看到 HN 上那条关于 agentic harness 的帖子,我一开始以为是又一篇"agent 架构图解"。读到中间那段"接口可以随便换,harness 不动,有的 agent 根本没 UI"才确认值得点开。这条在讲的是 LLM 外面那一圈决定 agent 继续还是停的基础设施和逻辑,不是界面。出处是 HN 上一条讨论,主帖和下面评论一起看才有意思。
主帖引了 Simon Willison 对 AI agent 的定义——一个带着工具、在循环里跑、直到达成目标的 LLM。这个定义同行都熟,真正让我停下来的不是它,是循环里那个"评估自己输出、判断任务完没完成"的机制。主帖把这个机制归进 harness,和界面分开。评论里有人往下推了一步:done-check 应该是一个放在模型外面的确定性闸门,不是让 LLM 问自己"我干完了吗"。
顺手跑了一下,用最糙的方式验证这个说法。
我让模型改 auth.py,改完自己判断是否完成。
你:把 auth.py 的登录逻辑改成用 bcrypt 校验。改完自己判断是否完成,完成了就回答"完成",没完成就继续改。
Claude:完成。
它说"完成"的时候,我跑测试,挂了两条:一条 import 路径错,一条函数签名没对齐。模型根本没看到这两条。不是撒谎,是它真以为自己干完了。
这跟评论里那句话对得上:model self-assessment inherits blind spots。让模型自评,等于让一个不知道盲点在哪儿的人自己报告他有没有盲点。prompt 里写"你自己判断"没有用,盲点不会因为被问了就自己亮出来。
后来我把 done-check 换成外面一个脚本:跑一遍测试,测试过了才算完成,不过就带着错误信息把上下文再喂回去。跑通了。不是模型变聪明,是把"判断完成"这件事从模型手里拿走了。
我自己的夹子里存了几个号称"agent 工作台"的工具,界面都挺像那么回事,但 done-check 还是靠模型自评,一碰到边界条件就原地转圈。跑通这个之后我再看这些工具,先不看 UI,先翻它们把 done-check 放在哪了。
这篇里还有一个说法我记到现在:harness 是「当上下文窗口忘掉一切之后还活下来的东西」——指那些不随单次对话消失的持久规则和验证脚本。
讨论里那个说法是「everything that survives when the context window forgets」。
这个说法值得细想。你在一次对话里苦口婆心跟 agent 说的规则——"只改 auth.py""别新增依赖""改完跑测试"——下一次对话就没了。agent 的可靠性不是靠某一次对话里把话说清楚,是靠那些不随上下文一起被忘掉的东西:验证脚本、约束文件、pre-commit 检查。会随上下文忘掉的,都不算 harness。
评论里还有一个人把 harness 拆成两类,提到 Birgitta Böckeler 的一篇东西:sensors 和 guides。sensors 是反馈,回头看,测试、done-check 都是;guides 是前置规则,在 agent 动手之前就框住它。我一开始只盯着 sensors,觉得有测试就齐了,后来想想 guides 那半我根本没做。"只改 auth.py"如果只在 prompt 里写一遍,就是 guides 但没 persist;写成一个约束文件,才算进了 harness。这又回到上面那条。
还有个评论说需要显式的失败状态,带一个有上限的重试预算。我也撞上了。第一版 done-check 是"测试不过就继续喂回去",结果它来回试了四次,每次都在同一个地方打转。没有失败出口,它只能继续试。后来我加了个"连续三次同样的错误信息就停,输出'搞不定'",它才肯停下来。显式的失败状态不是给 agent 留面子,是给整个流程一个结束条件。
主帖里还提到 function calling 让 LLM 能访问训练数据里没有的外部上下文。这块我没展开,不是这周关注的点。
不点链接也能带走一句:让 agent 自己判断"干完了吗"是一种幻觉,done-check 必须是一个模型外面的确定性闸门;另外,只有活得过上下文窗口的规则和脚本,才算真的 harness,剩下的都是那一次对话里的运气。
