35B 검증 에이전트가 반례를 만들어 코드 채점과 수정을 돕는다
Beyond the Verdict: Agentic Code Judging with Verifiable Feedback
무엇인가
테스트 시점 확장(test-time scaling)은 LLM이 답을 낸 뒤에도 여러 후보를 생성해 고르거나 이전 시도를 고쳐 쓰게 한다. 두 경우 모두 이미 만들어진 후보에 대한 피드백이 있어야 다음 계산을 쓸 수 있는데, 선택에는 어느 후보를 남길지에 대한 판정이, 수정에는 어떤 실패가 있었는지에 대한 정보가 필요하다. 경쟁 프로그래밍은 이 문제를 구체적으로 만든다. 문제 지문이 요구 동작을 규정하고 공식 저지가 숨은 입력과 자원 제한으로 후보를 채점하지만, 공식 저지는 판정이나 점수만 돌려줄 뿐 실패 입력이나 설명을 주지 않는다. 제출 예산이 유한한 대회에서는 그 피드백을 마음대로 요청할 수도 없다. 이 논문은 문제 지문과 소스코드만 주어진 단일 후보에 대해 수락 여부를 예측하고, 실패가 의심되면 그 후보를 실제로 깨뜨리는 반례를 만들어 검증 가능한 증거로 제시하는 과제를 정식화한다.
어떻게 동작하나
Arbiter의 인터페이스는 다음과 같다. 문제 P와 후보 프로그램 C가 주어지면, 검증자는 범용 실행 샌드박스에서 Python 코드와 Bash 명령을 돌려 자기만의 테스트를 만들고 실행할 수 있다. 다만 공식 테스트, 정답 코드, 입력 validator, 출력 checker, 그리고 자신이 낸 최종 반례의 채점 결과에는 접근할 수 없다. 에피소드는 submit(v, d, g) 호출로 끝난다. v는 판정(Accepted, Wrong Answer, Time Limit Exceeded, Runtime Error, Memory Limit Exceeded, Compile Error 중 하나), d는 자연어 진단, g는 입력 하나를 출력하는 결정적 Python 3 생성기다. 이 호출은 후보 C를 공식 저지에 제출하는 것이 아니다. Accepted와 Compile Error일 때 g는 비어 있다. 제출 뒤 외부 저지가 C를 공식 테스트에 돌려 기준 판정 v*를 얻고, g가 있으면 입력 x를 생성해 합법성을 검사한 뒤 기준 해답과 대조해 C를 채점한다. 공식 테스트가 놓친 실패라도 합법 입력 x가 C를 깨뜨리면 실패가 입증된다. 반대로 반례를 못 찾았다고 해서 수락이 입증되는 것은 아니다. 이 비공개 검사가 학습 보상과 평가 레이블을 공급하며, 검증자에게는 공개되지 않는다. 진단문 d는 직접 채점하지 않는다.
무엇과 다른가
Arbiter는 Qwen3.6-35B-A3B를 출발점으로 삼아 (P, C)에서 (v, d, g)로 가는 사상을 에이전트 강화학습으로 최적화한 35B MoE 검증자다. 학습 데이터는 6,145개 경쟁 프로그래밍 문제에 대한 온라인 저지 채점 솔버 롤아웃에서 뽑은 후보 프로그램 20,000개이며, 문제당 최대 5개 롤아웃을 샘플링하고 평가 문제는 전부 제외했다. 수락된 프로그램이 15%를 차지하고, 나머지 중 46.8%는 76~99점 구간에 몰려 있다. 즉 대부분의 공식 테스트를 통과하고 살아남는 미묘한 버그를 담은 고득점 실패가 학습 대상이다. 100개 어려운 문제에서 뽑은 400개 후보의 검증 세트는 체크포인트 선택에 쓰이며 학습·테스트 문제와 겹치지 않는다. 최적화는 GRPO와 slime RL 프레임워크로 수행한다. 토큰 예산을 넘긴 에피소드는 잘라내되 보상 0으로 유지하고, 월클럭 예산을 넘긴 에피소드는 중단해 정책 업데이트에서 제외한다.
어떻게 쓰나
보상 설계의 핵심은 실행 가능한 증거에 가중치를 두는 것이다. 판정만 맞히는 보상은 지름길을 부른다. 학습 후보의 85%가 미수락이므로 정책이 후보를 테스트하지 않고 다수 판정을 찍어도 보상을 챙길 수 있다. 실제로 진단 실행에서 학습 보상은 오르는데 검증 판정 정확도는 56~58%에 머물렀고, 평균 도구 호출은 롤아웃당 4.9회에서 1회 미만으로 떨어졌다. 그래서 미수락 판정을 맞혀도 실행·검증을 통과하는 반례를 내지 못하면 보상을 거의 주지 않는다. 미수락 판정 일치에 0.05, 생성기 g를 실행하면 0.05, 합법 입력을 만들면 0.10이 붙어 판정 일치까지 포함한 중간 보상 합계가 0.20이고, 실제로 C를 깨뜨리는 입력에는 0.75가 주어진다. 실패 유형까지 맞히면 마지막 0.05가 더해져 검증된 미수락 예측이 1.00이 된다. v와 기준 판정 v*가 모두 Accepted면 1.00을 받는다. 공식 판정을 뒤집는 유효 반례에는 0.10을 추가로 주어, 공식 테스트와의 일치보다 검증된 증거를 위에 둔다. 진단문 d에는 정답 보상이 없고, 1000토큰을 넘기면 0.05를 감점한다. 한편 기준 판정이 미수락인데 Accepted를 예측하면 패널티 λ를 주는 실험도 했다. λ=0과 λ=0.5를 비교하면 λ가 클수록 Accepted 클래스 정밀도가 오르고 재현율이 떨어진다. USACO-Judge 하드 분할에서 정밀도는 77.78%에서 80.98%로 오르지만 재현율은 76.67%에서 62.86%로 내려간다. 최종 Arbiter는 λ=0을 쓴다.
전제와 한계
길이 제어도 학습 효율의 일부다. 응답이 길어지면 생성 비용이 오르고 롤아웃 처리량이 떨어진다. Arbiter는 조건부 적응 패널티를 쓴다. 원시 보상이 0.9 이상이고, 그룹 상대 길이 임계값 B를 넘고, 그룹의 최고 보상을 공유하는 롤아웃이 그룹의 4분의 1 이상일 때만 0.6을 감점한다. 어려운 문제에서의 실패한 시도와 드문 성공은 건드리지 않는다. 같은 체크포인트에서 이어 학습한 두 실행을 비교하면 길이 제어가 응답을 줄이고 롤아웃 타임아웃을 줄이며, 없을 때 나타나는 후반부 평균 보상 하락을 막는다. 다만 패널티를 계속 켜 두면 탐색이 위축된다. 한 비교 실행에서 중앙 응답 길이는 17.2k에서 12.9k 토큰으로, 중앙 상호작용 턴은 10에서 7로 줄었고 hack 성공률은 62.3%에서 59.1%로 떨어졌다. 그래서 패널티 구간과 비패널티 구간을 번갈아 두어 긴 시도를 할 여지를 남긴다.
평가는 두 벤치마크로 한다. UOJ-Bench의 코드 해킹 분할은 표준 테스트가 잡아낸 결함이 있는 Easy 479개와, 표준 테스트를 통과했다가 커뮤니티 해킹에 결함이 드러난 Hard 1,046개로 구성되며 전부 오답 프로그램이다. 수락 인식은 전혀 시험하지 못한다는 한계가 있다. 이를 메우려고 만든 USACO-Judge는 USACO 2026 대회의 39개 홀드아웃 문제에 대한 C++17 후보 900개를 담는다. Easy 계층은 Bronze·Silver 18문제의 270개, Hard 계층은 Gold·Platinum 21문제(USACO Open 포함)의 630개다. 후보는 Claude Opus 4.8, GPT-5.5, GPT-OSS-120B, DeepSeek-V4, Qwen3.6-35B-A3B 다섯 LLM과 인간 경쟁 프로그래머 5명이 작성했고, 두 계층 모두 수락 대 미수락 비율이 1:2다. 미수락 후보는 공식 점수 밴드 다섯 구간에 분산했고, Easy 계층은 80~99 구간 표본이 귀해 채우지 못한 몫을 60~79 밴드에 배정해 이 밴드가 20%를 넘는다. USACO 사이트는 문제 지문·테스트 데이터·공식 해답은 주지만 validator와 checker는 주지 않아서, 저자들은 경쟁 프로그래머를 고용해 UOJ 호환 validator를 문제마다 구현하고, 다중 정답이 가능한 6문제에는 별도 checker를 작성했다. 모든 후보를 공식 테스트 데이터로 다시 채점해 레이블을 실제 판정으로 삼았다.
학습 후 전체 hack 성공률은 40.61%에서 62.67%로 오른다. Hard 분할에서 판정 정확도는 UOJ-Bench에서 67.43%에서 83.40%로, USACO-Judge에서 65.34%에서 84.50%로 올라 평균 26.5%의 상대 개선을 보인다. 35B Arbiter가 1.6T 파라미터급 비에이전트 모델을 앞선다는 것이 저자들의 주장이다. USACO-Judge에서 Arbiter는 평가된 오픈웨이트 모델 중 Easy·Hard 모두 최고 hack 성공률을, Hard에서 최고 판정 정확도를 기록했다. 테스트 시점 확장도 측정했는데, Arbiter 샘플 1개가 도구 없는 8개 샘플을 모든 분할에서 능가한다. 진단 품질은 인간 감사로도 확인했다. 경쟁 프로그래머 3명이 USACO 후보 400개에 대한 Arbiter 진단을 문제·후보·공식 판정 증거와 대조했고, 독립 초기 레이블이 400건 모두 일치했다. 컴파일 가능한 후보 중 올바른 진단의 71.6%에서 반례가 성공했고, 틀리거나 공허한 진단에서는 10.3%에 그쳤다. 실제 버그를 짚은 올바른 진단 163건 중 82.2%가 원인을 특정했고 54.0%가 수정안을 제시했다.
검증을 넘어 코드 선택과 수정에도 쓴다. 선택 실험은 Ma et al.(2026)을 따라 LiveCodeBench v6와 OJBench에서 Qwen3-30B-A3B-Thinking, Qwen3-235B-A22B-Thinking으로 8개·64개 프로그램 풀을 재생성했다. 후보당 Arbiter를 1회 또는 8회 호출하고 Accepted 판정을 가장 많이 받은 후보 중에서 균등 선택하며, 아무도 Accepted가 아니면 전체 풀에서 고른다. 여덟 개 설정 모두에서 후보당 Arbiter 1회 호출이 가장 강한 공개 베이스라인보다 높은 pass@1을 기록했다. 30B 솔버에 64개 풀에서는 LiveCodeBench 82.6 대 공개 73.7, OJBench 43.6 대 34.9다. 8회 호출은 모든 설정을 더 끌어올려 완벽 선택 상한에 가깝게 만든다. 수정 실험은 USACO 2026 홀드아웃 39문제에서 Qwen3.6-35B-A3B와 GPT-OSS-120B로, 이미 채점된 시작 프로그램 8개와 최대 8회 수정을 쓴다. Best@8에서 Arbiter의 판정(V)과 진단(D)을 함께 주는 조건이 모든 난이도 계층에서 온라인 저지 피드백보다 높은 점수를 냈다. V+D와 V+X는 판정을 노출하고 수락 기반 정지 규칙도 같으므로, 두 비교는 수정 지침으로서 진단의 가치를 보여준다. 반례 생성기 소스 X를 V+D에 더해도 일관된 이득은 없었다. IOI 2026 사례 연구에서는 GPT-OSS-120B가 문제마다 50개 내부 궤적을 출발점으로 최대 5회 Arbiter 유도 수정을 거쳐, 공식 제출 상한 아래에서 기대 점수 385.46을 기록해 금메달 기준 361.12를 넘었다. 온라인 저지 피드백을 쓴 경우는 334.6이었다.
실무에서 이 논문이 쓸모 있는 지점은 명확하다. 여러 후보를 뽑아 하나를 고르는 선택 단계와, 실패한 코드를 반복 수정하는 루프에서 공식 제출 예산을 태우기 전에 후보를 걸러내는 사전 심사기로 쓸 수 있다. 특히 수정 루프에서는 판정만 주는 것이 아니라 어떤 입력에서 왜 깨지는지를 실행 가능한 반례로 돌려주기 때문에, 다음 시도의 탐색 공간을 좁히는 데 직접 쓸 수 있다. 도입할 때 확인해야 할 것은 세 가지다. 첫째, 반례가 정말 그 문제의 제약을 만족하는 합법 입력인지 검증하는 장치가 파이프라인 안에 있어야 한다. 둘째, Accepted 판정에는 증거가 따라오지 않는다는 점이다. 반례는 실패를 입증하지만, 반례를 못 찾은 것이 수락을 입증하지는 않으므로 수락 판정은 별도 신뢰도 관리가 필요하다. 셋째, Accepted 오판은 수정 루프를 조기에 멈춰 버그를 남기고, 미수락 오판은 선택 단계에서 멀쩡한 코드를 버린다. 논문이 보여준 λ 조정은 이 정밀도-재현율 트레이드오프를 어느 쪽으로 기울일지 정하는 손잡이다.
저자들이 밝힌 전제와 한계는 분명하다. 증거 게이트는 구조적으로 비대칭이다. 반례는 실패를 확립할 수 있지만, 반례를 찾지 못한 것은 수락을 확립하지 못한다. 그래서 정책은 증인 없이 Accepted를 추측할 수 있고, 실제로 최종 모델은 λ=0을 택해 그 여지를 남겨 두었다. 진단문 d에는 정답 보상이 없으며, 반례 성공은 진단 품질의 검증 가능한 대리 지표일 뿐 d의 모든 주장을 증명하지는 않는다. 벤치마크 쪽 한계도 있다. UOJ-Bench의 해킹 분할은 전부 오답 프로그램이라 검증자가 수락 코드를 알아보는지를 시험하지 못하며, 모든 후보에 미수락을 예측해도 반례 없이 완벽한 이진 판정 정확도를 얻을 수 있다. USACO-Judge는 이 공백을 메우지만, 저자들이 validator와 checker를 직접 구현해야 했고 다중 정답 문제 6개에는 자체 checker를 써야 했다. 또한 판정 정확도는 온라인 저지가 처음 실패한 테스트에 따라 결정되는 실패 유형을 Accepted/미수락으로 이진화해 측정한 값이라는 점, 그리고 학습 데이터가 특정 솔버 롤아웃 분포에 치우쳐 있다는 점도 결과를 해석할 때 감안해야 한다.