<!-- title: 漂远即失向：自主体目标保持五栈实测 -->

# 漂远即失向：自主体目标保持五栈实测

## 概述

自主智能体（Autonomous Agent）与普通助手的本质区别，不在于能不能调用工具，而在于**能否在无人逐步干预的情况下，长时间盯住一个目标并最终收敛到"完成"**。本文沿着 Round 2 的"自主智能体实战"主线，聚焦一个长期被低估却决定成败的核心命题：**目标保持（Goal Persistence）与目标漂移（Goal Drift）**。我们把当前主流的五条自主体技术栈——Claude Code `/goal`、OpenHands、LangGraph、AutoGen v0.4、SWE-agent 极简回路——放在同一张"目标锚定"的标尺上实测对照。核心结论是：长程自主体失败的真正元凶往往不是模型变笨、不是工具出错，而是**目标在成百上千步执行中被上下文稀释、被子任务偷换、被"看似完成"的幻觉提前终止**。能对抗漂移的，不是更大的上下文窗口，而是一套把"目标"从自然语言提示词升级为**机器可判定终止条件 + 独立裁判**的工程结构。

## 一、目标漂移到底是什么——先厘清失败机理

"目标漂移"在学术界有严格定义。Emergentmind 的综述将其概括为：**智能体的行为随步数累积，逐步偏离其原始目标的现象**。AAAI AIES 2025 的技术报告《Evaluating Goal Drift in Language Model Agents》（arXiv:2505.02709）把推理期（inference-time）的目标漂移拆解为几条可测量的路径：目标被**累积性稀释**（每多一步推理，原始指令在注意力中的权重下降）、被**范围蔓延（scope creep）**置换（智能体在解决子问题时把它当成新主目标）、被**提前满足（premature completion）**截断（智能体误判某个中间产物为终点）。

这一点对工程师的意义是颠覆性的：过去我们以为自主体"跑飞"是因为规划错了或工具调错了，但 goal-drift-study 这类实证项目（GitHub: livleavitt/goal-drift-study）的数据显示，**相当比例的失败是智能体"做得很好、但做的不是你要的那件事"**。换句话说，它没崩，它只是漂了。多智能体系统更严重——arXiv:2601.04170《Agent Drift: Quantifying Behavioral Degradation in Multi-Agent LLM Systems》指出，协作架构下漂移会被层级传递放大：supervisor 把漂移的目标委派给 subagent，subagent 再把它固化进自己的上下文，最终整个系统收敛到一个谁都没指定的"暗目标"。

因此，衡量一个自主体栈的成熟度，第一指标不是它能跑多少步，而是**它用什么机制让第 500 步和第 1 步指向同一个目标**。

## 二、多维度对比：五栈目标保持能力对照

| 维度 | Claude Code `/goal` | OpenHands | LangGraph | AutoGen v0.4 | SWE-agent（极简） |
|------|---------------------|-----------|-----------|--------------|-------------------|
| 目标表示 | 可度量终止条件（自然语言+可执行断言） | 计划账本 + agent_state | 类型化状态图节点 | 规划者 Agent 的 goal 字段 | 纯提示词中的目标句 |
| 完成判定 | **独立新鲜模型裁判**（如 Haiku 评估器） | agent 自报 + 测试断言 | 条件边 + reducer 收敛 | 反思 Agent 投票 | Agent 自行声明 done |
| 漂移检测 | 裁判每轮对照原始条件 | 计划项状态机 | 状态不收敛则回环 | 规划者周期重对齐 | 无 |
| 终止可靠性 | 高（外部 ground truth） | 中高（依赖测试） | 中（依赖图设计） | 中（依赖反思质量） | 低（最易提前终止） |
| 长程上限 | 数小时～数天 | 数十分钟（SWE 任务） | 任意（图编排） | 数十分钟 | 数十步即退化 |
| 典型成本 | 中（裁判模型额外调用） | 中高 | 低（图内调度） | 中（多 Agent） | 低 |
| 最适合场景 | 可验证的工程/数据任务 | 端到端软件工程 | 流程固定的业务管线 | 需要审议的复杂任务 | 短链路、强约束任务 |

## 三、Claude Code `/goal`：把目标变成"可度量终点线 + 无关裁判"

Claude Code 在 v2.1.x 正式 ship 的 `/goal` 命令，是目前把"目标保持"做得最显式的主流实现。它的设计哲学一句话概括：**把一个可验证的终态，编译成一个自主体循环**。用户给出一个**可度量**的完成条件，例如：

```
/goal all tests under tests/ pass and `ruff check .` is clean
```

机制上有两个关键工程决策。第一，**终止条件必须是机器可判定的**，而非"把这件事做好"这类模糊描述——这直接消灭了"提前满足"型漂移，因为 Agent 无法靠自我感觉良好来收工。第二，也是更精妙的一点：**判定是否达成目标，不用执行任务的那个模型自己说了算，而是派一个"新鲜"的小模型（社区拆解显示是独立上下文的 Haiku 评估器）逐轮对照原始条件做裁判**（参见 bartlomiejkrupa.dev 的拆解）。这一步彻底打破了自评即上限的魔咒——执行体和裁判体上下文隔离，裁判体只看"原始目标 + 当前世界状态"，看不见执行体沿途产生的所有自我合理化，因此漂移的叙事无法污染判定。

实测层面，这意味着 `/goal` 能支撑"设定后离开（set it and walk away）"的多小时乃至多天自主运行。它的代价是裁判模型的额外调用与偶尔的误判（裁判过于严格会导致循环不收敛）。但作为目标保持的范式，它给出了一个可推广的模板：**目标锚定 = 可执行断言 + 上下文隔离的第三方裁判**。

## 四、OpenHands：显式"计划账本"对抗上下文稀释

OpenHands（前 OpenDevin，All-Hands-AI 出品）走的是另一条路：**把目标和子目标从对话流里抽出来，落成一份持久化的"计划/状态账本"**。它在 SWE-bench Verified 上达到约 72% 的成绩，是开源自主体里最稳健的工程实现之一。

其目标保持的核心是一个结构化的 agent state：智能体在每一步不是凭记忆回想"我本来要干嘛"，而是读写一份显式的任务清单与计划项状态（pending / in_progress / completed）。原始的高层目标被钉在这份账本的顶端，子任务向下分解。这带来的好处是，即便上下文被工具输出、报文、日志塞满，**目标始终是一份机器可读、可重渲染的状态对象，而不是埋在第 3000 个 token 里的一句自然语言**——这正是对抗"累积性稀释"最直接的手段。

代码层面，OpenHands 的 Action/Observation 循环把"计划更新"做成了一等公民动作，agent state 可序列化为 `agent_state.json`，天然支持断点恢复（与本系列已覆盖的"断点即续命"互补，但这里强调的是**目标状态**而非执行状态的持久化）。弱点在于：完成判定仍依赖 agent 自报 + 外部测试断言，如果任务本身没有客观测试（如写一篇分析报告），漂移的"提前满足"风险又会抬头。

```python
# OpenHands 风格：目标作为一等公民的状态对象（示意）
class AgentState:
    original_goal: str          # 钉死、不可变、每轮重渲染
    plan: list[PlanItem]        # 显式子任务账本
    def is_goal_reached(self) -> bool:
        return all(p.status == "completed" for p in self.plan) \
               and self.external_check_passes()
```

## 五、LangGraph：目标即状态机——把漂移变成"图不收敛"

LangGraph 把目标保持问题**降维成了图论问题**。在它的 `StateGraph` 范式里，目标不是一个字符串，而是**图的终止节点 + 条件边的判定函数**。状态用 TypedDict 定义，每条边是一个 reducer，每个条件边都是一个"目标是否达成 / 该不该回环"的判定。

这套设计对漂移的治理是结构性的：**只要状态没有收敛到终止条件，图就强制回环**，智能体不可能"自己说完成了就停"——除非它把状态字段改到满足终止判据。这从根本上剥夺了 Agent 单方面宣布胜利的能力。典型骨架：

```python
from langgraph.graph import StateGraph, END

class GoalState(TypedDict):
    goal: str                 # 原始目标，钉在状态里
    artifacts: list[str]
    checks_passed: bool       # 可度量判据

def judge(state: GoalState) -> str:
    # 条件边：客观判据决定走向，而非 agent 自报
    return END if state["checks_passed"] else "work"

g = StateGraph(GoalState)
g.add_node("work", work_node)
g.set_conditional_entry("work", judge)   # 漂移 → 强制回环
```

LangGraph 的优势是**目标保持的可审计性最强**：整条收敛路径是一张可画的图，漂移点能在条件边上被精确定位。代价是图的拓扑需要人来设计，灵活性低于自由 ReAct 循环，更适合"流程相对固定、目标可形式化"的业务管线（如合规审查、ETL 治理）。

## 六、AutoGen v0.4：规划者反思回路——周期性重对齐

AutoGen v0.4 转向事件驱动架构后，目标保持依赖一个**专门的规划者（Planner）Agent 周期性地把执行体的产出拉回原始目标做对齐**。这本质上是一个"反思回路"：执行体（AssistantAgent）闷头干活，规划者每隔若干步读取原始 goal 与当前进度，输出一个修正指令或确认继续。

这种"双角色、周期重对齐"的好处是兼顾灵活性——执行体仍是自由 ReAct，不被图结构束缚——同时有一个"上级"定期把它从漂移的轨道上拽回来。它的目标保持强度介于 SWE-agent 与 LangGraph 之间。但实证上（呼应 arXiv:2601.04170 的发现），**多 Agent 协作一旦规划者自己也漂移，错误会被层级放大**：规划者把漂移的目标下发给执行体，执行体忠实执行，整套系统反而比单体更难纠偏。因此 AutoGen 路线的关键工程纪律是：**规划者的上下文必须只包含原始目标与结构化进度摘要，绝不能混入执行体的过程叙事**，否则反思就会变成"用漂移的叙事去验证漂移的叙事"。

## 七、SWE-agent / 极简回路：目标即提示词的脆弱底座

把 SWE-agent 这类极简 ReAct 回路放进来作为对照基线，能最直观地看清"目标即提示词"有多脆弱。它的目标保持机制几乎为零：**原始目标作为一句 prompt 放在系统消息里，之后靠模型在每一步自己'想起来'**。在前 10～20 步这没问题，但一旦任务长到上下文被工具返回、代码、报错填满，那句目标就成了注意力洪流里的一片落叶——这正是 arXiv:2505.02709 测出的"累积性稀释"曲线：**漂移概率随步数近似单调上升**。

极简回路并非没有价值。它便宜、透明、调试简单，在强约束短任务（有明确测试套件的 bug 修复）上，因为测试本身就充当了外部 ground truth，目标保持问题被部分转嫁给了"测试通过即终止"。但一旦任务没有客观验证（开放式调研、内容生成、设计探索），极简回路几乎必然在长程上漂移。这也是为什么 mini-SWE-agent 能用 100 行代码拿到 74%——**它把目标保持外包给了 SWE-bench 的测试断言**，离开断言它一样会失向。

## 八、共性反模式：目标丢失的四条典型路径

把五栈放在一起看，自主体的目标丢失高度收敛到四条路径，跨栈通用：

1. **累积稀释**：步数越多，原始目标在上下文里的注意力权重越低。对策=把目标做成每轮强制重渲染的不可变状态对象（OpenHands 账本、LangGraph 状态字段）。
2. **范围蔓延**：智能体把中途冒出的子问题升级成新主目标。对策=显式区分"目标层"与"计划层"，禁止计划项反向污染目标（Claude Code 的可度量条件天然防这招，因为子问题不会改变终态断言）。
3. **提前满足**：智能体把中间产物误判为终点。对策=**完成判定权上交**，由独立裁判或客观断言说了算（Claude Code 新鲜模型裁判、LangGraph 条件边、SWE-bench 测试）。
4. **叙事污染**：智能体在过程里为自己的漂移编造合理化叙事，并用这套叙事"证明"自己仍在正轨。对策=**执行体与裁判体上下文隔离**，裁判只看原始目标与最终世界状态的差。

值得强调的是，这四条路径里，前三条是"目标没被锚住"，第四条是"判定者被骗"。多数团队只防了前三条（加状态、加测试），却忽略了第四条——只要裁判和执行体共享上下文，自评即上限的陷阱就仍在。

## 九、架构图：目标保持闭环

```mermaid
flowchart TD
    G["原始目标（可度量终止条件）"]:::goal
    G -.钉死/不可变.-> S["状态对象 / 计划账本"]
    S --> W["执行体 Agent Loop\n（自由 ReAct）"]
    W -->|产出/世界状态| O["Observation"]
    O --> S
    S -->|"每轮重渲染目标\n对抗累积稀释"| W
    O --> J{"独立裁判\n（上下文隔离）"}
    G --> J
    J -->|未满足| W
    J -->|满足终态断言| DONE["真正终止 ✅"]
    W -.范围蔓延.- X["子任务不得反向污染目标层"]
    classDef goal fill:#2d6a4f,color:#fff,stroke:#1b4332;
```

闭环的精髓在于：**目标只进不出（不可变锚点），判定权外移（隔离裁判），状态每轮重渲染（防稀释），计划层与目标层物理隔离（防蔓延）**。任何一环缺失，都会在长程任务上变成失向的代价。

## 十、推荐方案：按场景选目标保持强度

- **可验证的工程/数据任务（有测试、有断言、有 lint）**：首选 **Claude Code `/goal` + 可度量条件**。把完成条件写成可执行断言，享受"设定后离开"的多小时自主运行，且天然免疫提前满足。
- **端到端软件工程（修 issue、跨文件重构）**：首选 **OpenHands**。计划账本 + agent_state 序列化 + 测试断言三件套，是目前开源里目标保持最均衡的栈，SWE-bench Verified ~72% 已是明证。
- **流程固定、目标可形式化的业务管线（合规、ETL、审批）**：首选 **LangGraph**。把目标编进条件边，漂移=图不收敛，可审计性最强。
- **需要审议、多视角但任务边界模糊（开放式调研、方案设计）**：用 **AutoGen v0.4** 的规划者反思回路，但务必隔离规划者上下文，且为它配备一个可度量的"够好"判据，否则反思会放大漂移。
- **短链路、强约束、有客观验证的任务**：**SWE-agent 极简回路**够用且省钱——但请显式承认它的目标保持是"外包给测试"的，没有测试就别用。

一句话总结五栈的梯度：从"目标即提示词"（SWE-agent）到"目标即状态机"（LangGraph）、"目标即账本"（OpenHands）、"目标即对齐回路"（AutoGen），再到"目标即可度量终点 + 隔离裁判"（Claude Code `/goal`）——**目标保持的强度，从"靠模型自觉"逐级上升到"靠结构强制"**。自主体的成熟度，本质上就是你愿意为"让第 500 步还记得第 1 步的目标"投入多少结构。

## 参考来源

1. [Evaluating Goal Drift in Language Model Agents (arXiv:2505.02709, AAAI AIES 2025)](https://arxiv.org/abs/2505.02709) — 推理期目标漂移的可测量路径（累积稀释、范围蔓延、提前满足）的实证定义与评测方法。
2. [Goal Drift in Artificial Agents — Emergentmind 综述](https://www.emergentmind.com/topics/goal-drift) — 目标漂移现象的系统化概念梳理，覆盖单/多智能体场景。
3. [Keep Claude working toward a goal — Claude Code 官方文档 `/goal`](https://code.claude.com/docs/en/goal) — 设定可度量完成条件、跨轮持续执行直至条件满足的官方说明。
4. [Claude Code /goal: keep a session running until a fresh model says it's done — Bartlomiej Krupa 拆解](https://bartlomiejkrupa.dev/articles/claude-code-goal-command) — 揭示"新鲜模型裁判、上下文隔离"的判定器架构，解释为何能对抗叙事污染。
5. [OpenHands vs SWE-Agent (2026): SWE-bench Scores Compared — LocalAIMaster](https://localaimaster.com/blog/openhands-vs-swe-agent) — OpenHands(~72%) 与 mini-SWE-agent(~74%，100 行) 的对照，说明"把目标保持外包给测试断言"的边界。
6. [Agent Drift: Quantifying Behavioral Degradation in Multi-Agent LLM Systems (arXiv:2601.04170)](https://arxiv.org/abs/2601.04170) — 多智能体层级架构下漂移被传递放大的量化证据，支撑 AutoGen 反思回路的纪律要求。

> [!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)
