Files

128 lines
5.0 KiB
Markdown
Raw Permalink Normal View History

# Harness
Skill 迭代优化。通过 eval → render test → analyze → optimize → rebuild 循环,持续提升 LLM 代码生成质量。
## 架构
```
controller.js # 主入口,驱动整个优化循环
├── eval-agent.js # 调用 eval CLI生成测试结果文件
├── render-agent.js # Headless 浏览器渲染测试,返回失败 case
├── analyze-agent.js # 将错误 case 归因到对应 skill 文件
├── optimize-agent.js # LLM 重写 skill 文档修复错误
├── index-agent.js # 重建 BM25 检索索引
├── config.js # Library 注册表g2 / g6 元信息)
├── config-manager.js # 多源配置合并CLI > 配置文件 > env > 默认值)
├── error-classifier.js# 错误分类与恢复策略
├── memory.js # 跨迭代记忆skill 优化历史)
└── retry-utils.js # 重试工具
```
### 循环流程
```
┌─────────────────────────────────────────────────────┐
│ 每次迭代 │
│ │
│ 1. eval-agent 生成代码并写入 result JSON │
│ 2. render-agent 渲染测试,识别 error / blank case │
│ 3. analyze-agent 将 case 归因到 skill 文件 │
│ 4. optimize-agent LLM 重写出错的 skill 文档 │
│ 5. index-agent 重建 BM25 检索索引 │
│ │
│ 连续 --passes 次零错误 → 退出 │
└─────────────────────────────────────────────────────┘
```
## 快速开始
```bash
cd harness && npm install
# 最小运行g2采样 10 条)
node controller.js
# 指定 library 和采样量
node controller.js --library=g6 --sample=30
# 全量数据集
node controller.js --library=g2 --full
```
## CLI 参数
| 参数 | 默认值 | 说明 |
|------|--------|------|
| `--library <id>` | `g2` | 目标库:`g2` \| `g6` |
| `--sample <n>` | `10` | 随机采样条数 |
| `--full` | `false` | 使用完整数据集(覆盖 `--sample`|
| `--retrieval <strategy>` | `tool-call` | 检索策略:`tool-call` \| `bm25` \| `context7` |
| `--passes <n>` | `3` | 连续多少次零错误才停止 |
| `--max-iterations <n>` | `20` | 最大迭代轮次上限 |
| `--concurrency <n>` | `5` | 渲染测试并发数 |
| `--optimize-model <id>` | 同 `AI_MODEL` | 优化阶段使用的模型(如 `claude-sonnet-4-6`|
| `--score` | `false` | 开启 VL 视觉质量打分 |
| `--score-threshold <n>` | `0.6` | 视觉分低于此值视为失败 |
| `--dry-run` | `false` | 只记录错误,不执行优化 |
| `--no-worktree` | `false` | 禁用 git worktree 隔离 |
| `--no-memory` | `false` | 禁用跨迭代记忆 |
| `--log <file>` | 自动生成 | dry-run 日志文件路径 |
## 环境变量
| 变量 | 说明 |
|------|------|
| `AI_MODEL` | 生成模型 ID`qwen3-coder-480b-a35b-instruct` |
| `AI_API_KEY` | 生成模型 API Key |
| `AI_API_ENDPOINT` | 生成模型 API Endpoint |
| `CLAUDE_API_KEY` | Claude 模型 API Key配合 `--optimize-model claude-*` 使用)|
| `CLAUDE_API_ENDPOINT` | Claude API Endpoint |
| `VL_MODEL` | 视觉评分模型,默认 `Qwen3-VL-235B-A22B-Instruct` |
| `G2_SRC_DIR` | G2 源码目录,供 optimize-agent 查阅(可选)|
| `G2_DOCS_DIR` | G2 文档目录,供 optimize-agent 查阅(可选)|
| `G6_SRC_DIR` | G6 源码目录,供 optimize-agent 查阅(可选)|
| `G6_DOCS_DIR` | G6 文档目录,供 optimize-agent 查阅(可选)|
也可通过 `HARNESS_*` 前缀环境变量设置 CLI 参数的默认值:`HARNESS_LIBRARY``HARNESS_SAMPLE``HARNESS_CONCURRENCY` 等。
## 持久化配置
常用参数可写入 `~/.harness/config.json`,避免每次重复输入:
```json
{
"library": "g6",
"sample": 30,
"concurrency": 5,
"optimizeModel": "claude-sonnet-4-6"
}
```
配置优先级:**CLI 参数 > 配置文件 > 环境变量 > 内置默认值**
## 常见用法
```bash
# 使用 Claude 优化,其余用默认模型生成
node controller.js --library=g6 --sample=30 --optimize-model claude-sonnet-4-6
# 只跑渲染测试,不优化(排查问题用)
node controller.js --dry-run --library=g6
# 禁用 worktree 隔离(本地调试)
node controller.js --no-worktree
# 开启视觉打分
node controller.js --score --score-threshold=0.7
```
## optimize-agent 的 refs 查阅工具
当配置了 `G6_SRC_DIR` / `G6_DOCS_DIR`(或 G2 对应变量optimize-agent 会额外获得三个文件系统工具用于查阅权威 API
- `list_directory` — 列出目录结构
- `read_file` — 读取文件内容(限 12 KB
2026-05-25 11:59:12 +08:00
- `grep_files` — 在目录中搜索关键词`
未配置时 agent 直接基于 skill 内容和错误 case 分析,不会尝试调用任何工具。