기존의 BLEU나 ROUGE 같은 지표들은 주로 정답 텍스트와의 단어/구문 일치도를 보지만, 문맥적 의미, 창의성, 논리성 등 복합적인 품질을 평가하는 데는 한계가 있었죠.
이러한 배경 속에서 등장한 새로운 평가 프레임워크가 바로 GPTScore입니다. 이 방법론은 Jinlan Fu, See-Kiong Ng, Zhengbao Jiang, Pengfei Liu 등이 발표한 논문 "GPTScore: Evaluate as You Desire" (arXiv:2302.04166v2)에서 제안되었습니다.
GPTScore란 무엇인가? 핵심 아이디어
GPTScore의 가장 핵심적인 아이디어는 매우 강력한 LLM(예: GPT-3, FLAN-T5 등) 자체를 평가자(Evaluator)로 사용하는 것입니다. 즉, LLM의 뛰어난 언어 이해 능력과 지시(Instruction) 수행 능력을 활용하여 생성된 텍스트의 품질을 평가하자는 것이죠.
논문의 부제인 "Evaluate as You Desire"처럼, 사용자가 자연어 지시문(Instruction)을 통해 원하는 평가 기준을 LLM에게 알려주면, LLM이 그 기준에 따라 텍스트의 점수를 매겨줍니다.
GPTScore는 어떻게 작동할까?
GPTScore는 평가 작업을 조건부 텍스트 생성 확률(Conditional Text Generation Probability) 문제로 재구성합니다. 쉽게 말해, 평가자 LLM에게 특정 조건(지시문, 입력 컨텍스트)이 주어졌을 때, 평가 대상 텍스트가 생성될 확률이 얼마나 되는지를 계산하는 방식입니다.
이 확률을 계산하기 위해 평가자 LLM에게 입력하는 프롬프트는 주로 다음과 같은 요소로 구성됩니다.
- Instruction (지시문):
- 평가의 기준이자 명령입니다. 어떤 측면(유창성, 관련성, 사실성, 안전성 등)을 평가할지를 명확히 정의합니다.
- 예시:
- "다음 문서를 요약하세요:" (요약의 정보성 평가)
- "다음 문장이 주어진 문맥과 일치하는지 판단하세요:" (사실성 평가)
- "다음 영어를 프랑스어로 자연스럽게 번역하세요:" (번역 유창성 평가)
- Demonstration (IDM - In-domain Demonstration):
- 평가 작업의 구체적인 예시입니다. LLM이 Instruction을 더 잘 이해하고 일관된 평가를 하도록 돕는 가이드 역할을 합니다 (퓨샷 학습).
- 평가하려는 작업(In-domain)과 관련된 입력-출력 쌍을 보여줍니다.
- 예시 (간단한 감성 분류 평가):
Instruction: 문장의 감성을 '긍정' 또는 '부정'으로 분류하세요.
---
Demonstration 1:
문장: 오늘 날씨가 정말 좋아서 기분이 상쾌해요.
감성: 긍정
---
Demonstration 2:
문장: 길이 너무 막혀서 약속에 늦어버렸어요.
감성: 부정
---
(평가 대상)
문장: 이 음식은 기대했던 것보다 맛있네요.
감성: [LLM이 '긍정'을 예측하도록 유도]
- Input / Context (입력 / 문맥):
- 평가 대상 텍스트가 생성될 때 사용된 원본 입력이나 관련 문맥 정보입니다. (예: 요약의 원본 문서, 번역의 원본 문장)
- Candidate Text (평가 대상 텍스트):
- 실제로 품질을 평가하고자 하는 LLM이 생성한 텍스트입니다.
평가자 LLM은 이 구성 요소들을 조합한 프롬프트를 입력받아, 최종적으로 Candidate Text가 나타날 로그 확률(Log Probability) 값을 계산합니다.
확률에서 점수로: GPTScore 관련 지표들
GPTScore 프레임워크에서 주로 사용되는 점수(지표)는 다음과 같습니다.
- GPTScore (Sum Log Likelihood):
- Candidate Text의 모든 토큰에 대한 로그 확률의 총합입니다.
- 시퀀스 전체의 생성 확률을 나타내지만, 텍스트 길이에 민감하다는 단점이 있습니다. (길수록 값이 작아지는 경향)
- Average Log Likelihood (평균 로그 우도):
- GPTScore를 Candidate Text의 토큰 수로 나눈 값입니다.
- 토큰 당 평균 로그 확률로, 길이 영향을 줄여 서로 다른 길이의 텍스트 비교에 더 유용합니다.
- 값이 높을수록 (0에 가까울수록) 좋습니다.
- Perplexity (PPL, 혼란도):
- exp(-Average Log Likelihood) 로 계산됩니다.
- 모델이 다음 토큰을 예측할 때 평균적으로 몇 개의 선택지 사이에서 헷갈리는지를 나타냅니다.
- 값이 낮을수록 (1에 가까울수록) 모델이 텍스트를 더 확실하게 예측했다는 의미이며, 성능이 좋다고 봅니다.
Average Log Likelihood와 Perplexity는 길이 정규화가 되어 있어 서로 다른 모델이나 결과물을 비교 평가하는 데 널리 쓰입니다.
GPTScore의 장점 및 의의
- 유연성 및 맞춤 평가: 자연어 Instruction 변경만으로 원하는 거의 모든 측면(논문에서는 22개 측면 언급)을 평가할 수 있습니다.
- 다각적 평가: 하나의 텍스트에 대해 유창성, 관련성, 안전성 등 여러 기준을 동시에 또는 개별적으로 평가 가능합니다.
- 참조 텍스트 불필요(한 경우): 기존 BLEU/ROUGE와 달리, 일부 평가(예: 유창성, 문법성)에서는 인간이 작성한 정답 텍스트 없이도 평가가 가능합니다.
- 인간 평가와의 상관관계: 논문에서는 여러 작업에서 GPTScore가 인간의 판단과 높은 상관관계를 보임을 실험적으로 증명했습니다.
고려할 점
- 평가자 LLM 의존성: 평가 결과는 평가자로 사용된 LLM의 성능, 편향 등에 영향을 받습니다.
- 비용 및 계산량: 강력한 LLM API 사용 시 비용이 발생하며, 계산량이 많을 수 있습니다.
- 프롬프트 민감성: 평가 결과가 프롬프트(Instruction, Demonstration) 설계에 민감할 수 있습니다.
파이썬 예제 코드
import torch
from transformers import GPT2LMHeadModel, GPT2TokenizerFast
# --- 1. 모델 및 토크나이저 로드 ---
# 작은 모델(gpt2)을 사용하여 로컬 실행 가능하도록 함
model_name = 'gpt2'
tokenizer = GPT2TokenizerFast.from_pretrained(model_name)
model = GPT2LMHeadModel.from_pretrained(model_name)
model.eval() # 평가 모드로 설정 (dropout 등 비활성화)
# --- 2. 평가 요소 정의 ---
# 예시: 문맥에 이어지는 문장의 자연스러움(유창성)을 평가
# Instruction은 이 경우 프롬프트 구조 자체에 함축되어 있다고 볼 수 있음
input_text = "오늘 날씨는 정말" # 평가의 기준이 되는 문맥
candidate_text = " 화창하고 따뜻합니다." # 평가하려는 대상 텍스트
# --- 3. 입력 구성 및 토큰화 ---
# 평가를 위해 문맥과 대상 텍스트를 합침
full_text = input_text + candidate_text
# 전체 텍스트 토큰화
encoded_full = tokenizer(full_text, return_tensors='pt')
input_ids = encoded_full.input_ids # 전체 텍스트의 토큰 ID 시퀀스
# 평가 대상(candidate_text)이 시작되는 지점 계산
encoded_input = tokenizer(input_text, return_tensors='pt')
start_index_candidate = encoded_input.input_ids.shape[1] # candidate_text 시작 토큰 인덱스
# --- 4. 로그 확률 계산 (GPTScore 계산) ---
total_log_likelihood = 0.0 # GPTScore (Sum Log Likelihood)를 저장할 변수
# 모델 추론 수행 (그래디언트 계산 비활성화)
with torch.no_grad():
outputs = model(input_ids=input_ids)
logits = outputs.logits # 모델 예측 결과 (다음 토큰 예측 확률 분포)
# candidate_text의 각 토큰에 대한 로그 확률 계산 및 합산
# 루프는 candidate_text의 첫 토큰부터 시작
for i in range(start_index_candidate, input_ids.shape[1]):
# i-1번째까지의 토큰을 보고 i번째 토큰을 예측한 결과(logits)를 가져옴
# logits shape: [batch_size, sequence_length, vocab_size]
logits_at_prev_step = logits[0, i-1, :]
# 로그 소프트맥스를 적용하여 로그 확률 계산
log_probs = torch.log_softmax(logits_at_prev_step, dim=-1)
# 실제 i번째 위치에 온 토큰의 ID 확인
actual_token_id = input_ids[0, i]
# 실제 토큰의 로그 확률 값을 추출
token_log_likelihood = log_probs[actual_token_id].item()
# 총 로그 우도에 더함
total_log_likelihood += token_log_likelihood
# 최종 GPTScore (Sum Log Likelihood)
gpt_score = total_log_likelihood
# --- 5. 추가 지표 계산 (Average Log Likelihood, Perplexity) ---
num_candidate_tokens = input_ids.shape[1] - start_index_candidate
# 평균 로그 우도 (길이 정규화)
avg_log_likelihood = gpt_score / num_candidate_tokens if num_candidate_tokens > 0 else 0
# Perplexity (낮을수록 좋음)
perplexity = torch.exp(torch.tensor(-avg_log_likelihood)).item() if num_candidate_tokens > 0 else float('inf')
# --- 6. 결과 출력 ---
print("--- 입력 텍스트 ---")
print(f"문맥 (Input Text): '{input_text}'")
print(f"평가 대상 (Candidate Text): '{candidate_text}'")
print("-" * 30)
print("--- 평가 결과 ---")
# gpt_score는 합계 로그 확률이므로 0 또는 음수. 0에 가까울수록 확률이 높음.
print(f"GPTScore (Sum Log Likelihood): {gpt_score:.4f}")
# avg_log_likelihood는 평균 로그 확률. 0에 가까울수록 좋음.
print(f"Average Log Likelihood: {avg_log_likelihood:.4f}")
# perplexity는 혼란도. 1에 가까울수록 좋음 (낮을수록 좋음).
print(f"Perplexity (PPL): {perplexity:.4f}")
예상되는 출력 결과:
--- 입력 텍스트 ---
문맥 (Input Text): '오늘 날씨는 정말'
평가 대상 (Candidate Text): ' 화창하고 따뜻합니다.'
------------------------------
--- 평가 결과 ---
GPTScore (Sum Log Likelihood): -19.8734
Average Log Likelihood: -3.9747
Perplexity (PPL): 53.2318
출력 결과 해석:
- GPTScore (Sum Log Likelihood): -19.8734
- 모델이 '오늘 날씨는 정말' 이라는 문맥 뒤에 ' 화창하고 따뜻합니다.' 라는 시퀀스를 생성할 총 로그 확률입니다. 0에 가까울수록 모델이 이 시퀀스를 더 자연스럽다고 판단합니다.
- Average Log Likelihood: -3.9747
- 평가 대상 텍스트의 각 토큰 당 평균 로그 확률입니다. 길이가 다른 텍스트 비교에 유용하며, 역시 0에 가까울수록 좋습니다.
- Perplexity (PPL): 53.2318
- 모델이 다음 토큰을 예측할 때 평균적으로 약 53개의 선택지 사이에서 헷갈렸다는 의미입니다. 이 값은 낮을수록(1에 가까울수록) 모델이 해당 텍스트를 더 잘 예측하고 자연스럽다고 판단한다는 뜻입니다.
참고: 실제 출력되는 정확한 수치는 사용하는 transformers 라이브러리 버전이나 gpt2 모델의 특정 버전에 따라 약간씩 달라질 수 있습니다. 하지만 값의 의미와 상대적인 크기는 동일하게 해석할 수 있습니다.
관련 논문
GPTScore: Evaluate as You Desire (논문 링크)
'AI' 카테고리의 다른 글
| LLM 평가 방법론 - BERTScore (0) | 2025.12.11 |
|---|---|
| LLM 평가 방법론 - ROUGE (0) | 2025.12.10 |
| LLM 평가 방법론 - G Eval (0) | 2025.12.10 |
| LLM 평가 방법론 - LLM as a Judge (0) | 2025.12.10 |
| LLM 평가 방법론 - 벤치마크 (0) | 2025.12.10 |