본문 바로가기

AI-ML/LLM

LLM 평가의 4가지 주요 접근법 이해하기

728x90
https://magazine.sebastianraschka.com/p/llm-evaluation-4-approaches 번역입니다!

LLM을 실제로 어떻게 평가할까?

간단한 질문이지만, 훨씬 더 큰 논의를 불러일으키는 경향이 있습니다.

 

프로젝트 자문이나 협업 시 가장 자주 받는 질문 중 하나는 다양한 모델 간 선택 방법과 공개된 평가 결과를 해석하는 방법입니다. (물론 자체 모델을 튜닝하거나 개발할 때 진척도를 측정하는 방법도 포함됩니다.)

 

이 질문이 자주 제기되기에, 사람들이 LLM을 비교하는 데 사용하는 주요 평가 방법에 대한 간략한 개요를 공유하면 도움이 될 것 같습니다. 물론 LLM 평가는 단일 자료로 완전히 다루기에는 너무 방대한 주제이지만, 이러한 주요 접근법을 명확히 이해하면 벤치마크, 리더보드, 논문 해석이 훨씬 수월해질 것입니다.

 

원래는 곧 출간될 저서 『추론 모델 구축하기(처음부터)』에 이 평가 기법들을 포함할 계획이었으나, 결국 주요 범위에서 다소 벗어나는 내용이 되었습니다. (책 자체는 검증기 기반 평가에 더 초점을 맞추고 있습니다.) 그래서 처음부터 코드 예제를 포함한 긴 글로 공유하는 것이 좋겠다고 생각했습니다.


추론 모델 구축(처음부터)에서는 추론용 대규모 언어 모델을 처음부터 직접 구축하는 실습 중심 접근법을 취합니다.

"대규모 언어 모델 구축(처음부터)"을 좋아하셨다면, 이 책은 순수 PyTorch로 모든 것을 처음부터 구축한다는 점에서 유사한 스타일로 작성되었습니다.

추론은 대규모 언어 모델(LLM)을 개선하는 최근 발전 중 가장 흥미롭고 중요한 분야 중 하나이지만, 단순히 '추론'이라는 용어만 듣고 이론적으로만 접한다면 가장 오해하기 쉬운 분야이기도 합니다. 따라서 이 책에서는 추론 능력을 갖춘 LLM을 처음부터 직접 구축하는 실습 중심의 접근법을 취합니다.

이 책은 현재 얼리 액세스 중이며, 이미 100페이지 이상이 온라인에 공개되었습니다. 또한 방금 30페이지를 추가로 완성했으며, 현재 레이아웃 팀이 이를 추가 작업 중입니다. 얼리 액세스 프로그램에 참여하신 분들(지원해 주셔서 정말 감사합니다!)께서는 해당 페이지가 공개되면 이메일로 안내를 받으실 수 있습니다.


추신: 현재 LLM 연구 분야에서는 많은 일이 진행 중입니다. 저는 계속 늘어나는 북마크 논문 목록을 따라잡고 있으며, 다음 글에서 가장 흥미로운 논문 몇 가지를 소개할 계획입니다.

하지만 지금부터는 LLM의 네 가지 주요 평가 방법과 이를 구현한 코드 예시를 살펴보며 각 방법의 장단점을 더 잘 이해해 보겠습니다.

LLM의 주요 평가 방법 이해하기

실무에서 훈련된 대규모 언어 모델(LLM)을 평가하는 네 가지 일반적인 방법이 있습니다: 객관식 평가, 검증자 평가, 리더보드 평가, LLM 심사위원 평가로, 아래 그림 1에 표시되어 있습니다. 연구 논문, 마케팅 자료, 기술 보고서, 모델 카드(LLM 전용 기술 보고서를 지칭하는 용어)에는 종종 이 중 두 가지 이상의 범주에 속하는 결과가 포함됩니다.

그림 1: 본 논문에서 다루는 4가지 서로 다른 평가 모델의 개요.

또한 여기서 소개한 네 가지 범주는 위 그림과 같이 벤치마크 기반 평가와 판단 기반 평가라는 두 그룹으로 나뉩니다.

(훈련 손실, 퍼플렉시티, 보상 등과 같은 다른 측정 방법도 있지만, 이들은 일반적으로 모델 개발 과정에서 내부적으로 사용됩니다.)

다음 하위 절에서는 네 가지 방법 각각에 대한 간략한 개요와 예시를 제공합니다.

방법 1: 답안 선택 정확도 평가

우리는 벤치마크 기반 방법인 객관식 질문 답변으로 시작합니다.


역사적으로 가장 널리 사용된 평가 방법 중 하나는 MMLU(Massive Multitask Language Understanding, https://huggingface.co/datasets/cais/mmlu)와 같은 객관식 벤치마크입니다. 이 접근법을 설명하기 위해 그림 2는 MMLU 데이터셋의 대표적인 과제를 보여줍니다.

그림 2: 데이터셋의 정답과 비교하여 다중 선택 예측을 평가함으로써 MMLU에서 LLM을 평가함.

그림 2는 MMLU 데이터셋의 단일 예시만을 보여줍니다. 완전한 MMLU 데이터셋은 고등학교 수학부터 생물학까지 총 57개 과목으로 구성되며, 약 16,000개의 객관식 문항을 포함합니다. 성능은 정확도(정답률)로 측정되며, 예를 들어 16,000개 문항 중 14,000개를 맞췄다면 87.5%의 정확도를 기록합니다.

 

MMLU와 같은 객관식 벤치마크는 표준화된 시험, 많은 학교 시험 또는 이론 운전 시험과 유사한 직관적이고 정량화 가능한 방식으로 LLM의 지식 회상 능력을 평가합니다.

그림 2는 다중 선택 평가의 단순화된 버전을 보여줍니다. 여기서 모델이 예측한 정답 문자를 정답과 직접 비교합니다. 로그 확률 점수를 사용하는 다른 두 가지 인기 있는 방법도 존재합니다. 저는 이들을 GitHub에 구현했습니다. (이 구현은 여기서 설명한 개념을 기반으로 하므로, 본문을 다 읽은 후 확인해 보시길 권합니다.)

 

다음 하위 절에서는 그림 2에 표시된 MMLU 점수를 코드로 구현하는 방법을 설명합니다.

1.2 모델 로드하기

먼저, MMLU에서 평가하기 전에 사전 훈련된 모델을 로드해야 합니다. 여기서는 순수 PyTorch로 구현한 Qwen3 0.6B의 처음부터 구현한 버전을 사용할 예정이며, 이는 약 1.5GB의 RAM만 필요합니다.

Qwen3 모델 구현 세부 사항은 여기서 중요하지 않다는 점에 유의하세요. 우리는 단순히 평가하려는 대규모 언어 모델(LLM)로만 취급합니다. 하지만 궁금하신 분들을 위해, 제 이전 글 <Qwen3를 이해하고 처음부터 구현하기>에서 처음부터 구현하는 과정을 확인할 수 있으며, 소스 코드도 GitHub에서 제공됩니다.

수많은 Qwen3 소스 코드를 복사하여 붙여넣는 대신, 제 reasoning_from_scratch Python 라이브러리에서 가져옵니다. 이 라이브러리는 다음을 통해 설치할 수 있습니다.

pip install reasoning_from_scratch

또는

uv add reasoning_from_scratch

코드 블록 1: 사전 훈련된 모델 로드

from pathlib import Path
import torch
from reasoning_from_scratch.ch02 import get_device
from reasoning_from_scratch.qwen3 import (
    download_qwen3_small, Qwen3Tokenizer,
    Qwen3Model, QWEN_CONFIG_06_B
)

device = get_device()

# Set matmul precision to "high" to 
# enable Tensor Cores on compatible GPUs
torch.set_float32_matmul_precision("high")

# Uncomment the following line 
# if you encounter device compatibility issues
# device = "cpu"

# Use the base model by default
WHICH_MODEL = "base"

if WHICH_MODEL == "base":
    download_qwen3_small(
        kind="base", tokenizer_only=False, out_dir="qwen3"
    )
    tokenizer_path = Path("qwen3") / "tokenizer-base.json"
    model_path = Path("qwen3") / "qwen3-0.6B-base.pth"
    tokenizer = Qwen3Tokenizer(tokenizer_file_path=tokenizer_path)

elif WHICH_MODEL == "reasoning":
    download_qwen3_small(
        kind="reasoning", tokenizer_only=False, out_dir="qwen3"
    )
    tokenizer_path = Path("qwen3") / "tokenizer-reasoning.json"
    model_path = Path("qwen3") / "qwen3-0.6B-reasoning.pth"
    tokenizer = Qwen3Tokenizer(
        tokenizer_file_path=tokenizer_path,
        apply_chat_template=True,
        add_generation_prompt=True,
        add_thinking=True,
    )

else:
    raise ValueError(f"Invalid choice: WHICH_MODEL={WHICH_MODEL}")

model = Qwen3Model(QWEN_CONFIG_06_B)
model.load_state_dict(torch.load(model_path))
model.to(device)

# Optionally enable model compilation for potential performance gains
USE_COMPILE = False
if USE_COMPILE:
    torch._dynamo.config.allow_unspec_int_on_nn_module = True
    model = torch.compile(model)

1.3 생성된 답변서 확인

이 섹션에서는 생성된 객관식 답안 문자가 정답과 일치하는지 확인하는 가장 단순하고 직관적인 MMLU 채점 방식을 구현합니다. 이는 앞서 그림 2에서 설명한 내용과 유사하며, 편의를 위해 아래에 다시 제시합니다.

그림 3: 데이터셋의 정답과 비교하여 LLM의 객관식 예측을 평가하는 MMLU 평가.

이를 위해 MMLU 데이터셋의 예시를 활용해 보겠습니다.

example = {
    "question": (
        "How many ways are there to put 4 distinguishable"
        " balls into 2 indistinguishable boxes?"
    ),
    “choices”: ["7", "11", "16", "8"],
    “answer”: "D",
}

다음으로, LLM 프롬프트를 포맷팅하는 함수를 정의합니다.

코드 블록 2: 사전 훈련된 모델 로드하기

def format_prompt(example):
    return (
        f"{example['question']}\n"
        f"A. {example['choices'][0]}\n"
        f"B. {example['choices'][1]}\n"
        f"C. {example['choices'][2]}\n"
        f"D. {example['choices'][3]}\n"
        "Answer: "
    )
# Trailing space in "Answer: " encourages a single-letter next token

MMLU 예제에 대해 함수를 실행하여 포맷된 LLM 입력의 형태를 살펴보겠습니다.

prompt = format_prompt(example)
print(prompt)

출력은 다음과 같습니다.

구분 가능한 4개의 공을 구분 불가능한 2개의 상자에 넣는 방법은 몇 가지가 있을까요?

How many ways are there to put 4 distinguishable balls into 2
indistinguishable boxes?
A. 7
B. 11
C. 16
D. 8
Answer:

위와 같이 모델 프롬프트는 모델에게 다양한 답변 선택지 목록을 제공하며, 마지막에 "답변: " 텍스트를 추가하여 모델이 정답을 생성하도록 유도합니다.

꼭 필요한 것은 아니지만, 때로는 정답과 함께 추가 질문을 입력으로 제공하여 모델이 과제를 해결하는 방식에 대한 기대치를 관찰할 수 있도록 하는 것도 도움이 될 수 있습니다. (예를 들어, 5개의 예시가 제공되는 경우를 5-샷 MMLU라고도 합니다.) 그러나 기본 모델조차 상당히 능숙한 현재 세대의 대규모 언어 모델(LLM)에서는 이는 필수적이지 않습니다.

다양한 MMLU 샘플 로딩
MMLU 데이터셋의 예시를 datasets 라이브러리를 통해 직접 불러올 수 있습니다(pip install datasets 또는 uv add datasets로 설치 가능).
from datasets import load_dataset

configs = get_dataset_config_names("cais/mmlu")
dataset = load_dataset("cais/mmlu", "high_school_mathematics")
# Inspect the first example from the test set:
example = dataset["test"][0]
print(example)​

위에서는 "high_school_mathematics" 하위 집합을 사용했습니다. 다른 하위 집합 목록을 얻으려면 다음 코드를 사용하세요:

from datasets import get_dataset_config_names

subsets = get_dataset_config_names(”cais/mmlu”)
print(subsets)​

다음으로 프롬프트를 토큰화하고 LLM 입력으로 전달하기 위해 PyTorch 텐서 객체로 감쌉니다:

prompt_ids = tokenizer.encode(prompt)
prompt_fmt = torch.tensor(prompt_ids, device=device)
# Add batch dimension:
prompt_fmt = prompt_fmt.unsqueeze(0)


이제 모든 설정이 완료되었으므로, 아래에 주요 점수 계산 함수를 정의합니다. 이 함수는 몇 개의 토큰(기본값은 8개)을 생성하고 모델이 출력한 문자 A/B/C/D 중 첫 번째 인스턴스를 추출합니다.

코드 블록 3: 생성된 문자 추출

from reasoning_from_scratch.ch02_ex import (
    generate_text_basic_stream_cache
)

def predict_choice(
    model, tokenizer, prompt_fmt, max_new_tokens=8
):
    pred = None
    for t in generate_text_basic_stream_cache(
        model=model,
        token_ids=prompt_fmt,
        max_new_tokens=max_new_tokens,
        eos_token_id=tokenizer.eos_token_id,
    ):
        answer = tokenizer.decode(t.squeeze(0).tolist())
        for letter in answer:
            letter = letter.upper()
            # stop as soon as a letter appears
            if letter in "ABCD":
                pred = letter
                break
        if pred:
            break
    return pred

그러면 위 코드 블록의 함수를 사용하여 생성된 편지를 다음과 같이 확인할 수 있습니다.

pred1 = predict_choice(model, tokenizer, prompt_fmt)
print(
    f"Generated letter: {pred1}\n"
    f"Correct? {pred1 == example['answer']}"
)

결과는 어떨까요?

Generated letter: C
Correct? False

이 경우 생성된 답변이 틀렸음(False)을 확인할 수 있습니다.

 

이는 MMLU의 고등학교 수학 하위 집합(high_school_mathematics)에 포함된 270개 예시 중 하나에 불과합니다. 아래 스크린샷(그림 4)은 전체 하위 집합에 대해 실행된 기본 모델과 추론 변형 모델의 성능을 보여줍니다. 해당 코드는 GitHub에서 확인할 수 있습니다.

그림 4: MMLU 고등학교 수학 하위 집합에서의 기본 및 추론 모델 성능

질문의 정답 확률이 동일하다고 가정할 때, 무작위 추측자(A, B, C, D를 균등한 확률로 선택하는)는 25%의 정답률을 기대할 수 있다. 따라서 기본 모델과 추론 모델 모두 그다지 우수하지 않다습니다.

객관식 답안 형식
이 섹션에서는 설명을 위해 단순화된 다중 선택 평가 방식을 구현했으며, 여기서 모델이 예측한 답안 문자를 정답과 직접 비교합니다. 실제 적용에서는 로그 확률 점수(log-probability scoring)와 같이 더 널리 사용되는 변형들이 존재합니다. 이는 최종 선택된 문자를 확인하는 것보다 모델이 각 후보 답변을 얼마나 가능성 있게 여기는지 측정하는 방식입니다. (확률 기반 점수에 대해서는 4장에서 논의합니다.) 추론 모델의 경우, 평가에는 정답이 입력으로 주어졌을 때 이를 생성할 가능성을 평가하는 것도 포함될 수 있습니다.

 

그림 5: 기타 MMLU 점수 산정 방법은 GitHub(https://github.com/rasbt/reasoning-from-scratch/tree/main/chF/02_mmlu)에서 설명 및 공유됩니다.

그러나 어떤 MMLU 채점 변형을 사용하든, 평가 과정은 여전히 모델이 미리 정의된 답변 옵션 중에서 선택하는지 확인하는 것에 불과하다.

MMLU와 같은 객관식 벤치마크의 한계는 사전 정의된 옵션 중에서 선택하는 LLM의 능력만을 측정한다는 점이다. 따라서 모델이 기본 모델에 비해 얼마나 많은 지식을 잊었는지 확인하는 것 외에는 추론 능력 평가에 그다지 유용하지 않습니다. 자유형 글쓰기 능력이나 실제 활용도를 포착하지 못합니다.

그럼에도 객관식 벤치마크는 여전히 간단하고 유용한 진단 도구로 남아 있습니다. 예를 들어, 높은 MMLU 점수가 반드시 모델의 실용적 성능이 우수함을 의미하지는 않지만, 낮은 점수는 잠재적인 지식 격차를 부각시킬 수 있습니다.

방법 2: 검증기를 사용하여 답안 확인하기

이전 섹션에서 논의된 객관식 질문 답변과 관련하여, 검증 기반 접근법은 정확도 지표를 통해 대규모 언어 모델(LLM)의 능력을 정량화합니다. 그러나 객관식 벤치마크와 달리 검증 방법은 LLM이 자유 형식의 답변을 제공할 수 있도록 허용합니다. 이후 우리는 관련 답변 부분을 추출하고, 아래 그림 6에 설명된 바와 같이 소위 검증기를 사용하여 해당 답변 부분을 데이터셋에 제공된 정답과 비교합니다.

그림 6: 자유형 질문 답변에서 검증 기반 방법으로 LLM 평가하기. 모델은 자유형 답변(여러 단계 포함 가능)과 최종 박스형 답변을 생성하며, 이 답변은 추출되어 데이터셋의 정답과 비교된다.

추출된 답과 제공된 답을 비교할 때, 위 그림에서 보듯이 코드 해석기나 계산기 같은 외부 도구/소프트웨어를 활용할 수 있습니다.

단점은 이 방법이 수학이나 코드처럼 쉽게(그리고 이상적으로는 결정론적으로) 검증 가능한 영역에만 적용 가능하다는 점입니다. 또한 이 접근법은 추가적인 복잡성과 의존성을 유발할 수 있으며, 평가 부담의 일부를 모델 자체에서 외부 도구로 전가할 수 있습니다.

그러나 이 방법은 프로그래밍 방식으로 무한한 수의 수학 문제 변형을 생성할 수 있고 단계별 추론의 이점을 제공하기 때문에 추론 모델 평가 및 개발의 핵심이 되었습니다.

이 주제에 대해 저의 "추론 모델 구축(초보자용)" 책에서 35페이지에 걸쳐 상세히 다루었으므로, 여기서는 코드 구현은 생략하겠습니다. (해당 장은 지난주에 제출했습니다. 조기 접근 권한이 있으신 분들은 출판 시 이메일로 안내를 받으실 수 있으며, 그때 읽으실 수 있습니다. 그동안 단계별 코드는 GitHub에서 확인하실 수 있습니다.)

그림 7: GitHub(https://github.com/rasbt/reasoning-from-scratch/blob/main/ch03/01_main-chapter-code/ch03_main.ipynb)에서 확인할 수 있는 검증 기반 평가 접근법의 발췌문

방법 3: 선호도와 순위표를 활용한 모델 비교

지금까지 우리는 모델 정확도와 같이 쉽게 정량화할 수 있는 지표를 제공하는 두 가지 방법을 다루었습니다. 그러나 앞서 언급한 방법 중 어느 것도 응답의 스타일을 평가하는 것을 포함하여 LLM을 보다 종합적인 방식으로 평가하지는 않습니다. 이 섹션에서는 아래 그림 8에 설명된 바와 같이, 판단 기반 방법인 LLM 리더보드를 논의합니다.

그림 8: 본 부록에서 다루는 판단 기반 및 벤치마크 기반 평가 방법에 초점을 맞춘, 이 책에서 다룬 주제들의 정신적 모델. 이전 섹션에서 벤치마크 기반 접근법(다중 선택, 검증기)을 이미 다루었으므로, 이제 리더보드에 초점을 맞춘 LLM 성능 측정용 판단 기반 접근법을 소개한다.

여기서 설명하는 리더보드 방식은 정확도 값이나 기타 고정된 벤치마크 점수가 아닌, 모델 출력물에 대한 사용자(또는 다른 대규모 언어 모델)의 선호도에 따라 모델을 순위를 매기는 판단 기반 접근법입니다.

인기 있는 리더보드로 LM 아레나(구 채팅봇 아레나)가 있으며, 사용자는 두 개의 사용자 선택 또는 익명 모델의 응답을 비교하고 선호하는 모델에 투표합니다(그림 9 참조).

그림 9: 판단 기반 리더보드 인터페이스 예시(LM Arena). 두 LLM에 동일한 프롬프트를 제공하면, 그들의 응답이 나란히 표시되고 사용자가 선호하는 답변에 투표합니다.

위 그림과 같이 수집된 이러한 선호도 투표는 이후 모든 사용자를 대상으로 집계되어 사용자 선호도에 따라 다양한 모델을 순위별로 표시하는 리더보드로 통합됩니다. LM Arena 리더보드의 현재 스냅샷(2025년 10월 3일 기준)은 아래 그림 10에 제시되어 있습니다.

그림 10: 텍스트 작업에 대한 사용자 선호도를 기반으로 현재 선두를 달리는 대규모 언어 모델(LLM)을 보여주는 LM Arena 순위표 스크린샷 그림 10: 텍스트 작업에 대한 사용자 선호도를 기준으로 한 현재 선두 LLM을 보여주는 LM Arena 순위표 스크린샷

이 섹션의 나머지 부분에서는 리더보드의 간단한 예시를 구현해 보겠습니다.

구체적인 예시를 만들기 위해, 그림 9와 유사한 설정에서 사용자가 서로 다른 대규모 언어 모델(LLM)에 질문을 하는 상황을 고려해 보십시오. 아래 목록은 쌍별 투표를 나타내며, 첫 번째 모델이 승자입니다.

votes = [
    ("GPT-5", "Claude-3"),
    ("GPT-5", "Llama-4"),
    ("Claude-3", "Llama-3"),
    ("Llama-4", "Llama-3"),
    ("Claude-3", "Llama-3"),
    ("GPT-5", "Llama-3"),
]

위 목록에서 votes 리스트의 각 튜플은 두 모델 간의 쌍별 선호도를 나타내며, (winner, loser) 형식으로 기록됩니다. 따라서 (“GPT-5”, “Claude-3”)은 사용자가 Claude-3 모델 답변보다 GPT-5를 선호했음을 의미합니다.

본 섹션의 나머지 부분에서는 votes 리스트를 리더보드로 변환할 것입니다. 이를 위해 원래 체스 선수 순위를 매기기 위해 개발된 널리 쓰이는 Elo rating system을 사용할 것입니다.

구체적인 코드 구현을 살펴보기 전에 간단히 설명하자면, 작동 방식은 다음과 같습니다. 각 모델은 기준 점수로 시작합니다. 그런 다음 비교와 선호도 투표가 이루어질 때마다 모델의 평점이 업데이트됩니다. 구체적으로, 사용자가 현재 모델을 높은 순위의 모델보다 선호할 경우, 현재 모델은 상대적으로 큰 순위 업데이트를 받아 리더보드에서 더 높은 순위를 차지하게 됩니다. 반대로, 현재 모델이 낮은 순위의 모델에게 패배하면 평점이 약간만 상승합니다. (현재 모델이 패배할 경우에도 유사한 방식으로 업데이트되지만, 순위가 상승하는 대신 하락합니다.)

이러한 쌍별 순위를 리더보드로 변환하는 코드는 아래 코드 블록에 표시되어 있습니다.

코드 블록 4: 리더보드 구축

def elo_ratings(vote_pairs, k_factor=32,
                initial_rating=1000):
    # Initialize all models with the same base rating
    ratings = {
        model: initial_rating
        for pair in vote_pairs
        for model in pair
    }

    # Update ratings after each match
    for winner, loser in vote_pairs:

        # Expected score for the current winner
        expected_winner = 1.0 / (
            1.0 + 10 ** (
                (ratings[loser] - ratings[winner])
                / 400.0
            )
        )

        # k_factor determines sensitivity of updates
        ratings[winner] = (
            ratings[winner]
            + k_factor * (1 - expected_winner)
        )
        ratings[loser] = (
            ratings[loser]
            + k_factor * (0 - (1 - expected_winner))
        )

    return ratings

위에서 정의된 elo_ratings 함수는 투표를 입력으로 받아 다음과 같이 순위표로 변환합니다.

ratings = elo_ratings(votes, k_factor=32, initial_rating=1000)
for model in sorted(ratings, key=ratings.get, reverse=True):
    print(f"{model:8s} : {ratings[model]:.1f}")

다음과 같은 리더보드 순위가 산출되며, 점수가 높을수록 더 우수한 성적입니다.

GPT-5 : 1043.7
Claude-3 : 1015.2
Llama-4 : 1000.7
Llama-3 : 940.4

그렇다면 어떻게 작동할까요? 각 쌍에 대해, 우리는 다음 공식을 사용하여 승자의 예상 점수를 계산합니다.

expected_winner = 1 / (1 + 10 ** ((rating_loser - rating_winner) / 400))

이 값 expected_winner는 현재 평점을 기반으로 무승부 없는 설정에서 모델이 예측한 승리 확률입니다. 이는 평점 업데이트의 크기를 결정합니다.

먼저, 각 모델은 initial_rating = 1000으로 시작합니다. 두 평점(승자와 패자)이 같다면 expected_winner = 0.5가 되어 균등한 경기를 의미합니다. 이 경우 업데이트는 다음과 같습니다.

rating_winner + k_factor * (1 - 0.5) = rating_winner + 16

rating_loser + k_factor * (0 - (1 - 0.5)) = rating_loser - 16

이제, 압도적 우승 후보(높은 평점을 가진 모델)가 승리하면, 예상 승자 ≈ 1이 됩니다. 우세한 쪽은 압도적이진 않지만 이기고, 불리한 쪽은 집니다.

rating_winner + 32 * (1 - 0.99) = rating_winner + 0.32

rating_loser + 32 * (0 - (1 - 0.99)) = rating_loser - 0.32

그러나 약자(낮은 평점을 가진 모델)가 승리할 경우, 예상 승자(expected_winner)는 ≈ 0이 되며, 승자는 거의 전체 k_factor 점수를 획득하는 반면 패자는 거의 동일한 규모의 점수를 잃게 됩니다.

rating_winner + 32 * (1 - 0.01) = rating_winner + 31.68

rating_loser + 32 * (0 - (1 - 0.01)) = rating_loser - 31.68
순서가 중요합니다
엘로 방식은 매 경기(모델 비교) 후 등급을 업데이트하므로, 이후 결과는 이미 업데이트된 등급을 기반으로 합니다. 이는 동일한 결과 집합이 다른 순서로 제시될 경우 최종 점수가 약간 다르게 나타날 수 있음을 의미합니다. 이 효과는 일반적으로 미미하지만, 특히 초반에 이변이 발생할 때와 후반에 발생할 때 차이가 두드러질 수 있습니다.
이러한 순서 효과를 줄이기 위해 투표 쌍을 무작위로 섞고 elo_ratings 함수를 여러 번 실행한 후 평점을 평균화할 수 있습니다.

 

상기 설명된 리더보드 접근법은 정적 벤치마크 점수보다 모델 품질에 대한 보다 동적인 시각을 제공합니다. 그러나 결과는 사용자 인구 통계, 프롬프트 선택, 투표 편향의 영향을 받을 수 있습니다. 벤치마크와 리더보드는 조작될 수 있으며, 사용자는 정확성보다 스타일을 기준으로 응답을 선택할 수 있습니다. 마지막으로, 자동화된 벤치마크 하네스에 비해 리더보드는 새로 개발된 변형에 대한 즉각적인 피드백을 제공하지 않아, 활발한 모델 개발 과정에서 활용하기 어렵습니다.

기타 순위 산정 방법
LM 아레나는 원래 이 섹션에서 설명한 엘로 방식을 사용했으나 최근 브래들리-테리 모델 기반의 통계적 접근법으로 전환했습니다. 브래들리-테리 모델의 주요 장점은 통계적 근거를 바탕으로 하여 순위의 불확실성을 표현하는 신뢰 구간을 구축할 수 있다는 점입니다. 또한 엘로 평점과 달리, 브래들리-테리 모델은 전체 데이터셋에 대한 통계적 적합도를 활용해 모든 평점을 공동으로 추정하므로 순서 효과에 영향을 받지 않습니다.

보고되는 점수를 익숙한 범위로 유지하기 위해, Bradley-Terry 모델은 Elo와 비교 가능한 값을 산출하도록 조정됩니다. 공식적으로 Elo 등급을 더 이상 사용하지 않음에도 불구하고, 모델 비교 시 LLM 연구자와 실무자들 사이에서 "Elo"라는 용어는 여전히 널리 사용됩니다. Elo rating을 보여주는 코드 예시는 GitHub에서 확인할 수 있습니다.

그림 11: Elo와 Bradley-Terry 랭킹 비교; 소스 코드는 GitHub(https://github.com/rasbt/reasoning-from-scratch/tree/main/chF/03_leaderboards)에서 확인할 수 있습니다.

방법 4: 다른 LLM으로 응답 평가하기

초기에는 대규모 언어 모델(LLM)을 통계적·경험적 방법론으로 평가했는데, BLEU 지표가 대표적입니다. 이는 생성된 텍스트가 참조 텍스트와 얼마나 일치하는지 측정하는 원시적인 척도입니다. 이러한 지표의 문제점은 정확한 단어 일치를 요구하며 동의어나 단어 변경 등을 고려하지 않는다는 점입니다.

이 문제에 대한 한 가지 해결책은, 서면 답변 텍스트 전체를 평가하고자 할 때, 이전 섹션에서 논의한 상대적 순위 및 리더보드 기반 접근법을 사용하는 것입니다. 그러나 리더보드의 단점은 인간 피드백(이 피드백 수집과 관련된 어려움도 포함)이 개입되기 때문에 선호도 기반 비교의 주관적 성격입니다.

관련된 방법으로, 그림 12에 설명된 바와 같이 사전 정의된 채점 기준(즉, 평가 가이드)을 가진 다른 LLM을 사용하여 LLM의 응답을 참조 응답과 비교하고 사전 정의된 기준에 따라 응답 품질을 판단하는 방법이 있습니다.

그림 F12: LLM-judge 평가 예시. 평가 대상 모델이 답변을 생성하면, 별도의 판정자 LLM이 채점 기준과 제공된 참조 답변에 따라 점수를 매깁니다.

실제 적용 시, 그림 12에 제시된 판정 기반 접근법은 판정용 대규모 언어모델(LLM)이 강력할 때 효과적이다. 일반적인 설정에서는 API(예: GPT-5 API)를 통해 선도적인 독점 LLM을 활용하지만, 특수 목적의 판정 모델도 존재한다. (예를 들어, 수많은 사례 중 하나인 Phudge가 있으며, 궁극적으로 이러한 특수 모델 대부분은 독점 GPT 모델과 유사한 채점 행동을 보이도록 미세 조정된 소규모 모델에 불과하다.)

 

판정자가 효과적으로 작동하는 이유 중 하나는 답변을 평가하는 것이 답변을 생성하는 것보다 종종 쉽기 때문입니다.

그림 12에 표시된 판정자 기반 모델 평가를 Python으로 프로그래밍 방식으로 구현하려면, PyTorch에서 더 큰 Qwen3 모델 중 하나를 로드하고 평가 기준표와 평가하려는 모델 답변을 프롬프트로 제공할 수 있습니다.

또는 ChatGPT나 Ollama API와 같은 다른 API를 통해 다른 대규모 언어 모델(LLM)을 사용할 수도 있습니다.

이미 PyTorch에서 Qwen3 모델을 로드하는 방법을 알고 있으므로, 본 섹션의 나머지 부분에서는 흥미를 더하기 위해 Python에서 Ollama API를 사용하여 그림 12에 표시된 심사위원 기반 평가를 구현하겠습니다.

구체적으로, 성능과 효율성 사이의 균형이 우수한 OpenAI의 200억 파라미터 gpt-oss 오픈웨이트 모델을 사용할 것입니다. gpt-oss에 대한 자세한 내용은 제 글 <GPT-2에서 gpt-oss까지: 아키텍처 발전 분석>을 참고하세요.

4.1 Ollama에서 LLM-as-a-judge 접근법 구현

Ollama는 노트북에서 대규모 언어 모델(LLM)을 실행하기 위한 효율적인 오픈소스 애플리케이션입니다. 순수 C/C++로 구현되어 효율성을 극대화하는 오픈소스 llama.cpp 라이브러리를 감싸는 역할을 합니다. 다만 Ollama는 LLM을 이용한 텍스트 생성(추론) 도구일 뿐이며, LLM 훈련이나 미세 조정은 지원하지 않습니다.

다음 코드를 실행하려면 공식 웹사이트(https://ollama.com)를 방문하여 운영 체제에 맞는 설치 안내를 따라 Ollama를 설치하십시오:

macOS 및 Windows 사용자: 다운로드한 Ollama 애플리케이션을 실행합니다. 명령줄 사용법 설치 여부를 묻는 메시지가 나타나면 "예"를 선택합니다.

Linux 사용자: Ollama 웹사이트에서 제공하는 설치 명령어를 사용하세요.

모델 평가 코드를 구현하기 전에, 먼저 gpt-oss 모델을 다운로드하고 명령줄 터미널에서 이를 사용하여 Ollama가 정상 작동하는지 확인해 보겠습니다.

200억 파라미터 gpt-oss 모델을 시험해 보려면 명령줄(Python 세션이 아닌)에서 다음 명령어를 실행하세요.

ollama run gpt-oss:20b

이 명령어를 처음 실행할 때, 14GB의 저장 공간을 차지하는 200억 매개변수 gpt-oss 모델이 자동으로 다운로드됩니다. 출력 결과는 다음과 같습니다.

$ ollama run gpt-oss:20b
pulling manifest 
pulling b112e727c6f1: 100% ▕██████████████████████▏  13 GB                         
pulling fa6710a93d78: 100% ▕██████████████████████▏ 7.2 KB                         
pulling f60356777647: 100% ▕██████████████████████▏  11 KB                         
pulling d8ba2f9a17b3: 100% ▕██████████████████████▏   18 B                         
pulling 55c108d8e936: 100% ▕██████████████████████▏  489 B                         
verifying sha256 digest 
writing manifest 
removing unused layers 
success
대체 Ollama 모델
ollama run gpt-oss:20b 명령어에서 gpt-oss:20b는 200억 파라미터 gpt-oss 모델을 의미합니다. gpt-oss:20b 모델로 Ollama를 사용하려면 약 13GB의 RAM이 필요합니다. 사용 중인 컴퓨터의 RAM 용량이 충분하지 않다면, ollama run qwen3:4b 명령어를 통해 40억 파라미터의 qwen3:4b 모델과 같이 더 작은 모델을 사용해 볼 수 있습니다.
이 모델은 약 4GB의 RAM만 필요합니다. 더 강력한 컴퓨터의 경우 gpt-oss:20b를 gpt-oss:120b로 대체하여 1200억 매개변수 gpt-oss 모델을 사용할 수도 있습니다. 다만 이 모델은 훨씬 더 많은 컴퓨팅 자원을 필요로 한다는 점을 유의하십시오.

모델 다운로드가 완료되면 모델과 상호작용할 수 있는 명령줄 인터페이스가 제공됩니다. 예를 들어 모델에게 "1+2는 무엇인가요?"라고 물어보세요.

>>> What is 1+2?

Thinking...

User asks: “What is 1+2?” This is simple: answer 3. Provide explanation? Possibly ask for simple

arithmetic. Provide answer: 3.

...done thinking.

1 + 2 = **3**

이 ollama run gpt-oss:20b 세션을 /bye 입력을 사용하여 종료할 수 있습니다.

이 섹션의 나머지 부분에서는 ollama API를 사용할 것입니다. 이 접근 방식은 Ollama가 백그라운드에서 실행 중이어야 합니다. 이를 달성하는 세 가지 방법이 있습니다:

1. 터미널에서 ollama serve 명령어를 실행합니다(권장). 이 명령어는 Ollama 백엔드를 서버로 실행하며, 일반적으로 http://localhost:11434에서 실행됩니다. API를 통해 호출될 때까지(본 섹션 후반부 참조) 모델을 로드하지 않는다는 점에 유의하십시오.

2. 이전과 유사하게 ollama run gpt-oss:20b 명령어를 실행하되, 세션을 열어두고 /bye로 종료하지 마십시오. 앞서 설명한 바와 같이, 이는 로컬 Ollama 서버를 둘러싼 최소한의 편의성 래퍼를 엽니다. 내부적으로는 ollama serve와 동일한 서버 API를 사용합니다.

3. Ollama 데스크톱 앱. 데스크톱 앱을 실행하면 동일한 백엔드가 자동으로 실행되며, 앞서 그림 12에서 보았듯이 그 위에 그래픽 인터페이스를 제공합니다.

그림 13: Ollama 서버(/application)를 실행 상태로 유지하여 Python에서 Ollama API를 통해 사용할 수 있도록 하는 두 가지 다른 옵션.

Ollama 서버 IP
올라마는 로컬 서버와 유사한 프로세스를 시작하여 우리 컴퓨터에서 로컬로 실행됩니다. 위에서 설명한 대로 터미널에서 ollama serve를 실행할 때 다음과 같은 오류 메시지가 발생할 수 있습니다: Error: listen tcp 127.0.0.1:11434: bind: address already in use.

이 경우 OLLAMA_HOST=127.0.0.1:11435 ollama serve 명령어를 사용해 보세요. (해당 주소도 사용 중이라면 숫자를 하나씩 증가시켜 사용 중인 주소가 아닌 것을 찾을 때까지 시도하세요.)

다음 코드는 이전 섹션에서 생성된 테스트 세트 응답을 평가하기 위해 Ollama를 사용하기 전에 Ollama 세션이 정상적으로 실행 중인지 확인합니다.

코드 블록 5: Ollama 실행 여부 확인

import psutil

def check_if_running(process_name):
    running = False
    for proc in psutil.process_iter(["name"]):
        if process_name in proc.info["name"]:
            running = True
            break
    return running

ollama_running = check_if_running("ollama")

if not ollama_running:
    raise RuntimeError(
        "Ollama not running. "
        "Launch ollama before proceeding."
    )
print("Ollama running:", check_if_running("ollama"))

이전 코드 실행 결과 출력에 Ollama가 실행 중임을 확인하십시오: True. False로 표시될 경우, ollama serve 명령어나 Ollama 애플리케이션이 정상적으로 실행 중인지 확인하십시오(그림 13 참조).

본 문서의 나머지 부분에서는 Python을 사용하여 Ollama REST API를 통해 우리 머신에서 실행 중인 로컬 gpt-oss 모델과 상호작용할 것입니다. 다음 query_model 함수는 API 사용 방법을 보여줍니다.

코드 블록 6: 로컬 Ollama 모델 쿼리하기

import json
import urllib.request


def query_model(
    prompt,
    model="gpt-oss:20b",
    # If you used 
    # OLLAMA_HOST=127.0.0.1:11435 ollama serve
    # update the address below
    url="http://localhost:11434/api/chat"
):
    # Create the data payload as a dictionary:
    data = {
        "model": model,
        "messages": [
            {"role": "user", "content": prompt}
        ],
        # Settings required for deterministic responses:
        "options": {
            "seed": 123,
            "temperature": 0,
            "num_ctx": 2048
        }
    }

    # Convert the dictionary to JSON and encode it to bytes
    payload = json.dumps(data).encode("utf-8")

    # Create a POST request and add headers
    request = urllib.request.Request(  
        url,
        data=payload,
        method="POST"
    )
    request.add_header("Content-Type", "application/json")

    response_data = ""

    # Send the request and capture the streaming response
    with urllib.request.urlopen(request) as response:
        while True:
            line = response.readline().decode("utf-8")
            if not line:
                break
            # Parse each line into JSON
            response_json = json.loads(line)
            response_data += response_json["message"]["content"]

    return response_data

방금 구현한 query_model 함수를 사용하는 예시는 다음과 같습니다:

다음은 방금 구현한 query_model 함수를 사용하는 예시입니다.

ollama_model = "gpt-oss:20b"
result = query_model("What is 1+2?", ollama_model)
print(result)

결과 응답은 "3"입니다. (기본 설정 차이가 있어 Ollama run이나 Ollama 애플리케이션을 실행했을 때와 다릅니다.)

query_model 함수를 사용하면, 평가 기준을 포함한 프롬프트로 모델이 생성한 응답을 평가할 수 있습니다. 이 프롬프트는 gpt-oss 모델에게 정답을 기준으로 1부터 5까지의 척도로 대상 모델의 응답을 평가하도록 요청합니다.

이를 위해 사용하는 프롬프트는 다음과 같습니다.

코드 블록 7: 채점 기준표를 포함한 프롬프트 템플릿 설정

def rubric_prompt(instruction, reference_answer, model_answer):
    rubric = (
        "You are a fair judge assistant. You will be "
        "given an instruction, a reference answer, and "
        "a candidate answer to evaluate, according to "
        "the following rubric:\n\n"
        "1: The response fails to address the "
        "instruction, providing irrelevant, incorrect, "
        "or excessively verbose content.\n"
        "2: The response partially addresses the "
        "instruction but contains major errors, "
        "omissions, or irrelevant details.\n"
        "3: The response addresses the instruction to "
        "some degree but is incomplete, partially "
        "correct, or unclear in places.\n"
        "4: The response mostly adheres to the "
        "instruction, with only minor errors, "
        "omissions, or lack of clarity.\n"
        "5: The response fully adheres to the "
        "instruction, providing a clear, accurate, and "
        "relevant answer in a concise and efficient "
        "manner.\n\n"
        "Now here is the instruction, the reference "
        "answer, and the response.\n"
    )

    prompt = (
        f"{rubric}\n"
        f"Instruction:\n{instruction}\n\n"
        f"Reference Answer:\n{reference_answer}\n\n"
        f"Answer:\n{model_answer}\n\n"
        f"Evaluation: "
    )
    return prompt

루브릭 프롬프트의 model_answer는 실제 운영 시 우리 모델이 생성하는 응답을 나타내기 위한 것입니다. 설명을 위해 동적으로 생성하는 대신 여기서는 그럴듯한 모델 답변을 하드코딩했습니다. (다만, 본문 초반에 로드한 Qwen3 모델을 활용해 실제 model_answer를 생성해도 무방합니다).

다음으로 Ollama 모델용 렌더링된 프롬프트를 생성해 보겠습니다.

rendered_prompt = rubric_prompt(
    instruction=(
        "If all birds can fly, and a penguin is a bird, "
        "can a penguin fly?"
    ),
    reference_answer=(
        "Yes, according to the premise that all birds can fly, "
        "a penguin can fly."
    ),
    model_answer=(
        "Yes – under those premises a penguin would be able to fly."
    )
)
print(rendered_prompt)

출력은 다음과 같습니다.

You are a fair judge assistant. You will be given an instruction, a
reference answer, and a candidate answer to evaluate, according to the
following rubric:

1: The response fails to address the instruction, providing irrelevant,
incorrect, or excessively verbose content.
2: The response partially addresses the instruction but contains major
errors, omissions, or irrelevant details.
3: The response addresses the instruction to some degree but is
incomplete, partially correct, or unclear in places.
4: The response mostly adheres to the instruction, with only minor
errors, omissions, or lack of clarity.
5: The response fully adheres to the instruction, providing a clear,
accurate, and relevant answer in a concise and efficient manner.

Now here is the instruction, the reference answer, and the response.

Instruction:
If all birds can fly, and a penguin is a bird, can a penguin fly?

Reference Answer:
Yes, according to the premise that all birds can fly, a penguin can
fly.

Answer:
Yes – under those premises a penguin would be able to fly.

Evaluation:

"평가:"로 프롬프트를 종료하면 모델이 답변을 생성하도록 유도합니다. gpt-oss:20b 모델이 응답을 어떻게 평가하는지 살펴보겠습니다:

gpt-oss:20b 모델이 답변을 어떻게 평가하는지 살펴보겠습니다.

result = query_model(rendered_prompt, ollama_model)
print(result)

답변은 다음과 같습니다.

**Score: 5**

The candidate answer directly addresses the question, correctly applies the given premises, and concisely states that a penguin would be able to fly. It is accurate, relevant, and clear.

보시다시피 정답이 가장 높은 점수를 받았습니다. 이는 실제로 정답이므로 당연한 결과입니다. 이번에는 수동으로 과정을 단계별로 진행한 간단한 예시였지만, 이 아이디어를 확장하여 for-루프를 구현할 수 있습니다. 이를 통해 평가 데이터셋의 질문들로 모델(예: 앞서 로드한 Qwen3 모델)을 반복적으로 쿼리한 후 gpt-oss를 통해 평가하고 평균 점수를 계산할 수 있습니다. Qwen3 모델을 MATH-500 데이터셋으로 평가하는 해당 스크립트의 구현체는 GitHub에서 확인하실 수 있습니다.

그림 14: gpt-oss:20b를 평가자로 사용하여 MATH-500의 첫 10개 예제에 대한 Qwen3 0.6 기본 버전과 추론 변형의 비교. 코드는 GitHub(https://github.com/rasbt/reasoning-from-scratch/tree/main/chF/04_llm-judge)에서 확인할 수 있습니다.

중간 추론 단계에 대한 점수 부여: 과정 보상 모델을 활용한 접근법
상징적 검증기와 LLM 판정기와 관련하여, 프로세스 보상 모델(PRM)이라 불리는 학습 모델 계통이 존재한다. 판정기와 마찬가지로 PRM은 최종 답변을 넘어 추론 과정을 평가할 수 있으나, 일반적인 판정기와 달리 추론의 중간 단계에 특화되어 있다. 또한 결과 수준에서만 상징적으로 정확성을 확인하는 검증기와 달리, PRM은 강화 학습 훈련 중 단계별 보상 신호를 제공한다. PRM은 "단계별 평가자"로 분류할 수 있으며, 주로 순수 평가가 아닌 훈련을 위해 개발됩니다. (실제 적용 시 PRM은 대규모로 안정적으로 훈련하기 어렵습니다. 예를 들어 DeepSeek R1은 PRM을 채택하지 않고 추론 훈련을 위해 검증기를 결합했습니다.)

심사위원 기반 평가는 대규모 인간 투표자 집단에 의존하지 않기 때문에 선호도 기반 순위표보다 확장성과 일관성 측면에서 장점을 제공합니다. (기술적으로 순위표의 선호도 기반 평가는 LLM 심사위원에게도 아웃소싱할 수 있습니다). 그러나 LLM 심사위원 역시 인간 투표자와 유사한 약점을 공유합니다: 결과는 모델 선호도, 프롬프트 설계, 답변 스타일에 의해 편향될 수 있습니다. 또한 심사 모델과 평가 기준 선택에 대한 강한 의존성을 가지며, 고정된 벤치마크의 재현성을 갖추지 못합니다.

결론

이 글에서는 네 가지 평가 방식을 다루었습니다: 객관식 평가, 검증자 평가, 리더보드 평가, 그리고 LLM 심사위원 평가입니다.

긴 글이었지만, LLM 평가 방식에 대한 개요를 파악하는 데 도움이 되었기를 바랍니다. 이렇게 처음부터 접근하는 방식은 다소 장황할 수 있지만, 각 방법의 내부 작동 원리를 이해하는 데 탁월한 방법입니다. 이는 결국 약점과 개선점을 식별하는 데 도움이 됩니다.

그렇다면 아마도 "LLM을 평가하는 최선의 방법은 무엇인가?"라는 의문이 들 것입니다. 안타깝게도 단 하나의 최상의 방법은 존재하지 않습니다. 앞서 살펴본 바와 같이 각 방법마다 서로 다른 장단점이 존재하기 때문입니다. 간단히 말해:

객관식
(+) 대규모로 운영하기에 상대적으로 빠르고 저렴함
(+) 시험지(또는 모델 카드) 간 표준화 및 재현 가능
(-) 기본 지식 암기력 측정
(-) 실제 세계에서 대규모 언어 모델(LLM)이 활용되는 방식을 반영하지 않음

검증자
(+) 정답이 존재하는 영역에 대해 표준화되고 객관적인 채점 가능
(+) 자유형 답변 허용 (최종 답변 형식에 일부 제약 있음)
(+) 과정 검증자나 과정 보상 모델 사용 시 중간 단계도 채점 가능
(-) 검증 가능한 영역(예: 수학 또는 코드) 필요, 효과적인 검증자 구축이 까다로움
(-) 결과 중심 검증자는 추론 품질이 아닌 최종 답변만 평가

아레나 스타일 리더보드 (인간 쌍별 선호도)
(+) 실제 프롬프트에서 "사람들이 어떤 모델을 선호하는가?"에 직접 답함
(+) 자유형 답변 허용 및 스타일, 유용성, 안전성을 암묵적으로 고려
(-) 인간 참여에 비용과 시간이 많이 소요됨
(-) 정확도가 아닌 선호도만 측정
(-) 비정적 집단이 안정성에 영향을 미칠 수 있음

LLM-as-a-judge
(+) 다양한 작업에 걸쳐 확장 가능
(+) 자유 형식 답변 허용
(-) 심사관의 능력에 의존 (앙상블로 더 견고하게 만들 수 있음)
(-) 채점 기준 선택에 의존


일반적으로 레이더 플롯을 선호하지는 않지만, 아래와 같이 다양한 평가 영역을 시각화하는 데 유용할 수 있습니다.

그림 15: LLM을 평가할 때 그 강점과 약점을 파악하기 위해 이상적으로 다양한 영역에 주의를 기울여야 한다는 개념을 보여주는 레이더 차트.

예를 들어, 강력한 객관식 평가 점수는 모델이 탄탄한 일반 상식을 갖추고 있음을 시사합니다. 여기에 검증자 점수도 높다면 해당 모델은 기술적 질문에도 정확히 답할 가능성이 높습니다. 그러나 모델이 LLM-as-a-judge 및 리더보드 평가에서 저조한 성적을 보인다면, 효과적인 답변 작성이나 표현에 어려움을 겪을 수 있으며 RLHF(강화학습 기반 학습)가 도움이 될 수 있습니다.

따라서 최상의 평가는 여러 영역을 결합해야 합니다. 이상적으로는 목표나 비즈니스 문제와 직접적으로 연계된 데이터를 활용하는 것이 좋습니다. 예를 들어 법률 관련 업무를 지원하기 위해 LLM을 도입한다고 가정해 보겠습니다. MMLU 같은 표준 벤치마크로 모델을 실행해 기본적인 검증을 하는 것은 합리적이지만, 궁극적으로는 법률과 같은 대상 도메인에 맞게 평가를 맞춤화해야 합니다. 온라인에서 공개된 벤치마크를 좋은 출발점으로 활용할 수 있지만, 결국에는 자체 독점 데이터로 테스트해야 합니다. 그래야만 모델이 훈련 과정에서 테스트 데이터를 미리 접하지 않았다고 합리적으로 확신할 수 있습니다.

어쨌든 모델 평가는 매우 방대하고 중요한 주제입니다. 본 글이 주요 접근 방식의 작동 원리를 설명하는 데 도움이 되었기를 바라며, 향후 모델 평가를 검토하거나 직접 수행할 때 유용한 통찰력을 얻으셨기를 바랍니다.

항상 그렇듯,
즐거운 실험 되세요!

728x90