探索Redis向量数据库:如何构建智能的自查询检索器

126 阅读3分钟

探索Redis向量数据库:如何构建智能的自查询检索器

在现代应用中,使用Redis不仅仅是为了其传统的键值存储功能。充分利用Redis强大的功能,可以用它来构建缓存、消息代理、数据库乃至向量数据库。在本文中,我们将演示如何将一个自查询检索器(SelfQueryRetriever)封装到Redis向量存储中,并提供可操作的示例和深入的解释。

引言

Redis在近年来大受欢迎,部分原因在于其扩展功能,包括将其用作向量数据库的能力。在领域如机器学习和自然语言处理(NLP)中,向量数据库用于存储和检索高维向量数据,这对于语义搜索和相似度计算至关重要。本文章旨在介绍Redis向量数据库的创建过程,以及如何使用一个自查询检索器来进行智能搜索。

主要内容

1. 创建Redis向量存储

在开始之前,确保您已安装所需的库:

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

我们将演示如何在Redis中创建一个向量存储并填充数据。

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

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

docs = [
    Document(page_content="科学家带回恐龙,混乱随之而来", 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"}],
}

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

2. 创建自查询检索器

有了我们的向量存储,现在可以创建一个自查询检索器。

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="电影的类型", type="string 或 list[string]"),
    AttributeInfo(name="year", description="电影上映的年份", type="integer"),
    AttributeInfo(name="director", description="电影导演的姓名", type="string"),
    AttributeInfo(name="rating", description="电影的评分(1-10)", type="float"),
]
document_content_description = "电影的简要介绍"

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

3. 使用示例和代码

下面是如何通过不同的查询场景来使用这个自查询检索器:

# 查询恐龙相关的电影
retriever.invoke("有哪些关于恐龙的电影")

# 查询高评分的电影
retriever.invoke("我想看评分高于8.4的电影")

# 查询Greta Gerwig导演的电影
retriever.invoke("Greta Gerwig有没有导演过关于女性的电影")

常见问题和解决方案

  • 网络限制导致API访问不稳定:由于某些地区的网络限制,建议使用API代理服务来提高API访问的稳定性。
  • Schema不匹配警告:在创建向量存储时,确保index_schema与文档的metadata结构一致,这可以通过仔细规划和验证来实现。

总结和进一步学习资源

Redis作为向量数据库的功能强大且高效,通过结合使用LangChain和OpenAI等现代工具,开发者可以轻松地创建强大的智能查询系统。了解更多关于Redis和LangChain的详细使用,请参考以下资源。

参考资料

  1. Redis官网
  2. LangChain documentation
  3. OpenAI API reference

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