Function-Aware Fill-in-the-Middle as Mid-Training for Coding Agent Foundation Models
이 논문은 코딩 에이전트 루프와 함수 호출 사이의 구조적 유사성을 활용하여 SWE-Bench와 같은 벤치마크에서 코딩 에이전트의 성능을 크게 향상시키는 동시에, 표준 사후 학습에 의해 흔히 저하되는 일반적인 코딩 및 도구 사용 능력을 보존하는 자기 지도 학습 방식인 함수 인지형 FIM(function-aware fill-in-the-middle) 중간 학습을 소개한다.
원본 논문은 CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/) 라이선스로 제공됩니다. 이것은 아래 논문에 대한 AI 생성 설명입니다. 저자가 작성하거나 승인한 것이 아닙니다. 기술적 정확성을 위해서는 원본 논문을 참조하세요. 전체 면책 조항 읽기
당신이 거대하고 지저분한 코드 도서관에서 버그를 수정하는 로봇을 가르치고 있다고 상상해 보세요. 보통 우리는 로봇에게 책을 처음부터 끝까지, 왼쪽에서 오른쪽으로 읽도록 가르칩니다. 하지만 문제가 하나 있습니다. 로봇이 실제로 버그를 고치러 갈 때는 단순히 앞으로만 읽지 않는다는 점입니다. 로봇은 한 단계를 밟고, 일어난 일(예를 들어, 도구가 에러를 발생시킴)을 관찰한 다음, 다음에 무엇을 할지 결정합니다. 즉, **행동(Action) → 관찰(Observation) → 다음 단계(Next Step)**라는 루프를 따릅니다.
이 논문의 저자들은 매우 흥สนใจ로운 점을 발견했습니다. 이 로봇의 루프는 일반적인 컴퓨터 코드의 **함수 호출(function call)**과 정확히 일치한다는 것입니다.
- 로봇의 행동은 하나의 함수가 다른 함수를 호출하는 것과 같습니다.
- 로봇의 관찰은 그 함수가 값을 반환(return)하는 것과 같습니다.
- 로봇의 다음 단계는 그 값을 사용하는 나머지 코드와 같습니다.
핵심 아이디어는 무엇일까요? 저자들은 로봇에게 코드를 단순히 정방향으로 읽는 대신, 이러한 함수 호출을 이용한 "빈칸 채우기" 게임을 가르쳤습니다. 그들은 이를 **함수 인지형 중간 채우기(Function-Aware Fill-in-the-Middle, FIM) 미드 트레이닝(Mid-Training)**이라고 부릅니다.
게임의 규칙: "사라진 조각 맞추기"
어떤 이야기 속에서 주인공(호출자, caller)이 친구(피호출자, callee)에게 어떤 과업을 요청했는데, 그 친구가 실제로 수행한 작업 내용이 숨겨져 있다고 상상해 보세요. 로봇은 앞뒤 문맥만을 바탕으로 친구가 무엇을 했는지 추측하고, 왜 그렇게 했는지 설명해야 합니다.
이 게임을 효과적으로 만들기 위해, 저자들은 단순히 무작위로 단어를 숨긴 것이 아닙니다. 그들은 코드의 특수한 지도인 "프로그램 의존성 그래프(Program Dependency Graph)"를 사용하여 완벽한 퍼즐을 찾아냈습니다. 그들은 다음과 같은 조건을 갖춘 함수들을 찾았습니다:
- 충분히 복잡하여 좋은 도전 과제가 될 수 있는 것 (너무 쉽지도, 불가능하지도 않은 수준).
- 충분히 예측 가능하여 로봇이 주변의 단서들을 통해 실제로 파악할 수 있는 것.
또한, 로봇이 빈 코드를 작성하기 전에 "추론 노트(Chain-of-Thought)"를 먼저 쓰도록 하여, 마치 인간 프로그래머처럼 행동하기 전에 먼저 생각하도록 강제했습니다.
결과: 정말 효과가 있을까?
저자들은 세 가지 서로 다른 로봇 두뇌(모델)를 대상으로 테스트를 진행했습니다. Qwen2.5-Coder 제품군 중 두 모델(70억 및 140억 파라미터)과 새로운 Qwen3 제품군 중 하나(80억 파라미터)입니다. 이 로봇들은 968개의 실제 세계 Python 코드 저장소에서 가져온 26억 개의 토큰(단어 및 기호)으로 구성된 방대한 데이터셋으로 훈련되었습니다.
결과는 다음과 같았습니다:
- 버그 수정 능력 향상: 실제 소프트웨어 문제를 시뮬레이션하는 유명한 벤치마크인 SWE-Bench-Verified에서 로봇들의 성능이 크게 향상되었습니다.
- 7B 모델은 +2.8% 향상되었습니다.
- 14B 모델은 +3.0% 향상되었습니다.
- 8B 모델은 +3.2% 향상되었습니다.
- 쉬운 작업에서 더 높은 성과: 더 가벼운 버전의 테스트인 SWE-Bench-Lite에서는 향상 폭이 더 컸으며, 8B 모델은 **+5.4%**나 뛰어올랐습니다.
- 어디서나 통하는 방법: 이러한 개선은 로봇들이 이후에 다른 방식으로 훈련되었을 때도 나타났습니다. 이는 "중간 채우기(fill-in-the-middle)" 훈련이 나중에 어떻게 다듬어지더라도 유지되는 탄탄한 기초를 제공했음을 시사합니다.
놀라운 점: 다른 기술을 망가뜨리지 않음
보통 로봇을 특정 분야의 전문가(예: 버그 수정 에이전트)로 훈련시키면, 간단한 코드를 쓰거나 도구를 사용하는 등의 다른 능력을 잃어버리곤 합니다. 저자들도 이를 우려했습니다.
하지만, 이 "미드 트레이닝"은 오히려 로봇의 다른 기술들을 보존했습니다!
- 이 추가 훈련이 없었다면, 로봇은 스스로 코드를 쓰는 능력(LiveCodeBench와 같은 벤치마크)이 떨어졌을 것입니다.
- 하지만 FIM 훈련을 거친 로봇은 단순히 유지되는 것에 그치지 않고, 오히려 더 좋아졌습니다 (+LiveCodeBench에서 +11.1%).
- 훈련 데이터가 오직 Python 코드뿐이었음에도 불구하고, 로봇은 완전히 다른 맥락(τ-bench 및 BFCL)에서도 도구를 사용하는 능력이 향상되었습니다. 이는 로봇이 인과관계에 대해 생각하는 일반적인 "사고 방식"을 학습했음을 시사합니다.
명확히 선을 그은 부분 (부정된 사실들)
저자들은 이 방법이 무엇이 아닌지도 신중하게 밝혔습니다:
- 단순히 똑똑한 스승을 흉내 내는 것이 아닙니다: 저자들은 로봇이 훈련 데이터를 생성하는 데 도움을 준 강력한 AI(Gemini-3-Flash)의 답을 단순히 암기하는 것인지 테스트했습니다. 그 결과, 로봇이 스스로의 추론 노트를 생성할 때도 여전히 성능이 향상됨을 확인했습니다. 즉, 마법은 단순히 "스승을 복제하는 것"이 아니라, 게임의 구조 자체에 있습니다.
- 모든 것에 통하는 만능 열쇠는 아닙니다: 이 방법은 코드가 모듈화되어 있을 때(깔끔하게 함수 단위로 나뉘어 있을 때) 가장 잘 작동합니다. 만약 모든 것이 뒤섞인 거대하고 지저분한 스크립트라면, 명확한 "함수 호출" 퍼즐을 찾을 수 없기 때문에 이 방법은 효과가 떨어집니다.
- 아직 모든 언어에 입증된 것은 아닙니다: 훈련 데이터는 오직 Python이었습니다. 로봇이 다른 작업에서도 더 나은 모습을 보였지만, 저자들은 이 방법이 Java, C++, 또는 Rust에서도 작동한다는 것을 아직 증명하지 못했다고 인정했습니다.
얼마나 확신하는가?
저자들은 결과가 운이 아니라는 것을 증명하기 위해 서로 다른 랜덤 시드(random seed)를 사용하여 테스트를 세 번 실시했으므로, 자신들의 수치에 상당히 확신하고 있습니다. 그들은 개선 정도를 정밀하게 측정했으며(예: +2.8%, +3.0%), 로봇이 막혔을 때 일관되게 더 많은 문제를 해결하고 실수를 덜 한다는 것을 보여주었습니다.
그들은 이 "미드 트레이닝" 단계가 중요한 누락된 연결 고리라고 제안합니다. 이는 마치 로봇을 실제 세상으로 보내기 전, 특정한 종류의 체육관 운동을 시켜서, 자신의 다른 능력을 잃지 않으면서도 "행동하고, 관찰하고, 계속하는" 복잡한 루프를 처리할 수 있는 적절한 근육을 갖추게 하는 것과 같습니다.
연구 분야의 논문에 파묻히고 계신가요?
연구 키워드에 맞는 최신 논문의 일일 다이제스트를 받아보세요 — 기술 요약 포함, 당신의 언어로.