五一实战:用MCP架构从零实现Agentic RAG系统,附完整代码与演示(建议收藏)

发布时间:2026/6/24 6:28:17

五一实战:用MCP架构从零实现Agentic RAG系统,附完整代码与演示(建议收藏) 本文介绍如何利用MCP架构从零实现Agentic RAG系统。文章详细讲解了Server端基于LlamaIndex提供的RAG工具及缓存机制以及Client端基于LangGraph实现的智能体与工具调用。通过端到端演示展示了该架构在处理跨文档问答及总结问题上的优势强调了MCP带来的模块化与可扩展性。1、 思考MCP与Agentic RAG的融合RAG是一种借助外部知识来给LLM提供上下文的AI应用范式。从这个角度来说RAG与MCP有着相似的意义给大模型补充上下文以增强其能力。只是MCP以提供外部工具为主而RAG则是以注入参考知识为主。这就像一个考试的学生MCP给你提供计算器而RAG则是给你一本书。当然两者的重点并不一样MCP强调的是提供工具的方式集成标准而RAG则是需要你实现的完整应用。所以两者并不冲突完全可以用MCP的方法来集成一个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 ServerRAG管道的核心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(nameindex_name) except Exception as e: logger.warning(f删除集合时出错 (可能是首次创建): {e}) # 创建新的向量库 collection chroma.get_or_create_collection(nameindex_name) vector_store ChromaVectorStore(chroma_collectioncollection) # 加载与拆分文档 nodes await load_and_split_document(ctx, file_path, chunk_size, chunk_overlap) logger.info(f加载了 {len(nodes)} 个节点) # 创建向量索引 storage_context StorageContext.from_defaults(vector_storevector_store) vector_index VectorStoreIndex(nodes, storage_contextstorage_context, embed_modelembedded_model) # 缓存索引信息这样下次不会重建 vector_index.storage_context.persist(persist_dirstorage_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(clientmcp_client, doc_configdoc_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( modelllm, toolsmcp_tools, promptSYSTEM_PROMPT.format( doc_info_strdoc_info_str, current_timedatetime.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 学习路径图✅ 大模型调优实战手册附医疗/金融等大厂真实案例✅ 百度/阿里专家闭门录播课✅ 大模型当下最新行业报告✅ 真实大厂面试真题✅ 2026 最新岗位需求图谱所有资料 ⚡️ 朋友们如果有需要《AI大模型入门进阶学习资源包》下方扫码获取~① 全套AI大模型应用开发视频教程包含提示工程、RAG、LangChain、Agent、模型微调与部署、DeepSeek等技术点② 大模型系统化学习路线作为学习AI大模型技术的新手方向至关重要。 正确的学习路线可以为你节省时间少走弯路方向不对努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划带你从零基础入门到精通③ 大模型学习书籍文档学习AI大模型离不开书籍文档我精选了一系列大模型技术的书籍和学习文档电子版它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。④ AI大模型最新行业报告2025最新行业报告针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。⑤ 大模型项目实战配套源码学以致用在项目实战中检验和巩固你所学到的知识同时为你找工作就业和职业发展打下坚实的基础。⑥ 大模型大厂面试真题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我精心整理了一份大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。以上资料如何领取为什么大家都在学大模型最近科技巨头英特尔宣布裁员2万人传统岗位不断缩减但AI相关技术岗疯狂扩招有3-5年经验大厂薪资就能给到50K*20薪不出1年“有AI项目经验”将成为投递简历的门槛。风口之下与其像“温水煮青蛙”一样坐等被行业淘汰不如先人一步掌握AI大模型原理应用技术项目实操经验“顺风”翻盘这些资料真的有用吗这份资料由我和鲁为民博士(北京清华大学学士和美国加州理工学院博士)共同整理现任上海殷泊信息科技CEO其创立的MoPaaS云平台获Forrester全球’强劲表现者’认证服务航天科工、国家电网等1000企业以第一作者在IEEE Transactions发表论文50篇获NASA JPL火星探测系统强化学习专利等35项中美专利。本套AI大模型课程由清华大学-加州理工双料博士、吴文俊人工智能奖得主鲁为民教授领衔研发。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的技术人员这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。以上全套大模型资料如何领取

相关新闻