竞赛编程(Competitive Programming)是大模型推理能力的一面镜子。
LeetCode 上的 Hard 题、Codeforces 的 Div1 题、IOI 级别的算法题——这些不是靠语言模型的"语感"就能混过去的。它们需要严密的逻辑推理、精确的算法设计、以及对边界条件的极致把控。
南京大学 NJU-LINK Lab 的 Solvita 项目(Enhancing Large Language Models for Competitive Programming via Agentic Evolution)尝试了一条不同的路:不是给模型喂更多的编程题让它死记硬背,而是让Agent在自我进化的过程中,自己"长出"解决竞赛编程的能力。
Agent进化是什么
论文的核心概念是"Agent进化"(Agentic Evolution)。它的工作流程大致如下:
自我生成。Agent 不只是被动地做题——它还会生成新的编程题、设计新的测试用例、构造新的边界场景。这个过程本质上是Agent在给自己出考卷。
自我验证。Agent 写的代码会被运行在测试用例上。通过的保留,失败的进入分析流程。Agent 需要理解为什么错了——是算法思路有问题、边界条件没覆盖、还是实现细节出了 bug。
自我迭代。基于对错误的分析,Agent 调整自己的策略。不是简单地记住"这道题应该用动态规划",而是理解"什么类型的题目适合动态规划、状态转移方程该怎么设计"。
群体进化。多个Agent并行进化,互相分享学到的策略和技巧。一个Agent发现的有效解题模式,可以快速传播给整个群体。
与传统方法的区别
当前提升大模型编程能力的主流方法:
- 监督微调(SFT):用大量(题目, 正确答案)对训练模型。有效但依赖高质量标注数据,而且容易过拟合训练集。
- 强化学习(RL):用通过率作为奖励信号优化模型。效果好但训练不稳定,容易出现奖励黑客行为——模型学会生成能通过测试但逻辑错误的代码。
- 推理增强(Reasoning Augmentation):通过思维链等技术让模型逐步推理。有帮助但无法从根本上提升算法设计能力。
Solvita 的进化范式与这些都不同。它不需要外部标注数据(Agent 自己生成),不依赖单一的奖励信号(多维度自我评估),也不局限于特定的推理格式(策略是自主演化出来的)。
实验表现
论文在多个竞赛编程基准上进行了评估。核心发现是:经过 Agent 进化训练的模型,在面对训练时未见过的题目类型时,泛化能力显著优于SFT和RL基线。
这验证了论文的核心假设:进化学出来的能力,比"教"出来的能力更灵活。因为进化过程逼迫Agent理解问题的本质结构,而不是记忆解题模板。
与IMO金牌推理论文的关系
有趣的是,Solvita 与之前那篇"通过简单缩放达到IMO金牌推理水平"的论文形成了一个有趣的对照。
缩放论文的态度是:不需要新方法,更大就够了。Solvita 的态度正好相反:不需要更大模型,更好的训练范式就够了。
两条路线孰优孰劣尚无定论。但 Solvita 的吸引力在于它对算力资源的友好性——它不需要投入海量的训练算力,而是通过智能的训练设计来提升效率。
我的看法
Solvita 最有意思的地方在于它把"Agent"和"训练"这两个概念融合了。
传统训练范式中,Agent是被动的——你给它数据,它学习。Solvita 中,Agent是主动的——它自己决定学什么、怎么学、从什么错误中吸取教训。
这更像真实世界中人类程序员的成长路径。一个好的程序员不是靠刷完所有LeetCode题目变强的——而是通过持续地解决新问题、分析自己的错误、从他人代码中学习,逐步建立起对算法和编程的深层理解。
Solvita 试图让AI也走这条路。如果这条路走得通,竞赛编程可能只是起点——同样的进化范式可以应用到任何需要复杂推理能力的领域。
当然,挑战也不小。Agent 生成的训练数据质量如何保证?进化过程中会不会出现能力退化?如何衡量"真正理解了"而不是"记住了模式"?
这些问题需要更多的研究来回答。但 Solvita 至少证明了:Agent 自我进化这个方向,在编程能力这个硬核指标上是可行的。
主要来源: