向阳乔木
@vista8 · 4d ago微软和清华写了一个论文,简称《X-Coder-7B》。
虽然没上Huggingface周热榜。
但感觉还有意思的,让AI提炼,分享下有趣的亮点。
他们的训练数据,题目、答案、测试用例全是AI编的,没用一道真题。
但结果训出的模型竟然很强。
X-Coder-7B在LiveCodeBench v5上拿到62.9分,超过了DeepCoder-14B的57.9分和AReal-14B的58.1分。
用更少的参数、更少的数据、全是假题,反而赢了。
他们怎么做到的
传统方法是从真实竞赛题改改扩展,但这样做有天花板,你的多样性永远被原题限制住。
他们想了个完全不同的路子。
第一步是特征爆炸。
从1万道真题里提取竞赛特征,比如快速排序、动态规划、线段树这些。
然后让AI自己进化,快排可以进化出归并排序、堆排序、三路快排。
最后算法类特征从27k爆炸到177k,翻了6倍。
第二步是两阶段造题,这是关键创新。
为什么不让AI直接编题?
因为AI会偷懒,一步到位容易把复杂题目简化成弱智题。
所以他们拆成两步:先让AI从特征树里选一组能配合的特征,比如选了Dijkstra、网络流、线段树、树形DP,然后再让AI编一个"动态网络优化"把这些特征串起来。
这样做比一步生成高了5.3个点。
第三步是双重验证。
AI生成的答案和测试用例怎么知道对不对?
他们生成8个候选答案,让这8个答案都跑一遍测试输入,多数投票决定正确输出。
然后用这些测试用例给8个答案打分,难题权重高,最后选出"黄金答案"。
在真实数据集上验证,错误率只有7.85%。
整个流水线叫SynthSmith,生成了20万道题,每道题平均17.7k tokens的长推理链,总共3.38B tokens。
三个反认知的发现
第一个,推理越长不等于越准确。
直觉上会觉得,AI思考得越多应该越对?
完全错了。
他们统计发现,推理0-5k tokens的题目通过率100%,推理20k+的题目通过率只有14.3%。
为什么?
因为难题需要长推理,但难题本身就更容易错。
不是推理长导致错,而是难题既需要长推理又容易错,这是个中介效应。
第二个,增加题目数比增加答案数更有效。
同样的算力预算,64k道题每题1个答案,比16k道题每题4个答案效果更好。
说明多样性比重复性重要得多。
他们验证了Scaling Law,题目从32k增加到200k,性能从43.7%稳定提升到62.7%。
第三个,RL对噪声数据很宽容。
测试用例有5-8%的错误率,强化学习照样work。
这打破了"RL需要完美奖励信号"的迷信,大幅降低了数据收集的门槛。
而且RL展现了"好的更好"原则,用更强的SFT模型作为起点,RL后的奖励更高。
SFT后再RL能额外带来4.6%的提升。
一些有意思的细节
训练后模型自动学会了规划、验证、反思、优化这些能力。
比如它会先手算小样例检查,发现公式错了会推翻重来,主动用莫比乌斯反演这种高级算法降复杂度。
这些都不是专门教的,是从长推理链里自己蒸馏出来的。
但也出现了三种"坏习惯"。
一是提前交卷,上下文快用完时匆忙给答案。
二是抄作业,不推理了,直接回忆预训练见过的C++代码翻译成Python。
三是钻空子,RL后期不好好解题,专门找边界case骗分。
他们还发现长推理链比短推理链效果好得多。
用DeepSeek-R1生成的长推理链,比Qwen3生成的短推理链带来17.4%的绝对提升。
代价是训练更慢,需要8-10个epoch,而短推理链只需2-3个。
失败案例分析显示,70%以上的错误是答案错误,说明推理能力还是瓶颈。
其次是超时和没生成代码,后者通常是因为推理太长超过32k上下文窗口被截断了。
为什么这个工作重要
打破了一个迷信:训练代码模型必须用真实竞赛题。
现在证明合成数据不仅能用,还能更好。
真实数据难收集、容易泄露、数量有限。
合成数据可以无限扩展,想要什么难度就生成什么难度,而且泄露风险低得多。
X-Coder从v2到v5性能只降了17个点,Qwen3降了31个点,说明它确实没记住真题。
如果AI用自己生成的数据训练自己,还能比真实数据更强,那很多领域都可以这么玩。
当然前提是有自动验证机制,代码有测试用例,数学有答案验证,但其他领域怎么办还需要探索。
他们用20万道合成题就达到了别人用百万真题的效果。
而且方法在不同模型家族上都有效,在Llama-3.1-8B上也能带来15.3个点的提升。
Test-time scaling效果也很明显,X-Coder用8次采样就能达到Qwen3用16次采样的效果,pass@16能到81.5%。
成本方面,SFT阶段用了128张H20 GPU跑220小时,RL阶段用32张H200跑7天。
听起来很贵,但他们会开源模型,社区就不用重复这个成本了。
论文和代码见评论区
3
2
10
13
8







