轻松玩转Redis向量存储与自查询检索器:打造智能搜索体验

69 阅读3分钟
## 引言

Redis是一款广泛使用的开源键值存储解决方案,其应用场景涵盖了缓存、消息代理、数据库等,而在AI和大数据时代,它也延伸到了向量数据库领域。本文将带领大家探索如何利用Redis向量存储来构建自查询检索器,旨在提升信息检索的智能化和效率。

## 主要内容

### 创建Redis向量存储

我们首先需要创建一个Redis向量存储,并为其填充一些数据。在这里,我们使用一组电影简介数据进行演示。在使用自查询检索器时,需要额外安装`lark`以及其他一些整合库:

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

配置OpenAI Embeddings

为了使用OpenAI提供的嵌入模型,我们需要准备OpenAI的API Key。

import getpass
import os

# 设置OpenAI API Key
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"}],
}

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

创建自查询检索器

自查询检索器能够智能解析查询句的意图,并根据文档元数据进行过滤。

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]",
    ),
    # 其他属性省略...
]

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)

常见问题和解决方案

数据索引模式不匹配

如果出现index_schema与生成的模式不匹配的警告信息,您可能需要手动调整并确认模式。

网络访问问题

由于某些地区的网络限制,在使用外部API服务(如OpenAI)时,可以考虑使用API代理服务来提高访问的稳定性。

总结和进一步学习资源

Redis向量存储与自查询检索器结合,为我们提供了强大的信息检索能力。若想深入了解,可以查阅官方文档或相关社区资源。

参考资料

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

---END---