최근 한국어에 특화된 LLM들이 속속 등장하면서, 이들을 평가할 수 있는 표준 벤치마크의 필요성이 커지고 있습니다. 이번 포스트에서는 한국어 벤치마크 데이터셋인 K2-Eval을 활용하여 다음 세 모델의 성능을 비교해보았습니다:
yanolja/EEVE-Korean-Instruct-10.8B-v1.0Qwen/Qwen3-8Bmeta-llama/Llama-3.1-8BK2-Eval은 HAERAE-HUB에서 만든 한국어 LLM 평가용 데이터셋입니다. 단순 번역이 아닌, 한국 문화와 지식에 기반한 객관식 문항(총 90개)으로 구성되어 있습니다.
knowledge아래는 실험에 사용된 전체 코드입니다. Hugging Face 기반 모델 로딩, 평가 루프, 정확도 계산 및 시각화까지 포함되어 있습니다.
import torch
import evaluate
import matplotlib.pyplot as plt
from datasets import load_dataset
from transformers import AutoTokenizer, AutoModelForCausalLM
from tqdm import tqdm
import re
# 모델 목록 (Hugging Face 모델 경로 사용)
model_names = [
"yanolja/EEVE-Korean-Instruct-10.8B-v1.0",
"Qwen/Qwen3-8B",
"meta-llama/Llama-3.1-8B"
]
# 정확도 저장 딕셔너리
acc_results = {}
# 데이터셋 로드
ds = load_dataset("HAERAE-HUB/K2-Eval", "knowledge", split="test")
acc_metric = evaluate.load("accuracy")
# 평가 루프
for model_name in model_names:
print(f"\n📌 Evaluating: {model_name}")
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
trust_remote_code=True
)
model.to(device)
model.eval()
letter2idx = {"A": 0, "B": 1, "C": 2, "D": 3}
preds, refs = [], []
for example in tqdm(ds, desc=f"Evaluating {model_name}", leave=False):
instruction = example["instruction"].strip()
question = example["question"].strip()
prompt = (
f"{instruction}\n\n"
f"{question}\n\n"
f"A. {example['a']}\n"
f"B. {example['b']}\n"
f"C. {example['c']}\n"
f"D. {example['d']}\n\n"
"정답을 고르세요. 아무 말 없이 아래에 한 글자만 출력하세요.\n\n"
)
inputs = tokenizer(prompt, return_tensors="pt", truncation=True, max_length=1024).to(model.device)
input_length = inputs["input_ids"].shape[1]
output = model.generate(
**inputs,
max_new_tokens=1,
pad_token_id=tokenizer.eos_token_id,
do_sample=False,
num_beams=1,
return_dict_in_generate=True,
output_scores=True
)
generated_tokens = output.sequences[0][input_length:]
response = tokenizer.decode(generated_tokens, skip_special_tokens=True).strip()
match = re.search(r"\b([A-D])\b", response)
if match:
pred_idx = letter2idx[match.group(1)]
else:
pred_idx = -1
gold_idx = int(example["gold_answer"])
preds.append(pred_idx)
refs.append(gold_idx)
acc = acc_metric.compute(predictions=preds, references=refs)["accuracy"]
acc_results[model_name.split("/")[-1]] = acc
⸻
📊 정확도 시각화
아래는 matplotlib을 활용해 각 모델별 정확도를 시각화한 코드입니다.
plt.figure(figsize=(10, 5))
plt.bar(acc_results.keys(), acc_results.values())
plt.ylabel("Accuracy")
plt.xticks(rotation=15, ha="right")
plt.title("📊 모델별 정답률 비교 (K2-Eval 기준)")
plt.ylim(0, 1.0)
plt.tight_layout()
plt.show()
⸻
🔍 인사이트 및 해석
• EEVE 모델이 한국어 문항에서 가장 우수한 성능을 보였습니다. 이는 한국어 지식과 프롬프트 튜닝이 잘 되어 있다는 방증입니다.
• Qwen은 다국어 성능을 고려할 때 나쁘지 않은 결과지만, 한국 고유 문맥에는 제한적입니다.
• LLaMA 3.1은 성능은 기본적으로 안정적이나, 한국어 맞춤형 튜닝 부족이 드러났습니다.
⸻
📝 결론 및 향후 계획
• K2-Eval은 한국어 LLM 성능 평가에 유용한 기준을 제공합니다.
• 향후에는 generation, summarization 서브셋을 활용한 추가 실험을 고려하고 있습니다.
• 다양한 모델의 프롬프트 최적화 전략도 탐색할 수 있을 것입니다.
⸻