☰
UltraData-Code-L2-Classifier 核心组件拆解:C/A/Q三模型如何协同识别高质量算法代码
2026/11/3 10:30:08 网站建设 项目流程

UltraData-Code-L2-Classifier 核心组件拆解:C/A/Q三模型如何协同识别高质量算法代码

UltraData-Code-L2-Classifier 是 OpenBMB UltraData 项目开源的一套代码数据筛选器,它通过 C、A、Q 三个文件级打分组件,从海量代码语料中精准识别出高质量算法代码,是约 400B tokens 的 UltraData-Code-L2 数据集背后的核心引擎。

为什么代码模型需要一台"数据筛选器" 🧭

大语言模型的代码生成能力,取决于预训练数据的质量。单纯堆量已经失效——真正有用的是那些"包含可解释计算与问题求解逻辑"的文件。UltraData-Code 的 L2 层做的就是这件事:从 L1 标准化自然代码中仅保留约12.23%的文件,把最"算法密集"的代码集中起来。

负责这件事的分类器由三个小模型组成,各自回答一个问题:

组件回答的问题输出字段
C文件角色分类器这是个什么文件?category、cls_confidence
A算法相关性模型它离算法题有多近?algo_rel_score(0~1)
Q代码质量模型代码质量有多高?quality_score(0~10)

C 文件角色分类器:给每个文件发"职业身份证" 🪪

C 组件(FileRoleClassifier,见 scripts/scorers.py)把文件的 1024 维语义 embedding(由 Qwen3-Embedding-0.6B 生成)送入 Linear + LayerNorm + GELU + Dropout 的 MLP,将每个文件归入 7 种角色之一:

  • ALGO:算法求解代码——L2 层要留的"主角"
  • WEB/TOOL:Web 相关、工具类
  • DATA/CONFIG:数据、配置文件
  • TEST:测试代码
  • EXCLUDE:不值得保留的垃圾文件

"索引 → 角色"的映射表保存在每个语言目录里,例如 classifiers/python/C_file_role.json。分类时还会输出最高概率作为cls_confidence置信度,方便后续审计。

A 相关性模型:从"代码+路径"中提取算法基因 🧬

A 组件(RelevanceMLP,见 scripts/scorers.py)的输入设计最有意思:代码 embedding + 文件路径哈希。

直觉是——算法代码常常出现在algo、dp、graph、contest这类有特征的路径下。为了利用路径信号又不记住某个具体仓库,scripts/path_features.py 用 crc32 哈希技巧把相对路径变成 256 维定长向量(L2 归一化,权重 0.4),再拼到 1024 维 embedding 后面一起喂给 A 模型。

两个精巧的工程细节:

  1. 丢弃位置信息:路径被拆成 token 集合再哈希,同一目录名出现在不同层级同样有效,天然容忍仓库布局差异;
  2. 先剥掉基准名:path_features.py 会预先清除leetcode、humaneval、codeforces等关键词,防止模型看到"竞赛题目录名"就直接打高分走捷径。

A 的输出是经 sigmoid 压缩到 0~1 的algo_rel_score,越接近 1 表示越可能是算法相关文件。

Q 质量模型:两阶段"零点检查 + 十分制打分" ⭐

Q 组件(QualityMLP,见 scripts/scorers.py)采用两阶段结构:

  1. zero_head先判断"这个文件配不配打分"——配置、数据、无逻辑文件会被 sigmoid 概率p_zero直接拦在 0 分附近;
  2. ordinal_head再把其余文件放上 1~10 的序数刻度。

最终质量分是两阶段的乘积(推理逻辑见 scripts/scorers.py):

quality_score = (1 − p_zero) × (1 + Σ sigmoid(ordinal)),取值 0~10

这样避免了直接做 0~10 回归的经典坑:配置文件再也不会莫名其妙拿到 5.5 分。Q 还会先用Q_scaler.npz里保存的 StandardScaler 参数归一化 embedding,scripts/scorers.py 用纯 NumPy 实现了这个缩放器,避免依赖特定版本的 sklearn。

三模型如何协同:高质量代码的"三重门禁" 🚪

C、A、Q 的协同不是简单的分数平均,而是一条带否决权的筛选规则。config.json 中的默认策略为:

  • algo_rel_score >= 0.8:相关性达标
  • quality_score >= 3.0:质量达标
  • category不在EXCLUDE列表中:角色否决通过

三条全部满足,文件才被标记selected = true。一个值得注意的细节:打分脚本只标记、不删除未通过的行(见 scripts/score_parquet.py),"留多少"的决定权交给使用者——阈值可以通过 config.json 的per_language字段按语言微调,也可以用--algo-rel-min、--quality-min、--exclude-categories命令行参数临时覆盖。

目录结构一览:每个语言一套自包含权重 📁

classifiers/<language>/ C_file_role.bin # C 模型权重 C_file_role.json # C 的角色映射表 A_relevance.bin # A 模型权重(内含架构与路径特征配置) Q_quality.bin # Q 模型权重 Q_scaler.npz # Q 的归一化参数

共 11 个语言目录(cpp、csharp、go、java、javascript、php、python、r、ruby、rust、shell),结构完全一致。加载器 LanguageScorers 直接根据权重张量自身的形状推断网络层宽,因此除了 C 的角色映射表外,一个额外配置文件都不需要——每个目录都是自包含的。

快速上手:三步给代码数据打分 🚀

  1. 装依赖:pip install numpy torch pyarrow;
  2. 加载打分器(详细说明见 README_ZH.md):
from scorers import LanguageScorers scorers = LanguageScorers.load("classifiers/python") out = scorers.score(embeddings, paths)
  1. 批量处理 Parquet:对整目录打分加策略标记:
python scripts/score_parquet.py \ --scorers classifiers/python \ --input data/input \ --output-root data/output \ --batch-size 1024 --apply-policy

每行输入会追加category、cls_confidence、algo_rel_score、quality_score四列,加上selected列;输出目录镜像输入结构并保留原有列。语料级推理建议按分片在外部调度,每个分片跑一次。

小结:分工,是这套设计真正的价值 🎯

C/A/Q 三模型的精髓在于分工明确:C 管"是什么文件",A 管"算法含量多少",Q 管"质量有多高",最后的筛选则是一条人类可审计、可调阈值的透明规则。这套组合让 UltraData-Code 仅保留 L1 中 12.23% 的文件,就在 10B token 持续预训练中带来了 EvalPlus pass@1+7.80、MultiPL-E+5.13个百分点的提升。如果你正在搭建自己的代码数据流水线,"角色分类 → 相关性打分 → 质量打分 → 策略标记"这个四步模式非常值得参考。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询