循环终止是一道闸门
#thread/agent-loop
agent 循环(GPT 和 Claude 共享同一个骨架):model → tool calls → feed results back → repeat → stop。两者的主要差异在于谁掌控这个循环——原始 API(由你自己驱动:finish_reason/stop_reason)对比托管式(OpenAI Assistants/Responses 的 "runs",Anthropic 的 Agent SDK / Claude Code)。
核心在于终止:谁来判定"完成"? 在朴素循环里,执行者(模型)自证完成(end_turn / finish_reason=stop)。这正是不可靠的那一点——和贯穿本笔记库的那根神经一样:一个随机的执行者自行宣布成功,恰恰是你不能信任的东西(gatekeeper-not-driver)。
控制终止的三种方式 = 八种控制手段中的三种(control-methods):
- 信任执行者(朴素循环)
- 计量它——最大迭代次数 / 超时(StandMeet 的
force-final-answer;控制 #4) - 设闸——持续运行直到某个条件成立(
/goal;控制 #2)
/goal = 循环出口上的一道语义闸门(据文档确认)
/goal <condition> 是一个会话作用域的基于 prompt 的 Stop hook。每一轮结束后,(condition + transcript) 会被发送给一个独立的、全新的小模型(默认是 Haiku),由它返回是/否加一个理由;条件未满足 → 理由被反馈回去,循环继续。
- 生成者 ≠ 验证者,被产品化了。 做事的模型不是判定它完成与否的那个模型——由一个对这项工作没有既得立场的全新评估者来判。recognizer-not-generator 在这里被落地实现;文档明确把它点名为对抗"写代码的模型自己宣称代码正确"的防护手段。
- verify-cheaper-than-execute,字面意义上的体现——评判者是一个便宜的小模型;评估所耗的 token 相对于实际工作可以忽略不计。
- 局限(说实话): 评判者只能看到对话记录——它不能跑测试,也不能读文件。所以它判断的只是声称的内容 + 可见的输出;语义闸门是可以被刷分的(Goodhart 定律),只要你能让表面上说得过去的东西冒出来就行。因此才要"把条件写成输出本身能够证明的东西"。
两种闸门("eval 即类型系统"的分野)
- 机械闸门(脚本化的 hook,退出码):确定性强、可靠,但只能编码可判定的谓词(测试通过、文件存在)。
- 语义闸门(
/goal的 LLM 评判者):能处理模糊的"完成"(比如"每篇论文都是 A 级"),但评判者本身会出错。它靠分离(不同的模型、空白的上下文)去偏,而不是靠自身绝对正确。
→ 终止是任何 agent 循环中最承重的那个决策,而在那里设一道闸(机械的或语义的)就是让你不再盲目相信"我完成了"这句话的方法。