Agent学习笔记(六)资料检索与 RAG:LlamaIndex、LangChain 与托管检索
先拆解资料解析、索引、检索与答案生成,再比较 LlamaIndex、LangChain 和模型服务的接入方式。
调研助手已经能够调用 search_documents,但把一个函数注册成工具,只解决了“怎样调用它”。搜索函数内部怎样读论文、找到实验数据、带回出处,是另一部分工作。
如果只有两份短文,直接读入上下文就可以比较。资料变成几百篇 PDF、网页和持续更新的实验记录以后,我们需要根据问题挑出相关内容,再交给模型生成答案。这就是检索增强生成,也就是 RAG 要组织的过程。
一次检索应该带回什么
用户问“方案 A 和方案 B 哪个吞吐更高”,只找回两个数字还不够。实验可能用了不同硬件、线程数和数据集,比较时需要把这些条件一起带回。我们可以把搜索结果设计成这样的结构:
1 | 方法:方案 A |
这些是说明数据结构的示例值。它们提示我们:检索工具的输出需要包含证据及其解释条件。正文切分时若把数值与表头拆开,或者更新文档后仍返回旧版本,后面的模型即使按要求调用工具,也可能作出错误比较。
完整处理可以分成准备资料和回答查询两部分:
1 | 准备资料:原始文件 → 解析正文与表格 → 切分内容 → 保存出处 → 建立索引 |
关键词检索适合精确方法名、错误码和字段名;向量检索通过文本表示寻找语义相关内容。是否结合两者,以及是否额外调用模型重排,要看资料和查询的特点。外围 Agent 只需要一个查询入口,入口内部可以由我们自己实现,也可以使用开源组件。
LlamaIndex:围绕文档与查询组织组件
LlamaIndex 用 Document 表示加载后的文档,用 Node 表示可检索的内容单元。切分时可以保留来源信息,再建立索引。Retriever 负责取回候选内容;Query Engine 可以把检索和基于证据生成答案接成一个入口。官方 RAG 说明。
对于这个调研助手,可以先让 Retriever 返回原文和出处,由外围 Agent 比较;也可以把 Query Engine 封装成工具,让它先回答“方案 A 的实验条件是什么”。后一种方式中,一次工具调用可能已经包含额外的模型生成,评估成本时要把它算进去。
它提供的便利集中在文档加载、切分、索引与查询之间的连接。具体 PDF 的表格有没有解析正确、实验条件是否跟着数值一起取回,仍要用实际资料检查。LlamaIndex 开源仓库。
LangChain:把检索组件接入已有调用流程
LangChain 也提供文档加载器、文本切分器、向量存储集成和 Retriever 接口。应用可以把它们接成检索工具,也可以查询已有数据库,把结果作为上下文交给模型。官方检索组件说明。
因此,LlamaIndex 与 LangChain 在这一层确实有重叠。若程序已经用 LangChain 接入模型和工具,可以先检查现有检索组件能否处理资料;若主要工作是组织多种文档和查询过程,则可以具体考察 LlamaIndex 的数据抽象。比较时,应让两种实现处理同一份论文与同一组问题,观察差异发生在解析、检索还是答案生成。
没有必要为了使用 LlamaIndex,再替换外围 Agent 循环。只要工具返回的证据结构约定清楚,检索部分就可以单独替换。
OpenAI 与 Anthropic:怎样接入这条数据路径
OpenAI 的 Responses API 提供托管的 file_search。应用上传文件并建立 vector store,模型可以通过这个工具查询资料,服务端负责执行搜索,支持语义与关键词检索。它与自己搭 LlamaIndex 的差别,首先是检索服务由谁运行和维护。官方 file search 说明。
若使用 Anthropic Messages API,可以把自己的检索实现注册为客户端工具:模型返回查询参数,应用执行搜索,再通过 tool_result 返回证据。同样的方式也能接入 OpenAI 的函数工具。这样,LlamaIndex 或 LangChain 的检索组件可以独立于模型服务存在。Anthropic 工具调用机制。
这两条路径分别展示了托管检索和自建检索的接入方式。前者减少检索服务的部署工作,后者让我们直接控制文档处理、索引和返回格式;模型能否理解证据,还需要单独检查。
在同一个任务里比较实现
| 实现方式 | 可以直接复用什么 | 需要重点检查什么 |
|---|---|---|
| 自写文件或数据库查询 | 已有数据与索引 | 查询是否能覆盖真实问题,返回值是否带条件和出处 |
| LlamaIndex | 文档、Node、索引、Retriever、Query Engine | 解析与切分结果,检索和生成之间的分工 |
| LangChain 检索组件 | 加载、切分、向量存储与检索接口 | 组件组合是否适合资料,能否融入现有工具流程 |
| OpenAI file search | 托管文件检索及模型工具接入 | 上传与更新流程、检索结果、数据与成本约束 |
可以先准备一组有明确出处的问题,例如某个吞吐数值在哪一页、使用几个线程、新版记录是否推翻旧结论。先看检索有没有找回正确证据,再看模型有没有据此回答。两步分开检查,才能知道换一个模型、调整切分,还是修改检索策略更有帮助。
资料检索处理的是当前任务所需的外部证据。用户确认过的偏好、过去任务留下的结论,怎样保存并在以后重新使用,还需要记忆的写入和更新策略。