mcpField
A
arbor

arbor

github.com/k-dense-aiAgent 工作流55.1k1.3k 次安装2 天前更新
代码仓库

关于 arbor

arbor 是一种用于在可量化目标下迭代改进现有产物的技能,适合需要运行多轮实验的研究与工程任务。它用持久假设树累积实验依据,并以独立测试评估作为合并门槛。

主要功能

  1. 01维护持久化假设树
  2. 02按假设组织实验轮次
  3. 03隔离子 Agent 并行测试
  4. 04记录结果并向上提炼洞见
  5. 05用留出测试评估把关合并

适用场景

  1. 01优化模型训练方案
  2. 02提升 Agent 或工具链指标
  3. 03改进数据生成与筛选流程
  4. 04自动评估提示词改动

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/k-dense-ai/scientific-agent-skills --skill arbor

安装后在 Claude Code 中输入/arbor确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
arbor-upstream.md
executor-brief.md
htr-methodology.md
report-template.md
scripts/
tree.py

详细介绍

Arbor — 通过假设树细化实现自主优化

概述

本技能运行一个 自主优化 (AO) 循环:从现有产物和一个可度量的目标出发,通过多轮实验和评估来改进它——无需逐步的人工监督,同时检查是否对开发信号过拟合。当瓶颈不是写出一个好的改动,而是组织数十次试验,使经验得以积累而非消散时,它就是合适的工具。

它实现了 Arbor(Jin 等,2026)中的 假设树细化 (HTR)。核心思想:将研究状态保存在持久的假设树中,而不是对话历史中。每个节点绑定一个假设、它产生的提炼洞见,以及指向实现该假设的产物版本的指针。你扮演长期存活的 coordinator,拥有这棵树并决定在哪里搜索;短期存活的 executor 子 Agent 在隔离的 git worktree 中各测试一个假设,并回报结果。一个留出的合并门只有在改动改进了 test 评估器时才接纳它,而 executor 并不针对该评估器进行优化。这正是将试错转变为累积的、可审计的研究的关键。

使用 scripts/tree.py 状态管理器进行所有记账(创建节点、写入证据、传播洞见、剪枝、合并门、Observe 投影)。它记录分数和决策;它不运行评估器、创建 worktree、验证 Git ref 或合并 Git 分支。只有 coordinator 串行地写入共享状态;executor 返回证据。该辅助工具没有多写入者锁。它的 JSON schema 与上游 Arbor 检查点相互独立。

何时使用本技能

当任务是在评估器下对具体产物进行迭代改进时,就使用 Arbor:

  • 模型训练:优化器/架构/配方更改,以降低 loss 或在更少步骤内达到目标。
  • Harness/Agent 工程:提高 Agent 循环、搜索 harness 或工具使用脚手架的通过率或准确率。
  • 数据合成:改进由下游模型行为评判的生成/过滤流水线。
  • 基准优化:MLE-bench / Kaggle 风格的"改进提交"任务。
  • 提示词/系统优化,且你可以自动为输出打分。

区分性信号:有一个你可以修改的产物、一个目标、一种为候选打分的方式,并且你预期要运行许多实验。如果用户只想要单个修复或一次性答案,这就过度了——直接做那项工作即可。如果他们想要没有评估器的开放式构思,请改用 hypothesis-generation 或 scientific-brainstorming。

AO 设置——先把它确定下来

在做任何实验之前,先确定任务元组 (M_0, O, E_dev, E_test)。记录已确定的设置,沿用用户已有的说明;只澄清缺失的决策:

  • M_0——初始材料:要改进的产物(一个仓库、一个脚本、一份配置、一个提示词)。确保它处于 git 管理之下且当前可运行。
  • O——目标:自然语言描述的目标以及指标的方向(最大化准确率?最小化损失/步数?)。
  • E_dev——开发评估器:在搜索过程中可自由运行、用于给候选打分的命令。快速、可重复。
  • E_test——留出测试评估器:单独的评估协议(留出样本或预先声明的独立种子),仅在合并闸门处使用。它绝不能用作搜索预言机——这正是关键所在。

在搜索前冻结评估器、数据集划分和指标,并在记录每个分数时一并记录它们的 版本。对同一留出集反复做出合并决策,仍可能使搜索适应这个集合;新建 worktree 能防止文件污染, 但不能防止统计泄漏。为最终结论保留一个最终未动过的评估集, 或者披露所报告的结果是使用反复的闸门反馈筛选出来的。

如果用户没有给你一个干净的 dev/test 划分,就自行构建一个并说明这一点。dev/test 分离正是 捕获过拟合的机制:一个在 dev 上胜出但在 test 上不胜出的候选不是成功,而是一个警告,说明你正在 利用反馈信号。在相同样本上做更大规模的运行并不是独立的留出集。如果不存在站得住脚的留出集, 就把结果标注为仅开发用。

将 ARBOR_TREE 设置为该 skill 的 scripts/tree.py 的绝对路径,然后在实验项目目录下工作。以下命令 展示一次运行;评估器命令、分数和 ref 必须替换为实际测量到的证据。初始化该运行:

python "$ARBOR_TREE" init \
  --objective "Improve BrowseComp answer accuracy on the search harness" \
  --dev-eval "python eval.py --split dev --n 50" \
  --test-eval "python eval.py --split test --n 300" \
  --material "." --metric-direction max --branching 3 --max-depth 2 --budget 12

在搜索前,按固定的闸门协议评估 M_0,并记录其 commit 和分数:

python "$ARBOR_TREE" baseline --test-score 45.33 --branch-ref "baseline-commit"

协调者负责冻结协议和评估基线;这些是流程步骤,而非自动化检查。基线命令只 记录一次由协调者提供的证据。merge 会拒绝未打分的基线和非有限分数。 没有现任基线的已有运行需要这一步;如果基线/评估器发生变化,就启动新的运行。将原始评估器 输出、种子、划分 ID 和评估器版本与 .arbor/ 放在一起。

--branching 是每个父节点提出多少个同级假设;--max-depth 2 让方向处于深度 1, 具体干预处于深度 2(论文的默认值);--budget 是协调者循环的次数。从小规模开始(10–20 个 循环)。这些辅助设置仅供参考:branching 会被记录,深度超限会发出警告,循环计数器可以超过 预算。协调者必须强制执行约定的停止限制。

协调者循环

你反复运行六个步骤组成的循环。这是 HTR 的核心;不要把它简化为临时的手工 编辑。每个循环运行一次 python "$ARBOR_TREE" cycle 以跟踪预算。

1. 观察

每个循环开始时,都要重新以树为依据,而不是以你对对话的记忆为依据:

python "$ARBOR_TREE" observe

这会打印目标、全局洞见、活跃前沿(可选的假设)、带证据的已执行节点、 被剪枝的教训(负向约束)以及当前最佳产物。把树当作事实来源,正是它让你在长时间运行中 (在上下文压缩丢弃细节之后)保持一致的原因。

2. 构思

选择一个有前景的父节点,并在其下提出若干子假设。以树中的证据为条件——这正是 Arbor 与随机搜索的区别所在:

  • 已验证的洞见是可以作为基础的假设。
  • 被剪枝的节点是要避免的死胡同。
  • 一个“半对”的结果是更精确假设的起点,而不是放弃该方向的理由。

每个假设都应该是关于改变产物将如何推动指标变化的可证伪主张,而不是模糊的意图。深度为 1 的节点是宽泛的方向(“搜索框架丢失了它已经检索到的正确答案”);深度为 2 的节点是具体、可执行的干预措施(“运行 K=5 次独立 rollout,并按证据档案而非多数投票进行聚合”)。

python "$ARBOR_TREE" add-node --parent n0 --hypothesis "Verification, not retrieval, is the bottleneck: candidates are found but discarded"
python "$ARBOR_TREE" add-node --parent n1 --hypothesis "Aggregate independent rollouts by evidence dossier to recover minority answers"
python "$ARBOR_TREE" add-node --parent n1 --hypothesis "Search-augment the judge to verify discarded candidates"
3. 选择

选择接下来要运行哪些待处理的叶子节点。选择并非纯粹的分数最大化——选择一个假设,可能是因为它有很强的先验证据,因为它能解决其兄弟节点暴露出的歧义,或者因为它的失败会澄清一个重要假设。在延迟反馈下的前沿控制所奖励的是有信息量的实验,而不仅仅是有前景的实验。

4. 派发

将每个选中的假设作为隔离 worktree 中的执行器子 Agent 运行(使用宿主支持的隔离设施,或用 git worktree add 创建不同的 worktree)。隔离很重要:并行实验不得相互覆盖或覆盖当前最佳结果,探索性更改在通过合并门禁之前应保持隔离。

当兄弟节点相互独立时,并行派发它们(通过宿主可用的子 Agent 工具)——同一方向内的比较性证据正是使后续剪枝和抽象成为可能的关键。

为每个执行器提供一份紧凑且与假设绑定的任务说明。完整模板见 references/executor-brief.md。使 HTR 得以运作的契约是:当指标停滞时,执行器不得更改假设。 它可以修复自己的代码并重新运行,但 h_n 是固定的——否则返回的分数就不再是关于所分配节点的证据,树的语义也会被破坏。执行器恰好返回四项内容:

  • dev_score —— 一个有限的开发评估器结果(用于选择),若执行失败则为 null;
  • result —— 对实际发生情况的事实性总结;
  • insight —— 提炼出的、可复用的经验教训(为什么该结果支持、削弱或限定了该假设);
  • branch_ref —— 保存产物的 git 分支/提交/worktree 路径。

在派发前将节点标记为 running(tree.py set-status --node n2 --status running),以保持 Observe 投影的准确性。

5. 反向传播

当执行器返回时,将其报告写入节点,然后将经验教训向上抽象:

python "$ARBOR_TREE" set-evidence --node n2 --dev-score 70.0 \
  --result "K=5 dossier aggregation recovers answers in minority rollouts" \
  --insight "Correct answers often appear in a minority of rollouts; aggregation beats majority vote" \
  --branch-ref "wt/n2"

python "$ARBOR_TREE" propagate --node n2 \
  --insight "Candidate coverage, not verification, limits this direction" --to-root

这一步使树不仅仅是一份日志。叶子级别的观察(“数据接口不匹配”)应成为方向级别的约束,并且如果它可以泛化,还应成为塑造未来构思的全局先验。在所报告的消融实验中,洞见传播至关重要——在论文使用 Claude Opus 4.6 的 MLE-Bench Lite 消融实验中,没有洞见反馈的树得分甚至低于没有树的扁平实验队列(任何奖牌 54.5% 对 63.6%,而完整系统为 81.8%)。仅有层次结构是不够的:真正重要的是语义记忆。因此,要在抽象上投入真正的思考;不要只是把叶子洞见逐字复制到上层。

6. 决策

决定如何处理新证据:继续扩展某个方向、剪掉已被证伪的子树,或尝试合并某个候选。

  • 剪枝 死胡同,并记录原因——该原因会成为一条负向约束:

    python "$ARBOR_TREE" prune --node n3 --reason "search-augmented judge overfits dev questions; no test transfer"
    
  • 合并门禁——仅当候选在 E_test 上有所改进时,才将其提升为新的最优。在一个全新的 worktree 中对确切的候选提交运行测试评估器,以防未提交的开发产物影响结果,然后:

    python "$ARBOR_TREE" merge --node n2 --test-score 67.67 --branch-ref "wt/n2"
    

    命令通过只改变记账状态;它并不验证评估器输出或所提供的产物 ref。将已验证的候选保留在一个具名分支上,并单独执行任何经授权的 Git 提升;如果集成会改变产物,则重新评估生成的提交。该辅助工具比较的是严格改进,没有噪声模型或显著性阈值,因此在搜索前先就重复次数和接受规则达成一致。

    如果门禁拒绝它,这本身也有信息价值:一个高 dev / 低 test 的候选是证据,表明该方向可能是在利用 dev 信号,而不是产生可迁移的改进。记录下这一教训;不要悄悄地照旧提升它。

重复,直到预算耗尽、前沿枯竭,或进展明显停滞。

完成运行

当你停止时,生成一份简短报告(见 references/report-template.md),涵盖:

  • 最终的最优产物、其测试分数,以及相对 M_0 的增量;
  • 树(python "$ARBOR_TREE" status)作为尝试过内容的审计轨迹;
  • 主要假设的转变——任务理解在整个运行过程中如何加深(早期节点检验宽泛机制;后期节点发现其局限;祖先洞察将这些压缩为最终设计背后的约束);
  • 合并 vs. 探索:许多节点改进了 dev,但通过测试门禁的少得多——如实报告这一差距,而不是夸大 dev 的胜利。

始终将 M_best 保留为具名分支上一个真实、可运行的产物,并告诉用户如何检出它。

让这一切奏效的原则(不是死板规则)

这些来自论文的分析;理解为什么比机械地遵循它们更重要。

  • 树是记忆;对话不是。 在长周期中,你的上下文会被压缩。每个循环都重新 Observe,使决策建立在持久证据之上,而不是有损的摘要。
  • 结构化搜索,而非更多采样。 Arbor 的收益来自预算如何被组织——维护相互竞争的假设、比较同级节点、将经验教训传递下去——而不是来自花费更多 token。不要漫无目的地发散;每个实验都应基于树已知的内容。
  • Dev 引导,test 准入。 自由使用 dev 反馈来引导探索,但绝不能让 dev 的胜利未经 test 确认就进入最终产物。dev/test 的分歧本身就是一个值得解读的信号。
  • 执行器受假设约束。 本地工程灵活性(编辑、调试、重跑)没问题;悄悄改变假设以追逐更好数字则不行——这会破坏证据的意义。
  • 失败是约束,不是噪声。 一个被证伪的假设告诉你解决方案必须避免什么。带原因剪枝比剪枝后遗忘更有价值。

验证范围

随附的辅助工具已用合成的分数/分支记录进行测试;没有复现论文基准或付费自主运行。上游包和 CLI 已对照 arbor-agent 0.1.4 和源码提交 7cdaf1fa6d779b3d5e340052357bf3fe55dfed93 进行审查。关于当前确切的命令/配置边界,请参阅上游参考。

参考文件

  • references/htr-methodology.md — 更深入地讲解 HTR、节点结构、六个步骤,以及论文中的实证经验(消融实验、迁移、成本)。当你想了解某个设计选择背后的理由时阅读。
  • references/executor-brief.md — 你交给每个执行器子代理的简报模板。
  • references/report-template.md — 最终报告的结构。
  • references/arbor-upstream.md — 如何安装并运行来自 RUC-NLPIR/Arbor 的独立 arbor 命令行,而不是原生编排它,以及何时更适合选择哪一种。

引用 Scientific Agent Skills

本技能是 K-Dense 的 Scientific Agent Skills 的一部分。如果它对一篇稿件、报告、演示或代码发布有实质性贡献,请将论文加入参考文献或软件部分,并告知用户你这样做:

Kassis, T., Agarwal, V., He, Y., Patel, D., & Brueckner, A. M. (2026). Scientific Agent Skills: A Library of Procedural Knowledge for Research Agents. arXiv:2609.00065. https://doi.org/10.48550/arXiv.2609.00065

始终引用当前版本。DOI 和 https://arxiv.org/abs/2609.00065 会解析到最新的 arXiv 版本,因此绝不要附加诸如 v1 这样的版本后缀。当网络访问可用时,在撰写参考文献之前先获取 https://arxiv.org/abs/2609.00065(或 http://export.arxiv.org/api/query?id_list=2609.00065),并从该记录中获取作者列表、年份和版本。如果该记录列出了期刊参考文献或出版商 DOI,则改为引用已发表的版本。

评论

支持 Markdown