0. Abstract
코드 생성 문제는 일반적인 자연어 문제와는 다르다. 자연어에서는 미묘한 어문의 차이가 발생하더라도 독자가 읽는데 큰 문제가 없지만, 코드를 생성하는 문제는 정확한 싱크를 일치시키고, 수많은 작은 세부 사항에 주의를 기울여야지 작동한다. 따라서, 자연어에서 성공한 수많은 LLM들이 코드 작업에서는 효과적이지 않을 수 있다. 해당 연구는 multi-stage 기반의 iterative flow를 지향하는 AlphaCodium이라는 새로운 접근 방식을 제안한다. gpt4를 사용했을 경우 정확도 기준으로 19%에서 -> AlphaCodium에서 44%로 증가.
1. Introduction
코드 생성은 한 글자만 수정해도 작동 방식이 완전히 달라질 수 있기 때문에 부분적 또는 잘못된 해결책이 유용한지 판단하는 것은 어렵다. 코드 생성 작업의 고유한 특성으로 인해 자연어 작업에 최적화된 일반적인 프롬프트 기법은 코드 생성에 적용했을 때 그다지 효과적이지 않을 수 있다.
구글 딥마인드에서 개발한 코드 생성 시스템인 AlphaCode는 최대 100만개에 대한 코드를 생성한 다음 이를 클러스터링하고 process를 통해서 10개정도를 선택해서 (대회에)제출한다. AlphaCode의 성능은 놀라우나 과중한 컴퓨팅 부하로 인해 실무에서 사용하기에는 부적절하다.
이 논문에서는 입출력 테스트에 대해 생성된 코드를 반복적으로 실행하고 수정하는 AlphaCodium을 소개한다. AlphaCodium 흐름의 두 가지 핵심 요소는 (a) 반복 프로세스를 하기위해 추가 데이터를 생성하는 것 (b) AI가 생성한 추가 테스트를 통해 새로운 코드를 작성하는 것이다.

핵심 아이디어는 : 올바른 코드를 생성하는 것보다, 문제를 해결하기 위한 유용한 데이터 셋(힌트)를 생성하는 것이 쉽다.
특정 테스트를 해결하려면 [문제에 대한 이해, 약간의 통찰력, 무차별 대입 또는 논리적 추론]이 필요하다. 추가 데이터 셋을 생성할 때 한번에 문제를 해결할 필요가 없다.
AlphaCodium 다음 사례를 활용한다
(1) YAML 구조화된 출력
(2) 불릿포인트 분석
(3) 모듈식 코드 생성
(4) 이중 검증을 통한 소프트한 결정
(5) 탐색(exploration)을 장려(encourage)하고 직접적인 결정을 하지 않기
(6) 테스트
2. CodeContests Dataset
CodeContests는 Google의 딥마인드에서 도입한 고난도 코드 생성 데이터이다. 데이터 세트에는 LLM을 훈련하는 데 사용할 수 있는 10,000개의 코드 문제와 어려운 코드 문제를 해결하는 LLM의 능력을 평가하기 위한 검증 및 테스트 세트가 있다.
이 연구에서는 모델을 훈련하는 대신 GPT 또는 DeepSeek와 같이 사전훈련된 LLM에 적용할 수 있는 방법을 개발하는데 중점을 둔다. 따라서 훈련 데이터셋에 집중하기 보다 테스트 데이터 셋에 집중하였다.

LLM은 일반적으로 훈련된 데이터 셋과 유사한 '평균'에 수렴하도록 설명한다.(NLLoss때문일수도..) 따라서 일반적으로 세부 사항에 주의를 기울이지 못하는 경향이 있다. 반면에 현실의 코드 문제는 사소한 디테일이 포함되어 있는 경우가 많다. CodeContests 데이터 세트의 주요 특징은 문제 설명이 설계상 복잡하고 길며 작은 세부 사항과 뉘앙스가 포함되어 있어서 선정하였다.
3. The Proposed Flow
3.1 Overview
코드 생성 문제의 복잡한 특성으로 인해 단일 프롬프트 최적화 또는 연쇄 프롬프트조차도 CodeCon 테스트에서 LLM의 정확도를 의미 있게 개선하지 못하였다. 과거 연구들은 문제를 이해하고 파악하는 데 어려움을 겪으며 계속해서 잘못된 코드를 생성하거나, 공개 테스트에는 통과했지만, 비공개 테스트에 일반화하지 못하는 코드를 생성한다.
본 연구에서 CodeContest를 해결하려면 입출력 테스트에 대해서 생성된 코드를 반복적으로 실행하고, 수정하는 반복 프로세스를 흐름을 사용하는 것이 유리하다는 것을 알게 되었다.
이 연구에서 위 문제를 해결하기 위해 크게 두가지 스텝을 제안한다.
1. Preprocessing : AlphaCodium으로 자연어로 문제를 추론하는 데이터 셋 만들기 -> 그림1(a회색 부분), 그림2.(b)
2. Code Iterations : 코드 생성, 실행, 버그 수정
3.2 Flow Stage
Figure 1(a-회색), Figure2(b)에 해당하는 부분을 설명.
- Problem reflection : bullet points로 문제를 설명하고, 문제의 목표, 입력, 출력, 규칙, 제약사항, 그리고 관련된 디테일들을 정리한다.
- Public tests reasoning : 입력이 출력으로 이어지는 이유를 설명
- Generate Possible solutions : 2-3개의 해결책을 자연어로 설명
- Rank Solutions : 정확성, 단순성, 견고성 측면에서 좋은 솔루션을 선택
- Generate Additional AI tests : 6-8개 정도되는 테스트 데이터 셋을 생성 -> 보지 못한 public tests를 대응하기 위함.
Figure 1(a-주황색) 설명 : 될 것 같은 해결책을 선택, test에 통과할때까지 실행
- Iterate on public tests : base코드로 부터 시작을해서, bug발생시 고치려고 한다.
- Iterate o AI-generated Tests : Run-Fix Iteration을 진행
3.3 Insight
- 1. 지식 축적에 의존 : 쉬운 단계부터 어려운 단계로 진행하면서 그 과정에서 지식과 인사이트를 얻어 더 어려운 단계에 도움이 될 수 있도록 노력함. 예를 들어, 첫 번째 단계인 Problem reflection에서 나온 결과물은, 더 어려운(문제의 goal)을 해결하기 위한 인풋으로 사용된다.
- 2. 전체 솔루션 코드를 생성하는 것보다, 데이터를 생성하는게 더 쉽다.(Generate Additional AI test)
4. Code-Oriented Design Concepts
코드 생성 문제를 해결할 때 도움이 되는 추가적인 설계 요령, 요령 및 모범 사례를 소개
- YAML Structured Output : 구조화된 출력의 사용(모델에 주어진 Pydantic 클래스에 해당하는 YAML포멧으로 출력을 생성하도록 요청.
- Semantic reasoning via bullet points analysis : Bullet Point로 작성하여 문제에 대한 심층적인 이해를 유도하고 모델이 출력을 논리적인 의미 섹션으로 나누도록 하여 더 나은 결과를 이끌어낸다. 예) 문제에 대한 글머리 기호로 표현하면(그림 2 (b)) 각 글머리 기호는 문제의 각 부분, 일반 설명, 목표 및 규칙, 입력 구조, 출력 구조에 대한 것을 만든다.
- LLMs do better when generating a modular code : LLM이 하나의 긴 함수를 생성하도록 요청받았을 때, 코드에 버그나 논리적 실수가 포함되어 있는 등 결과가 좋지 않은 경우가 종종 있었다. 또한 오류 메시지가 주어져도 모델이 문제를 정확히 찾아서 수정하는 데 어려움을 겪었다. 해당 문제를 해결하기 위해 “생성된 코드를 의미 있는 이름과 기능을 가진 작은 하위 함수로 나누라”고 명확하게 요청하면 버그가 적고 반복 수정 단계에서 더 나은 코드가 생성되고 성공률이 높아지는 것을 관찰할 수 있었다.
- Soft Decisions with double validation : 코드 생성은 엄격하고, 정확하게 작성해야 하나 LLM은 그렇지 못한 경우가 있다. 따라서 Double validation 과정을 추가한다. 이 과정은 똑같은 결과물을 다시 생성해보라는 것이며 만약 필요하면 수정하라고 한다.
- Postpone decisions, try to avoid direct questions and leave room for exploration : 복잡한 문제에 대해 모델에 직접적인 질문을 던질 때, 우리는 지속적으로 환각과 오답을 보게 된다. 이를 방지하기 위해 쉬운 작업부터 어려운 작업까지 점진적으로 데이터를 축적하는 흐름을 채택.
- Test Anchors : Double Validation을 하더라도 종종 틀리는 경우가 있다. 이때 생성한 코드가 틀린건지, 환경이 틀린건지 알 수 없고, 모델보고 알아서 수정하라 하면 할루시네이션 현상이 두드러진다. 이를 해결하기 위해 몇가지 방법을 제안
하였으나, 글쓴이가 이해를 못하여.. 시간이 생기면 다시 읽어보겟다.
5. Results
5.1 Direct prompt vs AlphaCodium flow

평가지표 : pass@k - k개 생성한 코드로부터 통과한 코드의 갯수
대부분의 LLM보다 앞서는 성능을 보인다.
5.2 Comparison to previous works
Introduction때 언급한 AlphaCode와의 비교를 해본결과 이 연구의 성능이 유의미하게 앞선다.

맨밑에 alphacode (pass@10@100k)의 경우 100K개의 코드를 생성하고 이중에서 10개가 최종적으로 선택된 것으로 해석하면 된다.
6. 결론
입출력 테스트에 대해 생성된 코드를 반복적으로 실행하고 수정하는 AlphaCodium을 제안. 두 가지 주요 단계로 나뉜다. AlphaCodium이 자연어로 문제를 파악하는 전처리 단계, 공개 테스트 및 AI 생성 테스트를 반복하는 코드 반복 단계가 있다.
또한 AlphaCodium은 코드 생성에 도움이 되는 추가적인 설계 개념, 요령 및 모범 사례, 즉 YAML 형식의 구조화된 출력, 모듈식 코드 생성, 불릿 포인트 분석을 통한 의미 추론, 이중 검증을 통한 소프트 결정, 활용 장려, 테스트 앵커 등을 활용한다.
CodeContests라는 까다로운 코드 생성 데이터 세트에서 AlphaCodium을 테스트 했으며. 제안한 연구는 다양한 클로즈드 소스 및 오픈 소스 모델의 결과를 일관되고 크게 앞선다. 또한 AlphaCodium은 훨씬 적은 계산 예산으로 기존 연구 결과보다 뛰어난 성능을 보인다.
https://arxiv.org/pdf/2401.08500
https://github.com/Codium-ai/AlphaCodium
GitHub - Codium-ai/AlphaCodium: Official implementation for the paper: "Code Generation with AlphaCodium: From Prompt Engineerin
Official implementation for the paper: "Code Generation with AlphaCodium: From Prompt Engineering to Flow Engineering"" - Codium-ai/AlphaCodium
github.com
'DeepLearing > NLP(LLM)' 카테고리의 다른 글
| [논문리뷰] MoRA: High-Rank Updating for Parameter-Efficient Fine-Tuning(작성중) (0) | 2024.06.01 |
|---|---|
| [논문리뷰] LoRA: LOW-RANK ADAPTATION OF LARGE LAN- GUAGE MODELS(작성중) (0) | 2024.05.17 |
| [논문리뷰] RAPTOR: RECURSIVE ABSTRACTIVE PROCESSING FOR TREE-ORGANIZED RETRIEVAL (0) | 2024.05.16 |
| [논문리뷰] GPT-NeoX-20B : An Open-Source Autoregressive Language Model (1) | 2024.05.08 |
| [논문리뷰] Large Language Models are Effective Text Rankers with Pairwise Ranking Prompting (1) | 2024.04.27 |
| Llama3 살펴보기 - 1 (1) | 2024.04.27 |
| [논문리뷰]Lost in the Middle: How Language Models Use Long Contexts (3) | 2024.04.21 |
| [논문리뷰] Generated Knowledge Prompting for Commonsense Reasoning (4) | 2024.04.19 |