Better-Harness:让AI Agent自己优化自己的革命性框架
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) │ │
│ └──────────────┘ │
│ │ │
│ │ 决策:保留/丢弃修改 │
│ └──────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘工作流程:
- 运行baseline:用当前的harness运行inner agent,获取baseline分数
- 构建proposer workspace:为outer agent创建一个临时工作区
- 编辑harness:outer agent基于评估失败案例,编辑harness的允许部分
- 测试候选harness:在train和holdout集上运行修改后的agent
- 决策:只有当组合通过率提升时,才保留修改
- 迭代:重复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的可编辑部分:
支持两种加载模式:
- module_attr - 修改Python模块属性
[surfaces.prompt]
kind = "module_attr"
target = "my_agent.graph:BASE_PROMPT"
filename = "prompt.txt"
base_value = "You are a helpful agent."- 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发现的改进:
- Prompt优化:
# 优化后的prompt
"""
你是一个资深代码审查员,专注于:
1. 安全性:检查SQL注入、XSS等漏洞
2. 性能:识别N+1查询、未使用索引
3. 可维护性:评估代码复杂度、命名规范
对于每个问题,提供:
- 问题类型(严重/中等/轻微)
- 具体位置(文件名:行号)
- 修复建议(代码示例)
- 影响分析
"""- Tools增强:
# 优化后的tools
tools = [
{
"name": "read_file",
"description": "读取文件内容"
},
{
"name": "analyze_ast",
"description": "分析AST结构,检测代码模式"
},
{
"name": "check_security_patterns",
"description": "检测常见安全漏洞模式"
},
{
"name": "write_report",
"description": "写入结构化的审查报告"
}
]- 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_harness5.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_promptWorkspace 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的场景:
- 复杂的agent系统:harness有多个可调参数
- 有明确的评估指标:可以通过测试量化性能
- 需要持续优化:agent的功能会不断演进
- 有足够的计算资源:需要运行多次迭代评估
❌ 不适合的场景:
- 简单的单次任务:overkill
- 没有量化指标:无法评估改进效果
- 计算资源受限:每次迭代成本高
- 安全性敏感:自动修改可能有风险
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的独特优势:
- 代码级优化:不只是调参,而是修改代码逻辑
- 领域感知:通过评估案例,了解具体失败原因
- 自我进化:形成持续改进的闭环
八、未来展望
Better-harness目前还是一个研究项目,但它指明了AI系统发展的一个方向:自我进化。
未来可能的发展方向:
更丰富的surface类型
- 支持模型选择
- 支持架构搜索
- 支持多模态输入输出
更智能的outer agent
- 引入强化学习
- 支持元学习
- 跨任务迁移能力
更安全的优化
- 形式化验证
- 沙箱隔离
- 回滚机制
更高效的评估
- 并行评估
- 增量评估
- 代理指标
九、总结
Better-harness展示了AI系统"自我进化"的可能性。通过双层agent循环,系统可以:
- 自动发现问题:从评估失败中学习
- 自动生成改进:outer agent提出解决方案
- 自动验证效果:通过holdout集验证泛化能力
- 持续迭代优化:形成改进的闭环
这不是取代工程师,而是将工程师从重复的调优工作中解放出来,专注于更高层次的设计和创新。
对开发者的建议:
- 从简单开始:先尝试优化prompt
- 建立评估体系:好的评估是优化的基础
- 关注泛化能力:避免过拟合
- 保持人类监督:审查outer agent的修改
- 记录优化过程:理解agent学到了什么
最后:
Better-harness标志着AI开发范式的转变——从"人工调优"到"自我进化"。这可能是通向AGI的一小步,但确实是重要的一步。
项目地址:https://github.com/langchain-ai/deepagents 相关文章:Improving Deep Agents with Harness Engineering 发布时间:2026-04-17