Hermes 与 ReAct 模式对比分析结论先行Hermes有Thought → Action → Observation 的经典过程但它不是用文本标记Thought:/Action:/Observation:显式表达的 ReAct而是用API 原生的结构化消息隐式完成了相同的三段循环。一、经典 ReAct 的三段式Thought: 我需要查找北京的天气 ← 推理文本 Action: search(北京天气) ← 行动文本需解析 Observation: 北京今天晴32°C ← 观察文本拼回上下文 Thought: 找到了可以回答用户 Answer: 北京今天晴天32°C关键特征Thought / Action / Observation都是纯文本在同一条输出流中Action 需要正则/JSON 解析器从文本中提取Observation 由外部注入到下一段文本三者之间没有结构化关联靠格式约定维系二、Hermes 的三段式结构化隐式 ReActHermes 没有显式的Thought:/Action:/Observation:标记但在每一轮循环中三段过程完整存在只是换了载体2.1 一轮循环的消息流messages 列表的真实结构 ┌─────────────────────────────────────────────────────┐ │ {role: system, content: You are Hermes...} │ ← 系统提示 │ {role: user, content: 北京今天天气怎样} │ ← 用户输入 │ │ │ ── 第 1 轮循环 ────────────────────────────────── │ │ {role: assistant, │ │ content: 让我查一下天气, ← Thought │ │ reasoning: 用户问天气需要调用web_search, │ │ tool_calls: [{ │ │ id: call_abc, │ │ function: { │ │ name: web_search, ← Action │ │ arguments: {query:北京天气} │ │ } │ │ }]} │ │ {role: tool, │ │ tool_call_id: call_abc, │ │ content: 北京今天晴32°C} ← Observation │ │ │ │ ── 第 2 轮循环 ────────────────────────────────── │ │ {role: assistant, │ │ content: 北京今天晴天32°C。} ← 最终 Answer│ │ tool_calls: null} │ └─────────────────────────────────────────────────────┘2.2 Thought → Action → Observation 的对应关系ReAct 阶段ReAct 表现形式Hermes 表现形式代码位置Thought文本Thought: ...assistant.content正文推理assistant.reasoning/reasoning_content/REASONING_SCRATCHPAD结构化推理_extract_reasoning()方法提取支持 6 种格式Action文本Action: search(北京天气)assistant.tool_calls[].function结构化对象name JSON args_execute_tool_calls()→_invoke_tool()Observation文本Observation: 北京今天晴{role: tool, tool_call_id: xxx, content: ...}结构化消息工具执行结果 append 到 messages2.3 Thought 的 6 种格式Hermes 通过_extract_reasoning()方法统一提取推理内容支持以下格式#格式来源示例1message.reasoningDeepSeek、Qwen 等模型直接返回assistant_message.reasoning2message.reasoning_contentMoonshot AI、Novita 等替代字段assistant_message.reasoning_content3message.reasoning_detailsOpenRouter 统一格式含 summary[{type: reasoning.summary, summary: ...}]4thinking.../thinking内联标签模型在 content 中嵌入5REASONING_SCRATCHPAD.../REASONING_SCRATCHPAD旧式推理标签convert_scratchpad_to_think()转换6thinking...thinkingAnthropic/Claude 风格正则提取代码原文def_extract_reasoning(self,assistant_message)-Optional[str]:# 1. message.reasoning — Direct reasoning field (DeepSeek, Qwen, etc.)# 2. message.reasoning_content — Alternative field (Moonshot AI, Novita, etc.)# 3. message.reasoning_details — Array of {type, summary, ...} objects# 4~6. Fallback: inline tags in content# ཱུ...thinking# thinking.../thinking# reasoning.../reasoning# REASONING_SCRATCHPAD.../REASONING_SCRATCHPAD三、循环过程对比3.1 经典 ReAct 循环while not done: output LLM(prompt history) thought, action parse(output) # 正则解析文本 if action is None: return thought # 纯文本就是最终答案 observation execute(action) # 执行动作 history [output, fObservation: {observation}]3.2 Hermes 循环while api_call_count max_iterations: response API(messages) # 结构化 API 调用 assistant_msg response.choices[0].message # Thought: 推理内容结构化提取 reasoning _extract_reasoning(assistant_msg) # Action: 工具调用结构化对象无需解析 if assistant_msg.tool_calls: # Observation: 工具结果结构化消息 for tool_call in assistant_msg.tool_calls: result _invoke_tool(tool_call.function.name, tool_call.function.arguments) messages.append({role: tool, tool_call_id: tool_call.id, content: result}) continue # 继续循环 else: # 无 Action → 最终答案 return assistant_msg.content3.3 逐步对照步骤ReActHermes1. 推理LLM 输出Thought: ...文本API 返回reasoningcontent字段2. 决策正则匹配Action: xxx(yyy)API 返回tool_calls数组或 null3. 执行eval(action_string)或自定义解析器_invoke_tool(name, args)JSON schema 校验4. 观察拼接Observation: result文本追加{role: tool, content: result}5. 终止输出不含 Action → 结束tool_calls为 null → 结束四、Hermes 比 ReAct 多了什么能力ReActHermes并行 Action不支持一次一个同一轮多个 tool_calls 可并行 ThreadPoolExecutor子任务委派不支持delegate_task创建子 Agent独立 budgetAction 校验无靠模型自觉工具名白名单 JSON schema 校验 自动修复Action 去重无_deduplicate_tool_calls()格式容错无格式错误直接失败无效工具名重试 3 次 无效 JSON 重试 3 次上下文管理无历史无限增长3 层压缩 压力预警 Grace CallFallback无多 Provider 自动切换Checkpoint无文件变更和破坏性命令前自动快照记忆无内置 memory session_search 外部 Provider五、总结构图ReAct 经典三段式 ──────────────── Thought ─────→ Thought: 我需要查天气 (文本) │ Action ──────→ Action: search(北京天气) (文本需解析) │ Observation ─→ Observation: 晴32°C (文本拼回上下文) Hermes 结构化三段式 ────────────────── Thought ─────→ assistant.reasoning (结构化字段) assistant.reasoning_content (6 种格式统一提取) assistant.content (正文推理) │ Action ──────→ assistant.tool_calls[0].function (结构化对象) { (name JSON args) name: web_search, arguments: {query:北京天气} } │ Observation ─→ {role: tool, (结构化消息) tool_call_id: call_abc, (带 ID 关联) content: 晴32°C}一句话总结Hermes 有完整的 Thought → Action → Observation 循环但把 ReAct 的文本约定协议升级成了API 结构化协议——逻辑同构工程实现更可靠。