Skip to content

Self-Harness 自我演进框架 — Agent 外骨骼的自我进化

2026 年 Agent 工程领域的"深水炸弹":不微调模型参数,不让强模型当导师,让 Agent 自己读日志、自己改代码、自己进化。Terminal-Bench 2.0 上三个模型 held-out 通过率提升 33-60%。

目录


一、背景:人工外骨骼(Harness)的极限

什么是 Harness

Agent 的性能不单独由基座模型决定,而是由模型(Base Model)+ 外骨骼(Harness)共同塑造。Harness 是模型与环境交互的外围系统,包括:

  • 系统提示词(System Prompt)
  • 工具定义和包装器(Tool Wrappers)
  • 记忆和上下文管理(Memory / Context Management)
  • 验证规则(Verification Rules)
  • 运行时策略(Runtime Policies)
  • 编排逻辑(Orchestration Logic)
  • 失败恢复流程(Failure Recovery)

论文原文:The performance of LLM-based agents is jointly shaped by their base models and the harnesses that mediate their interaction with the environment.

三种 Harness 工程模式对比

维度 Human Harness(人工) Meta-Harness(强模型导师) Self-Harness(自我演进)
谁来改 Harness 人类工程师 强模型(GPT-5.5 等) Agent 自己
成本 高(专家时间) 高(API 调用) 中(算力开销)
可扩展性 差(模型迭代快) 差(强模型贵/不可得) 好(随算力扩展)
模型特异性 需手动分析 强模型有"知识诅咒" 自动发现
核心瓶颈 依赖直觉,非系统化 难以共情弱模型盲点 依赖确定性验证器

为什么人工模式走不通

新模型发布 ──> 人类工程师分析 ──> 设计专属 Harness
                    ^                    │
                    │                    ▼
                    └── 手动测试迭代 ←── 部署
另一模型发布 ──────> 重复上述流程

问题:模型迭代速度 >> 人工适配速度

论文一作 Hangfan Zhang 在 VentureBeat 访谈中说:

"当前 harness-engineering 范式的深层问题是缺乏系统化的反馈闭环。很多修改基于直觉、几次观察到的失败、或临时调试。"

"在许多情况下,经验丰富的领域专家仍然能提出比 LLM 更好的修改。但瓶颈不在于人的能力,而在于依赖 ad hoc 调试而非可验证的经验反馈闭环。"


二、Self-Harness 核心机制:自我演进的三阶段闭环

整体架构

    ┌─────────────────────────────────────────────────┐
    │                Self-Harness Loop                 │
    │                                                  │
    │   [执行轨迹]                                     │
    │       │                                          │
    │       ▼                                          │
    │   1. 弱点挖掘 (Weakness Mining)                  │
    │      三元组失败签名聚类                           │
    │       │                                          │
    │       ▼                                          │
    │   2. 框架提案 (Harness Proposal)                 │
    │      平行分支 × 最小化修改                        │
    │       │                                          │
    │       ▼                                          │
    │   3. 提案验证 (Proposal Validation)              │
    │      Held-in + Held-out 双分割门控               │
    │       │                                          │
    │       ├──── 通过 ──> 合并到下一版本               │
    │       └──── 拒绝 ──> 回到提案阶段                 │
    │                                                  │
    └─────────────────────────────────────────────────┘

阶段一:弱点挖掘(Weakness Mining)

目标:从庞杂的报错日志中提取可复现的底层工程缺陷,而非偶发幻觉。

核心方法 — 三元组失败签名(Triplet Failure Signature)

失败签名 = (
    验证器层面的死因,       # Verifier-level cause of death
    Agent 导致死因的行为,   # Agent behavior causing it
    抽象出的机制故障        # Abstracted mechanism failure
)

只有三个维度完全咬合一致时才进行聚类,确保找到的是系统性工程缺陷而非随机噪声。

失败分类维度

类型 说明 典型表现
工具选择错误(Tool Selection) 用了错误的工具 任务需要 git commit 但跳过了配置
上下文错误(Context Errors) 丢失或误读信息 多步任务中忘记中间变量
规划错误(Planning Errors) 任务分解不当 探索过度,不产出交付物
错误处理缺失(Error Handling) 不会从失败恢复 同一命令盲目重试
验证缺口(Verification Gaps) 不验证假设 假设文件创建成功但不检查

阶段二:框架提案(Harness Proposal)

两大设计约束

┌─────────────────────────────────────────────┐
│  多样性 (Diversity)                          │
│  平行拉出多个 Feature Branch:               │
│  • Prompt 指令层修改                         │
│  • 控制策略中间件 (Middleware)               │
│  • 子 Agent 创建                             │
│  • 工具包装器修改                             │
│  • 验证步骤注入                              │
│  每个弱点生成 3-5 个候选方案                  │
├─────────────────────────────────────────────┤
│  最小化 (Minimality)                         │
│  • 只修改解决该 Issue 的最小代码面            │
│  • 不进行大重构                               │
│  • 变异原子化、可解释                         │
│  • 超过阈值行数的修改直接拒绝                 │
└─────────────────────────────────────────────┘

提案类型示例(以 git 配置缺失为例):

# 提案类型 1: System Prompt 修改
+ Before running git commit, always verify git user.name
+ and user.email are configured. If not set:
+   git config user.name "Agent"
+   git config user.email "agent@localhost"

# 提案类型 2: Tool Wrapper
def execute_git_command(cmd):
    if "commit" in cmd:
        check_git_config()  # 自定义提案
    return subprocess.run(cmd, shell=True)

# 提案类型 3: 验证步骤注入
def create_file(path, content):
    write_file(path, content)
    if not os.path.exists(path):           # 新增验证
        raise FileNotFoundError(f"Failed: {path}")

阶段三:提案验证(Proposal Validation)— 最严格的门控

双分割门控机制(Dual-Split Gating)

                  提案修改
                     │
         ┌───────────┴───────────┐
         ▼                       ▼
   Held-in 验证集          Held-out 盲测集
   (训练集 70%)           (完全隔离 30%)
         │                       │
   ΔTrain ≥ 0              ΔHeldout ≥ 0
   (不下降)                (不下降)
         │                       │
         └───────────┬───────────┘
                     ▼
         非零收益条件:
         ΔTrain + ΔHeldout > 0
         (拒绝无效重构)
                     │
                     ▼
              ✅ 接受合并  /  ❌ 拒绝

三个门控条件缺一不可

条件 公式 含义
Held-in 不退步 ΔTrain ≥ 0 训练集通过率不下降
Held-out 不退步 ΔHeldout ≥ 0 盲测集通过率不下降
必须有净收益 ΔTrain + ΔHeldout > 0 拒绝无意义的无效重构

这个设计极其关键:防止 Agent 在演进过程中产生"廉价的过拟合"——通过训练集但盲测集退步。

验证伪代码

def validate_proposal(current, proposed, val_tasks):
    baseline = run_benchmark(current, val_tasks)
    proposal = run_benchmark(proposed, val_tasks)

    regressions = [t for t in val_tasks
                   if baseline[t].passed and not proposal[t].passed]

    if len(regressions) > 0:
        return REJECT, "Introduced regressions"

    if proposal.pass_rate <= baseline.pass_rate:
        return REJECT, "No net improvement"

    return ACCEPT, f"Improved {len(improvements)} tasks"

三、实验数据:0 参数微调下的智商暴涨

实验设置

Benchmark:    Terminal-Bench 2.0 (容器化 Linux 终端任务)
评测标准:     Pass@1 (全或无)
初始 Harness: 最小化 (DeepAgent SDK, 仅基础 system prompt + 文件系统/shell 工具)
变量控制:     模型后端、工具集、环境、验证器全部不变,只让 Harness 变化
模型选择:     三个不同家族,不同架构,不同基线水平

Held-out 通过率(论文权威数据)

基座模型 演进前 演进后 绝对提升 相对提升
MiniMax M2.5 40.5% 61.9% +21.4pp +52.8%
Qwen3.5-35B-A3B 23.8% 38.1% +14.3pp +60.1%
GLM-5 42.9% 57.1% +14.2pp +33.1%

Held-in 通过率(视频披露的额外数据)

基座模型 演进前 演进后 相对提升
Qwen3.5-35B-A3B 15.1% 36.0% +138%
MiniMax M2.5 43.0% 50.0% +16%
GLM-5 47.4% 57.0% +20%

核心意义:无需耗费巨额定进行 Post-training 或权重微调,仅靠外围代码的自我盘顺,即可省去过半显存和 Token 成本。

MiniMax M2.5 迭代收敛曲线

Iteration 0 (Baseline):  40.5%  ████████████████████░░░░░░░░░░░░░
Iteration 1:             45.2%  ██████████████████████░░░░░░░░░░░ (+4.7%)
Iteration 2:             51.8%  ██████████████████████████░░░░░░░ (+6.6%)
Iteration 3:             56.3%  ████████████████████████████░░░░░ (+4.5%)
Iteration 4:             59.1%  █████████████████████████████░░░░ (+2.8%)
Iteration 5:             61.2%  ██████████████████████████████░░░ (+2.1%)
Iteration 6:             61.9%  ███████████████████████████████░░ (+0.7%)
Iteration 7:             61.9%  ███████████████████████████████░░ [收敛]

观察:前 3-4 轮迭代贡献大部分收益,第 5 轮后边际递减,无过拟合迹象

关键发现

  • ✅ 三个模型一致提升(14-21 个绝对百分点)
  • ✅ 改进不限于高性能模型(最弱的 Qwen 23.8% 也有 60% 相对提升)
  • ✅ 不同模型生成不同的 Harness 修改(非通用指令)
  • ✅ 改进跨迭代累积,5-7 轮后趋于收敛

四、Case Study:不同模型的隐性病灶与专属药方

Self-Harness 展现出针对不同模型特性进行"精准施药"的能力——每个模型的 Harness 修改完全不同。

三模型病灶与药方总览

┌──────────────────────────────────────────────────────────────┐
│                    Self-Harness 诊断台                        │
├──────────────┬──────────────────┬────────────────────────────┤
│ 模型         │ 隐性病灶          │ 专属药方                    │
├──────────────┼──────────────────┼────────────────────────────┤
│ Qwen 3.5     │ 无效死循环        │ 异常拦截中间件              │
│              │ (盲目重试)        │ + 严格命令重试纪律           │
├──────────────┼──────────────────┼────────────────────────────┤
│ MiniMax M2.5 │ 过度探索发散      │ Loop Breaker (50次截断)     │
│              │ (不产出交付物)    │ + 强制早期交付机制           │
├──────────────┼──────────────────┼────────────────────────────┤
│ GLM-5        │ 状态记忆丢失      │ 持久化环境变量              │
│              │ (跨命令丢上下文)  │ + Sanity Check 修复门控     │
└──────────────┴──────────────────┴────────────────────────────┘

病灶 1:Qwen3.5-35B-A3B — 无效死循环

症状:遇到文件覆盖错误后,盲目重复执行同一命令,最终在混乱中删除必要文件然后停止。

Agent 行为轨迹:
  工具调用: write_file(config.json)  → ERROR (文件已存在)
  工具调用: write_file(config.json)  → ERROR (文件已存在)  ← 盲目重试
  工具调用: write_file(config.json)  → ERROR (文件已存在)
  工具调用: rm config.json           → 删除文件
  工具调用: write_file(config.json)  → ERROR (路径不存在)
  停止 → 任务失败

药方(两味)

  1. 严格命令重试纪律:禁止完全重复的命令,遇到错误必须改变策略
  2. 缺失 Artifact 立即重建:文件错误发生时,强制立即重建而非删除
# 提案生成的 Harness 中间件
def execute_command(cmd, history):
    # 严格重试纪律
    if cmd in history[-3:]:
        inject_warning("命令重复执行,请改变策略")
        return BLOCK

    try:
        result = run(cmd)
    except FileError as e:
        # 立即重建而非删除
        inject_warning(f"文件操作失败: {e}。请补齐缺失文件,"
                       f"不要删除后重试。")
        return INTERCEPT
    return result

病灶 2:MiniMax M2.5 — 过度探索发散

症状:无止境地探索数据集配置,直到执行环境超时,始终不产出任何交付物。

药方(两味)

  1. Loop Breaker(循环截断器):50 次工具调用后强制停止并转向
  2. 强制早期交付:要求以最快速度建立草稿文件,切断探索域
演进前:                          演进后:
  探索 → 探索 → 探索 → ... → 超时    探索 → 探索 → [50次截断]
  无交付物                            │
                                      ▼
                                   强制创建草稿文件
                                      │
                                      ▼
                                   迭代优化草稿 → 交付

VentureBeat 访谈补充:MiniMax M2.5 还加入了"尽可能早地创建所需 artifact 的初始版本"的规则。

病灶 3:GLM-5 — 环境状态记忆丢失

症状:跨命令保留不住环境变更(如 PATH 变量),浪费大量时间在大体积下载上,甚至 sanity check 失败时仍然提交任务。

药方(三味)

  1. 持久化环境变量:跨 shell session 保留 PATH 等变量
  2. 限制外部计算:避免大体积无谓下载
  3. Sanity Check 修复门控:检查失败时必须修复后才能结束
# GLM-5 的 Harness 提案示例

# 1. 环境变量持久化(跨命令保留)
export PATH="$PATH:/custom/bin"
echo "export PATH=$PATH" >> ~/.env_persistent

# 2. 外部计算限制
MAX_DOWNLOAD_SIZE=100MB  # 超限拦截

# 3. Sanity Check 门控
if ! verify_artifact_exists "$DELIVERABLE"; then
    log "强制状态切换: 实施验证模式"
    repair_artifact "$DELIVERABLE"
fi

Case Study 核心洞察

Self-Harness 不是加通用指令,而是:

  模型特定行为缺陷  ──>  精准的工程修复
  (不是知识缺口)          (不是 Prompt 优化)
         │                      │
         ▼                      ▼
  Qwen: 死循环            →  异常拦截 + 重试纪律
  M2.5: 过度探索          →  截断 + 强制交付
  GLM-5: 状态丢失         →  持久化 + 修复门控

  论文原文:Self-Harness does not simply add generic
  instructions, but effectively turns model-specific
  weaknesses into concrete, executable harness changes.

五、落地雷区与工程挑战

三大致命陷阱

┌──────────────────────────────────────────────────┐
│ 雷区 1: 确定性验证器依赖                          │
│ ──────────────────────────────                    │
│ 有 0/1 明确结果: ✅ (代码、DevOps、CI)             │
│ 开放性任务: ❌ (写周报、客服、创意)                │
│ 缺乏客观 Verifier → 双盲测试崩溃                  │
├──────────────────────────────────────────────────┤
│ 雷区 2: 修改边界受限                              │
│ ──────────────────────────────                    │
│ 能改: Prompt 配置、中间件控制流                    │
│ 不能改: 底层架构重构                              │
│ 无法自发重构 MCTS 等全新架构                      │
├──────────────────────────────────────────────────┤
│ 雷区 3: 成本与延迟风险                            │
│ ──────────────────────────────                    │
│ 提案只优化通过率,不优化算力                      │
│ 可能导致 API 调用次数 + 延迟暴增                  │
│ 需要独立的算力/成本帐本约束                       │
└──────────────────────────────────────────────────┘

适用 vs 不适用场景决策树

你的场景是否适合 Self-Harness?

  ├─ 有确定性验证器 (0/1 结果)?
  │   ├─ YES → 继续
  │   │   └─ 频繁更换基座模型?
  │   │       ├─ YES → ✅ 强烈推荐 (自动适配省人工)
  │   │       └─ NO  → ⚠️ 可选 (人工也行)
  │   │
  │   └─ NO (开放性任务)
  │       └─ ❌ 不推荐 (验证器不可靠会导致错误升级)
  │
  ├─ 安全关键领域?(医疗/法律/基础设施)
  │   └─ ❌ 不推荐全自动,保留 human-in-the-loop
  │
  └─ 算力预算有限?
      └─ ⚠️ 注意成本 (89 tasks × 2 runs × 5 轮 ≈ 890 次 agent 调用)

计算开销估算

维度 估算
每轮迭代 全量 benchmark × 2(baseline + proposal)
总量 (89 tasks) 89 × 2 × 5-7 轮 ≈ 890-1246 次 agent 调用
成本 (昂贵模型) $50-100+ 每次完整优化

Zhang 在访谈中明确:Self-Harness 用"重复提案生成、平行候选评估、回归测试"替代了部分人工工程负担,但这意味着更多 API token、更多优化期间延迟、更多评估基础设施。


六、实践启示:从 Prompt Tweaker 到 Feedback Architect

核心哲学转变

Agent 的能力上限不单取决于基座模型参数,更取决于其与环境交互的工程 Harness。模型的"智商缺陷"本质上是推理逻辑与僵化操作框架之间的工程摩擦。

传统思维:                          新范式:
  模型不行 → 换更强模型               模型不行 → 先查 Harness
  Prompt 不灵 → 手动调词              Prompt 不灵 → 让 Agent 自己看日志
  换模型后 Harness 失效 → 重写         换模型后 Harness 失效 → 自动重新演进

三条行动建议

┌────────────────────────────────────────────────────┐
│ 建议 1: 将 Harness 视为动态行为接口                 │
│ 打破 Harness = 静态 JSON / 死板 if-else 的思维     │
│ 预留可成长的扩展性                                  │
├────────────────────────────────────────────────────┤
│ 建议 2: 优化单位聚焦「抽象失效机制」                │
│ 日志结构化归档                                      │
│ 针对可复现的失败签名做模块化防御修复                │
│ 而非针对单一 Task 湊答案                            │
├────────────────────────────────────────────────────┤
│ 建议 3: 建立严酷的隔离测试牆                        │
│ Held-in + Held-out 双盲回归测试体系                 │
│ 防止演进中产生廉价过拟合                             │
└────────────────────────────────────────────────────┘

工程师角色演进

阶段 角色 核心技能
过去 Prompt Tweaker 手动调 system prompt
现在 Harness Engineer 设计工具、中间件、验证器
未来 Feedback Architect 设计让 Agent 自我改进的反馈系统

Zhang 预言:工程师角色将从"手动修补个别 prompt 或工具调用"转向"设计让 Agent 改进成为可能的反馈系统"。

与其他自改进方案对比

方案 目标层 外部依赖 代表方法
Self-Harness 系统级 Harness 无(纯自驱) 本文
Meta-Harness 系统级 Harness 强模型 GPT-5.5 教 GPT-4
SkillOpt (Microsoft) 任务级 Skill 执行反馈 技能代码优化
Retrospective Harness 轨迹级 偏好模型 Self-Preference over Trajectory
APEX 原则层 三层架构 Adaptive Principle Extraction

Self-Harness 和 SkillOpt 互补:SkillOpt 优化单个技能,Self-Harness 优化整体框架。


参考资料

相关笔记

  • [[Agent Harness Engineering]]
  • [[Terminal-Bench 2.0]]
  • [[AI Agent 自改进范式]]