Chapter 02

心智模型

把 ReAct、CoT、Workflow、Agent、Augmented LLM 这一堆术语 对齐到一张图。看完你应该能对任何一段"agentic"代码迅速分类。

本章约 5,200 字 阅读 ~20 分钟 关键词:Augmented LLM · Workflow vs Agent · ReAct

上一章我们扫了 Agent 的历史。但概念太多——你听过 ReAct、CoT、ToT、Reflexion、 AutoGPT、LangGraph、orchestrator-workers……到了写代码时还是糊。这一章把所有这些 术语对齐到一张可操作的图。读完,你能对任何一段标榜 "agentic" 的代码 迅速回答:它本质是什么、属于哪种模式、复杂度有没有用对地方。

2.1最小心智模型:Augmented LLM

Anthropic 2024 年那篇Building Effective Agents提出了一个干净的底层抽象: Augmented LLM。一切复杂 Agent 系统都是它的组合。

flowchart LR
  P["prompt"] --> LLM
  subgraph LLM["Augmented LLM"]
    direction LR
    T["tools"]
    R["retrieval"]
    M["memory"]
  end
  LLM --> Resp["response"]
  T -.-> TX["工具调用
改变外部状态"] R -.-> RX["RAG
检索知识"] M -.-> MX["长期记忆
跨调用状态"] classDef enhance fill:#fbfaf6,stroke:#8b1538,color:#8b1538 class T,R,M enhance

三件增强:

这三件单独看都是"工具",但放在一起,LLM 就从"对话引擎"变成"能完成任务的引擎"。 本书后面所有抽象——Agent、Workflow、orchestrator、subagent——都是 Augmented LLM 在某种调度方式下的组合。

第一原则 不要在 augmented LLM 之上添加任何抽象,除非你能说清楚它解决了什么具体问题。 这是 Anthropic、Simon Willison、Hermes 维护者反复说的核心原则。 大多数"复杂 Agent 框架"的问题是抽象太早、太多、太通用。

2.2Workflow vs Agent:关键分类

Anthropic 那篇博客最重要的贡献,是把"agentic system"切成两类:

类型描述例子
Workflow LLM 和工具被预定义的代码路径编排。开发者决定每一步去哪。 "先翻译,再总结,再发邮件" — 步骤固定
Agent LLM 动态决定下一步用什么工具,循环直到任务完成。 "帮我把这个 bug 修了" — 步骤未知

这个区分至关重要,因为它直接影响你应该写什么代码:

5 种 Workflow 模式

Anthropic 列了 5 种,我们各看一眼,因为 Hermes 内部都用到了。

① Prompt Chaining(链式提示)

把任务切成顺序步骤,每步一个 LLM 调用,输出喂下一步。

# 伪代码:写博客的 chain
outline = llm("给我一个关于 X 的提纲")
draft   = llm(f"按这个提纲写:" + outline)
polish  = llm(f"优化这段文字:" + draft)

关键:步骤之间是顺序依赖。每步的 prompt 是定死的代码,不是 LLM 自己决定的。

② Routing(路由)

用一个 LLM 当分类器,根据输入选下游 chain。比如客服系统: "用户问退款?走退款 chain。问产品?走产品 chain。"

③ Parallelization(并行化)

两种子模式:

④ Orchestrator-Workers(编排者-工人)

一个"orchestrator" LLM 看任务,动态切成子任务,分给"worker" LLM 执行, 最后自己整合结果。和 Sectioning 的区别:子任务列表不是事先写死的,是 orchestrator 生成的。Anthropic 自己的代码 Agent 就是这种结构。

Hermes 对应 Hermes 的 delegate_task 工具就是 orchestrator-workers 的实现。 父 Agent 把任务用 delegate_task(goal=..., context=...) 派给子 Agent, 子 Agent 在独立 context 里干完返回结果。子 Agent 还能再派——构成树状结构。 细节见第 7 章。

⑤ Evaluator-Optimizer(评估-优化循环)

一个 LLM 生成,另一个 LLM 评估,把反馈给生成者改进,迭代到达标。 代码 Agent 写完代码后跑 lint 是简化版(lint 工具替代了 evaluator LLM)。 Voyager 论文里"iterative prompting + 环境反馈"也是这类。

Agent 模式

Agent 不是某种特定模式,而是"以上 5 种的动态组合 + 循环"。 Anthropic 这样描述:

"Agents begin their work with either a command from, or interactive discussion with, the human user. Once the task is clear, agents plan and operate independently, potentially returning to the human for further information or judgment."
Anthropic · Building Effective Agents

这就是 Hermes 的形态。一旦你用 hermes 命令开启对话, 你不再告诉它每一步该做什么——它自己决定下一步是搜索、读文件、还是问你。

2.3ReAct 模式与现代 Function Calling

让我们把第 1 章的 ReAct 重新对齐到 Augmented LLM 框架。

ReAct 的本质是给 LLM 显式 reasoning 步骤。它要求 LLM 输出顺序是:

Thought:  <为什么我要做这件事>
Action:   <工具名>[参数]
Observation: <工具结果>
Thought:  ...

而现代 Function Calling 的输出是:

content:    "我打算搜一下"      # Thought(可选)
tool_calls: [{name: "search",       # Action(结构化)
              arguments: {q: "..."}}]

下一轮 messages 里就是:

{"role": "tool", "tool_call_id": "...",
 "content": "工具结果"}            # Observation

所以"现代 Function Calling"≈ "结构化的 ReAct"。 reasoning content 字段(DeepSeek-R1、Claude Extended Thinking)则把 "Thought" 也变成了协议一等公民,不再是 content 里的散文。

Evolution Track
从 ReAct 到 Reasoning Models
2022–2026

一条清晰的演化线:
2022 ReAct(手写 prompt 模板分 Thought/Action)
→ 2023 Function Calling(Action 结构化)
→ 2024 O1/R1 reasoning(Thought 变成训练好的内化能力)
→ 2025 Extended Thinking(Thought 长度可配置,作为单独账单项)

每一步都是"把更多 burden 从 prompt 移到模型本身"。但循环骨架没变—— Hermes 的 conversation_loop 依然是 ReAct 的孙子。

2.4Chain-of-Thought 与 Reasoning Models

CoT(Chain-of-Thought,Wei et al. 2022)是 Agent 的近亲。 本质都是"让 LLM 把思考过程写出来"。但 CoT 是单次调用内的, Agent 是多轮工具调用的。区别在循环:

CoTAgent
调用次数1 次 LLMN 次 LLM + N 次工具
外部世界交互
失败恢复可以重试、调整策略
典型场景数学题、推理题开放任务、需要工具的事情

2024 年起 OpenAI o1 / DeepSeek R1 / Claude Extended Thinking 让 CoT 从 prompt 技巧升级成模型一等公民能力。模型在输出 final answer 前会先输出"reasoning"(不计费给用户读到),自己想清楚再说话。

对 Agent 工程的影响:

2.5Hermes 是 Workflow 还是 Agent?

把以上分类应用到 Hermes:

从最外层看 — Hermes 是 Agent。用户开启对话后,Hermes 不被 脚本路径限制,它自己决定每一步是搜索、读文件、调子 Agent、还是直接回答。

从内部子系统看 — Hermes 大量用 Workflow 模式

这说明Workflow 和 Agent 不是非此即彼——好的 Agent 系统内部 到处嵌套着 Workflow。第 7 章会看到 Hermes 怎么用 plugin hooks 让你也能 往任何工具调用边界塞一个小 workflow(如审计日志、内容脱敏)。

2.6什么时候用 Agent,什么时候用 Workflow

这是工程师最该问自己的问题。Anthropic 的建议:

用 Workflow 当...

  • 任务流程可预测(输入决定输出路径)
  • 每步成本敏感
  • 需要严格审计 / 合规
  • 稳定性优先于灵活性

用 Agent 当...

  • 任务步骤数未知("修复这个 bug")
  • 需要根据中途结果改变策略
  • 开放式探索(research、coding)
  • 愿意付出延迟和 token 成本换灵活

实际指南

Pragmatic flowchart:

flowchart TD
  Start(["任务来了"]) --> Q1{"步骤能事先
列出来吗?"} Q1 -->|是| W["Workflow"] Q1 -->|否| Q2{"工具空间小?"} Q2 -->|是| A1["简单 ReAct
+ 少数工具"] Q2 -->|否| A2["完整 Agent
+ 子 Agent"] classDef workflow fill:#e8eff5,stroke:#2c5282,color:#2c5282 classDef agent fill:#fbfaf6,stroke:#8b1538,color:#8b1538 class W workflow class A1,A2 agent

翻译成具体决策:

  1. "我要做翻译 + 总结 + 发邮件"——三步固定 → Workflow。三次 LLM 调用就够。
  2. "我要做把这个 PR review 一下"——可能要看 5 个文件也可能 50 个 → 简单 Agent 配 read_filegrepdiff 工具。
  3. "我要做从需求文档生成完整 Web 应用"——开放任务、要写代码、跑测试、修 bug → 完整 Agent + 子 Agent 分工 + iterative refinement。
常见反模式 把所有任务都做成 Agent。一个简单的"翻译 + 总结"如果用 Agent,会浪费很多 token 让 LLM "想"它该做什么——而这个流程是确定的,根本不该让它想。

2.7本书的概念地图

把所有概念组织成一张图。这张图你需要回来查很多次:

flowchart TD
  Root["LLM-Era Agent"]
  Root --> Aug["Augmented LLM"]
  Root --> Ctrl["控制流"]
  Aug --> T["Tools"]
  Aug --> R["RAG"]
  Aug --> M["Memory"]
  Aug --> Rs["Reasoning"]
  Ctrl --> W["Workflow"]
  Ctrl --> Ag["Agent"]
  W --> W1["Prompt Chaining"]
  W --> W2["Routing"]
  W --> W3["Parallelization"]
  W --> W4["Orchestrator-Workers"]
  W --> W5["Evaluator-Optimizer"]
  Ag --> Ag1["ReAct loop"]
  Ag --> Ag2["Subagent"]
  Ag --> Ag3["+ 自由组合
上面的 workflow"] classDef root fill:#f5ede0,stroke:#8b1538,color:#8b1538,font-weight:bold classDef branch fill:#ecf3eb,stroke:#2f5d3a,color:#2f5d3a classDef agent fill:#fbfaf6,stroke:#8b1538,color:#8b1538 classDef workflow fill:#e8eff5,stroke:#2c5282,color:#2c5282 class Root root class Aug,Ctrl branch class W,W1,W2,W3,W4,W5 workflow class Ag,Ag1,Ag2,Ag3 agent

Hermes 用代码实现了这张图的几乎所有节点:

当你读源码迷路时,问自己:我现在看的是这张图哪一块?—— 通常能立刻定位。

2.8Multi-Agent 心智模型四象限

上面讲的是单 Agent。但 2024–2026 年大量项目走向 multi-agent—— 多个 Agent 协作完成一个任务。不同 framework 选了完全不同的底层抽象。 搞清楚抽象差异比学具体 API 重要 100 倍。

四种主流抽象

① Graph(图模型)

代表:LangGraph

把工作流建模为有向图:节点=步骤,边=条件转移,状态在节点间流动。 支持 checkpoint、回退、并行。适合"工作流复杂、状态明确、需要可恢复"的场景。

优势:observability 强,生产级。劣势:抽象上手成本高。

② Actor(消息模型)

代表:AutoGen / AG2 / Microsoft Agent Framework

每个 Agent 是独立 actor,互相用消息异步通信。没有中心控制—— 每个 actor 自己决定何时回应、回应谁。适合"研究型对话、多角色辩论"

优势:灵活、自然。劣势:可控性差、易陷死锁。

③ Role + Task(角色模型)

代表:CrewAI

类比公司:定义 Agent("Research Analyst")、Task("撰写报告")、 Process(流程串联)。适合"prototype 快、业务直觉好"

优势:上手快。劣势:复杂度上升后失控;生产中常被换成 LangGraph。

④ Handoff(交接模型)

代表:OpenAI Agents SDK

Delegation 本身是核心 primitive:Agent A 把控制权"交接"给 Agent B。 和 ③ 的区别:handoff 是单向、串行的,不是并行多角色协作。

优势:模型直觉自然。劣势:仅适合线性流程。

Hermes 在哪

Hermes 本身是具体 Agent 产品,不属于上面任何 framework。但它内部用了 Handoff 模型——delegate_task 工具就是父 Agent 显式 hand off 给子 Agent。

这是 Anthropic 在 Building Effective Agents 里推崇的路线—— "不用 framework,用直接代码 + 简单 primitive"。 Hermes 没有 StateGraph、没有 ActorRuntime——只有一个 while 循环 + 工具字典 + delegate_task。但已经能搭出 orchestrator-workers 模式。

什么时候上 multi-agent framework

需求推荐
简单线性串联(Agent A → B → C)纯代码 / Agents SDK handoff
复杂分支 + 状态持久化 + 可恢复LangGraph
多 Agent 互相辩论 / 协商AutoGen / MAF
业务逻辑明确的工作流CrewAI(prototype)→ LangGraph(生产)
你已经在做产品级 Agent学 Hermes —— 直接写代码,避免 framework 抽象债
2026 业界趋势 从 framework 信仰回到 first-principles 代码。 OpenAI 的 Swarm 已 archive;AutoGen 转入 maintenance; 生产部署明显从 framework 迁向定制 harness(Cursor、Devin、Claude Code 都是这条路线)。 原因——framework 的抽象在 debug 时遮蔽底层 prompt,bug 难定位。

第 13 章我们详细拆这次"framework 大洗牌"的来龙去脉。这里你只需要记住: 不同 framework 的底层抽象决定了它能干什么——选 framework = 选哲学

2.9本章带走的

章末练习

  1. Easy 下列哪些是 Workflow,哪些是 Agent?
    • (a) 用户上传发票 → OCR → 提取金额 → 写入数据库
    • (b) "帮我把这个 React app 改成 Vue"
    • (c) 把英文邮件翻译成中文,再做 sentiment 分析
    • (d) Claude Code 修一个 issue
    • (e) ChatGPT 回答"水的化学式是什么"
  2. Easy "Augmented LLM" 三件增强中,哪一件对"防止上下文窗口爆炸"最关键?为什么?
  3. Medium 给一个 Orchestrator-Workers 的实际任务设计。说清楚 orchestrator 怎么切任务、worker 怎么独立工作、 怎么聚合结果。不超过 300 字。
  4. Medium 读 Voyager 论文摘要(arXiv:2305.16291)。它属于 Agent 还是 Workflow? 把它的三个核心组件(automatic curriculum、skill library、iterative prompting)对应到本章 2.7 节的概念地图。
  5. Hard Hermes 的 delegate_task 是 orchestrator-workers,但 Hermes 没有 一个"主流程"在那里循环编排——所有的子任务派发都是父 Agent 在自己的 while 循环里 通过工具调用完成的。这种"用 Agent 实现 Workflow 模式"和直接写代码实现的 Workflow 相比, 有什么 trade-off?想清楚之后再去看第 7 章的 delegate_tool.py