K2-Eval로 한국어 LLM 벤치마크하기

이카루스·2025년 5월 7일
0

Alone_Study

목록 보기
7/7

🧪 K2-Eval로 한국어 LLM 성능 비교 실험 (EEVE vs Qwen vs LLaMA3)

최근 한국어에 특화된 LLM들이 속속 등장하면서, 이들을 평가할 수 있는 표준 벤치마크의 필요성이 커지고 있습니다. 이번 포스트에서는 한국어 벤치마크 데이터셋인 K2-Eval을 활용하여 다음 세 모델의 성능을 비교해보았습니다:

  • yanolja/EEVE-Korean-Instruct-10.8B-v1.0
  • Qwen/Qwen3-8B
  • meta-llama/Llama-3.1-8B

✅ 실험 목적

  • 한국어 LLM 모델들의 지식 기반 문항 정확도(accuracy) 비교
  • 동일한 평가 기준(K2-Eval)을 통해 공정한 벤치마크 환경 제공
  • 다양한 모델 간 프롬프트 추론 성능 차이를 확인

📚 데이터셋: K2-Eval

K2-Eval은 HAERAE-HUB에서 만든 한국어 LLM 평가용 데이터셋입니다. 단순 번역이 아닌, 한국 문화와 지식에 기반한 객관식 문항(총 90개)으로 구성되어 있습니다.

  • 사용한 서브셋: knowledge
  • 태스크 유형: 4지선다형 객관식
  • 요구 능력: 인과 추론, 맥락 이해, 고유 지식

💻 전체 코드

아래는 실험에 사용된 전체 코드입니다. 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 서브셋을 활용한 추가 실험을 고려하고 있습니다.
• 다양한 모델의 프롬프트 최적화 전략도 탐색할 수 있을 것입니다.

profile
The ones who are crazy enough to think that they can change the world are the ones who do."(steven Jobs, 2015). 세상을 바꾸는 '미친' 아이디어를 찾아내 세상을 바꾸고자 하는 AI 연구자입니다.

0개의 댓글