RAG Agent 代码实现示例
如果说 Tool-Using Agent 代码实现示例 更偏回答:
一个会调工具的 Agent,最小代码骨架应该怎么搭
而 Research Agent 代码实现示例 更偏回答:
一个会持续补资料、整理研究结论的 Agent,循环应该怎么组织
那么这篇文档要解决的是更贴近真实知识系统的一个问题:
当任务既依赖私有 知识检索,又需要多步判断、补充检索、读取细节和最终有依据输出时,RAG Agent 的代码到底该怎么写?
很多人第一次做 RAG Agent 时,概念上已经知道这些词:
retrievalreranktool usestatedecision loopgrounded answer
但一落到工程实现,还是会卡在几个很实际的问题上:
- 普通
RAG和RAG Agent的边界到底在哪里 - 第一轮检索以后,系统怎么判断“还要不要继续查”
retrieval / rerank / read / synthesis应该怎么分层state里到底要存哪些东西,后面才不会乱- 怎样让最终答案不是“看起来像总结”,而是“真的有依据”
- 日志和最小评估要记录什么,后面才知道系统到底有没有变好
所以这篇文档不讲大而全框架,也不讲复杂多 Agent 编排,而是聚焦一个很实用的目标:
给你一个足够完整、但仍然轻量的 TypeScript 伪代码骨架,帮助你把 RAG、tool use、state 和多步决策 loop 接成一个真正能落地的系统。
1. 什么任务适合做 RAG Agent
不是所有知识问答都要做成 RAG Agent。
如果任务只是:
- 单轮问答
- 目标非常明确
- 第一轮检索通常就够
- 不需要额外 工具
- 结果主要是“找到相关段落并组织回答”
那普通 RAG 往往已经够用了。
更适合放进 RAG Agent 的,是下面这类任务:
- 需要围绕一个目标做多轮信息补全
- 第一批检索结果通常不够,或者彼此冲突
- 需要在“继续检索”和“开始总结”之间做判断
- 需要混合多种工具,而不只是向量检索
- 最终输出必须能说明依据、缺口和不确定性
比如:
- 企业内部助手:从产品文档、会议纪要、历史事故复盘里整理某功能的约束和风险
- 合规知识助手:围绕一个问题持续检索政策、制度、执行记录,再给出带出处的结论
- 技术调研助手:先搜内部 ADR,再读设计文档,再查接口定义,最后形成方案判断
- 客服升级助手:先查知识库,再读工单历史,再检索相关变更记录,最后判断是否需要人工升级
这些任务的共性不是“知识量大”,而是:
系统必须围绕一个目标,判断下一步该查什么、该不该继续查,以及什么时候可以收束。
2. RAG Agent 和普通 RAG 的区别
很多团队第一版系统其实做的是:
用户问题 -> 检索 top-k -> 拼上下文 -> 一次生成答案
这就是典型的普通 RAG。
它的优点是:
- 简单
- 成本低
- 延迟可控
- 适合 FAQ、知识问答、说明型场景
但它的天然限制也很明显:
- 检索 query 往往只有一次
- 没有显式状态来记录缺口和冲突
- 不会主动决定“需要再查一次”
- 也不会主动读某篇命中的长文档细节
RAG Agent 更接近下面这条循环:
目标 -> 检索 -> 判断证据是否足够 -> 必要时改写 query / 调其他工具 / 深读文档 -> 更新 state -> 继续或停止 -> 形成有依据输出
所以它和普通 RAG 的核心区别不是“有没有向量库”,而是:
- 普通
RAG:检索是一次性上下文准备 RAG Agent:检索是决策循环里的一步动作
再说得更具体一点:
- 普通
RAG主要在解决“把相关内容拿给模型看” RAG Agent主要在解决“围绕目标,持续判断信息是否足够”