【收藏级】实战指南:从零构建 MCP 架构下的 Agentic RAG 系统(无第三方MCP Server)
对于刚接触大模型应用开发的小白或进阶中的程序员来说,Agentic RAG 是当前工业级大模型应用的核心范式之一,而 MCP 架构则能显著提升系统的模块化与可扩展性。本文将带大家从零开始,不依赖第三方 MCP Server,完整实现 MCP 架构与 Agentic RAG 的融合落地,全程附带设计思路、核心代码与效果演示,助力快速上手实践。
对于刚接触大模型应用开发的小白或进阶中的程序员来说,Agentic RAG 是当前工业级大模型应用的核心范式之一,而 MCP 架构则能显著提升系统的模块化与可扩展性。本文将带大家从零开始,不依赖第三方 MCP Server,完整实现 MCP 架构与 Agentic RAG 的融合落地,全程附带设计思路、核心代码与效果演示,助力快速上手实践
1、核心融合思路:MCP 与 Agentic RAG 的协同逻辑
先明确两个核心概念的定位:RAG(检索增强生成)是通过引入外部知识库为大模型补充上下文,解决其“知识滞后”与“事实性错误”问题的应用范式;而 MCP(模型通信协议)则聚焦于为大模型提供标准化的外部工具集成能力,实现模型与外部功能的灵活交互。
从核心目标来看,两者存在高度协同性——都是通过“外部补充”增强大模型能力,区别仅在于补充形式:MCP 如同给考试的学生提供计算器、直尺等工具,RAG 则像是给学生提供参考教材。进一步拆解两者的核心差异:MCP 强调“工具集成的标准化”,关注如何让模型高效调用外部功能;RAG 则是“完整的应用实现方案”,关注如何高效检索、利用外部知识。这种差异不仅不冲突,反而能形成互补:用 MCP 的标准化架构来集成 RAG 应用,可大幅提升 Agentic RAG 系统的模块化程度与可维护性。
尤其在 Agentic RAG 系统中(如下图),通常涉及多组 RAG 查询管道与智能体(Agent)的协同,这与 MCP 架构“标准化工具调用、模块解耦”的核心思想高度契合:

我们以一个典型的 Agentic RAG 应用场景为例展开实践:构建一个能处理大量异构文档的问答 Agent,支持事实性查询、摘要生成、跨文档融合分析,甚至可调用搜索引擎补充实时信息。接下来,我们将基于 MCP 标准完成该场景的全流程设计与实现。
2、MCP标准下的Agentic RAG架构
在MCP架构下,无论是SSE还是stdio模式,都是Client/Server模式。你必须在开始之前清晰的设计好MCP Server与Client应用的分工及交互。比如:
- 服务端提供的工具,包括功能边界、输入输出
- 服务功能粒度不能太大(丧失模块化)也不能太小(复杂化)
- 缓存与持久化设计:毕竟RAG是数据密集型应用
- 客户端Agent设计:模型、工作流、与服务端的交互等
- 如果是多用户环境:要考虑只是文档与索引的隔离
【总体思想】
我们基于如下的总体架构来实现:

- 在MCP Server上提供RAG管道构建与查询的工具;在客户端创建使用这些工具的AI Agent,提供查询任务规划与执行能力
- MCP Server借助LlamaIndex实现RAG管道;在客户端借助LangGraph实现Agent:让每个‘人’干更擅长的事。
3、MCP Server:RAG管道的核心
MCP Server是RAG功能实现的位置。我们对MCP Server拆解设计如下:

【工具(Tools)】
- create_vector_index:输入文档、索引名与参数,完成解析与索引创建。
- query_document:查询事实问题的RAG管道,输入索引名与查询问题。
- get_document_summary:查询总结性问题的RAG管道,输入文件和查询问题。
- list_indies等:辅助工具,包括一个自己实现的Web搜索工具。
需要说明,在这里的设计中,不同的RAG管道查询的工具是一样的,但参数(索引名,依赖于Agent推理)不同。一个是推理工具,一个推理参数,效果一致。
【缓存机制】
服务端要对文档解析(含分割)与索引创建的信息进行缓存(持久化存储),以防止可能的重复解析与索引创建,提高性能。
-
文档节点缓存:缓存文档解析分拆后的结果,确保文档解析过一次后,只要内容与参数(如chunk_size)不变,就不会被重新解析。
文档缓存的唯一名称是文档内容hash值+解析参数的联合。比如:
“questions.csv_f4056ac836fc06bb5f96ed233d9e2b63_500_50”
-
索引信息缓存:缓存已经创建过的索引信息,防止重复嵌入及向量库访问,避免不必要的模型调用成本。
索引缓存的唯一名称是每个文档关联的唯一索引名称。比如:
“questions_for_customerservice”
以下情况下会导致索引被重建:
- 客户端强制要求重建
- 索引信息缓存不存在
- 文档节点缓存不存在
这样的缓存管理方式,可以增加处理的灵活性与健壮性。如:
- 更改文档内容或解析参数,即时文档名与索引名不变:仍然会触发索引重建。
- 文档内容与参数不变,但修改索引名:会创建新索引,但不会重新解析文档。
【工具实现:create_vector_index】
这是服务端两个重要工具之一,核心代码如下,请参考注释理解:
.....
@app.tool()
asyncdefcreate_vector_index(
ctx: Context,
file_path: str,
index_name: str,
chunk_size: int = 500,
chunk_overlap: int = 50,
force_recreate: bool = False
) -> str:
"""创建或加载文档向量索引(使用缓存的节点)
Args:
ctx: 上下文对象
file_path: 文档文件路径
index_name: 索引名称
chunk_size: 文本块大小
chunk_overlap: 文本块重叠大小
force_recreate: 是否强制重新创建索引
Returns:
操作结果描述
"""
#用来判断索引是否存在
storage_path = f"{storage_dir}/{index_name}"
try:
# 获取Chroma客户端
chroma = ctx.request_context.lifespan_context.chroma
# 获取节点缓存路径(文档内容hash_chunksize_chunovlerlap)
cache_path = get_cache_path(file_path, chunk_size, chunk_overlap)
# 确定是否需要重建索引:强制 or 索引不存在 or 文档有变
need_recreate = (
force_recreate or
not os.path.exists(storage_path) or
not os.path.exists(cache_path)
)
if os.path.exists(storage_path) andnot need_recreate:
returnf"索引 {index_name} 已存在且参数未变化,无需创建"
# 如果需要重新创建,首先尝试删除现有的索引向量库
try:
chroma.delete_collection(name=index_name)
except Exception as e:
logger.warning(f"删除集合时出错 (可能是首次创建): {e}")
# 创建新的向量库
collection = chroma.get_or_create_collection(name=index_name)
vector_store = ChromaVectorStore(chroma_collection=collection)
# 加载与拆分文档
nodes = await load_and_split_document(ctx, file_path, chunk_size, chunk_overlap)
logger.info(f"加载了 {len(nodes)} 个节点")
# 创建向量索引
storage_context = StorageContext.from_defaults(vector_store=vector_store)
vector_index = VectorStoreIndex(nodes, storage_context=storage_context, embed_model=embedded_model)
# 缓存索引信息,这样下次不会重建
vector_index.storage_context.persist(persist_dir=storage_path)
returnf"成功创建索引: {index_name}, 包含 {len(nodes)} 个节点"
except Exception as e:
......
【工具实现:query_document】
这是客户端调用的主要工具。其输入是索引名与查询问题。借助索引缓存,可以快速加载并执行RAG查询。这里不再展示完整处理过程:
@app.tool()
async def query_document(
ctx: Context,
index_name: str,
query: str,
similarity_top_k: int = 5
) -> str:
"""从文档中查询事实性信息,用于回答具体的细节问题
Args:
ctx: 上下文对象
index_name: 索引名称
query: 查询文本
similarity_top_k: 返回的相似节点数量
Returns:
查询结果
"""
......
按类似方法,再创建一个用于回答总结性问题的工具(利用LlamaIndex的SummaryIndex类型索引),此处不在赘述。
4、MCP客户端:实现Agent(基于LangGraph)
客户端的工作流程如下:

客户端的几个设计重点简单说明如下:
【配置文件】
客户端有两个重要的配置信息,分别用于MCP Server与知识文档的配置。
mcp_config.json:
配置MCP Servers的信息,支持多Server连接、工具加载与过滤(这是一个在langgraph-mcp-adapers基础上扩展的版本)。比如:
{
"servers": {
"rag_server": {
"transport": "sse",
"url": "http://localhost:5050/sse",
"allowed_tools": ["load_and_split_document", "create_vector_index", "get_document_summary", "query_document"]
},
...其他server...
}
doc_config.json:
配置需要索引和查询的全部文档信息。这些信息还会在查询时被注入Agent提示词,用来推理工具的使用参数:
{
"data/c-rag.pdf": {
"description": "c-rag技术论文,可以回答c-rag有关问题",
"index_name": "c-rag",
"chunk_size": 500,
"chunk_overlap": 50
},
"data/questions.csv": {
"description": "税务问题数据集,包含常见税务咨询问题和答案",
"index_name": "tax-questions",
"chunk_size": 500,
"chunk_overlap": 50
},
....其他需要索引和查询的文档.....
}
【主程序】
客户端主程序流程非常简单,基于一个封装的MCP客户端与AgenticRAG类型:
......
client = MultiServerMCPClient.from_config('mcp_config.json')
asyncwith client as mcp_client:
logger.info(f"已连接到MCP服务器: {', '.join(mcp_client.get_connected_servers())}")
# 创建智能体
rag = AgenticRAGLangGraph(client=mcp_client, doc_config=doc_config)
# 创建向量索引,自动排重
await rag.process_files()
# 构建智能体
await rag.build_agent()
# 交互式对话
await rag.chat_repl()
【创建智能体(build_agent)】
注意到这里的关键步骤是build_agent,会借助LangGraph预置的create_react_agent快速创建Agent。如果你需要精细化的控制,也可以自定义Graph:
......
async def build_agent(self) -> None:
# 获取服务端提供的工具列表
mcp_tools = await self.client.get_tools_for_langgraph()
...略:配置文件生成doc_info....
# 使用LangGraph创建ReAct智能体
self.agent = create_react_agent(
model=llm,
tools=mcp_tools,
prompt=SYSTEM_PROMPT.format(
doc_info_str=doc_info_str,
current_time=datetime.now().strftime('%Y-%m-%d %H:%M:%S')),
)
logger.info("===== 智能体构建完成 =====")
5、端到端效果演示
现在让我们来测试下这个的“MCP化”的Agentic RAG应用的运行效果。按照如下步骤来进行:
- 启动MCP RAG-Server。这里用更复杂的SSE模式(暂时未支持文档上传,所以只能本机启动):

启动时会自动提取并展示服务端的工具清单。
- 准备客户端知识文档与配置文件。将需要索引和查询的文档放在应用的data/目录,配置好mcp_config与doc_config。不做任何其他处理。直接启动客户端应用:
python rag_agent_langgraph.py
* 观察首次运行的跟踪信息(如下图),这里的过程是:
- 连接RAG-Server与初始化
- 调用服务端工具创建向量索引。由于是首次访问,服务端没有索引缓存,所以会逐个对文件解析与创建向量索引
- 最后会加载Server端工具,创建LangGraph的Agent

* 现在退出程序,再次启动客户端,观察输出(如下图),可以看到由于索引已经创建,所以会显示“无需创建”。

- 交互式测试
进入交互式测试环节(图中的服务端信息是通过MCP接口推送到客户端的远程日志,方便观察服务端的工作状态):
- 关联两个文档信息的查询
由于提供的文档有北京和上海的城市信息介绍,所以看到这个问题调用了北京和上海的RAG管道查询,还自作主张的调用了搜索引擎做补充,然后输出答案:


- 查询知识库答案,并要求和网络搜索结果核对。
日志显示,Agent先用本地向量索引查询,然后通过搜索引擎对比,非常准确。


- 总结性问题测试。
日志显示,这里未加载向量索引,而是由工具加载这个文档的节点,并生成文档摘要后返回(SummaryIndex的效率不太高,有待优化)

- 最后一个很有意思的测试。
由于我们把创建索引的过程“工具”化了,所以甚至可以用自然语言来管理索引。比如这里我要求把csv文档的索引重建,智能体准确的推理出工具及参数,并重建了csv文档索引(实际应用要考虑安全性):

以上展示了一个基于MCP架构的Agentic RAG系统的实现。总结这种架构下的一些明显的变化:
-
MCP要求对整个系统做模块化与松耦合的重新设计,这会带来一系列工程上的好处。比如分工与效率提升、可维护性、独立扩展、部署更灵活等。
-
MCP不依赖于某个技术堆栈。因此技术选择上更灵活,比如服务端用LlamaIndex框架,而客户端则用LangGraph;甚至可以用不同的语言。
-
MCP实现了基于标准的模块间互操作。这有助于资源共享,减少重复开发,比如其他人可以基于你的RAG Server构建Agent,而无需了解RAG的具体实现。
当然,本文应用还只是基本能力的演示,实际还有大量优化空间。比如服务端的并行处理(大规模文档)、索引进度报告、多模态解析等,后续我们将不断完善并分享。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】


为什么要学习大模型?
我国在A大模型领域面临人才短缺,数量与质量均落后于发达国家。2023年,人才缺口已超百万,凸显培养不足。随着AI技术飞速发展,预计到2025年,这一缺口将急剧扩大至400万,严重制约我国AI产业的创新步伐。加强人才培养,优化教育体系,国际合作并进是破解困局、推动AI发展的关键。


大模型入门到实战全套学习大礼包
1、大模型系统化学习路线
作为学习AI大模型技术的新手,方向至关重要。 正确的学习路线可以为你节省时间,少走弯路;方向不对,努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划,带你从零基础入门到精通!

2、大模型学习书籍&文档
学习AI大模型离不开书籍文档,我精选了一系列大模型技术的书籍和学习文档(电子版),它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础。

3、AI大模型最新行业报告
2025最新行业报告,针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

4、大模型项目实战&配套源码
学以致用,在项目实战中检验和巩固你所学到的知识,同时为你找工作就业和职业发展打下坚实的基础。

5、大模型大厂面试真题
面试不仅是技术的较量,更需要充分的准备。在你已经掌握了大模型技术之后,就需要开始准备面试,我精心整理了一份大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

适用人群

第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

更多推荐



所有评论(0)