대규모 언어모델의 프로그램 합성 (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개 프로그래밍 문제
Train374개 (task_id 11-410)
Test500개 (task_id 11-510, sanitized subset)
Validation/Prompt10개 (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_list3개의 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["더 엄격한 평가"]

핵심 구성요소

  1. 크라우드소싱 수집: 프로그래밍 경험이 있는 작업자가 문제 작성, 별도 작업자가 검증
  2. Sanitized 부분집합: 원본 974개 중 품질이 검증된 부분집합(~427개)을 별도 제공
  3. Few-shot 평가: 10개의 프롬프트 예시를 사용하여 3-shot으로 평가
  4. MBPPExt: 각 문제에 추가 테스트를 포함하여 더 엄격한 functional correctness 검증

발견 (Findings)

주요 결과

모델MBPP (pass@1)MBPP (pass@80)
Codex-12B58.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)

핵심 발견

  1. 규모의 중요성: 68M → 137B 파라미터로 스케일링 시 MBPP 정확도가 ~5% → 59.6%로 비선형 증가 (Figure 2)
  2. Few-shot vs Fine-tuning: 3-shot이 fine-tuning과 비슷한 성능 달성 가능 — LLM의 in-context learning 능력 입증
  3. 문제 유형별 차이: 문자열 조작, 리스트 처리에서 강하나 복잡한 알고리즘 문제에서 약함
  4. MBPP vs HumanEval 상관성: 두 벤치마크 점수가 높은 상관관계를 보여 상호 보완적

이론적 의의

대규모 코딩 벤치마크의 필요성 입증

974개 문제라는 규모는 모델 간 차이를 통계적으로 유의미하게 구별할 수 있게 해준다. HumanEval(164개)보다 넓은 커버리지로, 두 벤치마크는 이후 코드 LLM 리더보드(BigCode, LiveCodeBench 등)에서 항상 함께 사용된다.

크라우드소싱 벤치마크의 가능성

전문 연구원이 아닌 크라우드워커도 적절한 가이드라인 하에 고품질 코딩 벤치마크를 만들 수 있음을 보여주었다.


관련 연구


핵심 용어 정리

용어정의
MBPPMostly 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