自主智能体(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) | 低 |
| 最适合场景 | 可验证的工程/数据任务 | 端到端软件工程 | 流程固定的业务管线 | 需要审议的复杂任务 | 短链路、强约束任务 |
/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(前 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 自报 + 外部测试断言,如果任务本身没有客观测试(如写一篇分析报告),漂移的"提前满足"风险又会抬头。
# 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 把目标保持问题降维成了图论问题。在它的 StateGraph 范式里,目标不是一个字符串,而是图的终止节点 + 条件边的判定函数。状态用 TypedDict 定义,每条边是一个 reducer,每个条件边都是一个"目标是否达成 / 该不该回环"的判定。
这套设计对漂移的治理是结构性的:只要状态没有收敛到终止条件,图就强制回环,智能体不可能"自己说完成了就停"——除非它把状态字段改到满足终止判据。这从根本上剥夺了 Agent 单方面宣布胜利的能力。典型骨架:
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 转向事件驱动架构后,目标保持依赖一个专门的规划者(Planner)Agent 周期性地把执行体的产出拉回原始目标做对齐。这本质上是一个"反思回路":执行体(AssistantAgent)闷头干活,规划者每隔若干步读取原始 goal 与当前进度,输出一个修正指令或确认继续。
这种"双角色、周期重对齐"的好处是兼顾灵活性——执行体仍是自由 ReAct,不被图结构束缚——同时有一个"上级"定期把它从漂移的轨道上拽回来。它的目标保持强度介于 SWE-agent 与 LangGraph 之间。但实证上(呼应 arXiv:2601.04170 的发现),多 Agent 协作一旦规划者自己也漂移,错误会被层级放大:规划者把漂移的目标下发给执行体,执行体忠实执行,整套系统反而比单体更难纠偏。因此 AutoGen 路线的关键工程纪律是:规划者的上下文必须只包含原始目标与结构化进度摘要,绝不能混入执行体的过程叙事,否则反思就会变成"用漂移的叙事去验证漂移的叙事"。
把 SWE-agent 这类极简 ReAct 回路放进来作为对照基线,能最直观地看清"目标即提示词"有多脆弱。它的目标保持机制几乎为零:原始目标作为一句 prompt 放在系统消息里,之后靠模型在每一步自己'想起来'。在前 10~20 步这没问题,但一旦任务长到上下文被工具返回、代码、报错填满,那句目标就成了注意力洪流里的一片落叶——这正是 arXiv:2505.02709 测出的"累积性稀释"曲线:漂移概率随步数近似单调上升。
极简回路并非没有价值。它便宜、透明、调试简单,在强约束短任务(有明确测试套件的 bug 修复)上,因为测试本身就充当了外部 ground truth,目标保持问题被部分转嫁给了"测试通过即终止"。但一旦任务没有客观验证(开放式调研、内容生成、设计探索),极简回路几乎必然在长程上漂移。这也是为什么 mini-SWE-agent 能用 100 行代码拿到 74%——它把目标保持外包给了 SWE-bench 的测试断言,离开断言它一样会失向。
把五栈放在一起看,自主体的目标丢失高度收敛到四条路径,跨栈通用:
值得强调的是,这四条路径里,前三条是"目标没被锚住",第四条是"判定者被骗"。多数团队只防了前三条(加状态、加测试),却忽略了第四条——只要裁判和执行体共享上下文,自评即上限的陷阱就仍在。
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;
闭环的精髓在于:目标只进不出(不可变锚点),判定权外移(隔离裁判),状态每轮重渲染(防稀释),计划层与目标层物理隔离(防蔓延)。任何一环缺失,都会在长程任务上变成失向的代价。
/goal + 可度量条件。把完成条件写成可执行断言,享受"设定后离开"的多小时自主运行,且天然免疫提前满足。一句话总结五栈的梯度:从"目标即提示词"(SWE-agent)到"目标即状态机"(LangGraph)、"目标即账本"(OpenHands)、"目标即对齐回路"(AutoGen),再到"目标即可度量终点 + 隔离裁判"(Claude Code /goal)——目标保持的强度,从"靠模型自觉"逐级上升到"靠结构强制"。自主体的成熟度,本质上就是你愿意为"让第 500 步还记得第 1 步的目标"投入多少结构。
/goal — 设定可度量完成条件、跨轮持续执行直至条件满足的官方说明。[!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 等场景全覆盖。
