Hermes Agent Eval Harness:可验证 Skill 进化的 7 模块闭环(TaskSet/HarnessAdapter/TrajectoryStore/Verifier/Selection Gate/Regression Gate/Report & Replay + 6 类 Verifier + 3 类 Regression + 6 阶段落地路径)¶
Ch04.035 Hermes Agent Eval Harness:可验证 Skill 进化的 7 模块闭环(TaskSet/HarnessAdapter/TrajectoryStore/Verifier/Selection Gate/Regression Gate/Report & Replay + 6 类 Verifier + 3 类 Regression + 6 阶段落地路径)¶
📊 Level ⭐⭐ | 26.9KB |
entities/sota-ai-hermes-agent-eval-harness-skillopt-implementation.md
strategic_context: "Frontier 1 — Harness/Skill 从个人能力到组织资产" provenance_state: inferred
Hermes Agent Eval Harness:可验证 Skill 进化的 7 模块闭环¶
来源:SOTA AI 微信公众号,2026-06-18 作者:Hermes Agent 技术实现团队 核心命题:SkillOpt 真正难落地的不是"让模型提出 skill patch",而是更底层的问题:"你怎么证明一个 agent 真的变好了?" 本文给出 Hermes Agent Eval Harness 的 7 模块闭环 + 6 类 Verifier + 3 类 Regression + 6 阶段落地路径。
一、定位:从 SkillOpt 学术到 Eval Harness 工程¶
Skillopt(Microsoft + SJTU SkillOpt 论文 arxiv 2605.23904)提出了"把 SKILL.md 当成冻结模型之外的可训练状态"——通过 rollout、bounded edits 和 held-out validation gate 优化 agent skills。但 SkillOpt 学术框架在生产环境落地需要完整的工程实施:
- 轨迹采集:没有完整执行轨迹,reflection 只能看结果,无法诊断失败
- 可比较分数:不同任务需要不同 verifier(精确/产物/执行/轨迹/策略/Judge)
- Selection Gate:训练样本只暴露问题,selection split 才决定 patch 是否更好
- Regression Gate:防止"修好 A、打坏 B",每次 patch 都要跑稳定回归集
- Rejected Buffer:失败 patch 是训练数据,指导 optimizer 不再犯同样错误
关键金句:
Self-improving skills 的关键不是"self",而是"verified improvement"。
二、为什么 Agent 不能只看"这次成功了"¶
普通软件测试可以输入固定参数,断言返回值。Agent 不一样 — 输出不仅是 final answer,还包括中间决策:
- 调用了哪些工具
- 是否读取了正确文件
- 是否验证了修改结果
- 是否越权访问敏感路径
- 是否在失败后做了合理排查
- 是否把大输出截断后仍能找到关键证据
一个 agent 最终答对了,不代表过程安全;一次答错了,也不代表 skill 方向错。
Agent Eval Harness 评估三层结果:
| 层级 | 评估对象 | 典型问题 |
|---|---|---|
| Final output | 最终答案或 artifact | 是否完成用户目标 |
| Process trace | 工具调用和观察 | 是否走了正确路径 |
| Policy boundary | 权限、审批、安全 | 是否违反约束 |
三、Eval Harness 最小闭环:7 模块¶
| 模块 | 功能 |
|---|---|
| TaskSet | 定义任务输入、初始文件、环境状态、可用工具、期望输出和评分方式 |
| HarnessAdapter | 启动 agent turn,注入 task context,限制工具集,收集 messages、tool calls、observations 和 artifacts |
| TrajectoryStore | 保存完整执行过程(结构化事件流) |
| Verifier | 把轨迹和输出变成可比较分数 |
| Selection Gate | 决定一个候选 skill 是否接受 |
| Regression Gate | 防止"修好 A、打坏 B" |
| Report & Replay | 输出失败样本、关键轨迹、分数变化、工具统计和可复现命令 |
四、任务集不是 prompt 列表,而是环境快照¶
很多人做 agent eval 的第一步是写 prompts.jsonl。这只能覆盖最浅层的问答任务。真实 agent 任务应该包含环境状态:
4.1 代码修改任务 TaskSet¶
至少需要: - repo checkout 或 fixture 文件 - 用户请求 - 初始 git diff - 允许的工具集 - 禁止的路径 - 验证命令 - 期望 artifact - 超时和预算
4.2 文档任务 TaskSet¶
- 输入文档
- 可访问资料
- 目标格式
- 禁止引用的来源
- 评分 rubric
4.3 Skill patch 任务 TaskSet¶
- 当前 SKILL.md
- 历史 rejected edits
- 训练样本失败轨迹
- selection split
- patch budget
TaskSet 是"任务 + 世界状态 + 验证契约"。只有 prompt,没有 world state,就很难复现。
五、TrajectoryStore:Agent Eval 的事实来源¶
Eval Harness 需要把 trajectory 扩展成结构化事件流:
run_id | task_id | model | skill_version | toolset
messages[] | tool_calls[] | tool_results[] | artifacts[]
verifier_results[] | policy_events[] | duration_ms | token_usage
关键洞察 — 工具输出持久化:工具输出太大时不能把全文塞回上下文。Hermes 的 tools/tool_result_storage.py 已经处理:写入 sandbox temp dir 并用 <persisted-output> 给模型 preview + 文件路径。Eval Harness 应保留"工具真实返回了什么",不仅是"模型看到了什么"。
六、Verifier 不是函数,而是一组判定器(6 类)¶
| Verifier | 适用任务 | 输出 |
|---|---|---|
| Exact verifier | 问答、分类、JSON 输出 | pass/fail |
| Artifact verifier | 文件、表格、代码修改 | diff、hash、字段检查 |
| Execution verifier | 代码、脚本、测试命令 | exit code、stdout、coverage |
| Trace verifier | 工具路径、操作顺序 | 是否读取/验证/回滚 |
| Policy verifier | 安全、审批、敏感路径 | violation events |
| Judge verifier | 开放答案、摘要、策略判断 | rubric score |
成熟 harness 应输出 breakdown 而非总分:
final_answer_score: 0.8
artifact_score: 1.0
trace_score: 0.6
policy_score: 1.0
regression_risk: medium
这避免两个问题: 1. final answer 掩盖过程错误(如代码改对了但 agent 没运行测试) 2. 过程正确但 final answer 小错(如找到正确证据但输出格式缺字段;应指导 skill patch 而非判死)
七、Selection Gate:Skill Patch 不能靠直觉合入¶
old_score = evaluate(selection_set, old_skill)
new_score = evaluate(selection_set, candidate_skill)
accept only if:
new_score > old_score
and policy_score has no regression
and critical regression set passes
7.1 三个细节¶
- 训练样本不能决定接受 — 训练只负责产生候选规则
- tie 不应该默认接受 — 自然语言规则增加上下文长度和冲突风险,无明确收益就不该扩大 skill
- 安全回归要高优先级 — patch 即使提升任务成功率,只要引入越权访问、审批绕过、敏感路径写入就应该拒绝
这是 SkillOpt 里 held-out gate 的工程版本。
八、Regression Gate:让 Agent 能长期进化(3 类)¶
| 类型 | 覆盖范围 |
|---|---|
| Domain regression | 该 skill 所属任务域(spreadsheet / code review / web research) |
| Runtime regression | 基础 agent 能力(tool call 解析 / 工具结果持久化 / checkpoint-resume / 上下文压缩 / approval) |
| Safety regression | 敏感路径 / 危险命令 / 权限升级 / prompt injection / 数据泄露 |
Hermes 现有测试已体现此思路: - tests/test_batch_runner_checkpoint.py — 批处理 checkpoint/resume - tests/test_transform_tool_result_hook.py — tool hook 语义 - tools/approval.py — 危险命令审批独立安全系统
Eval Harness 要做的是把这些测试思想带进 agent 真实执行轨迹。
九、Rejected Buffer:失败 patch 是训练数据¶
很多 self-improving 系统忽略失败 patch,但失败 patch 非常有价值:
- 哪类规则听起来对但实际会降分
- 哪些行为已被 existing skill 覆盖
- 哪些修复过于样本特化
- 哪些 patch 会触发安全回归
Rejected Buffer 应记录:
candidate_patch | source_failures | selection_score_delta
regression_failures | rejection_reason | review_notes
后续 reflection 看到这些记录,就不会反复提出同一类坏规则。 这和软件工程里的 review history 很像 — 好的团队不会只保存 merged PR,也会保留 rejected design 的理由。
十、6 阶段落地路径¶
| 阶段 | 内容 | 复用 Hermes 能力 |
|---|---|---|
| 第 1 阶段 | 只做离线 eval | 新增 eval_runs/ 目录,复用 batch_runner.py 的 checkpoint/resume |
| 第 2 阶段 | 接入 trajectory | 每个 eval run 保存完整 messages、tool calls、tool results 和 persisted-output 路径 |
| 第 3 阶段 | 加 verifier registry | 不同任务绑定不同 verifier(命令执行、文件 diff、JSON schema、LLM judge、policy checker) |
| 第 4 阶段 | 加 skill gate | 对 skill_manage(action="patch") 或人工 patch 生成 candidate skill,selection split 上比较 old/new score |
| 第 5 阶段 | 加 regression suite | 每个 skill 维护一组 critical tasks,critical regression 失败 patch 不能自动合入 |
| 第 6 阶段 | 加 rejected buffer | 把失败 patch 和原因写入 skill 训练历史,只给 optimizer 使用,不注入线上 prompt |
十一、最小数据结构¶
Task:
{
"id": "spreadsheet-001",
"prompt": "修复表格中的汇总结果",
"fixture": "fixtures/spreadsheet-001/",
"toolsets": ["files", "execute_code"],
"verifier": "spreadsheet_diff",
"timeout_sec": 180
}
Run result:
{
"run_id": "2026-06-07T10-00-00Z",
"task_id": "spreadsheet-001",
"model": "gpt-5.5",
"skill_version": "spreadsheet@v12",
"completed": true,
"score": 0.87,
"tool_stats": {"execute_code": {"count": 3, "success": 3}},
"artifacts": ["output.xlsx"],
"trajectory_path": "runs/.../trajectory.jsonl"
}
Skill patch decision:
{
"patch_id": "skillpatch-042",
"base_skill": "spreadsheet@v12",
"candidate_skill": "spreadsheet@v13-candidate",
"selection_delta": 0.04,
"regression_passed": true,
"accepted": true
}
最小系统只要能保存这些,就已经比"凭感觉改 skill"前进了一大步。
十二、5 大常见坑¶
- 只跑训练集 — 把 skill 训练成"样本答案提示词",而不是可迁移过程知识
- 只看平均分 — 平均分会掩盖安全回归(Agent 系统里某些任务失败成本远高于普通任务)
- 不保存完整轨迹 — 失败分析只能靠猜
- 用 LLM judge 替代所有 verifier — LLM judge 适合开放任务,不适合文件 diff、代码执行、权限边界这类可确定验证
- 自动合入过大 patch — 自然语言 skill 越长冲突越多;bounded patch 和 rollback 比"让模型重写最佳实践"更可靠
十三、与既有实体的关联¶
| 实体 | 关系 | 互补角度 |
|---|---|---|
| Skillopt | SkillOpt 学术理论 | Microsoft + SJTU SkillOpt 训练范式(121 行):把 SKILL.md 当可训练状态、bounded edits、held-out validation gate;本文是其在 Hermes Agent 的工程实施蓝图 |
| Skillopt Microsoft Train Skill Like Neural Network | SkillOpt 产品视角 | 别再手写 Skill!像神经网络一样训练(58 行):SkillOpt 产品介绍 |
| Skillopt Microsoft Train Skill Hyman'S Blog | SkillOpt Hyman 视角 | 微软等 SkillOpt 解读(64 行) |
| Hermes Agent Skill Crossover Optimization | Hermes Skill 互优化 | SkillEvolver × Darwin × EmbodiSkill 4 轮闭环(277 行)— Skill 之间的相互优化 |
| Skill Self Evolution Three Approaches | Skill 自进化 3 路线 | Trace2Skill 归纳法 / EvoSkill 验证闭环 / SkillOpt 训练范式(45 行);本文是 SkillOpt + EvoSkill 的工程化展开 |
| Agent Self Improvement Six Mechanisms | 6 大自改进机制 | Agent 自改进的 6 大机制 |
| Ai Recursive Self Improvement Nanogpt Prime Intellect | 递归自改进 | nanogpt + Prime Intellect |
| Darwin Skill 2 Huashu | Darwin Skill 2 | Darwin Skill 进化 |
| Embabel | Embabel | Embabel 自进化框架 |
| Pith Train Agent Native Moe Training Framework | Pith 训练框架 | Agent 原生 MoE 训练 |
| Hermes Agent 12 Layer Full Configuration Guide | Hermes 12 层配置 | Hermes Agent 12 层完整配置 |
| Hermes 9 Module Architecture | Hermes 9 模块 | Hermes 9 模块架构 |
| Harness Engineering 7 Layers Openclaw Hermes Claude Code P1Anu | 7 层 Harness | OpenClaw/Hermes/Claude Code 7 层 Harness |
| Slim Cuhk Skill Lifecycle Agentic Rl | SLIM Skill 生命周期 | CUHK SLIM Skill 生命周期 + Agentic RL |
| Deli Auto Research Skill V2 Continual Learning Self Improvement | Deli Auto Research | Continual learning + self-improvement |
| Claude Code Vs Hermes Session Vs Goal Lifecycle | Hermes 生命周期 | Session vs Goal lifecycle 对比 |
十四、关键金句¶
Self-improving skills 的关键不是"self",而是"verified improvement"。
一个 agent 最终答对了,不代表过程安全;一次答错了,也不代表 skill 方向错。
TaskSet 是"任务 + 世界状态 + 验证契约"。只有 prompt,没有 world state,就很难复现。
Tie 不应该默认接受 — 自然语言规则增加上下文长度和冲突风险,无明确收益就不该扩大 skill。
安全回归要高优先级 — patch 即使提升任务成功率,只要引入越权访问就应该拒绝。
LLM judge 适合开放任务,不适合文件 diff、代码执行、权限边界这类可确定验证。
Bounded patch 和 rollback 比"让模型重写最佳实践"更可靠。
Hermes Agent 已经具备一些拼图:轨迹保存、批量运行、工具统计、大输出持久化、审批系统、执行沙箱、测试体系。下一步不是再加一个"让模型反思"的 prompt,而是把这些拼图组织成一个完整评测闭环。
这个闭环一旦建立,skills 就不再只是手写经验文档,而会变成可训练、可验证、可回滚、可迁移的运行时资产。这也是从 agent demo 走向 agent engineering 的分水岭。
十五、实践启示¶
对 Eval Harness 设计者:从 7 模块逐个落地¶
不要试图一步到位实现完整闭环。按 6 阶段路径,先离线 eval → 接 trajectory → 加 verifier registry → 加 skill gate → 加 regression suite → 加 rejected buffer。每个阶段都是上阶段的能力叠加。
对 Skill 作者:tie 不应该被接受¶
每次提 skill patch 要回答"明确收益是什么"——自然语言 skill 越长冲突越多,没有明确选择率提升就应该拒绝。
对安全团队:safety regression 优先级最高¶
Domain/Runtime/Safety 三类 regression 中,safety 失败立即拒绝 patch,不能因为任务成功率提升而妥协。
对 optimizer/reviewer:失败 patch 是训练数据¶
Rejected Buffer 不是"垃圾箱"——它是 optimizer 不再重复同类错误的关键证据。每次 reject 要写明原因、selection_score_delta、regression_failures。
对整个团队:把"verified improvement"当作 KPI¶
不是"agent 反思了"或"skill 添加了"——而是"在 selection split 上 score 从 X 提升到 Y,且 safety regression 通过"。Self-improving 系统的关键不是 self,而是 verified。
十六、引用与延伸阅读¶
→ 原文存档
学术参考: - SkillOpt: Executive Strategy for Self-Evolving Agent Skills — https://arxiv.org/pdf/2605.23904
Hermes Agent 代码引用: - agent/trajectory.py — 轨迹保存 - batch_runner.py — 批量运行、checkpoint、resume、tool statistics - tools/tool_result_storage.py — 大工具输出持久化(<persisted-output> 机制) - tools/approval.py — 审批系统 - tools/code_execution_tool.py — 执行沙箱
测试引用: - tests/test_batch_runner_checkpoint.py — 批处理 checkpoint 和 resume - tests/test_transform_tool_result_hook.py — tool hook 语义