很多团队在同一个项目里同时听到这三个词,于是把什么都往 Agent 上堆:检索交给 Agent 自己调,工具全塞进 MCP,结果链路一长就没人说得清是哪一步错了。这篇不重复原理科普,只给分工判断、串接顺序和上线前的检查项,方便你在写代码之前先把边界画出来。
很多团队在同一个项目里同时听到这三个词,于是把什么都往 Agent 上堆:检索交给 Agent 自己调,工具全塞进 MCP,结果链路一长就没人说得清是哪一步错了。这篇不重复原理科普,只给分工判断、串接顺序和上线前的检查项,方便你在写代码之前先把边界画出来。
先把一句容易记的话放前面:RAG 管知识从哪来,MCP 管能力怎么接,Agent 管谁来编排。三者不是同一层的竞品,也不存在必须一起用的绑定关系。判断顺序建议是——先看这个问题是不是知识问题,再看是不是接口对接问题,最后才考虑要不要把决定权交给模型。
三者不是同一层的竞品,先按「谁负责什么」分层
分层的目的不是分类美观,而是出错时能快速定位。检索召回差、工具调用失败、编排顺序跑偏,这三类问题的排查方向完全不同。如果一开始没有分层,日志里只能看到一个模糊的「Agent 回答错了」,后面就得靠猜。
| 维度 | RAG | MCP | Agentic AI |
|---|---|---|---|
| 它解决什么 | 知识从哪来 | 能力怎么接 | 谁来决定下一步 |
| 替换掉什么 | 手写拼接的上下文 | 一堆写死的胶水代码 | 固定 if-else 流程 |
| 典型失败表现 | 召回片段不对题 | 工具参数缺字段 | 步骤绕圈或提前收口 |
| 能否单独使用 | 可以 | 可以 | 可以,但价值有限 |
- RAG 解决的是「知识从哪来」:把外部资料取回来塞进上下文,它本身不决定要不要再取一次;
- MCP 解决的是「能力怎么接」:把外部系统以统一协议暴露成可调用工具,替换的是过去一堆写死的胶水代码;
- Agentic AI 解决的是「谁来编排」:由模型决定下一步调哪个工具、要不要再检索、何时收口;
- 判断口诀:知识问题优先看 RAG,接口对接问题优先看 MCP,流程分支问题才轮到 Agent;三者可以只用其中一个。
串起来的推荐顺序:先固定检索,再放开工具,最后才给自主权
- 第一步:把 RAG 单独跑通用一批固定问题集看返回片段对不对题,召回不稳就别急着加 Agent,否则后面所有问题都会归到编排上。
- 第二步:把外部动作拆成 MCP 工具每个工具只做一件事,参数尽量扁平,别让模型自己拼长串;工具返回要带明确的状态字段。
- 第三步:再引入 Agent 循环先只给串行多步的能力,观察调用顺序是否稳定,稳定之后再考虑并行或条件分支。
常见反例是一上来就让 Agent 同时管检索和工具。这样出错时无法区分是召回差还是路由选错,你只能一遍遍改提示词碰运气。顺序反过来做,前两步各自可控,Agent 引入后才有干净的基线可对比。
工具和知识别混在一个通道里
检索和工具在调用形式上很像,都是一次外部请求。但它们的返回值语义完全不同:一个是「读回来的事实」,一个是「改出来的状态」。混在一起会让模型误判,也会让日志难以归因。
- 把「查资料」做成检索工具、把「办事」做成动作工具,两者返回值格式不同,方便日志里区分;
- 只读查询类走检索、有副作用的写操作走工具,并对写操作加确认或白名单;
- 工具描述要写清输入输出与失败含义,否则模型会把动作工具当检索工具乱用;
- 不确定归属时先问一句:这个结果是「读回来的」还是「改出来的」,答案决定放哪边。
如果实在拿不准某个能力该放哪边,宁愿先做成只读检索,观察一段时间真实调用模式,再决定是否升级成写操作。先读后写比反过来安全得多。
上线前的落地检查:超时、步数、降级与评测
这一节的检查项建议直接抄成工单,逐条打勾。它们都不涉及模型本身强不强,而是保证链路长了之后还能被你自己控制住。
- 给每次 Agent 循环设步数上限和总耗时上限,检索超时与工具超时分开设,避免一个慢接口拖垮整轮;
- 检索失败降级为直接回答,工具失败降级为告知用户,不要让它自行重试到烧完额度;
- 日志至少记:本轮是检索还是工具、命中了哪个、耗时、是否走了降级,便于事后归因;
- 用一批固定问题做回归,改提示词或换模型后重跑同一批,看的是行为是否漂移,而不是单次回答好不好。
评测这件事容易被跳过,因为没有单点报错。但链路一长,行为漂移是常态。固定问题集不需要很多条,关键是每次都跑同一批,才有可比性。
什么时候这套组合并不适用
前面讲的都是「怎么用」,这一段讲「什么时候别用」。判断标准很简单:如果去掉某一层,结果没变差、维护更省,那这一层就是多余的。
- 问题答案在模型自身知识里就够用时,加检索只会引入噪声;
- 流程是固定几步、分支极少的场景,写死代码比让模型编排更稳也更便宜;
- 没有真实外部系统要接时,为了用 MCP 而造工具,等于给自己加维护负担;
- 对延迟极度敏感的场景,多层循环叠加检索的成本需要单独评估,必要时退回单步调用。
| 场景特征 | 建议保留 | 建议砍掉 |
|---|---|---|
| 答案靠行业资料 | RAG | Agent 循环 |
| 需要对接多个外部系统 | MCP | 额外检索层 |
| 步骤多变、无法穷举 | Agent | 写死的分支表 |
| 固定三步、分支极少 | 直接写代码 | Agent 编排 |
先用固定问题集验证召回,再让工具做单一动作,最后才把决定权交给模型。下一步代理选型也会影响这条链路的稳定性和排查体验,可以到 /sites 看各家的接入方式与限制,再决定把编排放在哪一层。→
常见问题
三者能只用一个吗?
能。只要知识在模型里就够,就都不用;只需要接入已有系统,用 MCP 或直接调接口即可,不必套 Agent;只有文档问答需求,单独做 RAG 也成立。组合是为了解决具体问题,不是成熟度标志。
MCP 能不能代替 RAG?
不能。MCP 管的是把能力暴露出来给模型调用,检索质量、切片、召回这些仍然要靠 RAG 那条链路。把检索包成一个 MCP 工具是常见做法,但包一层并不等于解决了召回问题。
Agentic RAG 一定比普通 RAG 好吗?
不一定。多轮检索会增加延迟和成本,只有在单次召回明显不够、需要按问题拆成多个子查询时才划算。先用固定问题集对比一次召回与多轮召回的结果差异,再决定要不要上循环。