# 引言
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---
1126

被折叠的 条评论
为什么被折叠?



