Unseen-Codebases-Domain Data Synthesis and Training Based on Code Graphs
이 논문은 새로운 소프트웨어 프레임워크에서 LLM 의 성능 저하와 할루시네이션 문제를 해결하기 위해, 소스 코드 기반의 코드 그래프를 활용하여 의존성 보존 사전 학습과 추론 흔적이 포함된 합성 데이터로 학습하는 'UCD-Training' 프레임워크와 새로운 벤치마크 'UnseenCodeBench'를 제안합니다.
상상해 보세요. 여러분이 완전히 새로운 도시에 여행을 갔습니다. 하지만 이 도시는 AI 가 훈련받던 과거 데이터에는 전혀 없었습니다.
현재의 문제 (할루시네이션): AI 는 이 도시를 처음 봅니다. 그런데 AI 는 "아, 여기는 내가 아는 도시 A 와 비슷하니까, 도시 A 의 길로 가면 되겠지!"라고 추측해서 엉뚱한 길로 안내합니다. 이를 **할루시네이션(환각)**이라고 합니다.
기존 해결책 (RAG): "그냥 검색을 해봐!"라는 방법입니다. AI 가 길을 잃으면 근처에 있는 간판을 찾아보게 하는 건데, 간판만 보고는 복잡한 도시의 전체 구조나 "어떤 건물을 어떻게 연결해야 하는지" 같은 깊은 이해를 하기는 어렵습니다.
이 연구의 해결책 (UCD-Training): 연구팀은 AI 에게 **"새 도시의 지도를 직접 그려서 가르쳐 주자"**고 제안합니다. 하지만 문제는, 이 새 도시에는 '사용자 가이드'나 '여행 후기' 같은 좋은 자료는 없고, 오직 건물들 (소스 코드) 만 덩그러니 있다는 점입니다.
🛠️ 이 연구가 한 일: "코드 그래프"라는 지도 그리기
연구팀은 UCD-Training이라는 두 단계의 훈련 방식을 개발했습니다.
1 단계: "건물 간의 연결고리"를 먼저 외우기 (CPT)
비유: AI 에게 도시의 건물들 (파일) 이 서로 어떻게 연결되어 있는지 도로망 지도를 그려줍니다.
방법: 소스 코드를 분석해서 "A 건물이 B 건물을 필요로 한다", "C 건물이 D 건물을 부른다"는 관계를 **그래프(지도)**로 만듭니다. 그리고 이 연결 관계를 바탕으로 AI 가 코드를 읽을 때, 의존성이 있는 파일들이 한 번에 함께 읽히도록 훈련시킵니다.
효과: AI 가 "이 파일을 고치면 저 파일도 같이 고쳐야 해"라는 구조적인 이해를 갖게 됩니다.
2 단계: "현실적인 시나리오"로 실전 훈련 (SFT)
이제 AI 가 지도를 보았으니, 실제 여행 (코드 작성) 을 해보게 합니다. 하지만 그냥 코드를 복사해 주는 게 아니라, 세 가지 종류의 문제를 풀게 합니다.
단순 연결 문제 (Single-hop): "A 와 B 는 어떤 관계야?" (예: "이 함수는 저 클래스를 호출해")
복합 도구 사용 문제 (Compositional API): "이 도시의 특색을 살려서 A, B, C 세 가지 도구를 함께 써서 집을 지어봐." (실제 개발자가 자주 쓰는 패턴을 학습)
전체 프로젝트 활용 문제 (Codebase Utilization): "이 도시의 기존 테스트 코드를 보고, 새로운 기능을 추가해봐."
✨ 핵심 포인트: 이 모든 훈련에 **생각의 과정 (Reasoning Traces)**을 함께 가르칩니다.
비유: 단순히 정답만 알려주는 게 아니라, "왜 이 도구를 썼는지, 왜 이 순서로 연결했는지"에 대한 논리적 설명을 AI 가 스스로 생각하고 답하게 훈련시킵니다.
🏆 결과: "새 도시의 전문가"가 되다
연구팀은 UnseenCodeBench라는 새로운 시험지를 만들어 이 방법을 검증했습니다.
기존 방법 (검색만 하는 AI): 복잡한 도시에서는 길을 잘 못 찾았습니다. (성능 저하)
이 연구의 AI (UCD-Training):
정확도 대폭 상승: 기존 방법보다 최대 26% 이상 더 정확하게 코드를 작성했습니다.
다양한 환경: 파이썬, C++ 등 다양한 언어와 모델 크기에 상관없이 잘 작동했습니다.
실전 적용: 한 AI 가 여러 개의 새로운 도시 (여러 프로젝트) 를 동시에 다룰 때도 여전히 강력했습니다.
💡 한 줄 요약
"AI 가 본 적 없는 새로운 소프트웨어를 다룰 때, 단순히 검색해서 대충 맞추는 게 아니라, 소스 코드만으로도 '지도'를 그려내고 '실전 연습'을 시켜주면, AI 는 그 도시의 전문가가 되어 훨씬 똑똑하게 일할 수 있다."
이 연구는 AI 가 새로운 기술을 배울 때, 단순한 정보 주입이 아니라 '구조와 논리'를 이해시키는 훈련이 얼마나 중요한지를 보여줍니다.
1. 문제 정의 (Problem Definition)
대형 언어 모델 (LLM) 은 GitHub 등 공개된 코딩 생태계에서 학습되어 다양한 소프트웨어 엔지니어링 작업에서 뛰어난 성능을 보이지만, **새롭게 출시된 프레임워크, 도메인 특화 라이브러리, 또는 기업 내부의 독점 코드베이스 (Unseen Codebases)**와 같은 훈련 데이터에 포함되지 않은 환경에서는 심각한 성능 저하와 할루시네이션 (Hallucination) 을 겪습니다.
기존 접근법의 한계:
추론 시 증강 (Inference-time Augmentation, 예: RAG): 검색을 통해 관련 코드를 프롬프트에 포함시키는 방식은 표면적인 오류를 줄일 수 있지만, 코드베이스 구성 요소 간의 **내재적 관계 (intrinsic relationships)**나 올바른 컴포지션 (composition) 을 추론하는 데에는 한계가 있습니다. 단순히 소스 코드를 검색하는 것만으로는 학습된 사용 패턴과 관례를 완전히 이해하기 어렵습니다.
기존 데이터 합성 (Data Synthesis): 공개 저장소의 사용 패턴에 의존하는 기존 합성 방법들은 (예: OSS-Instruct) 소스 코드만 존재하고 실제 사용 예시 (usage-oriented code) 가 부족한 새로운 코드베이스에는 적용하기 어렵습니다.
따라서, 소스 코드만 제공되는 **보이지 않는 코드베이스 (Unseen Codebases)**에 대해 LLM 이 효과적으로 적응하고 추론할 수 있도록 하는 새로운 학습 프레임워크가 필요합니다.
2. 제안 방법론: UCD-Training
저자들은 UCD-Training이라는 2 단계 학습 프레임워크를 제안합니다. 이 방법은 보이지 않는 코드베이스의 소스 코드만으로 **코드 그래프 (Code Graph)**를 구축하고, 이를 기반으로 추론 인식 (Reasoning-aware) 데이터 합성을 수행하여 모델에 도메인 지식을 주입합니다.
2.1 코드 그래프 구축 (Code Graph Construction)
소스 코드를 파싱하여 파일, 클래스, 함수, 메서드, 전역 변수 등을 **노드 (Node)**로, 의존성, 호출, 포함 관계 등을 **엣지 (Edge)**로 하는 구조화된 그래프를 생성합니다.
이는 코드베이스의 구조적 및 시맨틱 관계를 포착하는 기초가 됩니다.
2.2 1 단계: 의존성 보존 지속적 사전 학습 (Dependency-Preserving CPT)
목적: 코드베이스의 구현 구조와 파일 간 의존성을 모델이 기억하도록 합니다.
방법:
코드 그래프에서 파일 노드와 파일 간 의존성 엣지만 추출하여 방향성 비순환 그래프 (DAG) 를 만듭니다.
기존 방식 (위상 정렬) 과 달리, **깊이 우선 탐색 (DFS)**을 수행하여 실제 의존 관계를 가진 파일들이 동일한 학습 시퀀스 내에서 인접하게 배치되도록 합니다.
슬라이딩 윈도우 전략을 적용하여 컨텍스트 길이 제한을 준수하면서 의존성이 보존된 훈련 데이터를 생성합니다.
일반 도메인 데이터와 혼합하여 CPT 를 수행합니다.
2.3 2 단계: 그래프 기반 지도 미세 조정 (Graph-Grounded SFT)
목적: 모델이 코드베이스를 활용하여 실제 작업을 수행할 수 있도록 추론 능력을 강화합니다.
데이터 합성 (3 가지 유형): 모든 데이터에는 명시적인 **추론 흔적 (Reasoning Traces)**이 포함됩니다.
Single-hop Relation Reasoning Data: 그래프의 엣지 (관계) 를 기반으로 한 미세 구조적 관계 데이터. (규칙 기반 생성 + LLM 을 통한 다양화 및 부정적 샘플 생성)
Compositional API Reasoning Data: 코드베이스 내부 테스트 케이스에서 추출된 API 조합을 기반으로 한 복합적 API 사용 질문 (코드 검사 문제). 실제 사용 시나리오를 반영합니다.
Codebase Utilization Data: 내부 테스트 케이스를 함수 생성 작업으로 변환한 데이터. API 호출 패턴과 기능적 시나리오를 학습합니다.
품질 관리: 생성된 데이터와 추론 흔적에 대해 Ground-truth 수준의 컨텍스트를 제공하여 LLM 에게 재채택 (Rejection Sampling) 을 수행하고, 문법적/의미적 오류를 필터링하는 2 단계 필터링 메커니즘을 적용합니다.
3. 주요 기여 (Key Contributions)
UCD-Training 프레임워크 제안: 소스 코드만으로 코드 그래프를 구축하고, 이를 기반으로 의존성 보존 CPT 와 그래프 기반 SFT 를 수행하여 보이지 않는 코드베이스에 대한 도메인 지식을 주입하는 2 단계 학습 프레임워크를 개발했습니다.
새로운 벤치마크 (UnseenCodeBench) 도입: C++ 과 Python 으로 구성된, 실제 LLM 훈련 데이터에 포함되지 않은 최신 프로젝트들을 대상으로 한 코드 생성 벤치마크를 구축했습니다. 이는 단일 코드베이스가 아닌 다중 언어/다중 코드베이스 환경을 시뮬레이션합니다.
광범위한 실험 및 검증: 다양한 프로그래밍 언어, 모델 규모 (7B~32B), 아키텍처에서 UCD-Training 의 효과성과 일반화 능력을 입증했습니다.
4. 실험 결과 (Results)
성능 향상: UCD-Training 은 기존 베이스라인 (RAG, OSS-Instruct, COTTON 등) 보다 UnseenCodeBench에서 평균 **Pass@1 기준 7.2% ~ 26.1%**만큼의 성능 향상을 보였습니다.
예: GPT-5.1 기반 RAG 대비 25.5% 의 절대적 개선, 8B 모델이 14B 베이스라인 모델보다 더 나은 성능을 보이기도 함.
복잡한 코드베이스에서의 강점: 코드베이스가 복잡해질수록 (예: sqlgen 프로젝트) RAG 의 성능은 급격히 떨어지지만, UCD-Training 은 구조적 의존성을 학습하여 안정적으로 높은 성능을 유지했습니다.
실제 기업 환경 시뮬레이션: 하나의 모델이 여러 언어와 코드베이스를 동시에 처리해야 하는 시나리오에서도 **Pass@1 36.0%**를 기록하며 모든 베이스라인을 4.7%~23.6% 우월하게 능가했습니다.
Ablation Study:
Compositional API Reasoning Data가 가장 중요한 기여를 했으며, 이를 제거할 경우 성능이 최대 29.7% 하락했습니다.
데이터 필터링 메커니즘이 데이터 품질과 최종 성능의 안정성에 필수적임을 입증했습니다.
5. 의의 및 결론 (Significance)
이 논문은 소스 코드만 존재하는 새로운 도메인에서 LLM 의 적응 문제를 해결하기 위한 획기적인 접근법을 제시합니다.
추론 능력의 핵심: 단순히 코드를 검색하거나 (RAG) 무작위로 합성하는 것을 넘어, 코드 그래프 기반의 구조적 분석과 **실제 사용 패턴을 반영한 추론 흔적 (Reasoning Traces)**을 학습 데이터에 통합함으로써, 모델이 코드베이스의 '내재적 논리'를 이해하고 적용하는 능력을 비약적으로 향상시켰습니다.
실용성: 공개된 데이터가 부족한 기업 환경이나 신기술 스택 도입 시, 소스 코드만으로 모델을 빠르게 적응시킬 수 있는 실용적인 솔루션을 제공합니다.
확장성: 모델 규모와 아키텍처에 구애받지 않는 강력한 일반화 능력을 보여주어, 향후 다양한 소프트웨어 엔지니어링 작업에 적용 가능한 기반을 마련했습니다.
요약하자면, UCD-Training은 보이지 않는 코드베이스에 대한 LLM 의 할루시네이션을 줄이고, 구조적 이해와 추론 능력을 극대화하여 실제 산업 환경에서의 코드 생성 성능을 획기적으로 개선한 연구입니다.