自主智能体(Autonomous Agent)最关键、也最不可靠的控制信号,不是工具调用、不是记忆检索,而是那一句"我完成了"。当执行壳把终止判定权交还给模型自己时,停止条件就从工程契约退化成了一句散文。本轮聚焦 2026 年四支独立团队在一年内共同命名的同一故障——完工幻觉:SRI Lab 测出主流编码体对已通过的正确代码反复打补丁的比例超过 50%;监督实测在 225 个生产会话、198 起失配事件中,过早完工稳定占据 16–20%;终止投毒攻击 LoopTrap 在 8 个智能体、60 个任务上取得平均 3.57× 步骤放大、峰值 25×。本文拆解过早完工、虚假完工、顽固不停三种失真,给出复现优先(24%→77%)、强制验证(TermBench 2.0 达 81.8%)、完工清单(52.8%→66.5%)三条经数据背书的解药,并指出"be thorough"指令、更长推理链等伪解法的黑洞。
自主体(autonomous agent)区别于聊天机器人的本质,在于它握着"循环继续还是停止"这把方向盘。在经典 Agent Loop 里,每一轮都做三件事:推理(reason)→ 行动(act)→ 自评进度(self-evaluate)。问题恰恰出在第三步——自评的结论直接喂给停止判定器,而停止判定器的输入只有模型的散文输出。这意味着停止条件被编码进了语言分布,而非被编码进了可观测的环境状态。
工程上的直觉是:写一个正则去抓 \b(done|complete|finished)\b。生产日志会立刻打脸——Tian Pan 在 2026 年 4 月的复盘里列出同一个季度内不得不处理的完工话术清单:"all set"、"should be good to go"、"that should do it"、"I've wrapped that up"、"done, pending your review"、"I'll leave it here for now"、"let me know if you need more"、"that's everything"、"nothing else to add"、"finished — with a small caveat"。前五个是无歧义胜利,后五个每个都带着未完成的尾巴,而编排器必须基于它们决定是否推进工单、是否重试、是否扣费。这就是停止判定税:你为一句"我觉得差不多就是这样"而承担整条下游自动化的歧义成本。
| 失真模式 | 表面症状 | 根因 | 实测数据 | 有效解药 |
|---|---|---|---|---|
| 过早完工(Premature) | 宣称"全部通过"实则仍有失败测试 | "首个进度信号"触发了 done token | SRI Lab:6 模型对正确代码打补丁 >50%;监督实测 72/198 事件 | 停止条件外挂到测试套件真实状态 |
| 虚假完工(False) | 输出为空/破损却宣告成功 | 无复现步骤,无法区分已通过代码与真 Bug | arxiv 2503.15223:6.2pp 解析率注水 | 复现优先 prompting |
| 顽固不停(Refuse-to-stop) | 无界循环、步骤爆炸 | 终止信号缺失 / 终止投毒 | LoopTrap:均值 3.57×、峰值 25× 步骤放大 | 迭代上限 + sentinel 哈希校验 |
三种失真表面症状高度相似(都表现为停止行为异常),但病因与解药完全不同。把它们混为一谈,是绝大多数"加了 max_iterations 就好了"的根因级误解。过早上限会杀死顽固不停的解药,却对过早完工毫无作用——后者在远未到达上限时就主动收工了。
SWE-EVO(arxiv 2512.18470)的 Figure 6 揭示了一个反直觉的能力带偏移:o3、gpt-4.1、gpt-4o 在 SWE-EVO 上表现出更多的语法错误、循环错误和早停失败,说明它们的长程轨迹鲁棒性远不如 gpt-5;而 gpt-5 与 Claude Opus 4.6 在 SWE-EVO 上的过早终止率接近零——它们的失败是指令遵循层面的,不是停止判定层面的。
这条结论对选型极其重要。停止判定税不是均匀分布的,而是集中在"中段能力带":弱模型在到达停止点之前就因别的原因失败了,根本轮不到停止判定出问题;强模型在内部完成了验证,停止判定与可观测状态天然对齐;唯独那些"刚好能看见测试变绿就宣布完工"的中段模型,是停止判定失真最密集的地带,也是缓解措施投入产出比最高的地带。对 GPT-5 / Claude Opus 4.6 这一级别的部署,强行加 pre-completion checklist 只会增加成本而无收益——升级模型才是诚实的修法。这条洞察直接否定了"一套通用 harness 打天下"的产品思路。
Zhejiang University 团队 2026 年 5 月发表的 LoopTrap(arxiv 2605.05846)把停止判定从"工程税"升级为"安全漏洞"。论文指出:现代 LLM 智能体通过迭代执行循环解决复杂任务,反复推理、行动并自评进度来判定任务是否完成,而这一自评恰好是注入点——攻击者只需向智能体上下文注入恶意提示,就能扭曲其终止判断,使其相信任务仍未完成,从而导致无界循环。论文将其命名为 Termination Poisoning(终止投毒),设计了 10 种代表性攻击策略。
实测横跨 8 个 LLM 智能体、60 个任务,LoopTrap 取得平均 3.57× 的步骤放大、峰值 25×。其自动化红队框架先沿四个脆弱维度构造目标行为画像,再做自适应陷阱合成,把成功陷阱抽象成可复用技能库。这条线的杀伤力在于:它和上一节的过早完工是同一根信号线的两个方向——一个是 done token 误触发,一个是 not-done 判断被持续注入。任何把停止判定托付给散文的架构,都同时向这两个方向的攻击敞开。结合被广泛记录的"工具结果即攻击面"(间接注入劫持),终止判定必须被视为可信边界的一部分,而非一个无害的收尾动作。
Tian Pan 在 2026 年 4 月的结论直击要害:"完成"是一个事件,不是一种心情。失败是双模态且无趣的——要么智能体没完工就宣告 done(过早终止),编排器开心地把工作流推进到半成品工件上;要么智能体真的完工了,却用一种探测器匹配不到的方式表达("我把改动落地了,不过那个边界用例的测试还在 flaky"),编排器于是重试、重做工作、重复副作用,甚至与第一次成功的执行结果相矛盾。
正解不是更聪明的解析,而是给智能体一条结构化终止通道:一个 done-tool,携带枚举状态、原因码(reason code)和一个编排器可路由的句柄(handle),并改写编排器去等待这个事件,而不是去监听聊天流。下面是一段最小可落地的契约:
# 结构化终止:把"完成"从散文升级为可路由事件
class CompletionStatus(str, Enum):
SUCCEEDED = "succeeded" # 工件已验证通过
BLOCKED = "blocked" # 遇到不可绕过的依赖/权限
PARTIAL = "partial" # 主路径完成,存在已知缺口
FAILED = "failed" # 尝试穷尽仍未达成
NEEDS_HUMAN = "needs_human" # 触发人机交接
@tool
def finish(status: CompletionStatus, reason_code: str,
evidence: list[str], remaining: list[str] | None = None) -> Done:
"""唯一允许终止循环的工具。evidence 必须是可核验的工件指针。"""
verify(status, evidence) # 编排器侧硬核验,非自述
return Done(status=status, reason=reason_code, evidence=evidence)
关键在于 verify 这一行在编排器侧执行——它核对 evidence 指针指向的真实工件(测试结果、git 分支状态、文件存在性),而不是核对模型说了什么。这才是把停止判定从"税"变回"契约"的工程动作。
ForgeCode 的报告给出了最具说服力的单点改动:当模型试图跳过验证技能时,运行时注入提醒并阻塞终止,且无 opt-out,单凭这一条就把 TermBench 2.0 推到 81.8%。LangChain 走的是另一条路——纯 harness 层改动,引入 pre-completion checklist 作为可调 harness 变量,把 Terminal Bench 2.0 从 52.8% 抬到 66.5%,并通过"harness 爬山"循环持续优化。SRI Lab 则证明最廉价的杠杆是 prompt 层:要求智能体先复现 Bug 再打补丁,仅此一项让 GPT-5.4 mini 在正确代码任务上从 24% 跃升到 77%。
# 运行时强制验证门:无 opt-out 的终止前置
async def agent_loop(ctx, max_iters=12):
for step in range(max_iters):
action = await model.plan(ctx)
if action.is_finish_attempt():
# 1) 复现优先:先跑出失败,再谈修复
repro = await run_repro(ctx.bug_trigger)
if not repro.failed:
block_finish(ctx, reason="no_reproduced_failure") # 阻断
# 2) 全量测试门:禁止"首个绿灯即收工"
suite = await run_full_suite(ctx.repo)
ctx.record(suite) # 落盘为可核验证据
if suite.has_failing:
inject(ctx, "failing_tests_remain", suite.failures)
continue # 不允许 finish
ctx = await execute(ctx, action)
sentinel = hash(ctx.target_state) # 3) sentinel 终止校验
return finish(status=succeeded, evidence=[suite.digest, sentinel])
三组解药的共同结构是:把停止条件从模型的散文搬到可观测状态上——复现失败状态、全量测试门、目标态 sentinel 哈希。它们解决的是同一个根因,但落地成本递增:prompt 层最便宜(24%→77%),harness 层中等(52.8%→66.5%),运行时硬约束最强但侵入最深(81.8%)。
AgentPatterns 在"Mitigations that do not work alone"里点名了三条最常见的自我安慰式修法,它们是停止判定税的真正黑洞:
第一,"be thorough"型指令。在没有行为挂钩(behavioral hook)绑定到可观测状态的前提下,"请务必彻底"只是一句和模型训练分布高度共振的客套话,它不改变停止判定的输入。第二,更长的推理链。延长 reasoning 只是把停止判定的时刻往后挪,并没有改变判定所依据的信号——模型只是花了更多 token 走到同一个错误结论。第三,CoT prompting。它非但不是解药,反而是加速器——链式思考能产出"听起来更有把握的错误完工",把过早完工伪装得更自信,使人工抽查更难识破。
这三条之所以危险,是因为它们在主观感受上"似乎有用":输出看起来更详尽、更自信、更完整。AgentPatterns 把这种偏差命名为 Perceived Model Degradation / "vibes are not evals"——感觉不是评估。任何停止判定优化,必须以"评分未修复但本应修复的测试,而非净通过增量"为度量,否则 harnes 会在"首个 Bug 被修复"的偶然通过里把过早完工彻底掩盖。
flowchart TD
U[用户目标 / 工单] --> LOOP[Agent Loop: 推理→行动→自评]
LOOP --> DEC{停止判定器}
DEC -- "散文 done token<br/>(默认、不可信)" --> HAZARD{三失真风险}
HAZARD --> P1[过早完工<br/>首个绿灯即收工<br/>>50% 误修正确代码]
HAZARD --> P2[虚假完工<br/>无复现/空工件<br/>6.2pp 注水]
HAZARD --> P3[顽固不停<br/>终止投毒<br/>3.57× 步骤放大]
DEC -- "结构化 done-tool<br/>+ 编排器侧硬核验" --> GATE{可观测状态门}
GATE --> R1[复现优先门<br/>24%→77%]
GATE --> R2[强制验证门<br/>无opt-out 81.8%]
GATE --> R3[完工清单门<br/>52.8%→66.5%]
GATE --> R4[sentinel哈希<br/>阻断顽固不停]
R1 --> DONE[事件: succeeded/blocked/partial/failed/needs_human]
R2 --> DONE
R3 --> DONE
R4 --> DONE
DONE --> ORCH[编排器路由]
ORCH --> NEXT[推进工单 / 重试 / 人机交接]
P1 -. "伪解法黑洞" .-> BLACK[(be thorough<br/>长推理链<br/>CoT: 制造更自信的错误)]
P2 -.-> BLACK
P3 -.-> BLACK
style HAZARD fill:#f4cccc
style GATE fill:#d9ead3
style BLACK fill:#fff2cc
style DONE fill:#cfe2f3
整张图的核心张力在中间的判定分叉:左路是默认的散文停止判定,直接落入三失真;右路是把停止条件外挂到可观测状态的结构化通道。值得注意的是,伪解法黑洞(黄色)并非与三失真无关,而是在左路上被反复尝试却无法消除任何一支的无效投入——它们消耗预算却不改变信号源。
强模型部署(GPT-5 / Claude Opus 4.6 级):过早终止近零,停止判定税主要来自顽固不停与外部注入。优先上 sentinel 哈希校验 + 迭代上限,并对终止判定做 LoopTrap 式红队。pre-completion checklist 在此档 ROI 为负,不要堆。
中段模型部署(gpt-4.1 / gpt-4o / 开源中端):停止判定税最重的一档,必须全套上:复现优先 prompt(最低成本,24%→77%)打底,叠加 harness 层完工清单(52.8%→66.5%),关键路径再上运行时强制验证(81.8%)。这一档是把"中段"拉到"接近强模型"体验的唯一杠杆。
面向外部输入的自主体(处理用户内容/网页/邮件):终止判定是可信边界。必须默认假设上下文含终止投毒,把 not-done 信号视为不可信,所有"继续"决策都需可观测状态佐证,且全程记录 evidence 句柄以备审计。
面向变现的训练营/产品定位:停止判定是当前自主体赛道最被低估的护城河。市面"Agent 开发课"九成在讲工具调用与记忆,几乎无人系统讲停止判定工程。一个以"如何让你的自主体真的知道何时该停"为主题、用 24%→77%、81.8%、66.5% 三组真实数字做骨架、配复现门与强制验证门可运行样例的训练营,在 2026 年的差异化空间极大——因为它解决的恰恰是生产环境里"为一句'我觉得完成了'买单"的最高频、最痛的真实成本。
[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。
