一、什么是 agent
模型 + 工具 + 循环 + 停止条件
四个零件agent
把这个词拆开,其实只有四样东西:
模型——会读会写会推理的那部分。 工具——它能真的动手的通道:读文件、跑命令、查数据库、发请求、点浏览器。 循环——做一步,看结果,再决定下一步。这是它跟"一问一答"最本质的差别。 停止条件——什么算做完了。是它自己判断,还是等你点头。
少了工具,它只能说;少了循环,它只能说一次;少了停止条件,它会一直干下去或者早早收工。
生活里的样子
叫师傅通马桶。 你说"下水道堵了",他自己带工具来、试一下、发现是弯头卡了、换个法子、通完放水试一遍确认不漏。他中间没打十个电话问你——因为他手上有工具,眼前有能验证的信号(水下不下去)。 这就是 agent。
在群里问"我家马桶堵了怎么办"。 一堆人给你出主意,都挺有道理,但没人到你家来。你还得自己判断哪条对、自己动手、自己发现失败了再回来问。这是聊天。
点外卖。 你说"随便,别辣",骑手不会替你决定吃什么——这活的"做对了没有"只有你知道,所以它必然要回来问你。这类活天生不适合全托。
装修队。 你给的是效果图和预算,队长自己排工序、自己叫材料、自己返工。但拆承重墙这一步他必须来问你——不可逆的动作永远留着人工闸门。
别被名字骗
三条判据怎么判断"这是不是 agent"
市面上很多东西都叫 agent,用这三条一问就清楚:
一、它能不能自己拿到反馈? 能跑命令看到报错、能查库看到真实数据、能截图看到渲染结果——这是 agent。只能凭你转述——这是聊天框套了个壳。
二、出错谁先发现? 它自己先发现,是 agent;永远是你先发现,那它只是个打字快的实习生。
三、什么时候停是谁定的? 它按验收标准自己判断"通过了",是 agent;每一步都要你说"继续",那循环在你脑子里,不在它那里。
别去纠结"这算不算 agent",去问"它的反馈从哪来"。 这个问题答不上来,加多少提示词都没用;答得上来,剩下的都是工程活。
省得走弯路
它不是什么三个常见误会
不是自动化脚本。 脚本是路径写死的,条件变了就挂。agent 是路径现想的,代价是同一个输入两次结果可能不一样——所以稳定的活反而该写成脚本,让 agent 去调这个脚本。
不是"更长的提示词"。 提示词优化的收益很快见顶。真正拉开差距的是它手上有什么工具、能不能自己验证。
不是"人不用管了"。 它换来的是你从"每一步都参与"变成"定标准 + 验收"。管的总量没少,管的位置变了。
三、你现在的习惯,已经攒了三个零件
把它们接起来就是 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 摆出来,你扫一眼。
红灯(它准备,你执行): 删数据、删文件、动生产库、发线上、对外发消息、动钱。它可以把命令写好、把影响面列清楚,但那一下回车是你按的。
这三档要提前写进项目规矩,别临场判断。 临场判断的问题是:你赶时间的时候标准会松,而赶时间正是最容易出事的时候。
流程改进不是"用更多 agent",是"把判断标准从你脑子里搬到文件里"。 搬出去的每一条,都同时提升了两件事:agent 的下限,和你自己的一致性。