o. OceanCT / notes
← Agent 专栏
/ LEARNING NOTES

Agent学习笔记(六)资料检索与 RAG:LlamaIndex、LangChain 与托管检索

先拆解资料解析、索引、检索与答案生成,再比较 LlamaIndex、LangChain 和模型服务的接入方式。

调研助手已经能够调用 search_documents,但把一个函数注册成工具,只解决了“怎样调用它”。搜索函数内部怎样读论文、找到实验数据、带回出处,是另一部分工作。

如果只有两份短文,直接读入上下文就可以比较。资料变成几百篇 PDF、网页和持续更新的实验记录以后,我们需要根据问题挑出相关内容,再交给模型生成答案。这就是检索增强生成,也就是 RAG 要组织的过程。

一次检索应该带回什么

用户问“方案 A 和方案 B 哪个吞吐更高”,只找回两个数字还不够。实验可能用了不同硬件、线程数和数据集,比较时需要把这些条件一起带回。我们可以把搜索结果设计成这样的结构:

1
2
3
4
5
方法:方案 A
指标:吞吐 800 MB/s
条件:单线程,数据集 X
出处:实验记录 v2,第 3 页
原文片段:……

这些是说明数据结构的示例值。它们提示我们:检索工具的输出需要包含证据及其解释条件。正文切分时若把数值与表头拆开,或者更新文档后仍返回旧版本,后面的模型即使按要求调用工具,也可能作出错误比较。

完整处理可以分成准备资料和回答查询两部分:

1
2
准备资料:原始文件 → 解析正文与表格 → 切分内容 → 保存出处 → 建立索引
回答查询:用户问题 → 检索候选片段 → 筛选或重排 → 返回证据 → 生成答案

关键词检索适合精确方法名、错误码和字段名;向量检索通过文本表示寻找语义相关内容。是否结合两者,以及是否额外调用模型重排,要看资料和查询的特点。外围 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 托管文件检索及模型工具接入 上传与更新流程、检索结果、数据与成本约束

可以先准备一组有明确出处的问题,例如某个吞吐数值在哪一页、使用几个线程、新版记录是否推翻旧结论。先看检索有没有找回正确证据,再看模型有没有据此回答。两步分开检查,才能知道换一个模型、调整切分,还是修改检索策略更有帮助。

资料检索处理的是当前任务所需的外部证据。用户确认过的偏好、过去任务留下的结论,怎样保存并在以后重新使用,还需要记忆的写入和更新策略。

上一篇:模型接入与执行编排 · 下一篇:记忆管理的实现方案 · Agent 学习笔记专栏