如果你在 2022 年之前问一个大模型帮我查一下上海明天的天气然后订一张去那里的机票它会非常自信地编出一段看起来合理但实际全是幻觉的回答。不是因为它笨而是因为它的整个世界观里只有生成下一个 token没有任何机制让它去和外部世界发生交互、验证自己的假设、或者纠正自己的错误。这件事背后的核心矛盾是语言模型擅长生成看似合理的文本但解决真实问题需要获取真实信息、基于反馈决策、在错误中迭代。从静态生成到动态决策中间隔着一整条架构演进的鸿沟。过去三年业界填这条沟的过程就是 Agent 决策架构的演进史。Agent 这个方向要解决的问题本质上就是给大模型装上手和脑回路。这只手能调用工具拿回真实数据这条脑回路能在拿到反馈后重新思考。过去三年业界在这个方向上走出了一条非常清晰的演进路径从 ReAct 的推理行动交织到 Reflexion 的自我反思闭环到 Tool Calling 的接口标准化到 MCP 的上下文协议统一再到 Hermes 这种原生 function-calling 智能体。这篇文章我想把这条路线讲透不是罗列名词而是回答一个更本质的问题每一代架构到底解决了前一代解决不了的什么痛点为什么演进是必然的而不是噱头。第一代ReAct让推理和行动在同一个循环里交织ReAct 的全称是 Reasoning and Acting出自 2022 年 Yao 等人的论文。它的核心思想极其朴素但影响深远不要把思考和行动分开而是让 LLM 在同一个生成序列里交替输出 Thought思考、Action行动和 Observation观察。具体机制是这样的。模型拿到一个任务后先输出一段 Thought用自然语言描述自己当前的理解、已经知道什么、还缺什么。然后它输出一个 Action格式通常是Action: 工具名[参数]。这个 Action 被外部执行器拦截真正去调用对应工具比如搜索、计算器、数据库查询拿到结果后系统把结果包装成 Observation 重新拼回上下文。模型看到 Observation 后基于新的事实再输出下一个 Thought如此循环直到它认为自己掌握了足够信息输出 Final Answer。ReAct 最妙的地方在于它几乎没有改模型本身纯粹靠 prompt 工程就实现了推理指导行动行动反哺推理的闭环。模型在 Thought 里把任务拆解成子目标在 Action 里选择工具在 Observation 里验证假设。比如任务谁在打败了阿尔法狗的公司的创始人出生地出生模型会先 Thought我需要先找打败阿尔法狗的公司再找它的创始人再找创始人的出生地。然后 Action 去搜索Observation 回来再继续。值得强调的是ReAct 的 Thought 不只是给外面看的思维链它是真正的规划载体。在 HotpotQA 这样的多跳推理数据集上有 Thought 引导的模型明显比纯 Action 或者纯思维链的表现更好因为 Thought 强迫模型在行动前先声明自己的中间假设而这些假设一旦被 Observation 证伪模型就能在下一轮 Thought 里显式地纠正方向而不是在错误的路径上越走越远。但 ReAct 有一个结构性缺陷它的 Action 是用自由文本生成的靠正则或启发式去解析Action: search[xxx]这种字符串。解析一失败整个循环就断了。而且它每次都是单步串行模型想一次查两个东西就得分两轮。还有更深的隐患ReAct 的错误是一次性的模型在一个 Episode 里犯了错下一轮它并没有记住自己上次为什么错只是被动地拿到新的 Observation 再碰运气。一旦陷入错误循环模型可能反复调用同一个失败的工具十几轮token 烧光了问题还没解决。这就逼出了第二代。第二代Reflexion把失败变成可写入的长期记忆Reflexion 由 Shinn 等人于 2023 年提出它要补上的是 ReAct 缺失的那块自我反思和记忆。ReAct 是试一次看结果Reflexion 是试一次复盘把复盘写进记忆再试。它的架构多了一个关键角色verbal memory。每一轮 Trial 结束后模型不只看环境返回的成功或失败信号还要生成一段自我反思self-reflection。这段反思是用自然语言写的内容大致是我刚才的做法有什么问题下次应该换什么策略。比如它在代码生成任务上跑挂了测试用例反思会说我不该用那个已经废弃的 API而且我对边界条件的处理漏了空指针。这段反思随后被写入一个 memory 库不是向量数据库那种模糊检索而是作为显式的文本片段持久保留。下一轮 Trial 开始时这些反思文本会被注入上下文模型在规划时就能直接参考我之前在这里踩过坑。这个设计本质上是在模拟人类的学习方式你做错一道题不是简单地再试一次而是停下来想我为什么错然后把那个教训记住。Reflexion 论文里其实区分了几种记忆短期记忆是单轮 Episode 内的轨迹长期记忆是跨 Episode 积累的反思还有一类是环境自身的状态。它的反思生成也分层次有的是对具体错误的纠正式“这里应该用 BFS 而不是 DFS”有的则是对策略的元级反思“我应该先收集所有约束再动手”。这种分层让模型既能修具体 bug也能调整整体方法论。Reflexion 的闭环是Trial执行行动拿到环境反馈成功/失败 具体错误信息后触发 Reflection生成自然语言反思反思写入 MemoryMemory 参与下一轮规划如此迭代直到任务通过或达到最大步数。实验表明在决策、推理、编程多个 benchmark 上加入反思闭环后成功率显著提升尤其是那些需要多步纠错的复杂任务。在 ALFWorld 这类需要长程规划的具身任务里Reflexion 把成功率从 ReAct 基线的水平往上拉了十几个百分点。不过 Reflexion 也不是银弹。它的记忆是文本追加式的轮次多了上下文会膨胀而且反思质量完全依赖模型自身的元认知能力。模型要是反思错了错误记忆反而会把后续决策带偏。另外它和 ReAct 一样底层还是有自由文本解析工具调用的脆弱性。要真正解决工具调用的可靠性得从接口层动手这就是第三代。第三代Tool Calling 标准化用 JSON Schema 锁死接口前两段讲的 ReAct 和 Reflexion工具调用都建立在模型输出一段约定格式的文本外部正则解析之上。这种方式在工程上极脆模型偶尔多写一个换行、参数格式稍微飘一下、或者输出中英混杂解析就挂了。而且不同模型用不同的文本约定换模型就得重写解析器。Tool Calling 标准化要做的事是把调用工具这件事从自由文本提升为一等公民。核心机制是 JSON Schema 约束的函数调用。开发者在请求模型时附带一份工具定义每个工具用 JSON Schema 精确描述函数名、参数名、参数类型、是否必填、取值范围。模型在需要调用工具时不再输出自然语言字符串而是输出一段结构化的 JSON里面是函数名和符合 Schema 的参数值。调用方拿到这段 JSON 之后可以直接用类型安全的反序列化去执行几乎不可能解析失败。这里有几个关键升级点。其一是参数强约束JSON Schema 让模型知道每个参数该填什么类型、什么格式模型胡编的概率大幅降低因为如果输出不符合 SchemaAPI 层会直接拒绝并要求重填。模型不再需要猜参数的形状它会按照训练时见过的 Schema 结构老老实实填空。其二是并行调用标准化之后的接口可以支持一次返回多个 tool call模型能在同一个回复里说同时去查天气、查汇率、查日历执行器并行打出去整体延迟从 O(n) 降到接近 O(1)。这在实时性敏感的场景比如一个 Agent 同时监控多个数据源里价值巨大。其三是可组合性工具定义变成了一份声明式契约模型提供商、框架、开发者之间有了统一语言不再各自一套文本格式。还有一个工程上特别重要的点可观测性。自由文本解析时代你很难判断模型想调什么工具、传了什么参数因为那是一段自然语言。标准化之后每一次调用都是结构化日志你可以直接把 tool call 落表做回放、做审计、做成本分析。这对生产系统是刚需。和自由文本解析对比标准化的代价是模型需要针对 function calling 做对齐训练推理时要走专门的 decode 路径。但收益是质的可靠性、可观测性、可组合性全部上一个台阶。OpenAI 在 2023 年中的 function calling、以及后续各家的 tool use走的都是这条路线。今天你几乎看不到还有人在生产环境用正则解析Action:字符串了这就是标准化胜利的最直接证据。第四代MCP把工具的接入从私有插件变成开放协议Tool Calling 解决了怎么调用一个工具的标准化但还有一个更上层的痛点没解决每个应用、每个框架、每个模型厂商都在自己定义工具怎么连、资源怎么传、上下文怎么组织。你要给 Agent 接一个数据库得给 LangChain 写一套 Tool给某个闭源产品写一套 Plugin换一家又得重写。工具的供给方被锁死在消费方的私有格式里这是巨大的重复建设。MCPModel Context Protocol模型上下文协议由 Anthropic 在 2024 年底提出思路类比 LSP语言服务器协议或者 USB 接口定义一套标准化的通信协议让任何 MCP Client宿主应用都能连任何 MCP Server工具/数据源提供方不用关心对方内部怎么实现。MCP 的架构分三层。最上面是 Host/Client 层运行在 Agent 应用里负责发起请求、管理连接。中间是 Server 层每个 Server 封装一类能力比如文件系统访问、数据库查询、第三方 API 集成。最底层的 Transport 层负责实际传输定义了两种标准传输方式stdio本地进程间通信Server 跑在本地子进程里和 HTTP with SSE远程通信Server 可以部署在远端。这两种传输方式的选择是有讲究的。stdio 模式下Server 作为本地子进程由 Host 拉起所有数据都在本机内存里流转天然适合访问本地文件、本地数据库这类敏感资源数据不出本机。远程模式下Server 是独立部署的网络服务Host 通过 HTTP 连上去适合那种需要集中托管、多租户共享的工具能力比如一个公司内部的统一检索服务。一个设计良好的 MCP 生态里本地和远程 Server 可以混用Host 不关心背后是哪一类只管按协议发 JSON-RPC 消息。协议定义了三个核心原语。Tools 是模型可以主动调用的函数对应行动能力每个 tool 同样用 JSON Schema 描述输入输出。Resources 是模型可以读取的上下文数据比如一个文件、一段数据库结果、一份文档对应的是感知能力由应用决定何时注入。Prompts 是预定义的提示模板可以被用户或模型触发用来固化一些常见工作流。MCP 最大的价值在于解耦。本地 Server 通过 stdio 跑天然安全数据不出本机远程 Server 通过 HTTP 暴露可以被多个 Host 共享。一旦生态形成工具提供方只要实现一个 MCP Server就能被所有兼容 MCP 的 Agent 消费不用再为每个框架单独适配。这比各厂各自的私有 plugin 体系好太多了私有 plugin 是围墙花园MCP 是开放总线。对架构师来说这意味着你设计 Agent 系统时工具层从和具体框架深度绑定的代码变成了可插拔的标准协议端点。第五代Hermes Agent让原生 function calling 成为模型的出厂能力前面几代要么是 prompt 技巧ReAct、Reflexion要么是协议层抽象MCP要么是大厂的 API 特性Tool Calling。Hermes 系列工作来自 Nous Research走的是另一条更底层、更像从模型训练阶段就解决问题的路通过指令微调让开源模型原生具备可靠的函数调用与多轮工具对话能力。Hermes 的核心做法是 prompt 模板化的 function calling。它在训练数据构建阶段就把工具定义、工具调用、工具返回值、以及模型基于返回值继续推理的多轮对话按照一套统一的模板结构化成训练样本。模型不是去猜测某个私有格式而是在预训练和微调阶段就见过成千上万个规范的函数调用对话范式从而学会在推理时原生输出可被解析的调用 JSON。和 ReAct 那种在 prompt 里用文字写 Action: xxx不同Hermes 的调用是模型语言能力的一部分输出的是纯粹结构化、可被代码直接反序列化的 JSON没有正则解析的负担。和单纯依赖闭源 API 的 Tool Calling 不同Hermes 把这套能力开放给了开源社区让开发者可以在自己的模型上微调出同样的能力。Hermes 特别强的一点是多轮工具对话。真实业务里一次任务往往要在调用工具拿数据、基于数据思考、再调用另一个工具之间往返好几轮。Hermes 的训练数据显式覆盖了这种多轮结构模型学会了在每一轮里判断我现在该直接回答还是该再调一个工具还是该把之前几轮的结果综合起来。它把 ReAct 的推理行动交织从 prompt 技巧内化成了模型的本能。这里值得一提的是训练数据的构建哲学。Hermes 不是简单拿现成的 API 调用日志来训练而是用强大的教师模型比如 GPT-4 级别去生成大量规范化的工具定义-调用-返回-推理三元组对话覆盖单轮、多轮、并行、错误处理等多种形态再拿去微调开源基座。这种用强模型教弱模型怎么用工具的蒸馏思路让一个 7B、13B 的小模型也能获得接近闭源大模型的工具使用可靠性。对想在本地私有化部署 Agent 的团队来说这条路线意味着你不必依赖大厂的闭源 API 就能拥有可靠的 function calling 能力。我的看法是Hermes 这条路线代表了一个重要趋势Agent 能力正在从在通用模型外面套一层工程脚手架向模型本身就懂怎么用工具演进。工程脚手架永远有它的位置比如 MCP 管连接、Reflexion 管记忆但底层的调用可靠性、多轮规划能力最终应该长在模型权重里。这就像编译器从手写汇编演化到高级语言自带优化基座越强上层越薄。演进的本质从技巧堆叠到协议统一再到能力内化把五代串起来看你会发现一条非常清晰的主线。ReAct 证明了推理和行动可以交织但它用的是文本解析这种脆弱方式。Reflexion 证明了失败可以变成记忆但记忆是追加文本且依赖前代调用方式。Tool Calling 标准化把调用从文本提升到结构化接口解决了可靠性。MCP 把工具的接入从各厂私有格式统一成开放协议解决了生态解耦。Hermes 把可靠的调用和多轮规划做进模型训练让能力从外部脚手架内化进基座。每一代都在补前一代的结构性短板而不是凭空造概念。如果你今天要设计一个生产级 Agent 系统我的建议是分层看待基座模型选一个 function calling 对齐得好的无论开源 Hermes 系还是闭源 API工具接入层用 MCP 做解耦复杂任务里叠加 Reflexion 式的反思记忆做纠偏至于 ReAct 的循环骨架它已经溶解在每一代的实现里变成了基础设施而非feature。技术的演进从来不是线性叠加而是每一层把下一步的假设垫实。理解这一点你才不会在下一个Agent 新范式出来时盲目追新而是能判断它到底在补哪块地基。落到工程实践我的建议是别迷信任何单一范式。ReAct 的循环骨架值得保留但要用结构化调用替换文本解析Reflexion 的反思记忆在长时间任务上收益明显但对简单任务反而是负担Tool Calling 和 MCP 已经是事实标准新项目没有理由不用Hermes 这类原生能力越强你上层的工程代码就越能简化。选型的本质是看你卡在哪一层然后只补那一层不要为了用而用。
