速成课 · No. 10

agent 就是把一个语言模型放进一个循环里:推理、行动、观察、重复——直到目标达成。这个循环令人惊叹,可一旦放任不管,它只有大约一半的时候能成。真正的本事不是换一个更聪明的模型,而是去工程化这条链——那些步骤、那些 context、那些工具、那些边界——好让这个循环变成你敢信赖的东西。

只讲精髓 · 每个想法一个画面 · 可靠性高于魔法

§ 01

在动手造之前,先把定义弄得精确——因为 agent 是一个特定而狭窄的东西,而大部分麻烦,都来自在并不需要它的时候伸手去够它。

是放进循环里的模型,而不是一次性的答案

一个人在修漏水:试一下,看看发生了什么,调整,再试——不是一招到位的完美动作,而是行动与反馈的循环,直到修好为止。

一次普通的 LLM 调用接收输入、返回文本,一次就结束。而 agent 把模型裹进一个循环:它围绕目标推理,采取一个行动(调用一个工具),观察结果,然后再次推理——每一步下一步走哪,都由模型来决定。正是这个循环,让它能处理那些没有任何单条 prompt 能完成的开放式任务,比如「调查这个 bug 并提出修复方案」。

四个部分:模型、工具、记忆、循环

一个修理工远不止是一颗大脑——他车上有工具,有一本记着自己干过什么的本子,还有一步步把活儿干完的习惯。

一个 agent 是四样东西合在一起:一个用来推理的模型、一些用来对世界采取行动的工具、用来把状态带过每一步的记忆,以及一个驱动它直到目标达成或被边界叫停的循环。拿掉循环,你得到的是一个聊天机器人;拿掉工具,它就只会说话。力量——以及风险——都藏在这个组合里。

自主性是全部的意义所在——也是全部的危险所在

一种助手凡事都要先问过你才动,另一种你把目标一交、转身就走。后者有用得多,也更容易让你后悔。

让一个 agent 有价值的,是它自己决定如何去够到一个目标,跨越很多步,而不必每一步都把你拉进来。恰恰是同一份自主性让它变得危险:它会拐错弯、踩着一个糟糕的假设行动,然后一路走下去。这门课里其余的一切,都是关于如何拿到自主性的价值,而不必为那份危险付出全价。

大多数任务并不需要它

你不会为了挂一幅画就请一位总包工头。一把螺丝刀更快、更便宜,而且没什么会出岔子。

agent 是工具箱里最重的那把家伙。一条单独的 prompt、一份结构化输出,或一串固定的调用,都更便宜、更快,也可预测得多。只有当任务真的需要很多无法提前写好脚本、要随机应变的步骤时,才伸手去够 agent。如果你能把步骤写下来,那就把步骤写下来——别让一个循环去猜它们。

agent 是放进循环里、带着工具和记忆的模型。循环是力量,自主性是风险,而大多数任务两样都不需要。

§ 02

有一个事实应当塑造你的一切:一个典型的生产 agent,成功的时候只比一半多一点点。弄懂为什么,你就弄懂了你真正在造的是什么。

demo 能跑;活儿是剩下那一切

一辆车在展厅里启动得完美无瑕,这丝毫说不出它能不能熬过一个真实驾驶的冬天。展厅是最容易的那部分。

在一项 2026 年覆盖数千个生产 agent 的研究里,总体成功率大约是 57%——而基准分数大致比真实世界的结果高出三分之一。demo 跑的是幸福路径:干净的输入、一个为它量身打造的任务。生产则是 demo 过滤掉的一切。demo 是免费的;可靠性才是整个活儿。

链是相乘的,所以小错会累积

一场接力赛,每个选手都有 97% 的可靠度——可一旦有二十次交接,接力棒落地的次数反倒比不落多。

agent 是在长链里工作的——一个真实任务可能是二十个相互依赖的步骤。可靠性沿着链相乘:二十步、每步 97%,把你拉到 55% 上下。根本不需要哪一步犯什么「蠢」错;光是这道算术,就把你拖成了一次抛硬币。可靠性的第一根杠杆,是把链变短。

最糟的错误,藏在一个干净的答案背后

一份排版精美、却自信满满地错了的报告——每个标题都摆得妥妥当当,而三页之前,一个关键数字悄悄错了。

在一个多步任务里,一个中途的错误可能通过了最终输出的检查,却把结果给污染了——一个研究 agent 取回了正确的来源,在第三步把一个事实张冠李戴,然后写出一份干净却错了的摘要。最终答案看上去没问题;中间却坏了。这正是你最难抓到、却付出代价最大的那种失败模式。

可靠性是工程化出来的,不是 prompt 出来的

一座桥能立住,不是因为钢材有多聪明,而是因为有人工程化了那些载荷、那些接合处、那些余量。

你不会靠一条更好的 prompt 或一个更聪明的模型,去修好那 57%。你是去工程化它:更少的步骤、每一步给到对的 context、收窄过的工具、对中间结果的检查,以及对一次拐错弯能造成多大破坏所设的边界。**模型是原材料;可靠性是你围着它造出来的东西。**而这份活儿,就是这门课其余的部分。

一个典型的 agent 大约一半时候能成。那个数字不是模型的问题——它是工程的问题,而且这问题归你来解。

§ 03

一个 agent 的工作记忆,无非就是窗口里的那些文本,而在一个长任务里,那个窗口会被噪声塞满。管理它——而不是把它放大——才是让一个 agent 保持连贯的关键。

窗口是唯一的工作记忆

一位才华横溢的调查员,每天早上把一切都忘光,只能照着面前钉在板子上的那些便条来行动。

两步之间,模型什么都不记得,只记得此刻上下文窗口里有什么。当前的目标、试过些什么、上一个工具的输出——只要不在窗口里,就没了。所以一个 agent 在第十步时的能耐,是由你选择留在它面前的东西决定的,而不是由模型有多聪明。

真正杀死长任务的,是漂移

一长排人玩传话游戏——到了末尾,那句话已经悄悄变了样,而每个人都自信满满地复述着某个略微错了的东西。

长跑 agent 里占主导地位的失败,不是模型笨——而是 context 漂移:跨越很多步,窗口攒下了过时的事实、半截子的推理,还有自相矛盾,而最初的目标渐渐滑出了焦点。一个更大的窗口让这件事更糟,而不是更好——它给了漂移更多施展的空间。解法是卫生,不是容量。

边走边精选、边压缩

一位好编辑不会往上加页——他们删。每一步他们只递给你此刻最要紧的那一页,而不是那一摞越堆越高、什么都有的东西。

可靠的 agent 会主动管理窗口:只留这一步需要的,把做完的步骤摘要成一份简短的运行状态,而不是把整份逐字记录一路拖着走,并且每一回合都重新锚定目标。模型带走的是结论,而不是原始的历史。每一步,相关性都胜过完整性。

记忆活在窗口之外

一个长项目需要的是一个档案柜,而不是一张更大的桌子——你把要紧的东西存在别处,只在此刻需要时把那一个文件夹抽回来。

因为窗口是有限的,持久的记忆活在它之外:笔记、摘要,以及一个存储里可检索的历史,在相关时再取回来(和 RAG 是同一个检索思路)。正是这个,让一个 agent 能在一个大到无法一次握住的任务上工作——也正是这个,阻止它走到末尾时把开头给忘了。

一个 agent 有多连贯,取决于它的窗口。最大的上下文窗口赢不了——管理得最好的那个才赢。

§ 04

工具是 agent 越过文本、去真正做事的方式。它们也正是它长出手的地方——而这恰恰是为什么它们需要被仔细地收窄、描述,以及信赖。

tool use:模型来请求,你的代码来动手

一位聪明的助手,自己打不开那个档案柜——但能精确地告诉你抽哪个抽屉、拉哪个文件,还能读懂你拿回来的东西。

借助 tool use,你描述一组模型可以请求的函数——search_orderssend_emailrun_query——当它想用某一个时,它返回一个结构化的调用,你的代码去执行它,再把结果递回给它。模型决定做什么;你的代码掌控怎么做这就是一个 LLM 越过文字、伸进你的系统与世界的方式。

工具的描述是一道信任边界

一个新员工照着每个箱子上的标签、二话不说地照办——于是,谁写那些标签,谁就实际上控制了他做什么。

模型决定调用哪个工具,很大程度上是看工具的描述——所以一个误导性的或恶意的描述能把它带偏。把这组工具及其描述当作你安全面的一部分,而不是一种便利。一个 agent 信赖它的工具告诉它的东西;务必让那份信赖配得上。

最小权限:只交出最低限度

你给看屋子的人一把前门的钥匙,而不是保险箱、汽车和银行账户。访问权,按这份活儿来收窄。

给一个 agent 能干成这件事的最窄的工具。一个只需要读的研究 agent,不该握有发送、付款或删除的权限。收窄过的工具,会在循环拐错弯时缩小爆炸半径——而它一定会拐。你从未授予的能力,既不会被一个错误误用,也不会被一个攻击者误用。

MCP 与底下那套管线

一套新管线被飞快地铺穿了整栋屋子——而有些阀门,根本就没装过锁。

agent 通过连接器去够到工具——越来越多地是 Model Context Protocol(MCP)。它把一个 agent 如何长出手这件事标准化了,这很强大,如今也成了一个真实的攻击面:很大一部分远程 MCP 服务器,出厂时压根没有任何认证。如果一个连接器暴露了一些行动,它就需要认证、收窄和一份清单——把它当成它本就是的那扇门来对待。

工具给一个 agent 长出真正的手。把它们收窄到这份活儿、不信它们的描述、锁好那套管线——没有边界的能力,是一份负债。

§ 05

本能是去造一个聪明的 agent、让它什么都干。可靠的模式恰恰相反:把活儿拆开,让那个最适合每一块的、最简单的结构去把事干了。

一个什么都干的 agent,什么都干不好

一个工人被要求同时当建筑师、水管工、电工和验收员——对比一支各司其职、每人把一件事好好干完的专业小队。

一个带着二十个工具、却只揣着含糊使命的庞杂 agent,在每一步上都有太多出岔子的法子。一个有着清晰任务、只带几个工具的狭窄 agent,更可靠、更易测试,也更易调试。把活儿拆成一块块聚焦的小事——一件事上的深度,胜过十件事上的宽度。

先做计划,再去执行

一个好的包工头会在任何人抡起锤子之前先画好图纸——而图纸一旦清楚,大部分抡锤子的活儿,一个便宜的学徒就能干。

一个强力的模式是 plan-and-execute:一个有能耐的模型把目标拆成一个个具体的步骤,然后由更便宜、更狭窄的调用把它们执行下去。这缩短了推理链,让 agent 的意图在它行动之前就可被检视,还削减了成本——强模型做计划,小模型去执行。

编排才是真正的架构

一支管弦乐团不是一堆才华横溢的独奏家——而是指挥和总谱在决定谁在什么时候演奏。那份协调,才是音乐。

一旦你有了好几个 agent 或步骤,价值就转移到了编排上:把每个子任务路由给对的处理者、在它们之间传递干净的 context,以及在某个出错时处理错误。模型得到了关注,但那个协调层——谁在何时、带着什么 context 运行——才是一个多步系统真正成功或散架的地方。

当路径已知时,一条固定的链胜过一个循环

一条你每天都开的路线,你不会每天早上重新规划它——你照着那条已知的路走。只有当路真被堵住了,你才临场发挥。

如果步骤是可预测的,就把它们接成一条固定的链——调用 A,再 B,再 C——而不是一个每次都把显而易见的事重新决定一遍的 agent。把那个会随机应变的循环,留给真正开放式的部分。最可靠的系统,大体上是一条固定的流水线,加上一座只在真正需要的地方才有的、小小的自主性岛屿。

别去造一个什么都干的 agent。把活儿拆开、把可预测的部分固定下来,并且只在循环配得上它的地方,把它留得小小的。

§ 06

一个自主的循环,终究会做出某件你并不打算让它做的事。控制不是要拦住每一次拐错弯——而是要确保一次拐错弯,不会造成真正的伤害。

给循环设界:步数、时间、成本

一个带着硬顶的出租车计价器——到了设定的上限,这趟车就停,这样一次拐错弯就跑不出一笔无上限的车费。

第一根牵绳是硬性的边界:最大步数、一份时间预算、一个花费上限。没有它们,一个 agent 会永远循环下去、不停重复自己,或者悄悄烧掉一大笔钱去追一个它够不到的目标。边界不会让它变聪明——它们让它的失败有界、且能扛得过去。

在不可逆的事上设一道人工关卡

一家银行允许一个柜员查任何东西,但一笔大额转账需要第二个人签字。读是免费的;后果要过一道检查点。

任何 agent 收不回来的事——发送、付款、删除、发布、上线代码——都要在路径上设一道人工批准或一道硬性校验。被注入的那条指令、或那个糟糕的决定,可以提议这个行动,却无法独自把它完成。把检查点放在后果那里,而不是放在最末尾。

从批准每一步,到盯住被标记的那些

一个对每封邮件都签字放行的经理,永远没法规模化——而那个定下清晰政策、只在例外时才出手的,才能。

你不必在「给每一步盖橡皮图章」和「盲目放手」之间二选一。成熟的模式是 human-on-the-loop:agent 自己跑,你定下政策并盯着,而它只把那些不确定或有风险的时刻升级给你。随着信任增长,你批准得更少、监控得更多——但你永远不会停止盯着。

把一切都记下来,因为你早晚得解释它

一台飞行记录仪记下整段旅程——不是为了那些一切顺利的航班,而是为了那一次:你需要确切知道发生了什么、以及为什么。

一个 agent 会做出一些你没看见的决定。所以把它们记下来:每一步、每一次工具调用、每一份输入与输出,作为一条审计轨迹保留。当某件事出错时——而有了自主性,某件事一定会——这条日志,就是「弄清发生了什么」与「靠猜」之间的分别。它也越来越是监管方或客户会要求看的东西。

你没法让一个自主的循环永不出错。但你可以给它设界、在不可逆的事上设关卡、盯着它、把它记下来——好让「错」是扛得过去的。

§ 07

demo 和产品之间的鸿沟,是度量。一个你没在步骤一级测过的 agent,你信不过——而一个你靠手感调的 agent,你也改不好。

去评估那些步骤,而不只是答案

只看最终数字去给一张数学卷子打分,会放过那个靠两个相互抵消的错误算对了答案的学生——而你对他到底懂什么一无所知。

对 agent 来说,一次最终输出的检查是不够的——它会把坏掉的中间放行。步骤级 eval 给中途的推理、那些工具调用,以及那些检索打分:它选对工具了吗?传对参数了吗?用对事实了吗?你度量的是整段轨迹,而不只是终点。(Evals 那门课会深入讲这个。)

这架梯子,只爬到你非爬不可的那一阶

你不会为了把一个箱子搬到房间另一头就订一辆搬家卡车。你按这份活儿来匹配那套机器,而不是匹配到它之上。

有一架梯子:一条单独的 prompt,然后是结构化输出,然后是为了事实而上的 RAG,然后是工具,然后是一个完整的 agent 循环。每一阶都加上力量、成本,以及新的失败法子。从最底下开始,只在问题逼着你时才往上爬。大多数功能永远用不到最顶上那一阶——而一个本该用链的地方却用了 agent,是最常见的那种过度建造。

agent 是一个部件,而不是整个架构

一辆车有一台强劲的引擎,但它坐在一道防火墙后面,被喂进干净的燃油,被刹车包裹着。引擎不是车。

把 agent 放在一道接口后面,对进去什么、出来什么都做校验,并保有替换模型或重构循环的自由。agent 是你系统里一个强大、不可靠的部件——而不是它的地基。把系统造成这样:你能换掉这个 agent,而不必把一切都拆掉重来。

在你交付一个 agent 之前
  • 这到底需不需要一个循环——还是一条 prompt、一条链,或一次单独的工具调用,会更安全地把它干了?
  • 这条链能短到什么程度——你每拿掉一步,就是你赚到的一分可靠性。
  • 每一步窗口里有什么,以及什么被摘要掉、或丢掉?
  • 工具是否被收窄到了这份活儿所需的最低限度?
  • 边界是什么——最大步数、时间、花费——以及在不可逆行动上的那道关卡?
  • 步骤级 eval 是什么,它能告诉你这玩意儿真能干活,而不只是会演 demo?
说明你造过头了的几个嗅探测试
  • 给一个步骤明明能写下来的任务,用了一个 agent 循环
  • 一个带着十来个工具、揣着含糊目标的什么都干的 agent
  • 靠感觉调这个 agent,在步骤一级没有任何 eval。
  • 在步数或花费上没有边界,在有风险的行动上没有人工关卡。
  • 每一步都把整份历史拖进窗口里。
说明你造得不错的几个迹象
  • 活儿被拆解了——狭窄的 agent 加固定的链,只在需要的地方有一个小循环。
  • 窗口是经过精选与压缩的,而不是一个越堆越高的垃圾堆。
  • 工具是最小权限的,而那些连接器都做了认证。
  • 在任何不可逆的事上,有硬性边界和一道人工关卡
  • 你有步骤级 eval 和一条完整的审计日志,而那个 agent 坐在一道你能替换掉的接口后面。

构建 agent,不是去召唤自主性。它是那份平平无奇的工程——短链、干净的 context、收窄过的工具、边界,以及 eval——把一个 57% 的循环,变成某个你敢信赖的东西。

速成课终 · 7 章 · 可靠性高于魔法

接下来是实践:造一个最小的 agent,让它把一件真实的活儿端到端干完——一个目标、两三个收窄过的工具、一个步数上限,以及一条你读得懂的日志。然后,在你加上任何一个功能之前,先加一个步骤级 eval。但有一个念头要高过其余:模型是容易的那部分。围着它的那个循环——短、被盯着、有界、且被度量——才是一个值得信赖的 agent 真正被造出来的地方。