🤖 AI/ML

HumanEval

HumanEval

LLM의 코드 생성 능력을 평가하는 벤치마크. OpenAI가 개발.

📖 상세 설명

HumanEval은 OpenAI가 2021년 Codex 논문과 함께 공개한 코드 생성 능력 평가 벤치마크입니다. 164개의 Python 프로그래밍 문제로 구성되어 있으며, 함수 시그니처와 docstring을 보고 올바르게 작동하는 코드를 생성할 수 있는지 평가합니다.

평가 지표로는 pass@k를 사용합니다. 모델이 k개의 코드 샘플을 생성했을 때 적어도 하나가 모든 테스트 케이스를 통과할 확률을 의미합니다. 일반적으로 pass@1(첫 시도에 성공), pass@10, pass@100을 보고합니다.

HumanEval 문제는 "두 수의 합 구하기" 같은 기초적인 것부터 "문자열 파싱", "리스트 조작" 등 다양한 난이도를 포함합니다. 각 문제에는 숨겨진 테스트 케이스가 있어 정확한 구현을 검증합니다.

현재 최신 LLM들은 HumanEval에서 90% 이상의 pass@1을 기록합니다. 이에 따라 HumanEval+, MBPP, SWE-bench 등 더 어려운 벤치마크들이 등장했습니다. 하지만 HumanEval은 여전히 코드 생성 모델의 기본 역량을 빠르게 확인하는 표준으로 사용됩니다.

💻 코드 예제

from human_eval.data import read_problems
from human_eval.evaluation import evaluate_functional_correctness
import openai

# HumanEval 벤치마크 실행 예제
def run_humaneval_benchmark(model_name="gpt-4"):
    # 1. 문제 로드
    problems = read_problems()

    # 2. 각 문제에 대해 코드 생성
    samples = []
    for task_id, problem in problems.items():
        prompt = problem["prompt"]

        # LLM으로 코드 생성
        response = openai.chat.completions.create(
            model=model_name,
            messages=[{
                "role": "user",
                "content": f"Complete the following Python function:\n\n{prompt}"
            }],
            temperature=0.2,
            max_tokens=500
        )

        completion = response.choices[0].message.content
        samples.append({
            "task_id": task_id,
            "completion": completion
        })

    # 3. 결과 저장
    with open("samples.jsonl", "w") as f:
        for sample in samples:
            f.write(json.dumps(sample) + "\n")

    # 4. 테스트 실행 및 pass@k 계산
    results = evaluate_functional_correctness(
        sample_file="samples.jsonl",
        k=[1, 10, 100]
    )

    print(f"pass@1: {results['pass@1']:.2%}")
    print(f"pass@10: {results['pass@10']:.2%}")
    print(f"pass@100: {results['pass@100']:.2%}")

    return results

🗣️ 실무에서 이렇게 말하세요

코드 생성 모델 비교 회의에서

"GPT-4o가 HumanEval pass@1 92%인데 Claude 3.5 Sonnet은 94%예요. 단, HumanEval은 비교적 쉬운 문제라서 실제 코딩 능력 차이는 SWE-bench로 더 정확히 볼 수 있습니다."

기술 면접에서

"HumanEval의 pass@k 지표는 샘플링 기반 평가입니다. pass@1이 낮아도 pass@100이 높으면 모델이 정답을 알긴 하지만 일관성이 떨어진다는 의미예요. 프로덕션에서는 pass@1이 중요합니다."

모델 파인튜닝 논의에서

"코드 생성 모델 파인튜닝 후 HumanEval로 먼저 검증해보세요. 기존 모델 대비 pass@1이 떨어지면 catastrophic forgetting이 발생한 거니까 학습 데이터나 하이퍼파라미터를 조정해야 합니다."

⚠️ 흔한 실수 & 주의사항

1
데이터 오염 가능성

HumanEval 문제가 학습 데이터에 포함되어 점수가 부풀려진 모델이 있을 수 있습니다. 벤치마크 점수만으로 실제 능력을 판단하지 마세요.

2
Python 중심 평가

HumanEval은 Python만 평가합니다. 다른 언어 능력은 MultiPL-E 같은 확장 벤치마크로 별도 확인이 필요합니다.

3
실무와의 괴리

HumanEval은 알고리즘 문제 위주입니다. 실제 개발에 필요한 API 사용, 디버깅, 리팩토링 능력은 다른 벤치마크로 평가해야 합니다.

🔗 관련 용어

📚 더 배우기