대규모 언어모델의 프로그램 합성 (Program Synthesis with Large Language Models)
Digest: HumanEval이 164개의 정교한 문제에 집중한 반면, Google Research는 크라우드소싱으로 974개의 초중급 Python 문제를 수집한 MBPP(Mostly Basic Python Problems) 벤치마크를 제안했다. 핵심 통찰은 LLM의 코드 생성 능력을 다양한 난이도와 큰 규모로 평가해야 신뢰성 있는 결론을 얻을 수 있다는 것이다. 각 문제는 자연어 설명, 함수 시그니처, 3개의 assert 테스트로 구성된다. Google의 대규모 LM은 few-shot 설정에서 59.6% (Section 3)를 달성했으며, MBPPExt(추가 테스트 포함)로 더 엄격한 평가도 지원한다. MBPP는 HumanEval과 함께 코드 생성 벤치마크의 양대 표준으로 자리잡았다.
메타데이터
| 항목 | 내용 |
|---|---|
| 제목 | Program Synthesis with Large Language Models |
| 저자 | Jacob Austin, Augustus Odena, Maxwell Nye, Maarten Bosma, Henryk Michalewski, David Dohan, Ellen Jiang, Carrie Cai, Michael Terry, Quoc Le, Charles Sutton |
| 소속 | Google Research |
| 연도 | 2021 |
| 발표 | arXiv:2108.07732 |
| 링크 | arXiv, GitHub |
| 키워드 | MBPP, program synthesis, few-shot, code generation, crowdsourcing |
데이터셋 구성
규모 및 분할
| 항목 | 내용 |
|---|---|
| 전체 크기 | 974개 프로그래밍 문제 |
| Train | 374개 (task_id 11-410) |
| Test | 500개 (task_id 11-510, sanitized subset) |
| Validation/Prompt | 10개 (task_id 1-10, few-shot 예시용) |
| 언어 | Python |
| 작성 방식 | 크라우드소싱 (crowd workers) |
Feature/Column 구조
| 필드 | 설명 | 예시 |
|---|---|---|
task_id | 고유 식별자 (정수) | 1 |
text | 자연어 문제 설명 | "Write a function to find the minimum cost path..." |
code | 정답 Python 코드 | def min_cost(cost, m, n): ... |
test_list | 3개의 assert 테스트 | ["assert min_cost(...)==7", ...] |
test_setup_code | 테스트 실행 전 필요한 코드 | "" (대부분 비어있음) |
challenge_test_list | 추가 테스트 (MBPPExt) | 더 엄격한 엣지 케이스 |
난이도 체계
| 수준 | 비율 | 설명 |
|---|---|---|
| 기초 (Basic) | ~60% | 단일 루프, 기본 자료구조 |
| 중급 (Intermediate) | ~30% | 다중 조건, 리스트 컴프리헨션 |
| 고급 (Advanced) | ~10% | 재귀, DP, 복잡한 알고리즘 |
“Mostly Basic”이라는 이름처럼 대부분 1-3줄 내외로 풀 수 있는 초급 문제이나, 일부 고급 문제도 포함된다.
실제 데이터 예시
예시 1: 기초 수준
# Text: "Write a function to find the similar elements from the
# given two tuple lists."
# Code:
def similar_elements(test_tup1, test_tup2):
res = tuple(set(test_tup1) & set(test_tup2))
return res
# Tests:
assert similar_elements((3, 4, 5, 6), (5, 7, 4, 10)) == (4, 5)
assert similar_elements((1, 2, 3, 4), (5, 4, 3, 7)) == (3, 4)
assert similar_elements((11, 12, 14, 13), (17, 15, 14, 13)) == (13, 14)예시 2: 중급 수준
# Text: "Write a python function to identify non-prime numbers."
# Code:
import math
def is_not_prime(n):
result = False
for i in range(2, int(math.sqrt(n)) + 1):
if n % i == 0:
result = True
return result
# Tests:
assert is_not_prime(2) == False
assert is_not_prime(10) == True
assert is_not_prime(35) == True예시 3: 고급 수준
# Text: "Write a function to find the n largest integers
# from a given list of numbers, returned in descending order."
# Code:
import heapq as hq
def heap_queue_largest(nums, n):
largest_nums = hq.nlargest(n, nums)
return largest_nums
# Tests:
assert heap_queue_largest([25, 35, 22, 85, 14, 65, 75, 22, 58], 3) == [85, 75, 65]
assert heap_queue_largest([25, 35, 22, 85, 14, 65, 75, 22, 58], 2) == [85, 75]
assert heap_queue_largest([25, 35, 22, 85, 14, 65, 75, 22, 58], 5) == [85, 75, 65, 58, 35]왜 이 연구를 하는가?
핵심 질문
LLM이 자연어 명세로부터 올바른 짧은 Python 프로그램을 합성할 수 있는가?
기존 접근법의 한계
| 한계 | 설명 |
|---|---|
| 벤치마크 규모 부족 | 기존 데이터셋은 수십 개 수준으로 통계적 신뢰도가 낮음 |
| 도메인 특수성 | Karel, SQL 등 특정 도메인 DSL에 한정 |
| 비현실적 평가 | 텍스트 유사도 기반 평가는 코드 정확성을 반영하지 못함 |
핵심 통찰
범용 프로그래밍 언어(Python)에서, 자연어 설명만으로 기능적으로 올바른 코드를 생성하는 능력을 대규모(~1000문제)로 측정하면, 모델 능력의 분포와 한계를 더 정확하게 파악할 수 있다.
방법 (Method)
프레임워크 개요
graph TB A["자연어 설명<br/>(task description)"] --> B["Few-shot Prompt 구성<br/>(3개 예시 + 타겟)"] B --> C["LLM 코드 생성"] C --> D["assert 테스트 실행"] D --> E{"통과 여부"} E -->|Pass| F["✓ 정답"] E -->|Fail| G["✗ 오답"] H["MBPPExt<br/>(추가 테스트)"] --> I["더 엄격한 평가"]
핵심 구성요소
- 크라우드소싱 수집: 프로그래밍 경험이 있는 작업자가 문제 작성, 별도 작업자가 검증
- Sanitized 부분집합: 원본 974개 중 품질이 검증된 부분집합(~427개)을 별도 제공
- Few-shot 평가: 10개의 프롬프트 예시를 사용하여 3-shot으로 평가
- MBPPExt: 각 문제에 추가 테스트를 포함하여 더 엄격한 functional correctness 검증
발견 (Findings)
주요 결과
| 모델 | MBPP (pass@1) | MBPP (pass@80) |
|---|---|---|
| Codex-12B | 58.1% | — |
| Google LM (137B) | 59.6% | 82.8% |
| GPT-Neo (2.7B) | 17.5% | — |
| Fine-tuned (on MBPP train) | 61.4% | — |
(Section 3, Table 1)
핵심 발견
- 규모의 중요성: 68M → 137B 파라미터로 스케일링 시 MBPP 정확도가 ~5% → 59.6%로 비선형 증가 (Figure 2)
- Few-shot vs Fine-tuning: 3-shot이 fine-tuning과 비슷한 성능 달성 가능 — LLM의 in-context learning 능력 입증
- 문제 유형별 차이: 문자열 조작, 리스트 처리에서 강하나 복잡한 알고리즘 문제에서 약함
- MBPP vs HumanEval 상관성: 두 벤치마크 점수가 높은 상관관계를 보여 상호 보완적
이론적 의의
대규모 코딩 벤치마크의 필요성 입증
974개 문제라는 규모는 모델 간 차이를 통계적으로 유의미하게 구별할 수 있게 해준다. HumanEval(164개)보다 넓은 커버리지로, 두 벤치마크는 이후 코드 LLM 리더보드(BigCode, LiveCodeBench 등)에서 항상 함께 사용된다.
크라우드소싱 벤치마크의 가능성
전문 연구원이 아닌 크라우드워커도 적절한 가이드라인 하에 고품질 코딩 벤치마크를 만들 수 있음을 보여주었다.
관련 연구
- HumanEval_2021_CodeGeneration — 동시기 발표된 코드 벤치마크, 더 정교하지만 규모가 작음
- SWE-bench_2023_SoftwareEngineering — 실제 소프트웨어 이슈로 확장
- BigCodeBench_2024_ComplexCoding — MBPP의 한계(단순 문제)를 보완하는 복잡한 코딩 벤치마크
핵심 용어 정리
| 용어 | 정의 |
|---|---|
| MBPP | Mostly Basic Python Problems. 974개의 초중급 Python 프로그래밍 문제 벤치마크 |
| Program Synthesis | 자연어 명세로부터 실행 가능한 프로그램을 자동 생성하는 기술 |
| Few-shot Prompting | 소수의 예시(여기서는 3개)를 프롬프트에 포함하여 모델을 유도하는 방법 |
| Sanitized Subset | 품질 검증을 통과한 부분집합, 더 신뢰성 있는 평가 가능 |
| Crowd-sourcing | 다수의 비전문가 작업자에게 과제를 분배하여 데이터를 수집하는 방법 |
태그
paper #2021 benchmark code_generation MBPP program_synthesis Python Google