【Redis的魔法:如何将其打造为强大的向量存储和自查询检索器】

# 引言

Redis 是一种开源的键值数据库,广泛应用于缓存、消息代理以及数据库管理中。然而,随着数据科学和机器学习的发展,Redis 也被改造成了一种强大的向量存储解决方案。本篇文章将带你了解如何使用 Redis 来创建一个向量存储,并结合 OpenAI 的嵌入技术,实现高效的自查询检索。

# 创建 Redis 向量存储

在存储和检索高维数据时,Redis 向量存储展现出其独特的优势。首先,我们需要创建一个 Redis 向量存储,并通过一组电影摘要文档来演示其能力。首先,确保安装必要的库:

```bash
%pip install --upgrade --quiet redis redisvl langchain-openai tiktoken lark

由于我们需要使用 OpenAI 的嵌入技术,因此需要获取 OpenAI 的 API Key:

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass("OpenAI API Key:")

接下来,初始化存储和文档:

from langchain_community.vectorstores import Redis
from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings()

# 示例文档
docs = [
    Document(
        page_content="A bunch of scientists bring back dinosaurs and mayhem breaks loose",
        metadata={"year": 1993, "rating": 7.7, "director": "Steven Spielberg", "genre": "science fiction"},
    ),
    # 其他文档...
]

# 索引模式
index_schema = {
    "tag": [{"name": "genre"}],
    "text": [{"name": "director"}],
    "numeric": [{"name": "year"}, {"name": "rating"}],
}

# 创建 Redis 向量存储
vectorstore = Redis.from_documents(
    docs,
    embeddings,
    redis_url="redis://localhost:6379",  # 使用API代理服务提高访问稳定性
    index_name="movie_reviews",
    index_schema=index_schema,
)

注意:index_schema 的定义可能需根据生成的模式进行调整,以确保和实际数据匹配。在某些地区,由于网络限制,开发者可能需要考虑使用 API 代理服务。

创建自查询检索器

现在,我们可以创建一个自查询检索器,该检索器可以理解自然语言查询并查找相关文档:

from langchain.chains.query_constructor.base import AttributeInfo
from langchain.retrievers.self_query.base import SelfQueryRetriever
from langchain_openai import OpenAI

metadata_field_info = [
    AttributeInfo(name="genre", description="The genre of the movie", type="string or list[string]"),
    AttributeInfo(name="year", description="The year the movie was released", type="integer"),
    AttributeInfo(name="director", description="The name of the movie director", type="string"),
    AttributeInfo(name="rating", description="A 1-10 rating for the movie", type="float"),
]

document_content_description = "Brief summary of a movie"
llm = OpenAI(temperature=0)

retriever = SelfQueryRetriever.from_llm(
    llm, vectorstore, document_content_description, metadata_field_info, verbose=True
)

测试检索器

我们可以通过各种查询来测试该自查询检索器:

# 查询恐龙电影
result = retriever.invoke("What are some movies about dinosaurs")
print(result)

# 查询高评分电影
result = retriever.invoke("I want to watch a movie rated higher than 8.4")
print(result)

# 查询Greta Gerwig导演的电影
result = retriever.invoke("Has Greta Gerwig directed any movies about women")
print(result)

常见问题和解决方案

  • 索引模式不匹配:可能会收到关于索引模式和生成模式不匹配的警告。请根据文档的实际元数据来调整索引模式。
  • API 访问不稳定:在某些地区访问 OpenAI 的服务可能会不稳定,建议使用 API 代理来改善连接质量。

总结和进一步学习资源

Redis 的灵活性使其不仅限于传统的键值对存储。通过结合向量存储和 OpenAI 技术,Redis 可以成为实现复杂数据检索的强大利器。建议读者进一步探索 OpenAI 的 Embeddings 和 Redis 的高级功能。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值