RAG、Agent、MCP之间到底是什么关系?

一个员工对公司的内部AI助手说:"帮我请个假。"
这句话背后至少藏着四件不同的事:
查公司的休假制度
读取这个人的实时假期余额
把请假申请提交到审批系统
在信息不全或系统异常时做出合理的应对。
RAG、Agent、MCP这三个名词之所以经常同时出现,就是因为一项看起来简单的业务任务,往往需要不同种类的能力来完成。
但"经常一起出现"不等于"可以互相替代"。很多讨论把它们排成一条技术演进路线,或者用"查资料的、干活的、接电话的"这类比喻一笔带过。
这篇文章还是用这一项请假任务从头走到尾,看下RAG、Agent、MCP分别能用在什么位置、因为什么原因被使用。
从一个制度问题开始
员工的第一个问题是:"公司的年假可以结转到明年吗?"
这是一个知识类问题。答案写在公司的人事制度文档里,而且随着政策更新,去年的答案和今年的可能不一样。如果直接把问题发给大模型,模型会基于训练数据给出一个"听起来对"的回答——但它看到的训练数据里不包含这家公司今年七月刚修订的版本。
要让回答可靠,应用需要在模型生成之前,先从公司的制度知识库中检索出和"年假结转"最相关的条款,把这些条款放进当前请求的上下文,让模型基于真实依据来回答。
这就是RAG(Retrieval-Augmented Generation,检索增强生成)在做的事。
RAG不是一个产品,也不是一个框架,而是一种应用模式:在生成之前先检索,用检索到的内容增强模型当前能看到的信息。它的核心价值是让模型的回答有据可查,而不是凭印象编造。
应用收到问题,执行一次检索,把结果和问题一起发给模型,模型回答,流程结束。步骤是固定的,路径是确定的。
文档回答不了实时数据
员工的第二个问题来了:"那我今年还剩几天年假?"
制度文档能告诉他年假政策,但不能告诉他个人余额。余额是这个人在HR系统里的实时数据,每次请假、调休或补登都会变化。这个数据不在任何文档里,也不适合提前索引——它需要在员工提问的那一刻,实时从HR系统中读取。
这时候应用需要的不再是检索,而是调用一个外部工具:向HR系统的接口发送查询请求,拿到当前余额,再把结果放回上下文让模型组织回答。
工具调用和检索是两种不同的外部能力:
检索是从已有的知识源中找到信息
工具是与外部系统进行实时交互——读取数据、执行操作、获取反馈。
如果公司只有一个HR系统需要对接,直接写一个函数调用就够了。但现实中,一个企业助手可能需要连接HR系统查余额、连接日历服务查排期、连接审批系统提交申请、连接通知服务发送消息。每个系统的接口格式、认证方式、能力描述都不一样。
MCP(Model Context Protocol)解决的就是这个连接问题。
它是一种开放协议,规定了AI应用怎样用统一的方式发现和调用外部系统提供的能力。在MCP的架构中,外部系统把自己的能力封装成MCP Server,AI应用通过MCP Client与之通信,应用的宿主环境(Host)负责管理这些连接。
MCP能做什么,不能做什么
理解MCP的关键是看清它的边界。
MCP让应用可以用同一套方式问"你能提供什么工具和资源"、"我要调用你的某个工具",而不用为每个外部系统写不同的对接代码。这对工具越来越多的场景很有价值——不用重复造轮子,新系统接入时只需要实现MCP Server,应用端不用改。
但MCP不会替应用做任何业务决定。它不知道员工应不应该请假,不知道要不要先检查日期冲突,不知道接口失败后应该重试还是报错。它就像是一套标准化的接口规范:保证各方说同一种语言,但说什么内容、按什么顺序说,是应用自己的事。
一个常见的误解是把MCP当作编排引擎或调度中心。这是不对的,MCP不调度任何流程,也不会因为你接入了MCP,应用就自动变成了一个智能系统。它提供的是连接层的标准化,仅此而已。
另一个需要说明的是:工具调用不一定需要MCP。模型可以通过Function Calling请求调用某个函数,应用自己实现这个函数就行。MCP是在工具数量多、来源杂、需要统一管理时更有优势的选择,但它不是工具调用的唯一方式。
当任务不再是固定步骤
回到请假场景,员工说:"帮我申请下周三到周五的年假。"
如果所有条件都满足——余额充足、日期没有冲突、交接人已填好——这个流程可以由一段固定的代码来完成:检查余额、验证日期、填充表单、提交审批系统、返回结果。步骤是确定的,不需要模型来决定下一步做什么。
但现实经常不会这么顺利。
员工没填交接人,系统需要追问。追问后发现他选的日期和部门季度汇报冲突,系统需要提醒并建议调整。他改了日期,但提交时审批系统的接口返回超时,系统需要判断是重试、等待还是让员工稍后再来。
这些情况没法提前把所有分支都写进代码。每一步的下一步取决于当前这一步的结果——信息是否完整、系统是否正常、用户是否接受建议。这时候需要的是一个能根据当前情况动态决定下一步行动的角色。
这就是Agent在做的事。
Agent不是一个特定的产品或框架,而是一种运行方式:由模型参与判断"接下来该做什么"。它可以决定调用哪个工具、是否需要追问用户、在某一步失败后换一条路径尝试。Agent的核心特征是动态决策——步骤不是预先写死在代码里的,而是在运行过程中根据观察和推理逐步确定的。
Agent可以使用RAG来获取知识,也可以通过MCP连接的工具来读取数据和执行操作。但Agent本身不等于RAG加MCP。Agent解决的问题是"谁来决定下一步",而RAG解决的是"去哪里找依据",MCP解决的是"怎样标准化地连接外部能力"。
同样重要的是:不是所有需要多个步骤的任务都需要Agent。
如果步骤是确定的——查余额、检查日期、提交申请——普通代码或工作流编排就能处理。
把固定流程硬包装成Agent,不会让它变得更智能,反而会增加调试难度和不可预测性。
Agent应该出现在真正需要动态判断的地方,而不是作为所有AI应用的默认架构。
三者在同一项任务中的位置
从上面的请求流程示例可以看到三种能力各自承担了什么:
员工问制度问题时,RAG从公司知识库中检索出相关条款,增强模型的回答依据。
员工查余额和提交申请时,工具调用(可以通过MCP标准化接入)让应用与HR系统和审批系统交互。
员工的请求遇到信息不全、日期冲突或接口异常时,Agent根据当前情况决定追问、调整还是重试。

这张图展示的是同一项请假任务中三者的协作关系。Agent处于决策位置,根据当前步骤的结果判断下一步做什么。当需要查制度时,它调用RAG从知识库检索依据。当需要读余额或提交申请时,它通过工具(可经MCP连接的外部系统)执行操作。图中的虚线和"按需"标记表示三者不是强制套餐——一个纯知识问答系统可以只用RAG,一个固定流程的数据查询可以只用工具调用,并不需要每次都把三者全部启用。
它们之间有几个关系值得明确:
不是三代技术。
RAG最早被广泛讨论,MCP和Agent是后来才热起来的概念,但这不意味着它们是"RAG 1.0 → MCP 2.0 → Agent 3.0"。它们解决的是不同层面的问题,没有替代关系。一个2026年构建的应用完全可以只用RAG,一个2024年的应用也可能已经需要Agent。
RAG可以被封装为工具。
在一些架构中,检索能力本身被包装成一个工具,Agent在需要查资料时调用它。RAG也可以通过MCP Server暴露给应用。这说明三者之间不是互斥的平行关系,而是可以嵌套和组合的。
MCP不会让应用自动变聪明。
接入了MCP,应用可以用标准方式连接更多系统,但它不会因此自动知道该什么时候查余额、什么时候提交申请。业务判断的职责在应用或Agent身上,不在协议身上。
Agent不等于聊天机器人。
Agent可以在后台处理复杂任务而完全不和用户对话。聊天界面只是一种交互形式,不是Agent的定义特征。
什么场景用什么
理解了三者的角色之后,选择就变得相对清晰:
从简单方案开始是一个实用的原则。
如果一个检索加模型就能解决的问题,不需要为了"先进"去引入Agent。
如果工具调用用直接的函数就够了,不需要为了"标准化"马上引入MCP。
每增加一层能力,都会带来额外的复杂度、调试成本和需要评测的范围。
继续学习
这篇文章用一项请假任务把RAG、Agent和MCP放到了同一条业务线中。它们之间的关系不是竞争、替代或代际升级,而是不同层面的能力在同一项任务中各司其职。
如果你想进一步了解其中某一项:
关于AI应用从任务到评测的整体链路,可以阅读《AI应用开发的核心链路:模型、上下文、工具、记忆和评测》。
RAG的完整概念和实现方式,可以阅读一文看懂什么是RAG。
Agent的组成和核心运行机制,可以阅读一文看懂什么是智能体(AI Agent)以及深入理解AI Agent的7大核心概念。
MCP协议的架构和使用方式,可以阅读一文看懂MCP。
如果你在用AI编程工具开发这类应用,《AI辅助开发不只是工具:规则、上下文和评测体系》讨论的是怎样把工程方法落到开发协作中。
参考资料
RAG原始论文 (Lewis et al., 2020) — 把参数化模型与可检索知识结合用于知识密集型生成。
MCP官方架构文档 — Host-Client-Server架构,定义工具、资源和提示等上下文交换能力。
Anthropic: Building effective agents — 区分预定义工作流与Agent,增强LLM可结合检索、工具和记忆。
OpenAI Tools文档 — 工具让模型获得检索、函数、网页、MCP等外部能力。
OpenAI Agents SDK文档 — Agent可以规划、调用工具并为多步任务保留足够状态。