第一章 Agent 为什么会出现
1. 复杂任务为什么逼出了 Agent
讨论 Agent,最容易从词开始:模型、工具、工作流、记忆、规划、技能、多 Agent。这些词堆在一起,看着像目录,其实没回答问题。换一个角度,从一个具体任务出发会清楚得多。
"帮我修一个登录模块的 Bug。"
这句话听上去像普通请求,做起来却是一条工作链:理解目标 → 进入代码仓库和运行环境 → 读代码 → 跑测试 → 看报错 → 调整判断 → 改文件 → 再验证。每一步都可能失败,失败之后还得继续往前走。这不是一段文本,是一个持续推进的过程。
把这种任务摆在过去几类系统面前,缺口就出来了。
#mermaid-svg-GiXVVGvx0hblELTH{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-GiXVVGvx0hblELTH .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-GiXVVGvx0hblELTH .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-GiXVVGvx0hblELTH .error-icon{fill:#552222;}#mermaid-svg-GiXVVGvx0hblELTH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GiXVVGvx0hblELTH .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-GiXVVGvx0hblELTH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GiXVVGvx0hblELTH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GiXVVGvx0hblELTH .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-GiXVVGvx0hblELTH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GiXVVGvx0hblELTH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GiXVVGvx0hblELTH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GiXVVGvx0hblELTH .marker.cross{stroke:#333333;}#mermaid-svg-GiXVVGvx0hblELTH svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GiXVVGvx0hblELTH p{margin:0;}#mermaid-svg-GiXVVGvx0hblELTH .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-GiXVVGvx0hblELTH .cluster-label text{fill:#333;}#mermaid-svg-GiXVVGvx0hblELTH .cluster-label span{color:#333;}#mermaid-svg-GiXVVGvx0hblELTH .cluster-label span p{background-color:transparent;}#mermaid-svg-GiXVVGvx0hblELTH .label text,#mermaid-svg-GiXVVGvx0hblELTH span{fill:#333;color:#333;}#mermaid-svg-GiXVVGvx0hblELTH .node rect,#mermaid-svg-GiXVVGvx0hblELTH .node circle,#mermaid-svg-GiXVVGvx0hblELTH .node ellipse,#mermaid-svg-GiXVVGvx0hblELTH .node polygon,#mermaid-svg-GiXVVGvx0hblELTH .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-GiXVVGvx0hblELTH .rough-node .label text,#mermaid-svg-GiXVVGvx0hblELTH .node .label text,#mermaid-svg-GiXVVGvx0hblELTH .image-shape .label,#mermaid-svg-GiXVVGvx0hblELTH .icon-shape .label{text-anchor:middle;}#mermaid-svg-GiXVVGvx0hblELTH .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-GiXVVGvx0hblELTH .rough-node .label,#mermaid-svg-GiXVVGvx0hblELTH .node .label,#mermaid-svg-GiXVVGvx0hblELTH .image-shape .label,#mermaid-svg-GiXVVGvx0hblELTH .icon-shape .label{text-align:center;}#mermaid-svg-GiXVVGvx0hblELTH .node.clickable{cursor:pointer;}#mermaid-svg-GiXVVGvx0hblELTH .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-GiXVVGvx0hblELTH .arrowheadPath{fill:#333333;}#mermaid-svg-GiXVVGvx0hblELTH .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-GiXVVGvx0hblELTH .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-GiXVVGvx0hblELTH .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GiXVVGvx0hblELTH .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-GiXVVGvx0hblELTH .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GiXVVGvx0hblELTH .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-GiXVVGvx0hblELTH .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-GiXVVGvx0hblELTH .cluster text{fill:#333;}#mermaid-svg-GiXVVGvx0hblELTH .cluster span{color:#333;}#mermaid-svg-GiXVVGvx0hblELTH div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-GiXVVGvx0hblELTH .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-GiXVVGvx0hblELTH rect.text{fill:none;stroke-width:0;}#mermaid-svg-GiXVVGvx0hblELTH .icon-shape,#mermaid-svg-GiXVVGvx0hblELTH .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GiXVVGvx0hblELTH .icon-shape p,#mermaid-svg-GiXVVGvx0hblELTH .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-GiXVVGvx0hblELTH .icon-shape .label rect,#mermaid-svg-GiXVVGvx0hblELTH .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GiXVVGvx0hblELTH .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-GiXVVGvx0hblELTH .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-GiXVVGvx0hblELTH :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 传统软件
持续推进复杂工作
单轮 LLM
工作流
Agent
传统软件在确定性执行上仍然最强:规则清楚、输入输出明确,它可靠、可测试、可维护。批处理、服务编排、数据库事务、CI/CD,这些今天依旧是它的主场。它没有失效,只是不擅长"模糊目标 + 开放环境"。
单轮 LLM 补上了模糊输入这一环------能解释、能摘要、能分类、能在不完整信息下给一个局部合理的判断。但放进"修 Bug"这种任务里立刻露怯:它不会自己读文件、不会跑命令、不会改环境,也无法验证自己说的"应该可以工作"是不是真的工作。它让局部能力变便宜了,没把这些能力组织起来。
工作流 是最自然的中间方案:把任务拆成固定步骤,每一步插模型调用、工具调用、规则判断。优势很清楚------路径稳定、可审计、好测试。但它的强项也是边界:工作流靠的是已知路径,而复杂任务的难点恰恰在于路径要在运行中决定。读完第一个结果,下一步该搜什么、改什么、试什么,往往写不死。继续堆分支,就是一棵不断膨胀的人工决策树。
缺口因此清楚:传统软件管稳定规则,单轮 LLM 管局部理解,工作流管已知路径------三者都没覆盖一类任务:在开放环境里持续推进复杂工作。这类任务有个共同特征------复杂度不能被一次对话压缩。构建操作系统、维护大型代码库、定位跨服务故障、规划复杂迁移,这些事不是"知道答案"就结束,必须不断观察、调用、记录、调整。真正被压缩的不是过程本身,是人类亲自参与每一环节的比例。
工具在这里成了关键。它不是一份"功能越多越强"的插件清单,而是把开放环境的复杂度收束进一组可调用、可组合、可验证的边界。有了边界,系统就不必每次从零面对世界,可以站在已有抽象上继续往前走。
Agent 正是从这里长出来的------它不是传统软件的替代,不是单轮 LLM 的升级,也不是工作流换了个名字,而是一种新的运行结构:用模型处理局部理解,用工具进入真实环境,维持状态连续,根据反馈调整路径,保留控制,但不要求所有路径事先写死。
现实中已经能看到这种结构的雏形。Claude Code 风格的插件命令会显式声明一条任务允许调用哪些工具------关心的不是工具数量,而是任务在什么边界里运行才可控。OpenHarness 在执行前先做一道运行前检查------把"能不能安全连续地跑起来"当成任务的一部分。这些设计指向同一件事:系统不再满足于"一次回答",而是开始为多步任务准备运行环境、边界和恢复能力。
为什么必须观察环境?因为外部世界本身就是最权威也最便宜的事实来源。修 Bug 要看真实代码、真实报错、真实测试结果;整理材料要面对真实文档、真实版本差异。直接和环境交互再修正判断,比在脑子里复制一个完整世界再行动便宜得多。
Agent 不是先有定义再有项目,多数情况是反过来------项目为了接住复杂任务不得不长出这些结构,事后才被总结成一个概念。只要任务需要在开放环境中持续推进,路径不能事先写死,系统必须依赖反馈和验证向前走,类似的结构就会反复出现,不管它叫不叫 Agent。
下一个问题摆出来了:它到底是什么?
2. Agent 到底是什么
定义 Agent 难,不在于写不出一句话,而在于这句话能不能划清边界。边界不清,Agent 就退化成功能标签:会调工具的是 Agent,能多轮对话的是 Agent,能拉子任务的也是 Agent------什么都包括,等于什么都没说。
先说它不是什么。
它不是模型。模型提供语言建模、模式提取、局部推理和生成,但本身不持有目标,不持有状态,也不天然进入外部世界。一次模型调用再强,仍然只是模型调用。
它不是工作流的另一个名字。工作流要求路径预先设计好,Agent 允许路径在运行中决定。两者并不互斥,但绝不是同一个东西。
它不是工具列表。接上搜索、终端、浏览器、数据库不等于 Agent。工具是入口,不是结构。会调工具只是表面现象。
最小定义:Agent 是一种围绕目标、环境、行动、反馈与验证组织起来的软件系统。
这句话故意没把"模型"放在最前,也没把"规划""记忆"写进定义------它们重要,但属于实现层。Agent 之所以不同于普通软件自动化,不在于它会不会说话,而在于它能否在目标约束下持续观察环境、调用能力、吸收反馈、调整行动,并把整个过程维持在可继续推进的状态中。这条链路存在,内部用大模型、小模型、规则引擎都行;这条链路不存在,模型再强、工具再多也不是 Agent。
骨架画出来是这样:
#mermaid-svg-XCclOPwZkoMlUQjC{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-XCclOPwZkoMlUQjC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-XCclOPwZkoMlUQjC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-XCclOPwZkoMlUQjC .error-icon{fill:#552222;}#mermaid-svg-XCclOPwZkoMlUQjC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-XCclOPwZkoMlUQjC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-XCclOPwZkoMlUQjC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-XCclOPwZkoMlUQjC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-XCclOPwZkoMlUQjC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-XCclOPwZkoMlUQjC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-XCclOPwZkoMlUQjC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-XCclOPwZkoMlUQjC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-XCclOPwZkoMlUQjC .marker.cross{stroke:#333333;}#mermaid-svg-XCclOPwZkoMlUQjC svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-XCclOPwZkoMlUQjC p{margin:0;}#mermaid-svg-XCclOPwZkoMlUQjC .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-XCclOPwZkoMlUQjC .cluster-label text{fill:#333;}#mermaid-svg-XCclOPwZkoMlUQjC .cluster-label span{color:#333;}#mermaid-svg-XCclOPwZkoMlUQjC .cluster-label span p{background-color:transparent;}#mermaid-svg-XCclOPwZkoMlUQjC .label text,#mermaid-svg-XCclOPwZkoMlUQjC span{fill:#333;color:#333;}#mermaid-svg-XCclOPwZkoMlUQjC .node rect,#mermaid-svg-XCclOPwZkoMlUQjC .node circle,#mermaid-svg-XCclOPwZkoMlUQjC .node ellipse,#mermaid-svg-XCclOPwZkoMlUQjC .node polygon,#mermaid-svg-XCclOPwZkoMlUQjC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-XCclOPwZkoMlUQjC .rough-node .label text,#mermaid-svg-XCclOPwZkoMlUQjC .node .label text,#mermaid-svg-XCclOPwZkoMlUQjC .image-shape .label,#mermaid-svg-XCclOPwZkoMlUQjC .icon-shape .label{text-anchor:middle;}#mermaid-svg-XCclOPwZkoMlUQjC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-XCclOPwZkoMlUQjC .rough-node .label,#mermaid-svg-XCclOPwZkoMlUQjC .node .label,#mermaid-svg-XCclOPwZkoMlUQjC .image-shape .label,#mermaid-svg-XCclOPwZkoMlUQjC .icon-shape .label{text-align:center;}#mermaid-svg-XCclOPwZkoMlUQjC .node.clickable{cursor:pointer;}#mermaid-svg-XCclOPwZkoMlUQjC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-XCclOPwZkoMlUQjC .arrowheadPath{fill:#333333;}#mermaid-svg-XCclOPwZkoMlUQjC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-XCclOPwZkoMlUQjC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-XCclOPwZkoMlUQjC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XCclOPwZkoMlUQjC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-XCclOPwZkoMlUQjC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XCclOPwZkoMlUQjC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-XCclOPwZkoMlUQjC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-XCclOPwZkoMlUQjC .cluster text{fill:#333;}#mermaid-svg-XCclOPwZkoMlUQjC .cluster span{color:#333;}#mermaid-svg-XCclOPwZkoMlUQjC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-XCclOPwZkoMlUQjC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-XCclOPwZkoMlUQjC rect.text{fill:none;stroke-width:0;}#mermaid-svg-XCclOPwZkoMlUQjC .icon-shape,#mermaid-svg-XCclOPwZkoMlUQjC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XCclOPwZkoMlUQjC .icon-shape p,#mermaid-svg-XCclOPwZkoMlUQjC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-XCclOPwZkoMlUQjC .icon-shape .label rect,#mermaid-svg-XCclOPwZkoMlUQjC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XCclOPwZkoMlUQjC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-XCclOPwZkoMlUQjC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-XCclOPwZkoMlUQjC :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 目标
行动
环境
反馈
验证
这张图里最容易被忽略的不是"行动",是反馈和验证。很多系统能根据目标生成下一步,也能通过工具改变环境,但如果结果不能重新进入系统,或者进入后没被验证,链路就会退化成"不停生成下一步建议",而不是真正在推进任务。
定义里最关键的词是系统。把 Agent 当系统而不是能力标签,很多混乱会立刻减少。系统意味着:有输入输出但不止于输入输出,有内部状态但不只是历史消息堆积,和环境之间有边界但边界不是装饰------边界决定什么能被看见、被调用、被修改、必须被阻止。讨论系统就必须整体讨论:目标如何进入、状态如何保存、行动如何发起、结果如何回灌、错误如何止损、验证如何进行。这些问题不存在,讨论的就不是 Agent,是某个局部功能。
所以本书也不愿意把 Agent 简单说成"能自主行动的 AI"。"自主" 这个词太容易把讨论引向"它像不像人、会不会自己拿主意"这种方向。工程上真正要回答的不是它像不像人,而是它如何被约束地行动 ------能不能在给定目标下,根据环境反馈调用外部能力,维持状态连续,并在必要时通过验证和回退修正自己的路径。做到这一点,它就具备了 Agent 的工程内核,可以受限,也可以强大;可以高度自治,也可以始终在人类监督下。Agent 不是关于"自主"的神话,而是受控行动的结构。
骨架展开就能看到不可回避的五个支点:目标 让系统有任务可推进,没有目标的系统只有响应;环境 让它面对的不是封闭输入,是需要观察、读取、修改的外部世界;行动 让判断转化为外部效果而不只是建议;反馈 让它在行动后能重新看见世界发生了什么;验证在反馈之上再追问一层------这些变化是否符合目标、是否满足约束、这一步是否真的成立。少了验证,再多反馈也只是催着系统生成下一步,不知道这一步是成功、失败还是偏离。
那状态、记忆、规划、技能呢?重要,但属于这条骨架的展开方式:状态让系统不必每次从零开始,记忆让过去的信息继续起作用,规划让多步任务的方向更清楚,技能让一次性的局部处理沉淀成可复用单元。它们依附在前面那条更基本的链路上,离开目标、环境、行动、反馈、验证,就会重新变成松散的概念陈列。
骨架立起来,Agent 与其他对象的边界也清楚了:和传统软件相比,它面对的不再是规则稳定的封闭执行;和单轮 LLM 相比,它把局部推理放进了持续运行的系统;和固定工作流相比,它不要求所有关键路径事先写死。Agent 不在这些对象之外,而是在它们之间重新组织了一条运行结构------传统软件提供确定性执行,模型提供局部理解,工作流提供路径控制,Agent 把这些能力放进同一个持续推进任务的系统里。
定义重要不是为了争一个词的使用权,是为了决定后面的问题怎么问。把 Agent 当能力标签,后面就一直在问"它会不会某个功能";把 Agent 当系统形态,问题会变成:它如何进入环境,如何管理边界,如何保存状态,如何沉淀能力,如何组织验证。本书选后者。
这一章想落下的判断只有一句:
Agent 不是功能标签,是一种系统形态。
它的价值不在于给模型再贴一层"自动化"包装,而在于把目标、环境、行动、反馈、验证组织成一条能够持续推进复杂任务的运行结构。
既然关键不在"工具更多",而在"如何通过工具进入世界并约束复杂度",下一个要说清楚的问题就摆在面前:工具到底是什么,边界又在哪里。