- Title: In Line with Context Repository-Level Code Generation via Context Inlining
- ArXiv ID: 2601.00376
- 발행일: 2026-01-01
- 저자: Chao Hu, Wenhao Zeng, Yuling Shi, Beijun Shen, Xiaodong Gu
📝 초록
이 논문에서는 코드 생성 대형 언어 모델(LLM)의 발전에 따라, 저장소 수준의 코드 생성에 대한 관심을 살펴보고 있습니다. 저장소 수준의 코드 생성은 기능 수준 생성과 달리 전체 저장소를 고려해야 하며, 프로그래밍 관례와 API 사용 및 함수 간 복잡한 종속성을 이해해야 합니다. 본 논문에서는 이를 지원하기 위한 새로운 프레임워크인 **InlineCoder**를 제안합니다.
💡 논문 해설
1. 이 연구의 첫 번째 주요 기여는 저장소 수준의 코드 생성을 위해 함수의 역할을 정의하는 새로운 방법입니다. 이를 통해 함수가 호출되는 위치와 의존성에 따라 이해할 수 있는 방식으로 코드를 생성합니다.
2. 두 번째로, 본 논문에서는 기존 접근법이 부족한 부분을 보완하기 위한 **InlineCoder** 프레임워크를 제안합니다. 이 프레임워크는 함수를 호출하는 상황과 의존성에 따라 코드를 생성할 수 있도록 합니다.
3. 세 번째로, 본 논문은 다양한 벤치마크에서 실험을 통해 **InlineCoder**의 우수성을 입증하고 있습니다.
📄 논문 발췌 (ArXiv Source)
# 서론
코드 LLM의 급속한 발전과 함께 최근 몇 년 동안 저장소 수준 코드 생성에 대한 관심이 높아지고 있습니다. 함수 수준 생성과 달리 저장소 수준 생성은 전체 리포지토리를 고려하고 프로그래밍 관례, API 사용 및 복잡한 함수 간 종속성을 이해해야 합니다. 이러한 환경에서 성공하기 위해서는 문법적으로 올바르고 의미론적으로 유효한 코드뿐만 아니라 저장소의 전체적인 설계와 의존성과 일관성이 필요합니다.
저장소 수준 생성의 핵심 장애물은 리포지토리 컨텍스트 자체입니다. 이는 정확한 생성에 필요한 중요한 정보를 포함하지만, 전체 리포지토리를 LLM에 직접 입력하는 것은 컨텍스트 윈도우 제한과 과도하게 많은 관계 없는 또는 중복 코드 때문에 불가능합니다. 이로 인해 다음과 같은 핵심 도전이 발생합니다: 대규모 코드베이스에서 가장 관련 있는 컨텍스트를 어떻게 추출하고 표현할 수 있을까요?
이 도전을 해결하기 위한 전작에서는 다양한 검색 전략을 사용했습니다. 가장 일반적인 방법은 검색 강화 생성(RAG)으로, 완성되지 않은 함수와 유사한 코드 스니펫을 검색합니다. 그러나 코드에서 유사성이 반드시 관련성을 의미하지는 않습니다: 어휘적으로 유사한 스니펫이 기능적으로 관계 없을 수 있으며, 이로 인해 잡음이나 잘못된 프롬프트가 생성됩니다. 에이전트 기반 파이프라인은 반복적인 검색과 LLM 지도 평가를 통해 이러한 능력을 확장합니다. 더욱 고급 방법은 제어 흐름 또는 데이터 흐름 그래프와 같은 프로그램 분석을 통합하여 세미어틱 종속성을 더 정확하게 캡처하는 것입니다. 그러나 이들 방법은 라인 수준 완성이나 API 예측과 같은 미세한 작업에는 효과적이지만, 함수 수준 생성에서는 로컬 컨텍스트에 크게 의존하고 종종 전체 구현을 처음부터 합성해야 하는 상황에서 일반화에 실패합니다.
이러한 제약점을 극복하기 위해 우리는 InlineCoder, 저장소 수준 코드 생성을 위한 새로운 프레임워크를 제안합니다. 우리의 주요 통찰은 함수의 역할이 리포지토리 호출 스택 내 위치에 의해 결정된다는 것입니다: 함수는 상류 호출자(어떻게 사용되는지를 나타냄)에 의해 제한되며, 그 구현은 하류 호출자(무엇을 의존하는지를 나타냄)에 의해 정의됩니다. InlineCoder는 미완성 함수를 호출 체인에 인라인하여 저장소 수준 생성을 훨씬 쉬운 기능 수준 생성 작업으로 재정형화함으로써 컨텍스트 이해를 강화합니다. 함수 시그니처가 주어지면, InlineCoder는 잠재적 의존성을 근사하기 위한 초안 구현(anchor)을 먼저 생성합니다. 이 초안은 양방향 인라인 과정을 이끌게 됩니다: (1) 상류 인라인, 여기서 우리는 anchor를 호출자로 인라인하여 풍부한 사용 사례를 제공합니다. (2) 하류 검색, 여기서 우리는 초안이 부르는 모든 하위 함수를 포함하여 의존성 컨텍스트를 캡처합니다. 마지막으로, 우리는 초안 코드와 인라인된 컨텍스트를 통합하여 종합적인 프롬프트로 LLM을 사용해 최종 컨텍스트에 맞춘 코드를 생성할 수 있게 합니다.
InlineCoder는 두 개의 널리 사용되는 저장소 수준 코드 생성 벤치마크, DevEval 및 RepoExec, 세 가지 백본 LLM(DeepSeek-V3, Qwen3-Coder 및 GPT5-mini)을 사용해 평가했습니다. InlineCoder는 최고의 전반적인 성능을 보여주었습니다. 특히 RepoExec에서, 가장 강력한 베이스라인 대비 EM은 29.73%, ES는 20.82%, BLEU는 49.34% 상대적인 향상을 보였습니다. 절제 연구는 InlineCoder의 각 구성 요소가 최종 효능에 기여함을 확인했습니다. 또한 특정 코드 구조에 대한 타겟 분석 및 다양한 도메인과 컨텍스트 환경에서의 실험은 InlineCoder가 일관되게 큰 이점을 제공한다는 점을 강조하며, 저장소 수준 코드 생성에 대한 그 견고성과 일반화 능력을 보여줍니다.
이 논문의 주요 기여는 다음과 같습니다:
우리는 상류 (호출자)와 하류 (호출자) 컨텍스트를 고려한 저장소 수준 코드 생성 프레임워크를 제안합니다.
우리가 처음으로 함수를 호출자 컨텍스트에 인라인하여 LLM이 함수의 의도된 목적과 사용 패턴을 더 깊게 이해할 수 있도록 했습니다.
다양한 벤치마크에서 광범위한 평가를 수행했습니다. 결과는 우리의 방법이 다양한 컨텍스트 환경 및 여러 도메인에 걸쳐 최신 기준선보다 일관된 개선을 이루고 있음을 보여줍니다.
동기
[[IMG_PROTECT_N]]
동기화 예제. 목표 함수를 호출 체인에 인라인하면 더 컨텍스트에 맞는 작업 정의가 생성되어 저장소와 일관된 완성 결과를 얻을 수 있습니다.
저장소 수준 코드 생성에서 핵심 도전은 모델에 리포지토리 컨텍스트를 효과적으로 통합하는 것입니다. 현재 접근법은 일반적으로 텍스트 유사도나 구조적 가까움을 기반으로 관련 스니펫을 선택하는 검색 기반 프레임워크를 채택합니다. 이 전략은 로컬 컨텍스트를 제공하지만, 함수가 실제로 호출자에 의해 어떻게 사용되는지(상류) 또는 그 의존성(하류)에 대한 체계적인 표현을 거의 제공하지 않습니다.
최근 몇몇 노력이 호출 체인 정보를 통합하려고 하지만, 종종 검색된 함수를 미완성 목표 시그니처 앞에 단순히 추가합니다. 이 선형 연결은 타겟의 실제 호출 환경 내 기능적 역할을 무시합니다. 결과적으로 모델은 입력/출력 제약 조건이나 호출 규칙에 대해 인식하지 못하여 함수 의미론에 대한 불완전하거나 잘못된 이해를 가지게 됩니다. 검색된 스니펫을 실제 호출 위치에 맞게 적응시키지 않으면, 모델은 올바른 변수 바인딩, 반환 형식 또는 저장소 내에서 사용되는 적절한 API 변종을 추론하는 데 실패할 수 있습니다.
도표 1 (a)는 이러한 한계를 보여주는 예입니다. 기존 방법은 종종 타겟 함수를 고립시키고 유틸리티 함수나 스니펫을 그 위에 추가하여 진정한 호출 관계를 포착하지 못합니다. 결과적으로, 모델은 관련 없는 유틸리티 extract_functions를 부르는 등 잘못된 코드를 생성하며 예상되는 list[str] 대신 dict를 반환합니다.
이 예제는 새로운 컨텍스트 통합 패러다임을 동기화하는 데 사용됩니다. 도표 1 (b)에서 보듯, 우리는 타겟 함수를 실제 호출 컨텍스트에 직접 인라인하여 인라인된 컨텍스트를 제공합니다. 이 접근법은 구조화된 호출 그래프 정보를 모델이 쉽게 해석할 수 있는 형태로 변환하고 변수 바인딩, 반환 형식 및 유효한 API 사용과 같은 중요한 신호를 노출합니다. 예제에서 보듯, 인라인 컨텍스트는 모델이 저장소와 일관된 코드를 생성하게 합니다: 정확한 함수가 이제 list[str]를 반환하고 적절한 하위 호출을 부릅니다. 우리의 방법은 대상화된 컨텍스트 검색과 인라인을 결합하여 기존의 검색 기반 전략의 한계를 극복하는 컨텍스트에 맞춘, 저장소와 일치하는 코드 생성이 가능하게 합니다.
메소드
전체 프레임워크
리포지토리 내 미완성 함수 $`x`$의 시그니처가 주어졌을 때, 리포지토리 수준 코드 생성의 목표는 컨텍스트 정보 $`\mathcal{C}`$를 활용해 함수 본문 $`y`$를 생성하는 것입니다. 이 작업의 주요 도전은 가능한 한 정확하게 유용한 컨텍스트 $`\mathcal{C}`$를 추출하고, 모델이 컨텍스트 $`\mathcal{C}`$의 정보를 이해하도록 하는 것입니다.
[[IMG_PROTECT_N]]
InlineCoder 프레임워크.
이 도전을 해결하기 위해 우리는 InlineCoder, 저장소 수준 코드 생성을 위한 새로운 프레임워크를 제안합니다. 이전 기술들이 컨텍스트 내 유사한 스니펫을 검색하는 것과 달리, InlineCoder의 핵심 아이디어는 타겟 함수를 호출 그래프 환경에 위치시키는 것입니다. 도표 2에서 보듯, InlineCoder는 세 단계 파이프라인을 따릅니다:
1) 초안 생성(Section
3.2): 타겟 함수 시그니처를 중심으로 구성된 기본 프롬프트가 주어지면, InlineCoder는 미완성 함수의 초안 구현을 먼저 생성합니다. 이 초안은 잠재적인 하류 의존성을 근사하여 타겟 함수를 리포지토리 호출 그래프 내에 위치시키고, perplexity 평가를 위한 기반을 제공합니다.
2) 컨텍스트 인라인(Section
3.3): 초안은 호출자에게 인라인되어 상류 사용 사례를 캡처하고, 관련된 하위 호출 구현이 하류에 검색 및 통합됩니다. 이 과정은 모델을 위한 일관되고 선형화된 표현을 생성하여 상류와 하류 컨텍스트 정보를 통합합니다.
3) 컨텍스트 통합(Section
3.4): InlineCoder는 모든 관련 정보를 다음 구성 요소로 포함하는 컨텍스트 강화 프롬프트에 통합합니다: (a) 기본 프롬프트(함수 시그니처 + 임포트), (b) 검색된 상류 및 하류 컨텍스트, (c) 초기 초안. 이 풍부한 프롬프트는 LLM에게 종합적인 지침을 제공하여 의미론적으로 정확하고 리포지토리 환경과 일치하는 최종 구현을 생성할 수 있게 합니다. 각 단계의 세부 사항은 다음 하위 섹션에서 자세히 설명됩니다.
초안 생성
초안 생성 단계에서는 타겟 함수에 대한 예비 구현을 생성합니다. 이 초안은 후속 검색을 안내하는 동시에 최종 생성 단계를 위한 참조점이 됩니다.
이 초안을 생성하기 위해, 우리는 먼저 LLM에게 로컬 컨텍스트와 의존성을 포괄적으로 보여주는 초기 프롬프트를 구축합니다. 타겟 파일에서 모든 임포트 문을 수집하고 저장소 내에서 발견된 직접 참조된 의존성(예: 변수, 함수, 클래스)의 전체 코드를 원래 임포트 순서대로 추가합니다. 이 파일 간 참조 정보는 데이터셋(REPOEXEC 및 DevEval)에서 제공됩니다. 그런 다음 미완성 함수의 시그니처와 그 자연어 설명을 추가합니다.
이 구조화된 프롬프트는 LLM에 전달되어 함수 본문(초안)과 내부에서 사용되는 API 호출 목록을 생성합니다. 결과 초안은 두 가지 역할을 합니다: 한편, 검색의 씨앗으로 작용하여 식별된 API 호출이 후속 하류 검색 과정에 대한 명확하고 높은 신뢰도 신호를 제공하며 다른 한편, 생성 단계를 위한 참조로 작용하여 perplexity 기반 신뢰 점수를 최종 생성 단계에서 정보를 제공하고, 이 초안 구현을 최종 생성 중에 정교화할 수 있습니다.
컨텍스트 인라인
초기 구현 단계에서 시작하여 우리는 상류와 하류 컨텍스트를 수집하기 위한 양방향 인라인 과정을 소개합니다. 핵심 통찰은 함수의 역할이 리포지토리 호출 그래프 내 위치에 의해 정의된다는 관찰에서 비롯됩니다. 그 행위는 상류 호출자(어떻게 사용되는지를 나타냄)에 의해 제약되며, 구현은 하류 호출자(무엇을 의존하는지를 나타냄)에 의해 결정됩니다.
상류 인라인
[[IMG_PROTECT_N]]
함수 인라인.
상류 인라인은 LLM에게 타겟 함수가 어떻게 사용될 예정인지에 대한 풍부한 이해를 제공하기 위해 설계되었습니다. 이 과정은 타겟 함수의 모든 호출자 식별에서 시작됩니다. 우리는 저장소의 AST를 순회하여 타겟 함수가 호출되는 모든 호출 위치를 확인합니다. 각 호출 위치마다 해당 호출 함수(호출자)를 추출합니다. 기존 방법들이 단순히 호출자 컨텍스트를 프롬프트 앞에 추가하는 것과 달리, InlineCoder는 새로운 컨텍스트 인라인 기법을 제안합니다. 도표 3에서 보듯, 우리는 초안을 호출자로 직접 임베딩하여 함수 컨텍스트의 일관되고 선형화된 표현을 생성합니다. 이를 다음과 같은 4단계 변환으로 달성합니다:
매개변수 대체: $`\text{Args} = [a_1, a_2, \ldots, a_m]`$를 호출 위치의 매개변수 목록이고 $`\text{Params} = [p_1, p_2, \ldots, p_m]`$가 콜리에 정의된 형식 매개변수라고 가정합니다. 우리는 식별자에 대한 대체 함수를 정의합니다:
여기서 $`\mathcal{I}`$는 콜리 본문의 식별자 집합이고, $`\mathcal{I}'`$는 대체 후 식별자 집합을 나타냅니다.
우리는 문장 집합에 대해 $`\sigma`$를 Lift하여 모든 식별자를 재귀적으로 적용합니다: $`s \in \mathcal{S}`$, 여기서 $`\mathcal{S}`$는 콜리 본문의 문장 집합이고, $`\mathcal{S}'`$는 식별자 대체 후의 문장 집합을 나타냅니다.
콜리 본문 $`\text{Body}_f = \{s_1, \ldots, s_N\}`$에 대해 매개변수 대체된 본문은 다음과 같습니다: