Lilian Weng推荐的Harness项目:autoresearch到底好在哪里
Lilian Weng推荐的Harness项目:autoresearch到底好在哪里
上个文章中[[deep-read-lilian-weng-harness-engineering]]提到的autosearch, 原文是这么说的:
定义一个让模型能够运行、测试和迭代的工作流是自动化的核心设计。Karpathy 的 autoresearch 是此类工作流构建方式的简洁范例。常见的工作流遵循以目标为导向的循环:规划、执行、观察/测试、改进,然后再次执行,直至达成目标。该过程可能会主动向用户发起请求,以明确任务要求或执行偏好。 这个仓库里面非常非常的简单,repo 被刻意保持得很小,真正重要的只有三个文件:
- train.py agent 唯一会修改的文件。包含完整的 GPT 模型、optimizer(Muon + AdamW)和训练循环。所有内容都可以调整:模型架构、hyperparameter、optimizer、batch size 等。该文件由 agent 修改并持续迭代。
- program.md 单个agent的基线指示。让你的 agent 读取这个文件,然后开始运行。该文件由人类修改并持续迭代。
- prepare.py 固定常量、数据准备(下载训练数据、训练 BPE tokenizer)以及安装运行时工具(dataloader、evaluation)。不会被修改。
flowchart TD
H["人类编写或调整 program.md"] --> A["外部 Agent 读取工作协议"]
A --> S["创建实验分支并检查数据缓存"]
S --> B["运行原始 train.py 建立 baseline"]
B --> I["提出一个实验想法"]
I --> M["只修改 train.py"]
M --> C["先创建候选 Git commit"]
C --> R["运行 train.py 内部 300 秒训练循环"]
R --> E["prepare.py进行评估"]
E --> O["Agent 从脚本输出读取 val_bpb(评估的得分)"]
O --> L["记录到 results.tsv"]
L --> D{"val_bpb 是否更低"}
D -->|"是"| K["保留 commit,分支前进"]
D -->|"否"| X["reset 回上一个有效 commit"]
K --> I
X --> I
通过外部Agent( 可能是你的CC Codex cursor 或者是任何Agent) 来进行外层循环 (program.md中的指示 但愿你的Agent会听话) ,然后内层循环 就是通过train.py脚本 反复进行训练;
我第一次见到这么精简的仓库,拉到本地之后, 在MacBookPro上跑了一共8小时,指标从1.44(基线)最终下降到了1.36(毕竟只是一台笔记本,推理效率已经不错了)
图中的白点都是被抛弃了的实验(得分基于之前的最高分),图中的绿点则为超过的当时的最高分的实验,完全都是Gpt-5.6-sol的想法;
这些有进展的实验 分别是通过减小训练批次 缩短训练上下文 加宽模型 增强 Attention来实现的. 我们无需关心他做的这些更改 而是应该聚焦到这个仓库实现训练自进化的方式.
所以 翻回去重新去看这三个文件 program.md:就相当于Harness 的控制协议,里面规定了Agent可操作的范围和空间:只能改train.py,先commit再实验,超过保留,未超过就reset;持续循环,直到用户手动打断;
prepare.py相当于基础设施和评估脚本:这里的内容不重要 ,重要的是一定要有一个衡量指标 任务一定要有个得分才行;并且这是整个 Harness 最关键的边界:Agent 可以改变训练方法,但不能改变“考试题”和“评分规则”。
train.py:实验对象 里面的内容是训练模型 但是我们其实不关心;它里面可以是任何我们需要进化的对象;
所以 引申出来 我如果要通过这套harness方案去进化一个prompt:
那么我要有一个"program.md" 告诉外部Agent只能修改我的prompt,然后描述一整套循环流程;
要有一个"train.py" 承载我当前的prompt;
要有一个"prepare.py" 里面可以用各种手段对这个prompt进行测评以及打分 ;
这样 我只需要让我的Agent去阅读program.md 然后就可以放手去等结果了;
这个项目几乎是用最低的复杂度 演示了一个自进化harness要有的必要东西了,缺一不可.