핵심 요약
기존 코딩 AI는 코드를 단순히 텍스트로만 이해하여 실행 시 발생하는 논리적 오류를 잡는 데 한계가 있었다. 이 논문은 모델이 코드를 단계별로 '머릿속에서 실행(시뮬레이션)'하도록 학습시켜, 외부 실행 환경 없이도 스스로 오류를 검증하고 수정하여 프로그래밍 성능을 획기적으로 높이는 방법을 제시한다.
왜 중요한가
기존 코딩 AI는 코드를 단순히 텍스트로만 이해하여 실행 시 발생하는 논리적 오류를 잡는 데 한계가 있었다. 이 논문은 모델이 코드를 단계별로 '머릿속에서 실행(시뮬레이션)'하도록 학습시켜, 외부 실행 환경 없이도 스스로 오류를 검증하고 수정하여 프로그래밍 성능을 획기적으로 높이는 방법을 제시한다.
핵심 기여
NLEX 데이터셋 구축 및 학습
코드의 실행 과정을 단계별 자연어 설명으로 변환한 NLEX(Natural Language Execution Tracing) 데이터를 구축했다. 이를 통해 모델이 코드의 구문뿐만 아니라 실행 동역학을 이해하도록 지도 미세 조정을 수행했다.
실행 시뮬레이션 기반 자기 검증(Self-Verification)
모델이 생성한 여러 후보 코드들에 대해 직접 실행 결과를 예측하게 하고, 공공 테스트 케이스의 예상 출력과 일치하는 코드를 우선적으로 선택하는 best@k 전략을 도입하여 정확도를 높였다.
반복적 자기 수정(Self-Fixing) 프로세스
시뮬레이션된 실행 피드백을 바탕으로 모델이 스스로 코드를 수정하는 다회차(Multi-turn) 강화학습 파이프라인인 Self-RLEF를 제안했다. 이는 외부 인터프리터 없이도 모델 내부에서 디버깅이 가능함을 입증했다.
벤치마크 성능 대폭 향상
CruxEval 출력 예측 작업에서 최대 43%, 경쟁 프로그래밍 솔루션 생성에서 최대 39%의 성능 향상을 달성했다. 특히 Qwen 2.5 3B 모델이 NLEX 학습 후 훨씬 큰 규모의 모델들과 대등한 성능을 보였다.
핵심 아이디어 이해하기
기존의 Transformer 기반 언어 모델은 코드를 생성할 때 다음에 올 토큰을 확률적으로 예측하는 데 집중한다. 이는 마치 코드를 문법적으로는 완벽하게 쓰지만, 실제로 그 코드가 어떤 값을 계산하고 메모리에서 어떻게 동작하는지는 모르는 상태와 같다. 이로 인해 복잡한 논리 구조를 가진 알고리즘 문제에서 사소하지만 치명적인 논리 오류를 범하는 경우가 많다.
이 문제를 해결하기 위해 연구진은 모델에게 '코드를 머릿속으로 실행하는 법'을 가르쳤다. 모델이 코드를 한 줄씩 읽으며 변수 값이 어떻게 변하는지 자연어로 설명하게 함으로써, 코드의 정적인 구조(Syntax)와 동적인 실행 흐름(Execution Dynamics)을 연결하는 임베딩 공간을 형성하도록 유도했다. 이는 사람이 코드를 디버깅할 때 머릿속으로 변수 값을 추적하는 과정과 유사하다.
결과적으로 모델은 자신이 짠 코드가 특정 입력에 대해 어떤 결과를 내놓을지 미리 예측할 수 있게 된다. 이 예측 능력을 바탕으로, 여러 개의 답안 중 예상 결과가 정답과 일치하는 것을 골라내거나(Self-Verification), 예상 결과가 틀렸을 때 그 이유를 스스로 분석하여 코드를 고치는(Self-Fixing) 고차원적인 추론이 가능해진다.
방법론
전체 접근 방식은 지도 미세 조정(SFT)과 강화학습(RL)의 2단계로 구성된다. 먼저 SFT 단계에서는 NLEX(Natural Language Execution Tracing) 데이터를 사용한다. 약 3천만 개의 일반 함수와 11.5만 개의 경쟁 프로그래밍 솔루션에서 추출한 실행 트레이스를 Qwen 3-32B 모델을 이용해 자연어 설명으로 번역하고, 이를 학습 데이터로 사용하여 모델이 단계별 실행 과정을 설명하도록 훈련시킨다.
강화학습 단계에서는 RLVR(Reinforcement Learning with Verifiable Rewards)을 적용한다. 모델에게 코드와 표준 입력(stdin)을 주고 최종 출력(stdout)을 예측하게 한 뒤, 실제 실행 결과와 일치하면 +1, 틀리면 -1의 보상을 부여한다. [코드, 입력 → 실행 시뮬레이션 → 예측 출력] 과정을 통해 모델의 예측 정확도를 극대화한다.
자기 수정(Self-Fixing)을 위해 Self-RLEF 알고리즘을 도입했다. 모델은 먼저 코드를 생성(Solve)하고, 각 테스트 케이스에 대해 실행을 시뮬레이션(Simulate)한다. 이후 [문제, 코드, 시뮬레이션 결과]를 입력으로 받아 코드가 올바른지 판단하고, 틀렸다고 판단되면 피드백을 바탕으로 코드를 수정(Fix)하는 과정을 최대 10회까지 반복한다.
주요 결과
CruxEval-O 벤치마크에서 Qwen 2.5 3B 모델은 NLEX 학습 전 37.5%에서 학습 후 68.0%로 pass@1 성능이 급등했으며, 7B 모델 역시 48.5%에서 75.5%로 크게 향상됐다. 이는 모델 크기를 몇 배 키우는 것보다 실행 시뮬레이션 학습이 출력 예측 능력 향상에 더 효과적임을 보여준다.
경쟁 프로그래밍 벤치마크인 LCB-IO와 DMC에서도 성능 향상이 뚜렷했다. 자기 검증(Self-verification)을 적용했을 때, 표준 생성 방식 대비 2~8포인트의 성능 이득을 얻었다. 특히 실제 실행기(Oracle)를 사용했을 때와의 성능 격차(Simulation Gap)가 크지 않아, 모델의 시뮬레이션 능력이 실용적인 수준에 도달했음을 확인했다.
Self-RLEF를 통한 반복적 수정 결과, CWM 모델 기준으로 DMC 데이터셋에서 초기 정답률 57.8%를 63.2%까지 끌어올렸다. 모델은 초기 코드가 실패했을 때 약 17%의 확률로 성공적인 수정을 해냈으며, 이미 맞은 코드를 틀리게 고치는 경우는 1.2%에 불과해 수정 과정의 안정성을 입증했다.
기술 상세
모델 아키텍처는 Qwen 2.5 Base(3B, 7B) 및 CWM-base를 기반으로 하며, 긴 컨텍스트 처리를 위해 scaled RoPE를 적용하여 최대 65,536~131,072 토큰 길이를 지원한다. 학습에는 NVIDIA H100 GPU가 사용되었으며, SFT 단계에서 65B 토큰을 학습시켰다.
핵심 차별점은 기존 CWM(Code World Models)이 JSON 형태의 구조화된 트레이스를 사용한 것과 달리, 자연어 설명을 도입했다는 점이다. 자연어는 모델이 이미 학습한 추론 데이터와 형식이 유사하여 의미적 맥락(Semantic Context)을 더 잘 파악하게 하며, 문자 단위의 반복적인 루프 처리를 추상화하여 효율적인 학습을 가능하게 한다.
강화학습 시에는 비동기 RL 인프라를 사용했으며, 출력 예측 작업에 0.8의 가중치를 부여한 멀티태스크 학습을 수행했다. 보상 함수는 부동 소수점 오차(1e-5)를 허용하는 엄격한 바이너리 매칭을 사용했다. 실험 결과, 모델이 자신의 코드를 검증할 때 발생하는 'Simulation Gap'은 모델의 크기가 커질수록 줄어드는 경향을 보였다.
한계점
큰 숫자들의 곱셈이나 로그 계산과 같은 복잡한 수치 연산을 시뮬레이션하는 데에는 여전히 한계가 있다. 또한 현재 연구는 단일 파일로 구성된 경쟁 프로그래밍 문제에 국한되어 있으며, 여러 파일과 복잡한 종속성을 가진 실제 소프트웨어 저장소(SWE tasks)로의 확장은 향후 과제로 남아 있다.
실무 활용
외부 코드 실행 환경(샌드박스)을 구축하기 어려운 환경이나 실시간 응답이 중요한 서비스에서 LLM의 자체 검증 능력을 활용해 코드 품질을 높일 수 있다.
- 인터넷 연결이 제한된 환경에서의 로컬 AI 코딩 어시스턴트 디버깅 기능
- 코드 생성 API 비용 절감을 위한 내부 필터링 시스템 (실행기 호출 전 1차 검증)
- 복잡한 종속성이 있는 라이브러리 사용 시 실행 환경 구축 없이 논리적 오류 사전 탐지
코드 공개 여부: 비공개
키워드
AI 요약 · 북마크 · 개인 피드 설정 — 무료
출처 · 인용 안내
인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.