给你的编程智能体更多自主权
TL;DR
我的 SDD-flow skill 在关闭权限的情况下,把一个功能从规格一路带到能跑的代码,这样我不用逐步审批每一步。然后我把这些会话保存到 LangSmith,再把 trace 读回来。
三个好处:一份关于智能体在我没看着时做了什么的客观记录;用我自己的真实工作(而不是发布说明)来检验新模型的 evals;以及一个让智能体审查自己的行为、告诉我配置在哪里漂移了的循环。这些都不玄乎,而且在免费套餐上就能跑。
你别处得不到的那份记录
前一阵我写了一篇很兴奋的文章,讲我怎么搭起这条流水线、关掉权限、一气呵成地实现功能。那份兴奋我依然认。这篇是冷静的续集,它从一个无聊的事实开始:当一个智能体在关闭权限的情况下运行时,你并没有在看着。这正是它的全部意义,也是它的全部问题。
一个安静下来的智能体只留下一个产物:trace。你不读它,就是在赌「没有报错」等于「没出问题」。
而事情确实可能出问题,各位!这里有两个被我的 trace 抓到的例子:
- 一个用空消息启动的 subagent,没有报错,反而回了一句:「看起来你的消息发过来是空的。」这有一个回答的形状。它不是回答。在一次自主运行里,它就这么一路滑到下一步,仿佛真的干了活。
- 一个根本不存在的标识符
poliva83,被满怀信心地生成出来,还接进了配置里。我的用户名是pablooliva。poliva83谁也不是。
在信任一个新模型之前先检验它
一旦你有了那份记录,它就是 evals 的原料。
Claude Code 的默认模型在我脚下悄悄换了。Anthropic 会公布对一个新模型该有什么预期,这些说明我也读。但那是所有人用法的平均情况。关于我的用法,它什么也没说。
我的配置里有专门定制的 skill、一摞 CLAUDE.md 规则、依赖模型以特定方式行事的工作流。一个模型可以赢下每一个公开的 benchmark,却在我所依赖的那一件怪事上悄悄变差,因为发布说明并不知道我那一件怪事。不过话说清楚,我的配置一点都不怪。大家都说这是最好的配置。没人有像这样的配置。
evals 用确认代替指望。拿出一小把你自己的真实任务——你从 trace 里挖出来的那些——写下好的结果长什么样,等新模型一落地就重新跑一遍。分数稳住,你就放心继续。分数掉了,失败的用例直接指出哪个使用场景出现了回归,赶在它在真实工作里让你付出代价之前。公布的预期是先验;你的 evals 是确认。但凡你要依赖的东西,两个你都想要。
抬高你敢让它无人监督去做的上限
这是我最希望别人来偷走的那个好处。
SDD-flow 无人监督地跑完整个开发周期,只在智能体守在我给它的规则之内的限度里才管用:CLAUDE.md 的约定、该触发时触发的 skill、规规矩矩的插件。我越能信任这些,我就越敢不看着就把活交出去。所以问题不是「自主到底安不安全」,而是「我怎么持续抬高我能负责任地交出去的那个量」——而答案必须比「指望规则还成立」更靠谱。
trace 把这个循环交回给智能体自己来闭合。LangSmith 的免费套餐保留大约 14 天,所以每两周我会把 Claude 指向它自己的记录,请它审查自己表现如何。它遵守 CLAUDE.md 了吗?skill 和插件按该有的方式触发了吗?它在哪里漂移了?
它一旦发现什么,就会提出改动。一条老被忽略的规则,重写到能落地。一段触发出错的 skill 描述,收紧。一个含糊的约定,明确化。智能体把自己的行为对照它本该遵守的规则,告诉我这两者在哪里分了岔。
举个具体的。过去这一年的大部分时间里,Claude Code 只允许一层 subagent,一个智能体没法再启动另一个,我把这当成事实烤进了我的智能体定义里:「Agent 工具在你体内是失效的。」后来一个小版本悄悄启用了嵌套 subagent,一夜之间我的指令就在断言一件关于平台、却已经不再为真的事。我是撞了大运才发现的,碰巧刷到一条讲嵌套 subagent 的推文,就去刨根问底。修起来很容易:把一个会过期的事实,改成一条带理由的规则。难的是「发现」这一步,而它全靠我刷到了那条对的推文。审查循环就是你在没运气的时候,找到这种漂移的办法。
这是会累积的。每过一遍都把配置拧得更紧一点,于是下一次自主运行从更结实的地基上起步,于是我就能多交出去一点。trace 不只是垫在自主之下的安全网。它们是你挣到更多自主的方式。
这到底需要什么
比听起来要少。把 tracing 打开,一个环境变量;或者让 LangChain 的 LangSmith CLI skills 替你接好线:一条命令就把 trace、dataset、evaluator 直接装进 Claude Code,而它们正好对应上面那三个好处。
npx skills add langchain-ai/langsmith-skills --agent claude-code --skill '*' --yes --global
按固定的节奏去读它,而不是任由那个 dashboard 变成一个你永远不打开的标签页。把一小把真实任务拉进一个 eval set,好让下一次模型升级撞上一点阻力。然后让智能体审查它自己的 trace,把改你配置的 diff 递到你手上。
我仍然在关闭护栏的情况下跑。区别在于,我不再把一次安静的运行当成一次干净的运行,而且我有一个智能体帮我找出它哪里其实不干净。智能体会自我纠正,而我就能往后一靠,讲讲 Trump 的笑话……最好的笑话,没人有比这更好的笑话。