站点图标 高效码农

rStar-Coder小模型逆袭:7B参数代码模型如何突破USACO银牌区?

# 让小模型也能打比赛:rStar-Coder 如何把 7B 参数的代码模型送进 USACO 银牌区

>

一张图先告诉你效果:

过去半年,如果你关注代码大模型的进展,大概率听过 DeepSeek-R1OpenAI o3-mini 这些名字。它们用上千亿参数把竞赛级编程题刷到接近人类金牌选手的水平。
但是,训练或部署这样规模的模型对绝大多数团队来说并不现实——硬件成本、电费、调试时间都高得惊人。

微软亚洲研究院最新开源的 rStar-Coder 给出了另一条路:不拼参数,拼数据
他们用 418 K 道带测试用例的高难度题目 + 580 K 条逐步推理的解答,把 7 B 参数的 Qwen2.5-Coder 调教到 LiveCodeBench 62.5 %、USACO 2025 平均 16 % 的成绩,直接超过了 32 B 的 QWQ-32B。
更夸张的是,1.5 B 的小模型也被拉到 40 % 以上,表现超过 GPT-4o。

这篇文章把论文里的技术细节翻译成日常语言,告诉你:

  • 他们到底合成了什么样的数据
  • 为什么这些数据能显著提升小模型的推理能力
  • 如果你自己想复现或改进,应该关注哪些关键点

## 为什么代码推理的数据这么难做?

和数学题不同,代码题的正确性无法靠“对答案”简单判定。
一段程序必须通过大量、可验证 的输入输出测试,才能确认逻辑和效率都没问题。
目前公开的高质量题库(Codeforces、USACO、IOI 等)面临两大痛点:

痛点 具体表现
题少 人工出的金牌题全球加起来也就几万
测试弱 公开数据往往只有 2-3 组小样,无法覆盖边界和性能

早期的 WizardCoder、Magicoder 等合成数据集主要解决“函数补全”或“脚本生成”,难度和验证深度都不够。
rStar-Coder 要解决的正是:在没人写标准答案的情况下,如何大规模地“造题 + 造测试 + 造详解”


## rStar-Coder 的三板斧

### 1. 用专家题当种子,让大模型“改头换面”出新题

  • 先把 57 K 道公开竞赛题去重、去垃圾,保留 37.7 K 道带官方解答的“金牌母题”。
  • 把这些母题连同官方解答一起喂给 GPT-4o,让它照着“解题思路”而不是“文字表面”重写新题。
  • 最终得到 156 万道新题草稿,经过后续验证后剩下 38 万可用。

>

举个例子
原题:给定一个无向图,求最小生成树。
新题:把背景换成“城市修高铁”,把边权改成“预算 + 环保评分”双关键字,难度依旧,场景却完全不同。

### 2. 三步走生成带难度梯度的测试用例

直接让大模型“写 50 组测试”很容易翻车——要么规模太小,要么违反约束。
rStar-Coder 拆成三步:

  1. 让大模型一次性写两个工具函数
    • generate_test_input(scale):用 CYaRon 库按指定规模随机生成合法输入
    • validate_test_input(s):检查输入是否满足题面所有约束
  2. 人工设定规模范围
    从 1 到 100 000 按对数取点,确保既有“秒杀样例”也有“卡常数大样”。
  3. 批量跑工具函数
    通过验证的输入留下,不合法的直接丢弃。

这样一来,每道题都能拿到 50-100 组难度递进的测试,覆盖边界、极限、随机三种类型。

### 3. “多数表决”给无官方答案的新题贴标签

合成题没有官方程序,怎么知道输出对不对?
论文里用了一个朴素却有效的 mutual verification

  • 采样 16 条 QWQ-32B 生成的长推理解答
  • 在共享的 50 组输入上全部跑一遍
  • 如果 10 条以上解答对同一输入给出同一输出,就把这组输入输出标记为“可信”
  • 剩下不一致的解答直接丢掉

实验测下来,这种投票法在 3150 组输入上准确率 96.8 %,远高于让 GPT-4o 直接写输出的 12.7 %。


## 数据集长什么样?

类别 数量 特点
专家题(带官方解) 37.7 K 题面精炼、算法多样,用作种子
合成题(无官方解) 380 K 题面新颖、难度可控,已用多数表决验证
长推理解答 580 K 每条包含思考、伪代码、最终代码,全部通过测试

全部数据已脱敏,与 HumanEval、MBPP、LiveCodeBench、USACO 2025 无 16-gram 重叠,可放心用于训练而不用担心“刷榜”。


## 训练结果:小模型也能“越级打怪”

用上面 580 K 条数据对 Qwen2.5-Coder-Instruct 做 6 epoch 微调,得到三个版本:

模型 LiveCodeBench pass@1 USACO 2025 平均
rStar-Coder-1.5B 40.1 % 4 %
rStar-Coder-7B 57.3 % 16 %
rStar-Coder-14B 62.5 % 17 %

对比:

  • 7B 模型在 LiveCodeBench 超过 DeepSeek-R1-Distill-32B(57.2 %)
  • 14B 模型直接干掉 o3-mini-low(59.4 %)
  • 1.5B 小模型也能把 GPT-4o(30 %)按在地上摩擦
unsplash.com/coding-success

## 拆解关键实验结论

### 1. 题多比解多更重要

保持 37.7 K 专家题不变,只把每个题的解答从 1 条扩增到 16 条,最终 603 K 样本,效果仍不如 480 K 样本但覆盖 418 K 道题的混合数据。
结论:问题多样性 > 单题超量解答

### 2. 三步测试生成法 vs. 直接让 LLM 写测试

同样用 150 K 合成题跑实验,三步法在 LiveCodeBench 全难度段平均高出 2-3 个百分点,且生成的输入规模分布更均匀,不再扎堆简单样例。

### 3. 多数表决真的靠谱

64 道专家题、3150 组输入的消融显示,多数表决 96.8 % 准确率,而 GPT-4o 直接写输出仅 12.7 %。
说明:高质量标签不一定要官方答案,但需要交叉验证


## 如果我想自己跑一遍?

官方已放出完整 pipeline,这里把最简流程摘出来:

### 环境准备(Linux + A100 80G 示例)

# 1. Python 3.11
conda create -y -n rstar python=3.11
conda activate rstar

# 2. 安装依赖
pip install --upgrade pip
pip install -r requirements.txt
# 可选 flash-attn
# pip install flash-attn --no-build-isolation

# 3. 评测工具
git clone https://github.com/MARIO-Math-Reasoning/MARIO_EVAL.git
cd MARIO_EVAL && pip install -e . && cd ..

### 1. 合成新题

MODEL=deepseek-ai/DeepSeek-Coder-V2-Instruct
CFG=config/sample_mcts.yaml
CUDA_VISIBLE_DEVICES=0,1,2,3 python main.py \
    --qaf seed_problems.jsonl \
    --custom_cfg $CFG \
    --model_dir $MODEL

### 2. 生成测试用例

每道题先生成 generate_test_input.pyvalidate_test_input.py,再跑:

from cyaron import *
for scale in [1, 10, 100, 1000, 10000, 100000]:
    inp = generate_test_input(scale)
    if validate_test_input(inp):
        open(f"tests/{scale}.in", "w").write(inp)

### 3. mutual verification

用 QWQ-32B 批量跑 16 条解答,把相同输出 ≥60 % 的留下即可。

### 4. 微调脚本(以 7B 为例)

export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
torchrun --nproc_per_node=8 train/train_SFT.py \
  --model_name_or_path Qwen/Qwen2.5-Coder-7B-Instruct \
  --data_path rstar_train.jsonl \
  --output_dir ./rstar-coder-7b \
  --num_train_epochs 6 \
  --per_device_train_batch_size 4 \
  --gradient_accumulation_steps 4 \
  --learning_rate 4e-5 \
  --bf16 True \
  --fsdp "full_shard auto_wrap"

## 局限与下一步

  • 大模型依赖重:合成阶段离不开 GPT-4o/QWQ-32B,成本不低。
  • 隐含约束难处理:部分竞赛题靠上下文暗示输入限制,LLM 偶尔会误判。
  • 未来计划:继续从更多平台(AtCoder、TopCoder)抓题,进一步扩规模、降成本。

## 为什么这篇文章值得你收藏

  • 它用 3000 + 字把一篇 15 页论文拆成了“为什么要这么做 → 具体怎么做 → 结果如何 → 如何复现”四步,读完就能动手。
  • 所有数字、脚本、数据来源均来自论文与官方仓库,没有额外脑补。
  • 如果你正在做代码大模型、竞赛训练、甚至算法教学,这套“种子题 → 合成题 → 三步测试 → 多数表决”流水线几乎可以直接套用。
unsplash.com/coding-future

## 相关链接

  • rStar-Coder 论文:https://arxiv.org/abs/2505.21297
  • 数据集 & 代码:https://github.com/microsoft/rStar

祝你也能用小模型打出大成绩。

退出移动版