← 工作原理 · 原文件 notes/reports/dev/2026-10-03_per_metric_feedback.md(Markdown 源文件已渲染;链接到其他文档的会跳转,指向源码的只显示路径)
分项反馈与评分规则简报(2026-10-02 用户决定:让 agent 优化官方分数真正奖励的东西)
1. 改了什么
- 评分服务(
agent/scoring/service.py):worker 多发metric_skills;_clean在原有字段(board_score、groups、metrics、runtime_s、quota_left)之外新增metric_skills和score_parts。score_parts由agent/scoring/parts.py计算:每项排名指标的raw、skill、points(计入榜分,四项之和 = 榜分)、floor_points、max_points、group、weight、sense。只有聚合数字,没有任何逐基因或逐细胞的真值。T2 / T3 同样分解(多指标分组按 skill 份额分摊组分,T2 的 structure gate 已计入);未知分组布局时不加该字段。 - 节点记录:
execute_and_score带上metric_skills/score_parts;Controller.evaluate的每尺子摘要(proxy_json)多存metrics、score_parts。components(尺子 → 分数)含义不变。 - 角色看到的地方:变化量表(Analyst、Researcher 的父节点、Engineer 的父节点、Reviewer、OpenEvolve 公共材料)多一张“排名指标分解”表;Researcher / Reviewer / OpenEvolve 父节点块多一行四项摘要;Engineer 的
vec-score直接返回score_parts;tune 每轮反馈按尺子给四项的种子均值;OpenEvolve native 每轮反馈多score_parts,artifacts 多ranking_metrics。 - 评分规则简报
agent/prompts/scoring_rules_t1.md:默认附在 T1 的 Engineer / Researcher / Analyst 任务书后(scoring_rules:可改路径或设 null 关闭;T2 / T3 简报见第 4 节)。scripts/check_knowledge.py也扫描它,无需新增白名单。 - 方向库:新增
composition_program(优先方向 1,distribution_structure 类第一位);local_ot改写为“局部谱系 OT + 受约束的程序外推,允许基因开启”(优先方向 2,fate_branching 类第一位)。原有 10 个 id 不变;文件仍按 search_seed 0 的覆盖顺序书写。
2. 对评测规格与锁的影响(有意为之)
- 评测规格(
scoring_fingerprint)不变:评分器快照(modeling/src/common、veckit)、视图、真值、anchors、执行参数都没动;service.py和parts.py不在快照里。所以分数含义不变,续跑不会因此重评。 - 新 run 的锁会变:
code_hashes/search_hashes(agent 代码、新增简报、改过的 search_spec / researcher_spec / analyst_spec、方向库)、prompt_hashes,以及锁住的配置里新增scoring_rules、三个角色的prompts_by_role多一个文件;T1 带draft:的配置锁住的draft.order变成 11 个方法族。 - 旧 run 照常加载:新字段都是可选的。没有
score_parts的旧节点,变化量表和实验表与以前逐字相同(有单元测试);运行中的 run 用自己的代码快照,不受影响。 - 注意:draft 覆盖顺序会按 search_seed 轮转类别内的方法族,两个优先方向只在 search_seed = 0(或轮转后恰好落在首位)时最先起草;调度算法没有改。
3. 测试
新模块 agent/search/tests/test_score_parts.py(14 项:与评分器 GROUP_SPEC / aggregate 一致、地板 = 50、无定义指标、旧响应、服务 _clean、节点记录、渲染、tune、OpenEvolve、简报接线)。test_drafts 改为 11 个方法族,并修正 ot_moscot 已准入为 exploration 后的 seeds: all 预期。在 Spark 私有测试目录逐个模块运行,全部通过。
4. T2 / T3 评分规则简报(2026-10-03)
- 文件:
agent/prompts/scoring_rules_t2.md(三个 T2 榜共用一份:评分器对三榜完全相同,setting只是记录字段,差别只在 panel、细胞数上下限、参考 / 输入阶段);agent/prompts/scoring_rules_t3.md。只写公开评分代码(veckitcore_metrics/shape_metrics/T2|T3/metrics*.py)与官网任务页、参考行页的事实,加上本项目数据上的事实;不写任何阶段名、保留基因型或其表型 / 靶点。 - T2 要点:八项排名指标与分值(表达 12.5×2、状态 12.5×2、形状 8.33×3 再乘结构门、邻域 25);结构门 = min(邻域 skill/0.5, 1),所以邻域一项最多影响 50 分;坐标只取
spatial_3D前三列,空间项对平移旋转不变,d2_shape看不出镜像,scale_log_ratio是唯一看绝对尺寸的项;各项的细胞数上限;不计分的输出项。我们数据上的事实:DE 两项只看排序与符号(同一段代码);首批官网分 vs 本地尺子(插值两榜接近:59.6→62.9、61.5→60.0;外推高估:54.2→49.6);方法卡网格里“真实细胞 + 原坐标”邻域稳定 52–55,OT 插值新点使邻域掉到 23–41、门 0.46–0.61;全胚整细胞混抽的细胞状态组只有 36;照抄略低于 50。 - T3 要点:五项与分值(响应基因 30、方向 25、强度 25、状态 10+10);三项响应指标以同阶段匹配 WT 为参考;坐标与形状不排名、没有结构门;
severity_slope的定义(响应基因上过原点斜率的 log β,β≤0 / r²≤0.01 / 无变化记 log 0.001 = 地板值,偏大偏小同样扣分,β 正但 < 约 0.001 时低于地板),它是唯一看幅度的项。我们数据上的事实:Mab21l2 留一基因尺子的结果(只把被敲基因压到 0 时强度组 67;按 WT 共表达自然符号传播使 DE 两项低于地板);这把尺子未校准,首份官网 T3 为 45.9;照抄 WT 略低于 50。 - 接线:
- 搜索模式(T1 / T2):沿用
load_search_config的默认agent/prompts/scoring_rules_<task>.md,T2 文件出现后所有 T2 搜索配置默认附上(Engineer / Researcher / Analyst,Reviewer 不附):g24_t2_t3/t2_*.yaml(含 D 组)、g24_quick/t2_*.yaml、dev/search_t2_g24_fake.yaml。不想附的配置写scoring_rules: null。 - Agent 模式(T3,
agent/harness.py):没有scoring_rules:键,提示词就是配置的prompts:列表。g24_t2_t3/t3_spark.yaml显式加在方法卡之后;g24_quick/t3_spark.yaml(10-02 已跑完的快速基线)不改、不附。 search_spec/analyst_spec/researcher_spec、控制器父节点块和 tune 反馈里的“四项排名指标”改为“各项排名指标”(T2 有八项)。
- 搜索模式(T1 / T2):沿用
- 知识审计:
scripts/check_knowledge.py原本就按scoring_rules_t*.md扫描(t2 按心脏 + 全胚窗口,t3 按基因型);现在三份简报列为必需文件,缺一份即 FAIL。结果 PASS,没有新增白名单(简报里没有任何阶段名或基因型名)。 - 对锁的影响:评测规格(
scoring_fingerprint)不变。新的 T2 搜索 run:prompts_by_role三个角色多一个文件,锁住的配置scoring_rules从 null 变为 T2 简报路径,code_hashes/search_hashes/prompt_hashes变(新简报、三份 spec、controller / tune 文案)。正在跑的 T2 run 用自己的代码快照,不受影响;用新代码续跑会因锁变化被拒(除非显式放行)。T3 完整配置的prompt_hashes多一个文件;T1 新 run 只因 spec / 控制器文案改动而 hash 变化。 - 测试:
test_score_parts增加 T2 默认附上、scoring_rules: null关闭、T3 agent 配置与build_prompt顺序、两份简报的事实与“无阶段名 / 基因型名”检查。