Back to Blog

Better-Harness:让AI Agent自己优化自己的革命性框架

2026-04-17T00:15:00+08:00
AI LangChain Agent Auto-Optimization Self-Improvement

Better-Harness:让AI Agent自己优化自己的革命性框架

LangChain最近开源了一个名为"better-harness"的研究项目,它的核心思想非常简单但极具革命性:让一个Deep Agent通过评估数据来改进另一个agent的harness

这意味着什么?AI系统不再需要人工调优,而是可以"自我进化"。

一、什么是Harness?

在深入better-harness之前,先理解什么是"harness"。

**Harness(驾驭系统)**是指围绕AI模型构建的完整执行环境,包括:

Harness组件 作用 示例
Prompt 定义agent的行为准则和角色 "你是一个专业的代码审查员..."
Tools agent可调用的工具集合 文件读写、API调用、数据库查询
Skills agent的专业能力模块 代码分析、文档生成、测试编写
Middleware 拦截和增强agent行为的中间件 日志记录、权限检查、性能监控

传统上,优化harness需要工程师手动调整prompt、修改middleware代码、重构tools。这是一个耗时且依赖经验的过程。

二、Better-Harness的核心思想

Better-harness的核心是一个双层agent循环

┌─────────────────────────────────────────────────────────────┐
│                     Better-Harness Loop                      │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  ┌──────────────┐         ┌──────────────┐                 │
│  │ Outer Agent  │────────▶│ Inner Agent  │                 │
│  │ (优化者)     │ 编辑    │ (被优化者)   │                 │
│  └──────────────┘ Harness  └──────────────┘                 │
│         │                            │                       │
│         │ 运行评估                   │                       │
│         │                            │                       │
│         ▼                            │                       │
│  ┌──────────────┐                   │                       │
│  │ 评估数据     │◀──────────────────┘                       │
│  │ (Train/      │ 运行结果                                   │
│  │  Holdout)    │                                           │
│  └──────────────┘                                           │
│         │                                                    │
│         │ 决策:保留/丢弃修改                                │
│         └──────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘

工作流程

  1. 运行baseline:用当前的harness运行inner agent,获取baseline分数
  2. 构建proposer workspace:为outer agent创建一个临时工作区
  3. 编辑harness:outer agent基于评估失败案例,编辑harness的允许部分
  4. 测试候选harness:在train和holdout集上运行修改后的agent
  5. 决策:只有当组合通过率提升时,才保留修改
  6. 迭代:重复2-5步骤,直到达到最大迭代次数

三、实战配置:从零开始

3.1 环境准备

# 克隆项目
git clone https://github.com/langchain-ai/deepagents.git
cd deepagents/examples/better-harness

# 安装依赖
uv sync --extra dev

要求

  • Python 3.11+
  • uv包管理器
  • deepagents已安装(或设置DEEPAGENTS_ROOT)

3.2 配置文件解析

创建my_experiment.toml

[experiment]
name = "my-harness"
runner = "pytest"
workspace_root = "/abs/path/to/workspace"
model = "claude-sonnet-4-6"
max_iterations = 3

[better_agent]
model = "claude-sonnet-4-6"
max_turns = 40

[runner.pytest]
project_root = "/abs/path/to/workspace/libs/evals"
model_flag = "--model"
summary_flag = "--evals-report-file"
pytest_args = ["-q"]

# 定义可编辑的harness表面
[surfaces.prompt]
kind = "module_attr"
target = "my_agent.graph:BASE_PROMPT"
filename = "prompt.txt"
base_value = """
You are a helpful agent.
"""

[surfaces.middleware_impl]
kind = "workspace_file"
target = "my_agent/middleware.py"
filename = "middleware.py"
base_file = "middleware.py"

[surfaces.middleware_registration]
kind = "workspace_file"
target = "my_agent/graph.py"
filename = "graph.py"
base_file = "graph.py"

# 定义评估案例
[[cases]]
case_id = "tests/evals/test_one.py::test_case[{model}]"
split = "train"
stratum = "tool_use"

[[cases]]
case_id = "tests/evals/test_two.py::test_case[{model}]"
split = "holdout"
stratum = "tool_use"

3.3 关键配置详解

Surfaces(可编辑表面)

每个surface定义了一个harness的可编辑部分:

支持两种加载模式

  1. module_attr - 修改Python模块属性
[surfaces.prompt]
kind = "module_attr"
target = "my_agent.graph:BASE_PROMPT"
filename = "prompt.txt"
base_value = "You are a helpful agent."
  1. workspace_file - 临时替换工作区文件
[surfaces.middleware]
kind = "workspace_file"
target = "my_agent/middleware.py"
filename = "middleware.py"
base_file = "middleware.py"

常见的surface类型

Surface类型 作用 应用场景
prompt 修改agent的prompt 调整行为准则、角色定位
tools 添加/修改工具 扩展agent能力边界
skills 优化技能模块 提升特定领域性能
middleware_impl 修改middleware实现 改进拦截逻辑
middleware_registration 修改middleware注册 开启/关闭middleware

Cases(评估案例)

支持三种split类型:

[[cases]]
case_id = "tests/evals/test_one.py::test_case[{model}]"
split = "train"        # 训练集:用于优化
stratum = "tool_use"   # 分层:按任务类型分组

[[cases]]
case_id = "tests/evals/test_two.py::test_case[{model}]"
split = "holdout"      # 测试集:验证泛化能力
stratum = "tool_use"

Split说明

  • train:用于outer agent学习和优化
  • holdout:防止过拟合,验证泛化能力
  • scorecard:可选的额外评估维度

3.4 运行优化

# 验证配置
uv run better-harness validate my_experiment.toml

# 运行优化循环
uv run better-harness run my_experiment.toml \
  --output-dir runs/my-harness \
  --max-iterations 3

输出结构

runs/my-harness/
├── iteration_0/
│   ├── baseline/          # baseline运行结果
│   └── candidate/         # 候选harness
├── iteration_1/
│   ├── candidate/         # 第一次迭代结果
│   └── decision.json      # 保留/丢弃决策
├── iteration_2/
│   └── ...
└── final/                 # 最终优化的harness
    ├── harness/          # 最优harness代码
    ├── metrics.json      # 性能指标
    └── report.md         # 优化报告

四、实际案例:优化代码审查Agent

场景描述

假设我们有一个代码审查agent,初始harness表现一般:

初始配置

# prompt.txt
"""
你是一个代码审查员。检查代码质量并给出建议。
"""

# tools.py
tools = [
    {
        "name": "read_file",
        "description": "读取文件内容"
    },
    {
        "name": "write_report",
        "description": "写入审查报告"
    }
]

评估结果

  • Train set: 65% pass rate
  • Holdout set: 58% pass rate
  • 主要问题:遗漏边界情况、建议不够具体

运行Better-Harness

uv run better-harness run code_review.toml \
  --output-dir runs/code_review \
  --max-iterations 5

优化后的Harness

Outer Agent发现的改进

  1. Prompt优化
# 优化后的prompt
"""
你是一个资深代码审查员,专注于:
1. 安全性:检查SQL注入、XSS等漏洞
2. 性能:识别N+1查询、未使用索引
3. 可维护性:评估代码复杂度、命名规范

对于每个问题,提供:
- 问题类型(严重/中等/轻微)
- 具体位置(文件名:行号)
- 修复建议(代码示例)
- 影响分析
"""
  1. Tools增强
# 优化后的tools
tools = [
    {
        "name": "read_file",
        "description": "读取文件内容"
    },
    {
        "name": "analyze_ast",
        "description": "分析AST结构,检测代码模式"
    },
    {
        "name": "check_security_patterns",
        "description": "检测常见安全漏洞模式"
    },
    {
        "name": "write_report",
        "description": "写入结构化的审查报告"
    }
]
  1. Middleware添加
# 新增middleware:重复检查
class DuplicateCheckMiddleware:
    def __call__(self, agent_input):
        # 检查是否已经审查过相同文件
        if is_duplicate(agent_input['file']):
            return {
                "status": "skip",
                "reason": "Already reviewed"
            }
        return agent_input

最终结果

  • Train set: 89% pass rate (+24%)
  • Holdout set: 84% pass rate (+26%)
  • 泛化能力提升,未见代码类型的成功率提高

五、技术深度解析

5.1 Outer Agent的视角

Outer Agent在每次迭代中看到的信息:

┌─────────────────────────────────────────┐
│         Outer Agent的输入                │
├─────────────────────────────────────────┤
│ 1. 当前可编辑的surface文件              │
│    - prompt.txt                         │
│    - tools.py                           │
│    - middleware.py                      │
│                                         │
│ 2. Visible train failures               │
│    - test_case_101: FAILED              │
│      Reason: Missed SQL injection       │
│    - test_case_203: FAILED              │
│      Reason: Suggestion too vague       │
│                                         │
│ 3. 失败案例的源代码                     │
│    - tests/evals/test_one.py            │
│                                         │
│ 4. 历史决策                             │
│    - Iteration 1: Keep (score +5%)      │
│    - Iteration 2: Discard (score -2%)   │
└─────────────────────────────────────────┘

Outer Agent的任务:

# 伪代码
def optimize_harness(failures, current_harness):
    for failure in failures:
        if "SQL injection" in failure.reason:
            # 修改prompt,强调安全性
            current_harness.prompt += "\n重点关注SQL注入漏洞"
            # 添加安全检查tool
            current_harness.tools.append("check_security_patterns")
        elif "too vague" in failure.reason:
            # 优化prompt,要求更具体的建议
            current_harness.prompt += "\n每个建议必须包含代码示例"

    return current_harness

5.2 可编辑表面的机制

Module Attr模式

# 目标模块:my_agent/graph.py
BASE_AGENT_PROMPT = "原始prompt"

# Better-harness的工作流程
# 1. 读取当前值
current_prompt = importlib.import_module("my_agent.graph").BASE_AGENT_PROMPT

# 2. Outer Agent编辑
edited_prompt = outer_agent.edit(current_prompt)

# 3. 运行时patch
import my_agent.graph
my_agent.graph.BASE_AGENT_PROMPT = edited_prompt

# 4. 运行eval
run_eval()

# 5. 恢复原值
my_agent.graph.BASE_AGENT_PROMPT = original_prompt

Workspace File模式

# 目标文件:my_agent/middleware.py

# Better-harness的工作流程
# 1. 备份原文件
shutil.copy("my_agent/middleware.py", "middleware.py.backup")

# 2. Outer Agent编辑
edited_middleware = outer_agent.edit_file("my_agent/middleware.py")

# 3. 替换文件
with open("my_agent/middleware.py", "w") as f:
    f.write(edited_middleware)

# 4. 运行eval
run_eval()

# 5. 恢复原文件
shutil.move("middleware.py.backup", "my_agent/middleware.py")

5.3 决策机制

保留/丢弃的决策逻辑

def should_keep_candidate(baseline_score, candidate_score, min_improvement=0.01):
    """
    决策是否保留候选harness

    Args:
        baseline_score: baseline的通过率
        candidate_score: 候选harness的通过率
        min_improvement: 最小提升阈值(默认1%)

    Returns:
        bool: True=保留, False=丢弃
    """
    improvement = candidate_score - baseline_score

    # 必须有正向提升
    if improvement <= 0:
        return False

    # 提升必须超过阈值
    if improvement < min_improvement:
        return False

    # 检查过拟合(train提升但holdout下降)
    # 这里需要更复杂的逻辑
    return True

六、应用场景与最佳实践

6.1 适用场景

✅ 适合使用better-harness的场景

  1. 复杂的agent系统:harness有多个可调参数
  2. 有明确的评估指标:可以通过测试量化性能
  3. 需要持续优化:agent的功能会不断演进
  4. 有足够的计算资源:需要运行多次迭代评估

❌ 不适合的场景

  1. 简单的单次任务:overkill
  2. 没有量化指标:无法评估改进效果
  3. 计算资源受限:每次迭代成本高
  4. 安全性敏感:自动修改可能有风险

6.2 最佳实践

1. 从小规模开始

# ✅ 好的做法:先优化一个surface
[surfaces.prompt]
kind = "module_attr"
target = "my_agent.graph:BASE_PROMPT"
filename = "prompt.txt"
base_value = "..."

# ❌ 不推荐:一开始就暴露太多surface
[surfaces.prompt]
...
[surfaces.tools]
...
[surfaces.middleware_impl]
...
[surfaces.middleware_registration]
...

2. 合理设置评估案例

# ✅ 平衡的train/holdout比例
[[cases]]
case_id = "test_1"
split = "train"   # 70% train
stratum = "tool_use"

[[cases]]
case_id = "test_2"
split = "holdout" # 30% holdout
stratum = "tool_use"

3. 限制最大迭代次数

# ✅ 合理的迭代次数
uv run better-harness run my_experiment.toml \
  --max-iterations 3  # 3-5次通常足够

# ❌ 不推荐:无限迭代
uv run better-harness run my_experiment.toml \
  --max-iterations 100  # 可能过拟合

4. 监控过拟合

# 检查train/holdout的gap
def check_overfitting(train_score, holdout_score, max_gap=0.1):
    gap = train_score - holdout_score
    if gap > max_gap:
        print(f"⚠️ 过拟合警告:train={train_score:.2f}, "
              f"holdout={holdout_score:.2f}, gap={gap:.2f}")
        return True
    return False

七、与其他方法的对比

方法 人工优化 AutoML/Hyperopt Better-Harness
优化对象 整个harness 超参数 Harness代码
自动化程度
适用范围 通用 模型训练 Agent系统
代码级优化
需要人工设计 部分需要
评估成本
可解释性

Better-Harness的独特优势

  1. 代码级优化:不只是调参,而是修改代码逻辑
  2. 领域感知:通过评估案例,了解具体失败原因
  3. 自我进化:形成持续改进的闭环

八、未来展望

Better-harness目前还是一个研究项目,但它指明了AI系统发展的一个方向:自我进化

未来可能的发展方向

  1. 更丰富的surface类型

    • 支持模型选择
    • 支持架构搜索
    • 支持多模态输入输出
  2. 更智能的outer agent

    • 引入强化学习
    • 支持元学习
    • 跨任务迁移能力
  3. 更安全的优化

    • 形式化验证
    • 沙箱隔离
    • 回滚机制
  4. 更高效的评估

    • 并行评估
    • 增量评估
    • 代理指标

九、总结

Better-harness展示了AI系统"自我进化"的可能性。通过双层agent循环,系统可以:

  • 自动发现问题:从评估失败中学习
  • 自动生成改进:outer agent提出解决方案
  • 自动验证效果:通过holdout集验证泛化能力
  • 持续迭代优化:形成改进的闭环

这不是取代工程师,而是将工程师从重复的调优工作中解放出来,专注于更高层次的设计和创新。

对开发者的建议

  1. 从简单开始:先尝试优化prompt
  2. 建立评估体系:好的评估是优化的基础
  3. 关注泛化能力:避免过拟合
  4. 保持人类监督:审查outer agent的修改
  5. 记录优化过程:理解agent学到了什么

最后

Better-harness标志着AI开发范式的转变——从"人工调优"到"自我进化"。这可能是通向AGI的一小步,但确实是重要的一步。


项目地址:https://github.com/langchain-ai/deepagents 相关文章:Improving Deep Agents with Harness Engineering 发布时间:2026-04-17

Enjoyed this article? Share it with others!