Agent实战指南:ReAct推理循环 + MCP协议 + 手把手代码实现

📅 2026/8/8 8:58:57
Agent实战指南:ReAct推理循环 + MCP协议 + 手把手代码实现
从 RAG 到 Agent为什么你的大模型应用需要一次架构升级前言2025 年到 2026 年大模型应用开发圈子里最热的两个词一个是AI Agent智能体另一个是MCPModel Context Protocol模型上下文协议。如果你还停留在写个 Prompt 接个向量数据库做 RAG的阶段那么这篇文章会带你系统梳理为什么纯 RAG 正在遇到天花板Agent 到底解决了什么问题它的核心推理范式 ReAct 是什么MCP 协议是如何统一大模型 ↔ 外部工具这件事的手把手实现一个具备工具调用能力的 Agent附完整代码生产环境中常见的坑与优化思路全文预计阅读 15 分钟建议先收藏再细读。一、为什么 RAG 不够用了RAGRetrieval-Augmented Generation检索增强生成曾经是 2023-2024 年大模型应用的标准答案把知识库切片、向量化、存入 Milvus / Chroma / Pinecone用户提问时检索 Top-K 相关片段拼进 Prompt再交给 LLM 生成答案。这套架构简单可靠但本质上是一次性、单向的信息流检索 → 拼接 → 生成模型没有回头看和再次行动的能力。当任务变成下面这几种情况时RAG 就力不从心了需要多步骤才能完成的任务先查数据库再调用接口最后生成报告需要根据中间结果调整策略的任务第一次检索没找到答案要不要换个关键词再查一次需要操作外部系统的任务发邮件、建 Jira 工单、执行 SQL、跑代码这正是 Agent 架构要解决的问题。图1传统 RAG 是一次检索、一次生成的线性流程Agent 则是思考-行动-观察的闭环循环能够根据中间结果动态调整策略二、Agent 的核心ReAct 推理循环目前主流 Agent 框架LangGraph、AutoGPT、Claude Agent SDK 等背后的推理范式大多可以归纳为ReActReasoning Acting由普林斯顿和 Google 研究团队在论文《ReAct: Synergizing Reasoning and Acting in Language Models》中提出。它的核心思想很朴素让模型像人一样想一步、做一步、看结果、再想下一步而不是一口气生成最终答案。图2ReAct 的四个阶段循环往复直到任务完成或达到终止条件一个典型的 ReAct 轨迹长这样伪代码化的思维链Thought: 用户想知道上海明天会不会下雨我需要先获取当前天气数据 Action: call_weather_api(city上海, datetomorrow) Observation: {condition: 多云转小雨, temp: 24-30℃} Thought: 已经拿到天气信息可以直接回答用户了 Action: finish(上海明天多云转小雨气温24-30℃建议带伞)这个循环的关键在于每一步的行动Action都需要真实地去调用外部工具而不是模型凭空编造。这就引出了下一个问题——工具怎么接接口怎么统一这正是 MCP 要解决的。三、MCP给 AI 装上USB-C 接口在 MCP 出现之前如果你想让 Agent 同时具备读文件“查数据库”调用 GitHub API的能力往往需要为每个工具单独写一套 Function Calling 的 Schema、单独处理鉴权和调用逻辑工具一多代码就变成了一团意大利面。Anthropic 在 2024 年底提出的MCPModel Context Protocol本质上是给大模型如何连接外部数据源和工具这件事定义了一套开放、标准化的协议可以类比成 USB-C不管你的外设是键盘、硬盘还是显示器接口标准统一之后即插即用。MCP 的架构分为三个角色角色职责Host承载大模型的应用程序比如 Claude Desktop、IDE 插件ClientHost 内部与某个 MCP Server 建立 1:1 连接的组件Server暴露具体能力的服务比如文件系统、数据库、第三方 API图3一个 Host 可以同时连接多个 MCP Server每个 Server 通过 JSON-RPC 暴露标准化的 Tools工具、Resources资源、Prompts提示词模板MCP 的价值在于生态复用一旦有人写好了GitHub MCP Server所有支持 MCP 协议的 Agent 应用都能直接接入使用不需要每家公司重复造轮子。目前社区已经涌现出文件系统、Git、Slack、数据库、浏览器自动化等大量现成的 MCP Server 实现。四、动手实践实现一个带工具调用的 Agent下面用 Python Anthropic SDK 实现一个最简版本的 ReAct Agent帮助你理解底层原理生产环境建议直接用 LangGraph 或 Claude Agent SDK这里是为了讲清楚引擎盖下面发生了什么。4.1 定义工具importjsonimportanthropic clientanthropic.Anthropic()# 定义两个简单工具查天气、算数defget_weather(city:str)-str:# 实际项目中这里会调用真实天气 APIfake_db{上海:多云转小雨24-30℃,北京:晴18-26℃}returnfake_db.get(city,暂无该城市数据)defcalculator(expression:str)-str:try:returnstr(eval(expression,{__builtins__:{}}))exceptExceptionase:returnf计算出错:{e}TOOLS[{name:get_weather,description:查询指定城市的天气情况,input_schema:{type:object,properties:{city:{type:string,description:城市名称}},required:[city],},},{name:calculator,description:计算数学表达式,input_schema:{type:object,properties:{expression:{type:string,description:数学表达式如 3*72}},required:[expression],},},]TOOL_MAP{get_weather:get_weather,calculator:calculator}4.2 实现 ReAct 循环defrun_agent(user_query:str,max_turns:int5):messages[{role:user,content:user_query}]forturninrange(max_turns):responseclient.messages.create(modelclaude-sonnet-4-6,max_tokens1024,toolsTOOLS,messagesmessages,)# 模型认为不需要再调用工具直接给出最终答案ifresponse.stop_reason!tool_use:final_text.join(block.textforblockinresponse.contentifblock.typetext)print(f[最终回答]{final_text})returnfinal_text# 模型请求调用工具把 assistant 消息存入历史messages.append({role:assistant,content:response.content})# 执行所有被请求的工具调用tool_results[]forblockinresponse.content:ifblock.typetool_use:print(f[第{turn1}轮] 调用工具:{block.name}({block.input}))resultTOOL_MAP[block.name](**block.input)tool_results.append({type:tool_result,tool_use_id:block.id,content:str(result),})# 把工具执行结果作为 user 消息喂回给模型进入下一轮messages.append({role:user,content:tool_results})return达到最大轮数限制任务未完成if__name____main__:run_agent(上海明天天气怎么样如果气温超过25度帮我算一下25乘以1.8加32等于多少)4.3 运行效果说明这段代码的核心逻辑就是前面讲的 ReAct 循环模型判断是否需要调用工具stop_reason tool_use如果需要本地执行对应函数把结果重新塞回对话历史模型基于最新的观察结果继续推理直到给出最终答案或达到轮数上限这个 5-6 行核心逻辑就是几乎所有 Agent 框架无论 LangGraph、AutoGen 还是各类商业 Agent 产品底层都在做的事情——框架的价值在于把这个循环工程化加上错误重试、并行工具调用、状态持久化、人工审核节点等能力。五、进阶多 Agent 协作模式当单个 Agent 需要处理的任务过于复杂比如调研一个技术方案 → 写代码实现 → 自我 Review把所有职责塞进一个 Agent 会导致 Prompt 臃肿、上下文窗口爆炸、专注度下降。这时候常见的做法是拆分成多 Agent 协作由一个 Orchestrator编排者负责任务分解和调度图4Orchestrator 模式下主 Agent 负责拆解任务并分发给专职子 Agent每个子 Agent 各自持有一组 MCP 工具这种模式的好处职责单一每个子 Agent 的 System Prompt 更聚焦效果更稳定并行执行Research Agent 和 Coding Agent 可以同时跑缩短总耗时易于调试出问题时能定位到具体是哪个子 Agent 的锅Anthropic 官方的 Claude Agent SDK、LangGraph 的多 Agent 编排能力都是这一模式的工程化实现。六、生产环境踩坑经验写到这里分享几个从实践中总结的经验希望能帮你少走弯路1. 工具描述description质量直接决定调用准确率模型是否正确选择工具很大程度依赖description写得是否清晰。含糊的描述会导致模型频繁调错工具或参数缺失建议给每个参数都写清楚类型、取值范围和示例。2. 控制单轮工具调用的爆炸半径不要让 Agent 拥有过高权限的工具比如无限制的 shell 执行、生产数据库写权限而不加任何审核环节务必对高风险操作设置人工确认Human-in-the-loop节点。3. 设置合理的 max_turns 和超时机制Agent 陷入死循环反复调用同一工具却拿不到有效结果是生产环境的常见故障必须设置轮数上限和单次调用超时。4. 上下文管理不要让历史消息无限增长长对话中工具调用结果会迅速撑爆上下文窗口建议对早期轮次的工具结果做摘要压缩只保留关键信息。5. 优先复用现成的 MCP Server而不是自己重写文件系统、Git、常见数据库、浏览器自动化等能力社区已有成熟的 MCP Server 实现直接接入即可没必要重复造轮子。七、总结维度RAGAgent MCP信息流单向检索→生成闭环思考→行动→观察→反思任务复杂度适合单步问答适合多步骤复杂任务外部交互只读检索可读可写能操作真实系统工具扩展性需要为每个数据源单独适配通过 MCP 标准协议即插即用RAG 依然是构建知识问答系统的基础能力不会被取代但当你的应用需要多步推理和操作外部世界时Agent MCP 的组合才是真正面向未来的架构。如果这篇文章对你有帮助欢迎点赞收藏评论区交流你在实践中遇到的问题参考资料ReAct: Synergizing Reasoning and Acting in Language Models (Yao et al., 2022)Model Context Protocol 官方文档Anthropic Claude API 官方文档