AI-Workshop 文献分享 #22 — Hierarchical Self-Improvement:Harness 自进化框架
分享人:qyr | 日期:2026-08-29 22:15
论文:Hierarchical Self-Improvement(HSI)Harness 自进化框架 作者:香港科技大学博士生(独立完成,实验规模有限,解读需审慎)
主题:HSI(Hierarchical Self-Improvement)—— training-free 的 Harness 代码级与策略级自进化
论文定位:本文介绍一套名为 HSI(Hierarchical Self-Improvement)的 Harness 自进化框架。论文由香港科技大学一名博士生独立完成,因此在解读实验结果时,应结合作者背景、实验规模和论文复现情况保持审慎。
核心问题:如何让 Agent 自动修改自身的 Harness 代码,并根据任务结果持续改进后续的修改策略?
1. Harness 回顾
1.1 什么是 Harness?
Harness 可以理解为围绕 LLM 构建的任务执行系统:它负责组织模型、记忆、工具、监控、安全和任务编排,使 LLM 能够稳定地完成复杂任务。
目前业界对 Harness 尚无完全统一的定义。根据相关工作对大量 Agent 系统的归纳,一个较完整的 Harness 至少应包含以下能力:
| 能力模块 | 主要职责 |
|---|---|
| 记忆与上下文 | 管理当前对话、历史对话和长期记忆,并构造模型所需的上下文。 |
| 外部工具协议 | 以标准化方式发现、调用和管理外部工具。 |
| 运行监控 | 监控进程状态、Token 用量、时间和其他资源开销。 |
| 安全审计 | 防止执行危险代码、写入危险文件或泄露密钥等敏感内容。 |
| 沙箱 | 在隔离环境中执行代码,降低对宿主机产生越权影响的风险。 |
| 评估与进化 | 评估任务结果,并据此更新记忆、Skill 或其他策略。 |
| 主进程编排 | 将上述模块整合到完整的对话与任务执行流程中。 |
从实现角度看,Harness 通常由一组代码文件组成。例如,可以将 Codex、Hermes 等 Agent 理解为由多类 Python 模块共同构成的任务执行 Harness。
1.2 Harness 进化的含义
Harness 进化,指的是根据任务反馈自动修改 Harness 的代码或策略。
这项工作具有较高风险,原因包括:
- Harness 通常包含复杂的主循环、工具调用和状态管理逻辑;
- 局部修改可能破坏其他模块的接口或运行假设;
- 代码错误可能导致整个任务执行失败;
- 直接修改生产环境中的 Harness,可能影响宿主系统的安全性与稳定性。
因此,已有思路往往优先优化多个 Harness 之间的协作方式,而不是直接修改底层 Harness 代码。HSI 则进一步尝试让 Harness 代码本身参与自进化。
2. HSI 的总体设计
2.1 优化目标
HSI 是一种 training-free 框架:整个过程不更新模型参数,只使用冻结的 LLM 对 Harness 进行代码级和策略级修改。
HSI 同时优化两个对象:
- 任务 Harness \(H\):负责完成具体任务的代码系统;
- 进化策略 \(\Sigma\):负责指导如何选择父版本、生成候选、选择提交版本和导出最终版本的策略。
外层负责运行整个实验的 Harness 和提示词保持固定。可以将其抽象为一个不会被修改的“外部监督者”:
- 为每个任务家族选择和修改任务 Harness;
- 使用新的 Harness 执行实验;
- 根据评估结果调整进化策略;
- 最终从历史版本中选择要部署的 Harness。
2.2 面向任务家族的专用 Harness
HSI 的目标不是从通用 Harness 中训练出一个适用于所有任务的“超级 Harness”,而是为每个任务家族(task family)分别定制一个专用 Harness。
例如:
- 以通用的
deepseek-harness作为每个任务家族的共同起点; - 分别针对 Crafter、BabyAI、TextWorld 等任务家族进行独立优化;
- 优化结束后得到多个任务专用 Harness;
- 不进行跨任务家族的联合进化,也不在进化过程中共享各家族的历史信息。
这一设计基于前人工作的经验:试图直接构建一个适用于所有任务的通用 Harness,可能比针对单一任务家族进行定制更困难。
2.3 安全约束:沙箱与版本树
为降低代码自修改的风险,HSI 对候选 Harness 设置了两项基本约束:
- 隔离执行:所有待评估 Harness 都在代码沙箱中运行,并通过固定接口
use_harness(harness_idx, task)注入任务。即使某个候选版本崩溃,也不会影响其他版本或进化宿主。 - 版本留存:每次修改都记录为新版本并保存快照,形成版本树。出现错误或性能退化时,可以回滚或重新选择历史版本。
3. 实验设置与总体流程
HSI 针对每个任务家族独立运行。以 Crafter 为例,系统从手工编写的初始 Harness \(H_0\) 开始,在固定的实验框架内迭代优化。
3.1 基本设置
- 执行模型 \(M\) 在整个过程中保持冻结;
- 任务执行阶段关闭深度推理,Evolver 与 Meta-Evolver 阶段开启深度推理;
- 每个任务家族分别维护自己的进化图 \(\mathcal{G}\)、进化策略 \(\Sigma\) 和
BOOTSTRAP.md; - 实验固定进行 \(T=5\) 轮外层迭代;
- 所有候选 Harness 都在沙箱中评估,并通过固定的
using_harness()接口运行; - 外层 Meta-Evolver 的执行模板保持冻结,不能被修改。
3.2 初始化
在 \(t=0\) 时,将初始 Harness \(H_0\) 加入进化图 \(\mathcal{G}_0\),加载默认策略 \(\Sigma_0\),并初始化空的 BOOTSTRAP.md。随后记录初始任务分数,开始外层迭代。
4. HSI 的迭代机制
每轮迭代围绕“选择—修改—评估—总结”展开,前三个阶段主要优化任务 Harness,最后一个阶段优化进化策略。
4.1 选择与修改 Harness
Evolver 根据当前任务家族的进化图、历史分数和经验库,选择一个可靠的历史版本作为父本,并提出本轮进化假设。随后,基于该父本生成若干独立的候选 Harness。
候选版本可以修改 Prompt 编排、记忆逻辑、工具处理、重试审计和 Agent 主循环等业务代码,但必须保持 using_harness() 接口契约不变,也不能直接覆盖父本文件。
4.2 沙箱评估与提交
每个候选版本都会在隔离沙箱中执行任务,并根据任务进度计算奖励。代码崩溃或执行失败的版本会获得较低奖励,但不会影响进化宿主。
评估完成后,HSI 不会简单地只保留最高分版本,而是综合考虑分数与改动方向,保留具有一定多样性的候选,并将其快照、分数、修改理由及父子关系加入进化图。
设计重点:进化图保留多条分支,既可以避免过早收敛,也能为后续迭代提供更多候选种子。
4.3 元进化
Meta-Evolver 读取本轮的执行轨迹和评估结果,总结哪些种子选择、修改方向和提交策略更有效,并据此更新进化策略:
同时,具有长期价值的经验会写入 BOOTSTRAP.md。需要注意,Meta-Evolver 只能修改进化策略 \(\Sigma\),不能修改自身的外层执行模板。
4.4 最终版本选择与泛化评估
完成全部 \(T=5\) 轮迭代后,HSI 扫描进化图中的历史提交版本,并在验证集上选择表现最好的 Harness \(H^*\)。
这一阶段与中间的提交选择有所不同:
- 中间提交选择重视候选多样性,保留不同的探索方向;
- 最终版本选择重视验证集性能与泛化能力,不只看开发任务中的最高分。
选出 \(H^*\) 后,再使用完全未见过的测试集进行最终评估。例如在 Setup-B(BabaIsAI)中,20% 的留出测试集在整个进化过程中保持不可见,只在最终版本导出后评估一次。
重要结论:进化过程不保证分数单调提升。某一轮可能产生性能退化的版本,但该版本仍可作为历史节点保留,供后续分析和回滚使用。
4.5 Crafter 示例:进化并不总是单调提升
以 Crafter 为例,系统可能经历如下过程:
- 初始版本没有显式提供库存信息,模型规划能力有限;
- 某轮迭代将库存和环境状态结构化加入上下文,任务分数提升;
- 后续迭代围绕资源采集等方向继续探索,并保留多个候选分支;
- 某次新修改引入 Bug 或导致性能下降,但该版本仍会被记录到进化图;
- 最终从全部历史版本中,根据验证集表现选择较优版本作为 \(H^*\)。
这个例子说明,HSI 的进化图不仅保存“当前最好版本”,也保存探索过程中的有效经验和失败案例。
5. 关键结论
- 每个任务家族独立执行完整的 \(T=5\) 轮循环;Crafter 的进化图、策略 \(\Sigma\) 与经验库不会被 BabyAI 等其他家族访问。
- 每轮迭代的前 3 个阶段修改任务 Harness \(H\),第 4 个阶段修改进化策略 \(\Sigma\);外层 Meta-Evolver 锚点始终冻结。
- 每个候选 Harness 都必须在沙箱中评估;评估只使用当前任务家族的数据,其他家族的分数不参与筛选。
- 中间 Commit Selection 保留候选多样性;最终 Best-Version Selection 才以验证集泛化性能为主要标准。
- 进化过程不保证单调提升,退化版本也会被保存到进化图中,作为后续迭代的反面参考。
- 结果表中的
Avg列是事后算术汇总指标,不属于进化循环内部的优化信号。