<!-- title: 停太早还是停不下：终止判定税 -->

## 概述

自主智能体最难的不是"做"，而是"停"。2026 年学界与工程界形成共识：终止判定（termination logic）是被低估的头号设计难题，其影响力压过模型质量与提示词工程。自主智能体在终止上存在**两个相反方向的塌方**——**早停税**（premature exit，任务没做完就宣称完成）与**滑翔税**（thrashing，原地空转烧 token）。两者之间没有静态最优解：`max_iterations` 设低会被硬顶截断好任务，设高会让坏任务空转到天荒地老。本文拆解 OpenHands、SWE-agent、Atropos、AgentExit、EET/AgentStop 等当前主流终止机制的代价结构，给出按场景选型的判定框架。

## 终止策略多维度对比

| 策略 | 机制 | 触发信号 | 早停税风险 | 滑翔税风险 | 实现复杂度 | 典型代表 |
|------|------|----------|-----------|-----------|-----------|----------|
| 硬顶截断 | 固定迭代上限 | 步数 == 上限 | 高（截断好任务） | 低（强制止血） | 极低 | OpenHands `max_iterations_per_run`、SWE-agent max_steps |
| 自主 finish | 模型显式输出终止动作 | 模型自判完成 | 高（过早宣称done） | 中（依赖模型自觉） | 低 | OpenHands finish action、ReAct `Finish` |
| 无进展/环路检测 | 状态指纹或动作序列去重 | 连续重复 | 低 | 低 | 中 | SWE-agent loop detection、自定义 hash 滑窗 |
| 预测式早停 | 训练分类器预测成败概率 | P(成功) < 阈值 | 中（需校准） | 极低（提前止血） | 高 | Atropos（+热替换 SLM） |
| 终止预算可见 | 把剩余步数注入提示 | 模型看到预算 | 中 | 中 | 低 | OpenHands 提案 #2406 |
| HITL 审批门 | 风险分级 + 人工确认 | 高危动作 | 取决于人 | 取决于人 | 中高 | Stack AI、tianpan 审批门模式 |

## 深度分析

### 一、硬顶护栏：500 这个默认值的代价

OpenHands 的 `max_iterations_per_run` 默认 **500** 步，挂在 `ConversationState` 上、在第 594 行做计数。SWE-agent 同样以固定交互步数为天花板。这是最朴素也最不可省的护栏：它保证智能体永远会停。但硬顶是**一把钝刀**——它对"好任务"和"坏任务"一视同仁地截断。

代价集中在一个真实的边界 bug：OpenHands 曾出现当智能体**恰好在最后一步**（iteration == max_iterations）调用 `finish` 时，`execution_status` 被错误置为 `ERROR` 而非 `STOPPED`/`SUCCESS`。这意味着终止判定机制本身在边界条件下就会误报，把一个本可成功的任务判成失败。硬顶的本质问题是**步数与任务难度解耦**：一个本该 80 步的任务设了 500 步上限，前 420 步都在空转；一个本该 800 步的难任务被 500 截断，永远做不完。没有"一刀切"的正确值，这就是后续所有自适应终止技术的存在理由。

### 二、自主 finish：把"何时停"外包给模型

让模型自己说"我做完了"（OpenHands 的 `finish` action、ReAct 范式里的 `Finish(observation)`）是最自然的终止方式，但也是**早停税的主要来源**。CMU 的"Optimal Termination in LLM-Based Decision Support"专门研究教 LLM 何时停止收集信息、何时开始行动——这恰恰是 finish 判定的核心难点：模型往往**过早收敛**，在信息不充分时就宣布完成。

AgentExit（Coldmist-Lu）把这种"早退行为"（early-exit behavior）单独拎出来作为研究对象，量化了 LLM 智能体在何等条件下会草草收场。与之相对的是 VLAA-GUI 指出的 GUI 智能体两大失败模式之一正是**premature task termination**。自终止的悖论在于：模型越聪明、越自信，早停风险在某些场景反而越高——它"觉得"自己懂了。这跟你另测过的"自验证假通过"是同源异象：验证器被俘获是 finish 的**质量**问题，过早 finish 是 finish 的**时机**问题，两者合力制造了大量"看起来完成了其实没完成"的灰色产出。

```python
# 自终止的可信化：finish 不应只信模型的"done"，要交叉验证
def should_finish(state):
    if not state.agent_emits_finish():
        return False
    # 早停税对冲：模型说done时，要求至少一个外部信号佐证
    return (state.tests_pass()
            or state.goal_achieved_probe()
            or state.no_unresolved_subgoal())
```

### 三、无进展与环路检测：发现原地打转

滑翔税的另一头是**thrashing**——智能体卡在测试失败里反复横跳，改一行、跑测试、失败、再改、再失败。codex.danielvaughan 在 2026 年 6 月的早停策略文章里给出的经验判据很直白：**"一个在测试失败里反复折腾 80 轮的会话，通常说明任务范围被划得太大了。"** 这意味着 thrashing 往往不是模型笨，而是**任务分解的终止判定缺位**——本该在 80 轮前就触发"任务过大，回退重分解"。

工程上用状态指纹或动作序列去重来检测环路：对最近 N 步的 `(action, observation_hash)` 计算指纹，重复超过阈值即判定卡死。SWE-agent 内置了环路检测。更阴险的是 **LoopTrap 攻击**——通过"终止投毒"（termination poisoning）让智能体忘记如何停止，既可逼它**过早退出**返回残缺结果，也可逼它**无限滑翔**烧光预算。这把"无进展检测"从优化项变成了**安全防线**：没有环路检测的自主智能体，其终止判定在对抗条件下是可被远程操控的。

```python
# 极简无进展检测：动作指纹滑窗
from collections import deque
class ProgressGate:
    def __init__(self, window=8, dup_thresh=3):
        self.win, self.thresh = deque(maxlen=window), dup_thresh
    def observe(self, action, obs):
        fp = hash((action, str(obs)[:200]))
        self.win.append(fp)
        # 同一指纹出现 >= thresh 次即判卡死
        if self.win.count(fp) >= self.thresh:
            return "THRASHING"
        return "OK"
```

### 四、预测式早停 + 热替换：Atropos 砍掉 40-60% 成本

Atropos（ISSTA 2026，COINSE 实验室）是目前终止判定最前沿的工程答案。名字取自希腊神话中"剪断生命之线"的命运女神 Atropos，意涵精准。它的核心是**预测式早停 + LLM 热替换**：在 self-consistency（自洽性多次采样）流程中，训一个轻量预测器实时估计"当前轨迹是否大概率会失败"；一旦预测失败概率超过阈值，立刻**提前终止**这条轨迹，并把后续推理**热替换**（hotswap）到更便宜的小语言模型（SLM）上重试，而非让昂贵的大模型一路空跑到失败。

aimodels.fyi 汇总的实测结论是：Atropos 在多个基准上把总计算成本降低 **40-60%**，同时保持准确率不降。这个数字说明一件事——滑翔税不是边际成本，而是**主流成本**：默认配置下有将近一半的算力花在了注定失败的轨迹上。Atropos 的代价是工程复杂度高（预测器训练 + 在线热替换 + 状态迁移）和对预测器校准的依赖：预测器若系统性悲观，会复活早停税。它是把"二选一的税"转化成了"一个可校准的概率阀门"。

### 五、终止预算可见：让模型看见自己的剩余弹药

OpenHands 提案 #2406 提出一个被长期忽视的点：`max_iterations` 这个上限对**模型自身是不可见的**。模型不知道自己还剩多少步，就无法做"我快到顶了，该收尾了"的规划。把剩余迭代数注入系统提示，是成本近乎为零、收益明确的终止增强——它让模型的 finish 判定从"我觉不觉得做完"变成"在剩余预算内我能不能做完"。

这背后的原理是**预算约束下的终止再规划**。无预算可见时，模型倾向于要么过早 finish（早停税），要么无限探索（滑翔税）；给了可见预算后，模型会自发地在预算中段收敛。代价是模型可能"知道还有 400 步就故意磨洋工"或"知道只剩 5 步就草草交差"——即预算信息本身会**改变模型的终止分布**。这是终止判定里少有的"信息即干预"现象，需要配合阈值告警而非单纯暴露原始数字。

### 六、静默失败与熵：没有外部触发的塌方

arXiv 2606.08162 指出一类更隐蔽的终止问题：**无外部触发的静默失败**（silent failure）——智能体既没有 finish、也没有撞 max_iterations、也没有进入显式环路，而是"熵增"式地缓慢失效，产出看似正常实则错误的结果。这类失败不触发任何终止判定，因为现有机制都在检测"显式停止信号"，而静默失败的特征恰恰是**没有停止信号**。

熵原理意味着终止判定不能只盯"该不该停"，还要盯"产出是否在可信熵窗口内"。工程对策是引入**产出健康度探针**：对最终输出做一致性、可验证性、子目标覆盖率的多维打分，低于阈值的即便模型已经 finish 也要拉回继续。这把终止从"一次性决策"升级为"持续监控的可信度曲线"，是对早停税最彻底的对冲，也最贵。

### 七、HITL 审批门：用人工兜底终止判定

当自动终止判定都不够稳时，最后一道闸门是人。tianpan、Stack AI、Boundev 等给出的模式高度趋同：**风险分级 + 审批门 + 断点续跑**。把智能体的动作按破坏力分级——只读、本地写、对外副作用（发邮件、付款、删数据），只有高危动作才触发 pause，路由给人工确认后再 resume。

这本质上是把终止判定**从"停/不停"二元化，扩展为"继续 / 暂停 / 终止"三态**。审批门的代价是**中断税**：自主性的全部价值在于"无人值守"，每加一道门就削掉一份自动化收益。最优策略不是无差别加门，而是**只对不可逆副作用加门**——一个只读探索的智能体空转 500 步是钱的问题，一个有发邮件权限的智能体空转 500 步是公关灾难。终止判定在这里与副作用幂等性（你此前测过的"邮件发两遍"）正面交汇：副作用越不可逆，终止判定越要前置到"动手之前"。

## 终止判定的两条税线

把以上七点压成一张成本图，自主智能体的终止判定始终在两条税线之间走钢丝：

- **早停税**：上限设低 / 模型过度自信 / 预测器过悲观 → 任务残缺、假完成。用外部信号交叉验证、产出健康度探针、HITL 门对冲。
- **滑翔税**：上限设高 / 模型不会收尾 / 无环路检测 → token 空烧。用无进展检测、预测式早停、热替换对冲。

而**判定机本身也有税**：预测器训练、环路 hash 滑窗、健康度探针都在每一步消耗算力，即使任务本会顺利结束。Atropos 用 40-60% 的成本节省证明，在大多数场景下"判定机税"远小于"滑翔税"——值得交。但在简单、短任务上，判定机税反而是净亏。这就是为什么选型必须按场景，而非按框架名气。

```mermaid
flowchart TD
    A[Agent 每步执行] --> B{步数 == max_iterations?}
    B -->|是| H[硬顶截断 STOPPED]
    B -->|否| C{模型主动 finish?}
    C -->|是| D{产出健康度探针过关?}
    D -->|是| L[结束 SUCCESS]
    D -->|否| E[拉回继续]
    C -->|否| F{无进展/环路命中?}
    F -->|是| G[强制终止 THRASHING]
    F -->|否| I{预测器 P成功 < 阈值?}
    I -->|是| J[Atropos 早停 + 热替换 SLM]
    I -->|否| K{下一步是高危副作用?}
    K -->|是| M[HITL 审批门]
    M -->|批准| A
    M -->|拒绝| N[终止 REJECTED]
    K -->|否| A
```

## 推荐方案

按任务特征分层选终止策略，是当前最务实的工程结论：

- **短任务 / 高确定性**（单轮 QA、结构化抽取）：**硬顶 10-30 步 + 自主 finish**。判定机税会超过收益，别上预测器和健康度探针。
- **中等复杂度编码任务**（修一个 GitHub issue）：**硬顶 + 无进展检测 + 终止预算可见**。把 max_iterations 设到经验 P95（如 80-120 步），并把剩余步数注入提示，让模型自发收敛。codex 经验：超过 80 轮 thrashing 就该回退重分解，而非加步数。
- **长周期高成本任务**（多轮 self-consistency、长链推理）：**上 Atropos 式预测早停 + 热替换**。滑翔税占主导，40-60% 的成本节省足以摊销预测器工程成本。
- **有不可逆副作用**（发邮件、付款、删数据）：**HITL 风险分级审批门 + 副作用幂等设计**。终止判定前置到动作前，而非结果后。这一层与幂等性是配套件，缺一不可。
- **对抗环境 / 公网部署**：**强制环路检测作为安全防线**（对冲 LoopTrap 类终止投毒），并对静默失败加产出健康度探针。

一句话结论：自主智能体的成熟度，不取决于它能跑多少步，而取决于它**在正确的那一步停下来**——而正确的那一步，永远是早停税与滑翔税的交点。把这个交点显式建模出来（预算可见 + 无进展检测 + 预测早停 + 健康度探针的四件套），就是 2026 年终止判定工程的标准答案。

## 参考来源

1. [Atropos: Improving Cost-Benefit Trade-off of LLM-based Agents under Self-Consistency with Early Termination (arXiv 2604.15075)](https://arxiv.org/abs/2604.15075) — 预测式早停 + LLM 热替换，多基准降本 40-60%，ISSTA 2026
2. [Coldmist-Lu/AgentExit — On the early-exit behavior of LLM agents](https://github.com/Coldmist-Lu/AgentExit) — 专门研究智能体过早退出行为的框架
3. [Early Termination Strategies for Coding Agents: EET and AgentStop (codex.danielvaughan, 2026-06-21)](https://codex.danielvaughan.com/2026/06/21/early-termination-strategies-coding-agents-codex-cli-cost-efficiency-eet-agentstop-hooks/) — 80 轮 thrashing 经验判据与早停钩子
4. [OpenHands software-agent-sdk Issue #2406 — make Max Iteration Limit visible to the LLM](https://github.com/OpenHands/software-agent-sdk/issues/2406) — max_iterations_per_run 默认 500 与终止预算可见性提案
5. [Termination logic is the underrated design problem in agentic AI (glenrhodes)](https://glenrhodes.com/prediction-termination-logic-is-the-underrated-design-problem-in-agentic-ai-systems-not-model-quality-or-prompt-design/) — "最难的不是模型，而是知道何时该停"

> [!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 等场景全覆盖。

![51学通信知识星球海报-扫码加入](https://wiki.500nian.com/images/zhixingqiu_qrcode.png)
