专题 agent 接力解竞赛题,Gemma 4 比直接生成高 14.4 个点

MARS: Multi-Specialist LLM Relay System for Competitive Programming

Andrei Mikhailov, Mikhail Burtsev, Alsu Sagirova

EMNLP 2026

cs.AI, cs.MA, cs.PL

2026-08-25

MARS 用检索选出最多三个算法专题 agent 接力改同一份 C++17,每步跑公开样例。Gemma 4 在 CodeContests 165 题上 pass rate 0.624,比直接生成高 14.4 个点,墙钟约为 CodeSIM 的三成。

这篇在解决什么

竞赛编程把代码生成的短板暴露得很干净:题面稀疏、要对隐藏测试、还经常把图论、DP、构造拧在一道题里。现有多 agent 流水线按 planner、coder、debugger 这种工序切角色,算法该用哪一招,仍完全交给底座自己想。MapCoder、CodeSIM 把竞赛题当成通用代码生成,没有一条通路把「这题是最短路还是区间 DP」写进 agent 分工。

MARS 把角色从工序改成专题。每个 agent 只认一个算法方向,检索对应的理论文档,再在同一份草稿上接力。

方法

池子里有十一个专题 agent,每人都带一段专题描述和 tag,对着按自己 tag 切过的 cp-algorithms 语料做自评:在不在范围内、相不相关、置信度多少。按分数最多短列出三个,再用一次 can-start 探针选出起笔的人。检索用 Jina Embeddings v2。

每一拍两次 LLM 调用。第一次写草稿,输入是当前代码、分到的子任务、起笔合同、上一棒摘要和 RAG 上下文。草稿在 ExecEval 里跑公开样例。第二次看见测试报告,在 keep、repair、no-change 里选一个,并填结构化交接字段。repair 会再跑一遍公开样例,编译不过、或通过的样例数比本拍草稿少,就丢掉 repair、恢复草稿。对错门控看的是可观测执行信号,置信度分数只在组队时用。

接力有硬预算:最多三个不重复的专题、八步;收到显式 stop、没用过的入选者用完、步数用尽,或连续两拍无进展就改线、三拍无进展就停。收尾有一次基础设施修复,只在 I/O、头文件、整型宽度这类套模板失败时出手。提示词是写死的,不微调。

对照很完整。Direct 一次生成;Single-RAG 只留检索分最高的一个专题;Parallel ensemble 几个专题各自出方案再由经理合并;Base relay 保留组队和接力,拿掉公开测试自检、子任务跟踪和收尾修复。CodeSIM 用开源 harness 在同一 165 题、同一 Gemma 4 上重跑。

结果

评测是 CodeContests test 的 165 题,主干实验用指令微调 Gemma 4,温度 0,4096 token。数字是三跑平均。

方法Pass rate每题秒每题 token(千)调用次数
Direct0.48 ± 0.0234.91.81.0
Single-RAG0.53 ± 0.0159.825.012.0
Parallel ensemble0.56 ± 0.00360.929.817.6
Base relay0.55 ± 0.00191.634.117.1
MARS0.624 ± 0.006244.340.316.6
CodeSIM(同设定重跑)0.731 ± 0.009817.532.210.2

相对 Direct +14.4 个点,相对 Parallel +6.0,相对 Base relay +7.2。Hard(70 题)上 MARS 约 0.40,Direct 约 0.18;Medium 0.72 对 0.59;Easy 大家都在 0.80 到 0.93。CodeSIM 每档都高,Hard 题最多可以 debug 45 轮,墙钟是 MARS 的 3.3 倍,token 标准差大约是 7 倍。

换底座排序不变:Direct < Single-RAG < MARS。Qwen3.5-27B 上是 0.192 / 0.264 / 0.297;GPT-5.4-mini 上 0.149 / 0.364 / 0.503。Python(PyPy 3)上 MARS 0.622,Direct 0.485,和 C++17 数字在误差内对齐。PairCoder 在 Python 上到 0.705,墙钟约 1.4 倍,计划聚类用了闭源 embedding。

消融把故事说透了。去掉 RAG 掉 2.0 个点(0.604)。无 RAG 的通才 agent 0.615,和完整 MARS 的差在一个标准差里,但更慢(319.8 秒对 244.3 秒)。组队 82.4% 的任务跑到三人,改代码的专题平均只有 1.35 个;报道的 2.3 阶段还算上了收尾记录。多专题题占 88%,pass 0.612,单专题 0.719。收尾修复只实质改过一题(约 0.2% 的 task-run),头条 0.624 不靠它。697 次自检里,38.4% 接受 repair,55.4% 保持草稿,4.4% 被门控打回。

为什么重要

对做竞赛或强约束代码 agent 的人,能立刻抄的是「公开测试进每一棒」和「repair 必须本地再跑一遍」,不是「再加一个人格化角色」。Single-RAG 卡在 0.529,一个专题、没有测试信号,算法走错就停在那里。Parallel 把墙钟打到 360.9 秒,准确率还是不如带测试的接力。

专题化本身别估计过高。通才无 RAG 只少 0.9 个点,协议和执行反馈比「是不是 DP 专家」更扛事。相对 CodeSIM、PairCoder,这是更轻的 prompt-only 方案,把大部分缺口补上了,没有把最强搜索系统打下。Gemma 4 上能用;Qwen3.5-27B 全体仍只有 0.297,底座弱的时候专题接力也救不了。

局限与存疑

作者写得很清楚。165 题、三个底座、两种语言、一份语料、Codeforces 标签。Python 复用同一索引,再换语言要重做提示、抽取、沙箱和基础设施。本地门控只拒绝本拍公开测试回退,看不见隐藏测试,也不在专题之间做横向比较。生成代码必须沙箱执行。

对照也不对称。CodeSIM 是唯一按工序对齐的重跑;PairCoder 只有 Python;MapCoder、LDB、Xolver 因为语言或预算没有进主表。消融里「通才」同时关掉了 RAG,隔离不了「专题」和「检索」。公开样例进训练环,存在对着能看见的测试打磨、隐藏测试仍然挂的风险,论文没有单独报 public-pass 对 hidden-pass 的落差。

术语

原文与代码

相关论文

全部论文解读