
LlamaIndex • 2024-07-30
LlamaCloud 的动态检索
构建一个强大的问答助手需要动态地为每个查询检索最相关的信息。有时一个简短的片段就可以提供完整的答案,而其他问题则需要整篇文档的完整上下文(例如,“给我这份文档的摘要”)。
对于属于后一类别的问题,top-k 向量搜索力有不逮;您需要有目的地检索整个文档文本并将其输入到大型语言模型的上下文窗口,而不是仅仅检索匹配的 top-k 块。
为此,我们很高兴推出 LlamaCloud 的文件级检索功能,这是一个独立于我们现有块级检索能力的检索 API。此检索接口为我们构建一个智能体铺平了道路,该智能体可以根据问题的属性动态地将问题路由到正确的检索接口,从而使其能够更稳健地处理不同的用户问题。

文件级检索
此方法检索文档的完整内容,例如整个 SEC 10K 备案文件或整个幻灯片演示文稿。执行文件级检索主要有两种方式
- 按元数据:根据文件的元数据选择文件。
- 按内容:使用文档内容确定最相关的文件。
该接口允许您在检索模式之间无缝切换,调整 top-k 结果等参数,甚至在使用文件级检索时按元数据进行过滤。
构建用于动态检索的智能体
为了展示动态检索的强大功能,我们创建了一个 Jupyter notebook,它指导您构建一个能够根据当前问题在块级和文件级检索之间进行选择的智能体。下面我们来逐步介绍关键步骤
- 定义检索器:我们使用 LlamaCloud 的
as_retriever
方法设置了块级和文件级检索器。这些可以转换为查询引擎,以便在给定问题时对检索到的上下文合成答案。
# File-level retriever
doc_retriever = index.as_retriever(
retrieval_mode="files_via_content",
files_top_k=1
)
# Chunk-level retriever
chunk_retriever = index.as_retriever(
retrieval_mode="chunks",
rerank_top_n=5
)
- 构建智能体:该 notebook 的核心是决定使用哪个查询工具的智能体。它分析输入问题并根据工具描述选择适当的检索方法。在本节中,我们保持简单 - 如果问题更偏向“高层摘要”,则告诉智能体选择文件级检索,否则执行块级检索。
- 测试智能体:即使使用这些基本的工具提示,我们的智能体也已经能够智能地决定对更偏向“摘要”的问题执行文件级检索。
# uses chunk-level retrieval twice
response = agent.chat("Tell me the revenue for Apple and Tesla in 2021?")
print(response)
# uses file-level retrieval twice
response = agent.chat("How was Tesla doing generally in 2021 and 2022?")
print(response)
- [进阶] 文件级检索:该 notebook 还演示了如何通过推断元数据过滤器和注入现有文件的少量示例来设置更复杂的文件级检索,让智能体能够根据已上传的实际文件(而不仅仅是固定的提示词)更好地决定使用文件级还是块级检索。
立即构建更强大的问答接口
LlamaCloud 的动态检索能力代表着在构建更智能、更具上下文意识的 LLM 应用方面迈出了重要一步。通过提供在块级和文件级检索之间进行选择的灵活性,开发者可以创建更细致、更准确的系统,以适应每个查询的具体需求。
我们鼓励您在 LlamaCloud UI 中探索这些新功能并亲自尝试该 notebook。一如既往,我们很高兴看到您将利用这些增强的检索能力构建出什么!
想了解 LlamaCloud 能为您做什么?
欢迎在我们的 等候名单 上注册以获取访问权限。如果您对企业计划感兴趣,请 联系我们。
如果您已获得 LlamaCloud 的访问权限,请查看我们的 丰富的演示和示例库,了解如何构建不同的 LLM 应用用例。