读书笔记

Agent 怎么用

Agent 不是更聪明的聊天框,是一个能自己拿到反馈、自己决定下一步的循环。它的上限不在模型,在你给它的环境——工具、验证信号、边界。

约 28 分钟专题技术工作

一个 agent 能干多少活,取决于它能不能自己知道"我做对了没有"。

拿不到这个信号,它就只能一直问你、或者一直编。所有让 agent 变好用的功夫,最后都落在同一件事上:把"验收"这一步变成它自己能跑的东西。 这一页第一节说清 agent 到底是什么,第二节说什么活该交、什么活不该交,第三节结合你现在的工作习惯,第四节是四层落地做法(附可复制的模板),第五节讲工作流怎么滚起来。例子大部分是我按常见情况配的,不是某本书的案例,见页末灰框。

一、什么是 agent

模型 + 工具 + 循环 + 停止条件

四个零件agent

把这个词拆开,其实只有四样东西:

模型——会读会写会推理的那部分。 工具——它能真的动手的通道:读文件、跑命令、查数据库、发请求、点浏览器。 循环——做一步,看结果,再决定下一步。这是它跟"一问一答"最本质的差别。 停止条件——什么算做完了。是它自己判断,还是等你点头。

少了工具,它只能说;少了循环,它只能说一次;少了停止条件,它会一直干下去或者早早收工。

生活里的样子

叫师傅通马桶。 你说"下水道堵了",他自己带工具来、试一下、发现是弯头卡了、换个法子、通完放水试一遍确认不漏。他中间没打十个电话问你——因为他手上有工具,眼前有能验证的信号(水下不下去)。 这就是 agent。

在群里问"我家马桶堵了怎么办"。 一堆人给你出主意,都挺有道理,但没人到你家来。你还得自己判断哪条对、自己动手、自己发现失败了再回来问。这是聊天。

点外卖。 你说"随便,别辣",骑手不会替你决定吃什么——这活的"做对了没有"只有你知道,所以它必然要回来问你。这类活天生不适合全托。

装修队。 你给的是效果图和预算,队长自己排工序、自己叫材料、自己返工。但拆承重墙这一步他必须来问你——不可逆的动作永远留着人工闸门。

同一个活的两种做法
一问一答

你贴报错,它给一段代码

agent

它自己跑一遍,看到真实报错

一问一答

它猜你的项目结构

agent

它自己 ls 和 grep 去看

一问一答

改完你去验证

agent

改完它自己跑构建、自己截图比对

一问一答

错了你回来再问一轮

agent

错了它当场看到,当场换法子

一问一答

上下文是你手动喂的

agent

上下文是它自己找的

一问一答

你是执行者,它是顾问

agent

它是执行者,你是验收方

别被名字骗

三条判据怎么判断"这是不是 agent"

市面上很多东西都叫 agent,用这三条一问就清楚:

一、它能不能自己拿到反馈? 能跑命令看到报错、能查库看到真实数据、能截图看到渲染结果——这是 agent。只能凭你转述——这是聊天框套了个壳。

二、出错谁先发现? 它自己先发现,是 agent;永远是你先发现,那它只是个打字快的实习生。

三、什么时候停是谁定的? 它按验收标准自己判断"通过了",是 agent;每一步都要你说"继续",那循环在你脑子里,不在它那里。

别去纠结"这算不算 agent",去问"它的反馈从哪来"。 这个问题答不上来,加多少提示词都没用;答得上来,剩下的都是工程活。

省得走弯路

它不是什么三个常见误会

不是自动化脚本。 脚本是路径写死的,条件变了就挂。agent 是路径现想的,代价是同一个输入两次结果可能不一样——所以稳定的活反而该写成脚本,让 agent 去调这个脚本。

不是"更长的提示词"。 提示词优化的收益很快见顶。真正拉开差距的是它手上有什么工具、能不能自己验证。

不是"人不用管了"。 它换来的是你从"每一步都参与"变成"定标准 + 验收"。管的总量没少,管的位置变了。

二、什么活该交,什么活不该交

这一条能定八成

有没有裁判判断标准

能不能交给 agent,最强的单一判据是:这个任务有没有一个"不用问人就能判对错"的裁判。

写代码之所以是 agent 最先做好的领域,不是因为代码简单,是因为代码有裁判——编译器、测试、报错、浏览器截图。写年终总结没有裁判,所以它永远只能给你个草稿。

同一个人的一天
适合交出去

改完能跑一遍验证的

必须自己动手

对错要靠"业务上说得通"来判断的

适合交出去

边界清楚、影响面能划出来的

必须自己动手

牵扯十几个模块、说不清波及谁的

适合交出去

错了当场能看见的

必须自己动手

错了三个月后在对账时才暴露的

适合交出去

可逆的(改代码、生成文件)

必须自己动手

不可逆的(删数据、发通知、转账)

适合交出去

重复发生的

必须自己动手

一辈子就这一次的

适合交出去

你懂、能验货的

必须自己动手

你完全不懂、只能听它说的

你手上活儿的分类

线上老系统改功能。 有裁判(语法检查、页面能不能打开、订单能不能下单),但影响面常常说不清。适合交,但要把 diff 缩到一屏能看完。

排查"为什么这个数不对"。 裁判很强——查库能看到真值。非常适合交,而且只给只读权限最安全。

改样式、调布局。 裁判可以造出来(无头浏览器截图 + 量宽度)。造好裁判之前不适合交,造好之后特别适合。

动数据库、删文件、发线上。 裁判有,但错了不可逆。适合让它准备好、写清楚要动什么,执行那一下留给人。

决定要不要做一个功能。 没有裁判,只有取舍。这类别交,让它给你两边的最强论证,你自己拍板。

先看可逆性,再看有没有裁判。 不可逆的一律留人工闸门,哪怕它做得再对——因为这类事的期望收益不是按平均算的,是按最坏的一次算的。

三、你现在的习惯,已经攒了三个零件

把它们接起来就是 agent

你已经在做对的三件事只是散着放

看你这几个项目的工作方式,agent 的三个核心零件你其实都有了,只是还没接成一条链:

一、你在写"坑清单"。 每个项目的 CLAUDE.md 里都有一节"踩过的坑"——正则里不能用 \w 判断中文边界、flex 容器里的行内标记要包一层、后台菜单是硬编码的改这个文件才生效。这就是 agent 的常驻上下文,而且是最值钱的那种:外面搜不到、只有踩过才知道。

二、你定了硬闸门。 删除必须先确认、动数据库要先报备、只读排查随便。这就是 agent 的权限边界,而且划得比大多数人都清楚。

三、你有自测的手段。 无头浏览器在 393px 视口量 scrollWidth、改完模板跑语法检查、请求线上要带 Host 头否则假 404。这就是裁判。

这三样接起来之后

坑清单 → 它不用你提醒就避开。 不接的时候,你每次新开一个对话都要重说一遍"注意中文边界"。

闸门 → 它自己知道走到哪要停。 不接的时候,你得盯着它每一步。

裁判 → 它自己知道做完没有。 不接的时候,"我改好了"这四个字的可信度全靠你去复检。

都不难补

缺的那两件短板在哪

一、验收标准还是自然语言,不是命令。 "改完看一下手机上正不正常"——这句话它执行不了。改成一条能跑的命令 + 一个明确的断言(跑这个脚本,scrollWidth 必须等于 393),它就能自己循环到通过为止。这是收益最大的一步改造。

二、复盘没有固定的落点。 现在的坑是"想起来了就写进 CLAUDE.md"。应该变成每次收尾的固定动作:这次踩了什么、哪条已有规矩没生效、要不要升级成新规矩。不固定下来,信息就随对话消失了。

你不缺"用 agent 的意识",缺的是把口头标准变成可执行标准。 一句"验收标准 = 这条命令退出码为 0",比十句提示词优化都管用。

四、怎么创建一个 agent:四层,由轻到重

一次性提示语
这活只干一次。把目标、禁区、验收标准写清楚就行,不用留存。
项目记忆
这活会反复干,且规矩是项目级的。写进项目根目录的 CLAUDE.md,每次自动带上。
技能(skill)
有固定步骤的流程。写成一个带名字的技能,用的时候一句话唤起,不用每次复述步骤。
子 agent
需要独立干净的上下文、或者要收窄工具权限的专职活。单独一个定义文件。
定时 / 触发
不用人开口就该跑的(每天巡检、提交前自检)。挂到定时任务或者钩子上。
目标 · 禁区 · 验收

第 1 层:一次性提示语三段式

一次性的活也别只写目标。加上禁区和验收标准,返工率立刻降一半:

目标——要达成什么,不是"怎么做"。写"让手机上正文不横向滚动",别写"给 body 加 overflow-x hidden"(那是你替它想的方案,可能是错的)。 禁区——哪些文件不许动、哪些操作要先问、哪些方案已经试过不行。 验收——用什么命令、看什么信号、什么值算通过。

只写"看代码看不出来的"

第 2 层:项目记忆CLAUDE.md

放在项目根目录,每次自动进上下文。判断该不该写进去的标准只有一条:这件事能不能从代码里读出来?

该写: 踩过的坑和它的现象("改了却不生效,先去查这个文件,别翻缓存")、约定("手机优先,先写默认样式再加宽屏")、验证方法(那条自测命令怎么跑)、边界("这个目录是生成物,绝不手改")。

不该写: 目录结构、函数在哪(它自己会找)、通用编程常识、上次那个 bug 的修复过程(那是 git 的活)。

写坑的时候一定要写"现象",不只写"结论"。 "菜单不显示要改 menu.htm"——它只有在遇到"菜单不显示"的时候才想得起来这条;写成"改了菜单配置却不显示 → 去看 menu.htm 那行",它才认得出场景。

一条好规矩 vs 一条废规矩

废的: "注意代码质量。" —— 它本来就在注意,等于没说。

好的: "正则里不许用 \w 判断中文边界,Python 的 \w 把中文算 word 字符,会让紧跟中文的标记静默失效。" —— 有现象、有原因、有反例,它照着能避开。

废的: "部署到生产要小心。" —— 小心到什么程度?

好的: "改配置后必须带 Host 头 curl 验证,默认站点直接返回 404,不带 Host 测出来的结果是假的。" —— 可执行、能验证。

把"固定步骤"从脑子里搬出来

第 3 层:技能skill

当一件事步骤固定、但每次参数不同,就该做成技能。比如你已经有的那个部署技能——一句话唤起,不用每次再讲一遍"先构建、再上传、再重启"。

做成技能的三个信号: - 你已经第三次在对话里复述同一套步骤了 - 这套步骤里有顺序不能错的地方(先备份再改、先构建再传) - 有每次都会忘的那一步(清缓存、重启服务、改完要 reload)

技能就是一个带名字和一句话说明的文件夹,里面写清步骤。说明那句话要写"什么时候该用",不是"这是什么"——因为它是靠这句话决定要不要唤起你这个技能的。

两个理由,其余都不算

第 4 层:子 agent什么时候真的需要

只有两个理由值得单独开一个子 agent:

一、要独立干净的上下文。 比如让它把整个目录翻一遍找出所有引用点——这活会把几十个文件读进上下文,做完就没用了。放在子 agent 里,主线只拿到结论,不被垃圾撑爆。

二、要收窄工具权限。 排查线上问题的 agent,只给读文件、grep、只读查库,不给写权限。这不是防它使坏,是从结构上消除"手滑"这个可能性——比你在提示词里写十遍"不许改数据"可靠得多。

除此之外的"我想让它专门干某件事",用技能就够了,别开子 agent。

可复制

子 agent 定义模板(照着填,五格都别空)

名字:<一个动词短语,说清它干什么,比如 db-readonly-investigator>

什么时候用我:<一句话。这句是给主 agent 看的,它靠这句决定要不要叫你。
写"当需要查线上数据解释某个数字为什么不对时",
别写"这是一个数据库排查助手"。>

我能用的工具:<明确列出。能不给的一律不给。
排查类:只给读文件 / 搜索 / 只读 SQL
改代码类:给读写 + 跑构建,不给部署
写文档类:只给读写,不给执行命令>

我要做的事:
1. <第一步做什么>
2. <第二步做什么>
3. <怎么算做完了——写成可验证的>

我绝不做的事:
- 任何写操作(UPDATE / INSERT / DELETE / DROP / 删文件)
- <本项目特有的禁区>
- 拿不准的时候不猜,直接说"这里我不确定,需要你确认"

我返回什么:
<固定格式。比如:
- 结论:一句话
- 证据:查了什么、看到什么(贴真实输出,不转述)
- 不确定的地方:列出来
不要写成给人看的报告,主线要的是数据。>
都是低风险高频

建议你先建的三个从这三个开始

一、只读排查 agent。 线上数字对不上、页面不对劲的时候用。只给读权限,让它自己查库、看日志、读代码,回来给你"结论 + 证据 + 存疑"。这个最安全、用得最多、见效最快。

二、发布前自检 agent。 在你要发布之前跑:改了哪些文件、语法过不过、有没有碰到禁区目录、有没有漏掉那些"每次都忘"的收尾步骤(清缓存、重启、reload 后实测)。它不发布,只出一张检查单。

三、收尾复盘 agent。 一件事做完之后跑:这次踩了什么坑、哪条已有规矩本该拦住但没拦住、要不要补一条新规矩。它的产出直接是 CLAUDE.md 的一段 diff,你看一眼决定要不要合。

这三个的共同点:都不做不可逆的事。 先在零风险的地方把手感练出来,再往写操作那边挪。

别一上来就建一堆 agent。 建了不用的 agent 是负债——它会在不该出现的时候被唤起,还得你去纠正。一次只建一个,用满两周,再建下一个。

五、工作流怎么滚起来

关键是"往上升一级"

让每次踩坑都变成资产五级台阶

同一个坑踩第二次,说明上一次的教训停在了太低的台阶上。每次收尾问一句:这次的教训该待在哪一级?

第 1 级 · 对话里说过 —— 关掉就没了。默认所有教训都在这一级。 第 2 级 · 写进记忆 —— 跨对话还在。适合"这个项目的现状/决策"。 第 3 级 · 写进项目规矩 —— 每次自动生效。适合"这类改动必须怎么做"。 第 4 级 · 做成技能 —— 步骤不用再复述。适合"固定流程"。 第 5 级 · 变成检查项 —— 不靠记性,靠自动拦。适合"最容易忘、忘了代价大"的。

升到第 5 级的东西不该多。 大部分教训停在第 3 级就够了。但踩过两次的,必须往上升一级——这是硬规矩。

一个坑的完整生命

第一次: 改了模板 JS,整页空白。查了半天发现是模板引擎把某个符号当成变量了。→ 停在第 1 级,下次还会踩。

第二次又踩: 这次终于写进项目规矩——"改模板里的 JS 要注意这个符号,改完用这条命令验证,别用另一种方式测,它测不出来"。→ 升到第 3 级。

第三次不是踩,是懒得验证: 那就升到第 5 级——把那条验证命令挂进提交前的自检。→ 不靠记性了。

没裁判的活先造裁判

三种裁判,按可靠度排给 agent 装反馈信号

最强:机器判定。 退出码、语法检查、断言(这个值必须等于 393)。没有解释空间,它没法自欺欺人。

中等:可比对的产出。 截图、渲染出的 HTML、接口返回的 JSON。要它贴真实输出,不要它转述"看起来正常"。"看起来正常"这四个字是所有翻车的开始。

最弱:它自己说做完了。 只在改动很小、你会亲自复检的时候接受。

一个活如果连中等的裁判都造不出来,先别急着交给它——先花半小时把裁判造出来。 这半小时是这条链上回报率最高的半小时。

两种用法
收益递减

琢磨提示词怎么写更好

收益复利

把验收标准变成一条能跑的命令

收益递减

一次让它改二十个文件

收益复利

一次一个关注点,diff 一屏看完

收益递减

每次重新解释项目背景

收益复利

背景写进项目规矩,一次写多次用

收益递减

它说"改好了"就收

收益复利

它得贴出验证输出才算完

收益递减

踩了坑口头记住

收益复利

踩了坑当场升一级台阶

收益递减

所有权限全开图省事

收益复利

按活给最小权限,排查类只读

收益递减

出问题了换个说法再试一遍

收益复利

出问题了先问"为什么会这样",再动手

提前定好,别临场判断

人机分工的闸门三档

绿灯(它做完直接算数): 读、查、搜、分析、生成草稿、跑只读命令。不用问。

黄灯(它做,但要给你看过再进下一步): 改代码、改配置、改文档、生成迁移脚本。diff 摆出来,你扫一眼。

红灯(它准备,你执行): 删数据、删文件、动生产库、发线上、对外发消息、动钱。它可以把命令写好、把影响面列清楚,但那一下回车是你按的。

这三档要提前写进项目规矩,别临场判断。 临场判断的问题是:你赶时间的时候标准会松,而赶时间正是最容易出事的时候。

流程改进不是"用更多 agent",是"把判断标准从你脑子里搬到文件里"。 搬出去的每一条,都同时提升了两件事:agent 的下限,和你自己的一致性。

六、这套做法解释不了什么

免得期待错位

三个它治不了的问题边界

一、目标本身错了,它跑得越顺越糟。 agent 优化的是"怎么达成",不是"该不该达成"。方向的账,它一分钱都替你担不了。 这也是为什么取舍类的问题不该交出去。

二、你不懂的领域,它的产出你没法验收。 前面说过,这里再强调一次:没有验货能力的地方,交出去的不是活,是风险。 想用它进入新领域,可以——但要在沙箱里学,别直接交付。

三、协作和组织的问题,它不解决。 一个改动要等三个部门排期,这跟 agent 快不快没关系。编码被解决得越彻底,编码之外的环节就越成为瓶颈——这是另一个话题了。

  1. 一个 agent 能干多少活,取决于它能不能自己知道"我做对了没有"。
  2. 先看可逆性,再看有没有裁判。不可逆的一律留人工闸门。
  3. "看起来正常"这四个字,是所有翻车的开始。
  4. 同一个坑踩第二次,说明上一次的教训停在了太低的台阶上。
  5. 流程改进不是用更多 agent,是把判断标准从你脑子里搬到文件里。

这一页和站内《AI 写代码》《AI Coding 实操》《瓶颈不在写代码》是一组:那三篇讲"AI 写代码这件事本身靠不靠谱、卡在哪",这一篇讲"那怎么把它组织成能干活的东西"。"验证是瓶颈"这个判断,四篇是同一个。