Harness engineering
本文字数:1.1k 字 | 阅读时长 ≈ 4 min

Harness engineering

本文字数:1.1k 字 | 阅读时长 ≈ 4 min

让 Agent 完成任务,除了提供指令,还需要准备工具、运行环境和反馈机制。这里结合一个分类器评估和一个 Skill,理解怎样把要求变成可检查的工程约束。几个概念之间的关系可以先看 Agent 工程:Prompt、Context、Harness 与 Loop。

1. Harness 是什么

Harness 可以理解为支撑 Agent 工作的外围系统,包括工具执行、权限控制、状态管理和反馈机制。OpenAI 的 Harness engineering 还讨论了如何组织文档、开发环境和架构约束,让 Agent 更容易完成工程任务。

本文重点看其中的验证部分:

Agent 修改代码
      ↓
运行相关测试、Lint 或评估
      ↓
返回具体结果
      ↓
通过 → 进入下一步
失败 → 修正后重新验证

检查需要由工具或流程实际执行,仅把“记得检查”写进提示词,并不等于已经接好了检查机制。检查结果可以作为下一轮 Agent Loop 的输入;如果还要阻止不合格代码合并,需要将检查设为合并条件。

2. 把目标写成验收条件

假设我们让 Agent 优化一个 IP 分类器,并告诉它“Precision 优先”。它可能得到下面这样的示例结果:

Precision: 0.90
Recall:    0.20

Precision 达到了要求,但 Recall 可能已经无法接受。可以将目标写得更具体,例如 Precision 至少为 0.90,同时 Recall 至少为 0.70:

def check_metrics(precision, recall):
    failures = []
    if precision < 0.90:
        failures.append(f"Precision {precision:.2f} < required 0.90")
    if recall < 0.70:
        failures.append(f"Recall {recall:.2f} < required 0.70")
    return failures

failures = check_metrics(precision=0.93, recall=0.58)
print("\n".join(failures) if failures else "PASS")

上面的示例会指出:

Recall 0.58 < required 0.70

Agent 由此知道当前方案没有达到验收条件,可以继续调整 threshold、分析 hard negatives 或修改 classifier。这里约束了要达到的结果,具体实现仍然有选择空间。

这些阈值只是示例,需要根据任务确定。迭代时应在验证集上分析和调参,保留独立测试集做最终评估,避免反复根据测试结果优化方案。

3. Skill 负责指导,工具负责检查

假设我们创建了一个 analyze-badcase Skill,并规定:

分析 badcase 时:
1. 统计 FP 和 FN,按类别归因;
2. 输出 Precision、Recall 和 F1;
3. 不允许修改评估数据。

Skill 提供工作方法。如果“不能修改评估数据”是必须执行的规则,还需要将数据设为只读,或者在 CI 中检测相关文件变化,并阻止不符合规则的修改合并。

这些组件可以这样分工:

组件 主要作用
AGENTS.md、项目文档 说明背景、约定和资料位置
Skill 提供可复用的任务流程
权限与工具接口 控制允许执行的操作
Lint、Test、Evals、CI 检查规则、行为和任务指标
Review 判断难以机械检查的问题

这是一种方便理解的划分,不是固定的 Harness 标准。Skill 的创建和调用可以接着看 从零开始学习 Codex Skill。

例如,文档规定架构依赖是 UI → Service → Repo,结构测试检查是否出现 Repo → UI 的反向依赖,两者就能配合起来。CI 只能检测配置中覆盖的问题,还需要结合权限和流程,不能单靠它保证所有错误都被拦住。

4. 哪些要求适合自动检查

一条规则越重要、越容易判断、违反后的成本越高,就越值得接入自动检查。比如禁止提交密钥可以使用 secret scanner,固定的数据格式可以使用校验脚本,接口行为可以使用测试。

“文章读起来是否自然”“命名是否清楚”这类要求,很难完全变成通过或失败,更适合结合样本、规范和人工 Review。

Harness 的作用是让常见错误更容易被发现,让 Agent 得到明确反馈。检查通过只能说明已覆盖的条件通过了,不能等同于任务在所有方面都正确。