轨迹质量感知数据选择 — 实验设计 v3


基座模型:Qwen2.5-Coder-7B-Instruct
微调方法:LoRA
数据来源:SWE-trajectory 数据集
日期:2026年2月


一、评分体系设计

1.1 设计原则

评分体系回答一个核心问题:“如果一个人类专家在做同样的任务,他会怎么评价这条轨迹?”

人类专家评价一个开发者的 debug 过程,关注两件事:你做得聪不聪明(Efficiency)?你的过程干不干净(Style)? 至于“做对了没有”(Correctness)和“轨迹完不完整”(Completeness),则作为前置过滤条件,不参与连续评分。

1.2 前置过滤(Gate Conditions)

以下条件不参与评分,仅决定轨迹是否进入评分池:

Gate 条件 理由
Completeness Gate Truncation Ratio ≥ 0.9 截断比在数据集中几乎为常量(med=1.0, std≈0),无区分力,仅用于清理少量脏数据
Correctness Gate Outcome Success = 1(Resolved) 二值变量不应与连续变量混合加权;将其作为分层条件,在 resolved 池内排序
Format Gate 轨迹可被解析为 thought-action-observation 结构 格式损坏的轨迹无法可靠打分

为什么不把 Correctness 作为评分维度?
Outcome Success 是 binary(0/1),与连续维度做 weighted average 会导致评分被 0/1 主导。改为 gate 后,评分池内所有轨迹都是 resolved 的,评分聚焦于“如何更好地完成任务”。

1.3 连续评分维度(4维)

过滤后剩余 32,161 条 resolved 轨迹,在池内用以下 4 个维度评分:

Efficiency(效率)— 达成目标的路径是否精简

子维度 定义 打分方式 分布特征
B2: Error-Retry Cycles 出错后反复重试的代价 统计 “action→error observation→类似action” 的循环数,归一化取反 std=0.286, med=0.300,区分力最强
B3: Step Count Ratio 步骤数的合理性 本轨迹步数 / 同 task 所有 resolved 轨迹的中位步数,clip 后归一化取反 std=0.063, med=0.800

Style(风格质量)— 轨迹作为训练数据的干净程度

子维度 定义 打分方式 分布特征
C2: Action Diversity 工具使用是否合理多样 action type 的 entropy,归一化到 [0,1] std=0.046, med=0.655
C3: Observation Utilization 是否有效利用了 observation 信息 observation 中出现的文件名(basename)/错误类名在后续 action 中被引用的比例 std=0.118, med=0.313

被排除的维度及原因

维度 排除原因
B1: Redundant Commands std=0.033, med=0.962,几乎无区分力。数据集中的 agent 很少执行完全重复的命令
C1: Observation Cleanliness std=0.043, med=0.967,几乎无区分力。绝大多数 observation 都是干净的

论文表述:我们设计了 6 个候选子维度,通过方差分析发现 B1 和 C1 在该数据集上缺乏区分力(std < 0.05),因此排除。这本身是一个发现——SWE-trajectory 数据集的 agent 在命令冗余和 observation 干净程度上已高度同质化。

1.4 评分聚合

Efficiency = mean(B2, B3)           # std=0.152, med=0.529
Style      = mean(C2, C3)           # std=0.063, med=0.485
Composite  = 0.5 × Efficiency + 0.5 × Style   # std=0.083, med=0.507

1.5 C3 实现细节

初版 C3 使用完整路径匹配(如 src/utils.py),导致 agent 引用 utils.py(无路径前缀)时匹配失败,median 仅 0.201。修复后改为 basename 匹配,median 提升至 0.313。剩余的低利用率反映了 agent 普遍存在的“读了不用”问题,本身是一个值得讨论的发现。


二、实验分组设计

2.1 总览(13组 + 1 baseline)

# 实验名 样本池 选择方式 样本数 所属 Block
0 baseline — 无微调 — —
1 Random-500 全量 随机 500 Block 1
2 Random-1000 全量 随机 1000 Block 1
3 TopQ-500 resolved composite 排序 top 500 Block 1
4 TopQ-1000 resolved composite 排序 top 1000 Block 1
5 ResolvedOnly-500 resolved 随机 500 Block 1
6 ResolvedOnly-1000 resolved 随机 1000 Block 1
7 BottomQ-500 resolved composite 倒序 bottom 500 Block 1
8 Ablation-NoEfficiency-500 resolved 仅 Style 排序 500 Block 2
9 Ablation-NoStyle-500 resolved 仅 Efficiency 排序 500 Block 2
10 Ablation-NoB2-500 resolved Efficiency=B3 only 500 Block 3
11 Ablation-NoB3-500 resolved Efficiency=B2 only 500 Block 3
12 Ablation-NoC2-500 resolved Style=C3 only 500 Block 3
13 Ablation-NoC3-500 resolved Style=C2 only 500 Block 3

2.2 各 Block 的研究问题

Block 1:数据量与策略对比(7组)

对比 研究问题
exp1 vs exp5 Gate 有没有用? 全量随机 vs resolved 池随机
exp5 vs exp3 评分有没有用? resolved 随机 vs resolved 排序
exp1→exp2, exp3→exp4, exp5→exp6 数据量 scaling 效果,三种策略下 500→1000 的提升幅度
exp3 vs exp7 Sanity check:最好 vs 最差,验证评分体系有效性

Block 2:大维度消融(2组)

对比 研究问题
exp8 vs exp9 vs exp3 Efficiency vs Style 哪个更重要? 单用 vs 组合

Block 3:子维度消融(4组)

对比 研究问题
exp10 vs exp11 vs exp3 Efficiency 内部:Error-Retry Cycles vs Step Count Ratio
exp12 vs exp13 vs exp3 Style 内部:Action Diversity vs Observation Utilization

2.3 可复用的旧实验

实验 是否可复用 原因
baseline ✅ 复用 无微调
Random-500 (exp1) ✅ 复用 随机采样与评分体系无关
Random-1000 (exp2) ✅ 复用 同上
其余所有 ❌ 需重训 评分公式变化导致选出的样本不同

实际需要新训练:11 组


三、评测方案

3.1 困惑度评测(Perplexity / Cross-Entropy Loss)

在三个独立测试集上计算 assistant token 的平均交叉熵损失:

测试集 样本数 来源
Gold 200 新 composite score 最高的轨迹
Random 200 随机采样
Low-Q 200 新 composite score 最低的轨迹

注意:测试集也需要根据新评分重新构建,确保 Gold/Low-Q 反映的是新体系下的质量排序。

3.2 预期验证

所有模型应呈现 Gold < Random < Low-Q 的 loss 梯度,以验证新评分体系的合理性。


四、论文故事线

第一层:微调本身有没有用?     baseline vs 任意微调模型
第二层:Gate 有没有用?        Random-500 vs ResolvedOnly-500
第三层:评分有没有用?         ResolvedOnly-500 vs TopQ-500
第四层:数据量 vs 质量?       500→1000 scaling curve(三种策略)
第五层:哪个大维度重要?       EfficiencyOnly vs StyleOnly vs TopQ
第六层:哪个子维度重要?       子维度消融(B2/B3/C2/C3)
验证层:评分体系有效吗?       TopQ vs BottomQ + 测试集质量梯度

五、设计决策记录

决策 选择 替代方案 理由
Truncation Ratio 处理 Gate(过滤) 作为评分维度 std≈0,无区分力
Outcome Success 处理 Gate(分层) 作为连续评分维度 binary 变量不宜与连续变量加权平均
B1/C1 排除 从 composite 移除 rank normalization 强制拉平 rank normalization 会放大噪声,移除更诚实
C3 文件匹配 basename 匹配 完整路径匹配 agent 常省略路径前缀,完整匹配导致 C3 系统性偏低
聚合方式 层级 mean + 等权 加权平均 / 学习权重 等权作为默认选择,权重差异可通过消融实验间接体现
数据规模 500 / 1000 2000 / 5000 GPU 资源限制