Skip to content

第 2 章:Agent 的最小组成单元

本章目标:把“Agent”从一个模糊名词拆成几个可操作的系统部件,建立后续章节共同使用的分析框架。
本章对应总纲:docs/ebook-outline.md 中“第 2 章正文写作提纲(2026-03-31 归档)”。


2.1 为什么必须先拆结构,再谈能力

很多人一谈 Agent,就喜欢直接谈“这个模型强不强”“会不会自动做事”“能不能自己完成任务”。这种讨论很容易失焦。

原因很简单:系统能力从来不是某一个部件单独决定的,而是由部件之间如何组织决定的。

同样一个模型:

  • 放在纯问答系统里,它只是回答器
  • 放在带工具的交互系统里,它变成执行协调者
  • 放在有状态、有反馈、有权限边界的循环里,它才开始接近 Agent

所以工程上更有价值的问题不是:

这个模型是不是足够聪明?

而是:

这个系统到底由哪些最小部件组成?这些部件如何配合,才能把一个目标持续推进下去?

如果这个问题答不清,后面所有“增强 Agent”的讨论都容易变成堆概念、堆名词、堆幻觉。


2.2 一个最小 Agent 至少包含哪几部分

本书采用一个非常务实的拆法。一个可工作的 Agent,最少可以拆成五类部件:

  1. 模型(Model)
  2. 工具(Tools)
  3. 记忆/状态(Memory / State)
  4. 规划与决策(Planning / Decision)
  5. 执行循环(Execution Loop)

这五个部件不是为了教学好看,而是因为它们刚好对应了一个 Agent 系统最核心的五个问题:

  • 用什么来理解和推理?
  • 用什么和外部世界交互?
  • 用什么保存上下文和历史?
  • 用什么决定下一步?
  • 用什么把这一切串成闭环?

少了其中任何一个,系统能力都会明显塌陷。


2.3 模型:负责理解、判断与生成,但不等于 Agent

2.3.1 模型的职责是什么

模型是 Agent 的认知核心。它通常负责:

  • 理解用户目标
  • 解释当前上下文
  • 根据已有信息做判断
  • 生成下一步动作建议
  • 在必要时生成要执行的工具调用参数

所以模型确实很重要。但重要不等于它可以独立定义整个系统。

2.3.2 为什么“只有强模型”仍然不够

只靠模型,你最多得到一个更聪明的回答器。

它也许能:

  • 分析问题
  • 写出计划
  • 提供建议
  • 生成代码草案

但它未必能:

  • 真的去读取文件
  • 真的去运行测试
  • 真的根据测试失败继续修复
  • 真的记住中间状态
  • 真的在风险动作前停下来请求确认

这就是一个基本事实:

模型负责“想”,但 Agent 还必须负责“做”与“继续做”。

2.3.3 一个常见误区:把模型升级误当成系统升级

工程里最常见的误判之一,就是把“模型更强了”直接等同于“Agent 更成熟了”。

这通常只说明一件事:认知核心可能变强了。

但系统层面的问题仍然还在:

  • 工具有没有被正确定义
  • 状态有没有被保存
  • 决策有没有边界
  • 执行有没有反馈闭环

所以判断一个 Agent 系统,不要只盯模型型号,而要看模型被放进了什么结构里。


2.4 工具:让系统不只会说,还能真的动手

2.4.1 工具为什么是 Agent 的第一道分水岭

没有工具,系统几乎只能停留在文本世界里。

有了工具,它才开始具备改变外部状态的能力。常见动作包括:

  • 读文件
  • 搜代码
  • 改文件
  • 运行命令
  • 调接口
  • 打开网页
  • 请求用户确认
  • 调用其他 Agent

工具的意义不是“功能更多”,而是:

系统第一次从“解释任务”变成“推进任务”。

2.4.2 工具不是越多越好

很多人一设计 Agent 就想把一堆工具全挂上去,结果很快把系统做成垃圾堆。

问题在于:

  • 工具越多,选择空间越大
  • 选择空间越大,误用概率越高
  • 误用概率越高,系统就越不稳定

好品味不是“什么都能调”,而是只暴露完成任务真正需要的能力

2.4.3 Claude Code 的现实例子

当前仓库把工具层暴露得非常直白:Read、Edit、Write、Grep、Glob、Bash、Agent、AskUserQuestion 这些能力都不是混成一个“大工具箱”,而是被刻意拆成不同接口。

这种拆法背后不是形式主义,而是几条很硬的设计规则:

  • 读、写、搜索、执行要分开建模,这样系统才知道自己现在是在感知环境,还是在改变环境
  • 高风险动作不能和低风险动作混成同一层,所以 Bash 这种能力天然更接近风险边界
  • 能用专用工具解决的问题,就不要退化成通用 shell,否则动作语义会变脏,反馈也更难约束
  • 工具不是越多越强,而是越清楚越稳

再看 examples/settings/settings-strict.json:1,这个项目甚至把工具权限直接写成了策略对象:

  • ask: ["Bash"]
  • deny: ["WebSearch", "WebFetch"]
  • allowManagedPermissionRulesOnly: true
  • allowManagedHooksOnly: true

这说明一个成熟 Agent 的工具层从来不是“模型想调什么就调什么”。真正的设计思路是:工具先按能力和风险分层,再由配置层决定本次运行到底开放到哪。

所以工具层真正回答的,不只是“系统能做什么”,还包括:

  • 哪些动作只是读取
  • 哪些动作会改状态
  • 哪些动作风险高
  • 哪些动作必须先问人
  • 哪些动作在当前环境根本不该放开

这才是现实里的动作接口层。没有这层分化,所谓“工具调用”最后通常只会退化成一堆不受控的万能命令。


2.5 记忆与状态:没有状态,系统就只能重复失忆

2.5.1 为什么状态不是“可选增强”

很多人把记忆理解成“聊天记录保存”或者“长期记住用户偏好”。这太浅了。

对 Agent 来说,状态首先意味着:

  • 当前目标是什么
  • 已经做到了哪一步
  • 哪些动作做过了
  • 哪些结果失败了
  • 当前环境是什么状态
  • 后面该延续什么上下文

如果这些东西没有被保存,系统每一轮都像刚醒来一样重新猜。

那就根本谈不上持续推进任务。

2.5.2 状态不只有一种

工程上至少可以分几层:

  1. 瞬时上下文:当前轮对话、当前工具输出
  2. 会话状态:这一轮任务的中间结果、任务列表、暂存结论
  3. 持久记忆:用户偏好、项目背景、长期规则
  4. 外部状态:文件系统、Git 状态、Issue 状态、服务响应

真正的 Agent 往往同时依赖这几层,而不是只靠聊天历史。

2.5.3 为什么状态层最容易被低估

很多入门讨论会把注意力都放在模型和工具上,因为它们最显眼。

但真正让系统从“一次回答”变成“持续推进”的,往往恰恰是状态层。因为只要状态管理做不好,系统就会不断出现这些问题:

  • 重复做已经做过的事
  • 忘记前一轮为什么失败
  • 无法判断任务当前处于哪个阶段
  • 不能稳定地把反馈接到下一轮

所以状态不是锦上添花,而是执行连续性的地基。


2.6 规划与决策:不是为了好看,而是为了少走弯路

2.6.1 规划的本质

规划不是让模型写一段漂亮计划书。规划真正的价值是:

  • 降低盲动
  • 把任务拆成可执行步骤
  • 在多种路径里选一条更合理的路
  • 在执行前识别风险和依赖

如果没有规划层,系统很容易陷入两种坏状态:

  1. 一上来就乱做
  2. 说得头头是道,但根本不落地

2.6.2 决策发生在每一轮,而不只在开头

很多人把规划理解成“任务开始前生成一个计划”。这只说对了一半。

真正的 Agent 还需要持续决策:

  • 现在该读文件还是直接改?
  • 是继续当前路径,还是回退重查?
  • 是该问用户,还是可以自主处理?
  • 是该启动子 Agent,还是自己完成?
  • 当前错误说明代码逻辑错了,还是上下文还不够?

所以更准确地说,规划层包含两部分:

  • 前置规划:先设计路径
  • 过程决策:边执行边修正

2.6.3 这层为什么不能硬编码成固定流程

固定流程当然有价值,但它解决的是“已知路径问题”。

而 Agent 更擅长处理的是:

  • 信息不完整
  • 反馈会改变路径
  • 环境不断变化
  • 需要临场判断

当任务具备这些特点时,规划与决策就不再是装饰,而是核心能力。


2.7 执行循环:把前面四部分真正焊接起来

2.7.1 为什么循环才是系统的骨架

现在把前面四部分摆在一起:

  • 模型负责理解与判断
  • 工具负责行动
  • 状态负责连续性
  • 规划负责选择路径

但这些部件如果不被串起来,只是零件,不是系统。

真正把它们焊成 Agent 的,是执行循环。

最小循环可以写成:

读取状态 -> 理解目标 -> 选择动作 -> 执行动作 -> 接收反馈 -> 更新状态 -> 再判断

只要这个回路存在,系统就可以持续推进任务。

2.7.2 为什么很多“伪 Agent”会失真

因为它们通常只做了前半段:

  • 理解问题
  • 生成建议
  • 给出计划

但没有后半段:

  • 真正执行
  • 接收反馈
  • 根据反馈继续迭代

于是看上去像在做事,实际上只是更复杂的文字表演。

2.7.3 停机条件同样属于执行循环的一部分

很多人只关心系统怎么开始跑,却很少认真设计它怎么停。

但一个成熟 Agent 的循环一定包含停机条件,例如:

  • 目标已经完成
  • 当前路径已经证伪
  • 风险动作需要授权
  • 缺少关键上下文,必须请求外部输入
  • 达到明确的失败边界

如果没有停机条件,循环就会退化成盲目试错;如果停得太早,系统又只会做半截事。

所以执行循环不是“不断重复”,而是“有边界地持续推进”。


2.8 这五个部件之间是什么关系

现在可以把它们之间的关系压缩成一句话:

模型负责判断,工具负责行动,状态负责连续,规划负责选路,循环负责把一切变成持续运行。

如果你愿意再工程化一点,可以这样理解:

部件回答的问题缺失后会怎样
模型现在该怎么理解与推理?系统不会判断
工具现在能做什么动作?系统只能建议
状态已经发生了什么?系统持续失忆
规划下一步为什么这样走?系统容易乱撞
循环如何持续推进直到停机?系统只能做一轮

这张表的意义在于:以后你看到任何一个所谓 Agent 系统,都可以先别听营销词,直接拿这五项去查。

如果它说自己是 Agent,但:

  • 没有工具,只会输出建议
  • 没有状态,每轮重来
  • 没有反馈闭环,只跑一步
  • 没有决策层,只是固定脚本

那它大概率就不是一个成熟的 Agent。


2.9 从“部件视角”看系统设计,为什么更稳

当你开始用“最小组成单元”去看系统,会获得两个好处。

第一,你不会再被营销词带偏

别人说“我们有 Agent”。你不用吵概念,只要追问:

  • 模型是什么?
  • 工具是什么?
  • 状态存哪?
  • 怎么决策?
  • 闭环怎么跑?

对方答不上来,基本就露馅了。

第二,你能更稳地做设计取舍

因为很多问题会变得非常具体:

  • 当前问题是模型不够强,还是工具描述太差?
  • 是状态管理有洞,还是规划层没起作用?
  • 是工具太少,还是执行循环没有接住反馈?

这比一句“Agent 不够智能”有用得多。

“Agent 不够智能”这话通常是懒。


2.10 本章小结

这一章真正做的,不是介绍一堆术语,而是建立一把拆系统的刀。

你现在应该记住五件事:

  1. Agent 不是一个单点能力,而是多个部件协作形成的系统。
  2. 模型很重要,但模型绝不等于 Agent。
  3. 工具让系统具备行动能力,状态让系统具备连续性。
  4. 规划负责选路,执行循环负责把各部件焊成闭环。
  5. 以后判断一个系统是不是 Agent,先看这五个部件是否成立。

下一章我们不再只讲静态结构,而是沿着一次真实请求往下走:从用户提出任务开始,看一个 Agent 到底如何一步步形成完整闭环。