AI 채점기: BLEU로 AI 생성 텍스트 평가하기
이 글은 기계가 생성한 텍스트를 평가하는 핵심 지표인 BLEU를 자세히 설명하며, 동작 원리, Python과 Weave를 활용한 실무 적용 방법, 그리고 텍스트 생성 시스템 개선에서의 역할을 다룹니다. 이 글은 AI 번역본입니다. 오역이 의심되면 댓글로 자유롭게 알려주세요.
Created on September 12|Last edited on September 12
Comment
BLEU, 즉 Bilingual Evaluation Understudy는 기계가 생성한 텍스트를 평가하는 데 핵심이 되는 지표로, 특히 기계 번역과 요약 같은 과제에서 널리 사용됩니다. 생성된 텍스트를 사람이 작성한 기준 문장과 비교하여, BLEU는 n그램 정밀도와 간결성(길이) 요소를 통해 유사성을 정량적으로 측정합니다.
데이터세트 전반에서 BLEU를 효과적으로 계산하는 일은 복잡할 수 있지만, 다음과 같은 도구를 사용하면 Weave 평가 워크플로를 자동화하고 실행 가능한 인사이트를 제공해 과정을 간소화합니다. 이 글에서는 BLEU의 동작 원리를 풀어 설명하고, 실무 적용 사례를 살펴본 뒤, Python과 Weave로 사용하는 방법을 시연합니다.
코드로 바로 들어가고 싶으신가요? 가이드형 환경에서 BLEU 점수를 실험해 볼 수 있는 인터랙티브 Colab 노트북을 확인해 보세요:
또는 계속 읽으며 BLEU의 동작 원리와 텍스트 평가 지표 전반에서 BLEU가 어떤 위치를 차지하는지 더 깊이 살펴보세요.

목차
BLEU 점수란 무엇인가요? BLEU 점수는 어떻게 계산하나요?N그램 정밀도클리핑, 간결성 패널티, 기하평균최종 BLEU 점수코퍼스 수준 BLEU 점수 vs. 문장 수준 BLEU 점수튜토리얼: Weave Scorers로 BLEU 사용하기 1단계: 설치2단계: BLEU 스코어러 설정BLEU와 Weave Evaluations로 여러 모델 평가 BLEU의 한계 결론
BLEU 점수란 무엇인가요?
BLEU 점수는 하나 이상의 기준(reference) 텍스트와의 비교를 통해 AI가 생성한 텍스트의 품질을 정량화합니다. 여기서 n그램은 n개의 단어 또는 토큰으로 이루어진 연속된 시퀀스를 의미하며, BLEU는 n그램의 중첩 정도를 측정합니다. 1그램부터 4그램까지의 정밀도를 계산함으로써, BLEU는 생성된 텍스트와 기준 텍스트(들) 사이의 유사성을 세밀하게 분석해 제공합니다.
예를 들어 “The cat sat on the mat.”라는 문장에서 1그램은 “The”, “cat”처럼 단어 하나이고, 2그램은 “The cat”, “cat sat”처럼 단어 쌍입니다. BLEU는 생성된 텍스트에 포함된 n그램이 기준 텍스트(들)의 n그램과 얼마나 일치하는지를 점수화하여, 다양한 세분화 수준에서의 정렬 정도를 포착합니다.
정밀도 외에도 BLEU는 지나치게 짧은 출력을 방지하기 위해 간결성 패널티를 적용합니다. 이는 기준 텍스트와의 정렬을 유지하면서도 생성된 텍스트가 충분히 완결되도록 보장합니다. 예를 들어 기계 번역 과제에서 BLEU 점수는 생성된 텍스트가 기준 번역의 핵심과 주요 세부사항을 제대로 포착했는지를 반영합니다. 필수 요소를 누락했거나 불필요하게 장황한 경우, BLEU 점수는 이러한 한계를 드러냅니다.
BLEU 점수는 어떻게 계산하나요?
BLEU 점수는 하나 이상의 기준 텍스트와 비교하여 AI가 생성한 텍스트의 품질을 측정합니다. 이 점수는 두 가지 핵심 구성 요소를 통해 생성 텍스트가 기준 텍스트와 얼마나 잘 정렬되는지를 계산합니다: n그램 정밀도, 단어 또는 구의 중첩을 측정하는, 그리고 a 간결함 지나치게 짧은 출력을 방지하기 위한 패널티.
BLEU 점수는 다음과 같이 계산합니다:
N그램 정밀도
BLEU는 먼저 가설에서 등장하는 n그램이 기준 텍스트(들)에 얼마나 포함되는지를 계산합니다. 예를 들어 가설이 “The cat sat on the mat”이고 기준 문장이 “A cat was sitting on the mat”인 경우, 일치하는 1그램은 “cat”, “on”, “the”, “mat”입니다. 정밀도는 일치하는 n그램의 개수를 가설에 있는 전체 n그램 개수로 나누어 계산합니다.
이 과정은 2그램, 3그램 등으로 반복되며, 기본적으로 최대 4그램까지 계산합니다.
클리핑, 간결성 패널티, 기하평균
BLEU는 공정성을 보장하기 위해 보정을 적용합니다. 클리핑은 어떤 n그램이 정밀도 점수에 기여할 수 있는 횟수를 기준 텍스트에서 관측된 최대 빈도로 제한합니다. 가설이 “the the the the”이고 기준 문장이 “the cat sat on the mat”일 때, 단어 “the”는 한 번만 일치한 것으로 간주되어 클리핑된 정밀도는 1/4가 됩니다.
간결성 패널티는 지나치게 짧은 가설을 억제하기 위해 점수를 조정합니다. 가설이 기준보다 짧으면 길이 차이에 비례해 패널티가 적용되어 점수가 감소합니다. 가설 길이(c)가 기준 길이(r)보다 크거나 같으면 패널티가 적용되지 않습니다.
간결성 패널티는 다음과 같이 계산합니다:

최종 BLEU 점수
최종 BLEU 점수는 간결성 패널티와 클리핑된 n그램 ��밀도 점수의 기하평균을 결합하여 계산합니다:


이 공식은 모든 n그램에 대한 정밀도와 가설의 완전성이 함께 점수에 기여하도록 보장하며, 점수 범위는 0부터 100까지입니다. 점수가 높을수록 품질이 더 우수함을 의미하지만, 맥락적 변동성 때문에 서로 다른 데이터세트나 언어 간의 직접 비교는 권장되지 않습니다.
코퍼스 수준 BLEU 점수 vs. 문장 수준 BLEU 점수
위의 공식들은 계산 방법을 보여줍니다 문장 수준 BLEU 점수개별 예측을 해당 기준 텍스트와 비교해 평가합니다. 특정 출력의 디버깅 및 분석에는 유용하지만, 문장 길이와 코퍼스 수준의 맥락을 무시하기 때문에 문장 수준 BLEU 점수를 평균내는 방식은 신뢰도가 낮습니다.
코퍼스 수준 BLEU반면, 코퍼스 수준은 BLEU 점수를 계산하기 전에 모든 가설과 기준 문서 전반의 통계를 집계합니다. 이 방식은 데이터세트 전체에서 모델의 전반적인 성능을 반영하는 종합적인 평가를 제공합니다.
코퍼스 수준 BLEU 점수를 계산할 때는 개별 가설을 따로 평가하는 대신, 데이터세트의 모든 가설과 기준 문서 전반에서 n그램 일치와 빈도를 집계합니다. 마찬가지로 간결성 패널티도 모든 가설의 총 길이를 기준으로 전역적으로 적용합니다. 이러한 전역적 접근은 문장 수준의 변동성을 완화하여, 데이터세트 전체에 걸친 모델 성능을 종합적으로 평가할 수 있게 합니다.
튜토리얼: Weave Scorers로 BLEU 사용하기
BLEU 점수가 실제로 어떻게 작동하는지 확인하기 위해, Weave의 을(를) 사용하는 스크립트를 설정해 보겠습니다 BLEUScorer이 도구는 …와(과) 연동됩니다 sacreBLEU 문장 수준과 코퍼스 수준 BLEU 점수를 모두 계산하기 위한 라이브러리입니다. 아래에서는 이러한 점수를 계산하는 단계와 결과를 분석하는 과정을 차례대로 살펴보겠습니다.
1단계: 설치
필요한 라이브러리를 먼저 설치하세요. 다음 명령을 실행합니다:
git clone https://github.com/wandb/weave.git && cd weave && git fetch origin pull/3006/head:xtra-scorers && git checkout xtra-scorers && pip install -qq -e .
또한, 이 튜토리얼에서 나중에 평가를 실행하려면 OpenAI 키를 내보내세요:
export OPENAI_API_KEY='your api key'
2단계: BLEU 스코어러 설정
다음으로 문장 수준과 코퍼스 수준 BLEU 점수를 계산하겠습니다.
먼저 필요한 라이브러리를 임포트하고 초기화합니다. BLEUScorer:
import weave; weave.init('bleu-scorer-demo')from weave.scorers import BLEUScorer# Initialize Weave BLEU scorerweave_scorer = BLEUScorer()# Define sample hypotheses and referencesexamples = [{"hypothesis": "The cat sat on the mat.", "references": ["A cat was sitting on the mat."]},{"hypothesis": "The quick brown fox jumps over the lazy dog.", "references": ["A fast brown fox jumped over a sleeping dog."]},{"hypothesis": "The sun rises in the east.", "references": ["Sunlight emerges from the eastern horizon."]},]# Prepare input for Weave's summarize functionweave_inputs = []print("Sentence-Level BLEU:")for example in examples:# Compute sentence-level BLEU for each examplesentence_bleu_result = weave_scorer.score(ground_truths=example["references"],output=example["hypothesis"])weave_inputs.append({"output_pred": example["hypothesis"],"output_refs": example["references"],"sentence_bleu": sentence_bleu_result["sentence_bleu"], # Use the sentence-level score from Weave})# Print sentence-level BLEU resultsprint(f"Hypothesis: {sentence_bleu_result['output_pred']}")print(f"References: {sentence_bleu_result['output_refs']}")print(f"BLEU Score: {sentence_bleu_result['sentence_bleu']}")print(f"Brevity Penalty: {sentence_bleu_result['sentence_bp']}")print("-" * 50)# Calculate corpus-level BLEU using Weaveweave_corpus_score = weave_scorer.summarize(weave_inputs)# Print corpus-level BLEU resultsprint("\nWeave Corpus-Level BLEU:")print(f"BLEU Score: {weave_corpus_score['corpus_level']['bleu']}")print(f"Brevity Penalty: {weave_corpus_score['corpus_level']['brevity_penalty']}")
결과 해석
이 스크립트는 문장 수준과 코퍼스 수준의 BLEU 점수를 모두 계산하여, 여러 세분화 수준에서 텍스트 품질에 대한 인사이트를 제공합니다. 주요 차이점은 다음과 같습니다:
- 문장 수준 BLEU: 특정 출력 분석과 디버깅에 유용합니다.
- 코퍼스 수준 BLEU: 모든 예시에 대한 점수를 집계하여 모델 성능을 전체적으로 보여 줍니다.
BLEU 채점기를 사용자 정의할 때 활용할 수 있는 일부 파라미터는 다음과 같습니다:
| Parameter | Type | Default | Description |
|---|---|---|---|
lowercase | bool | False | If True, performs case-insensitive matching. |
tokenize | Optional[str] | None | Specifies the tokenizer to use. Defaults to SacreBLEU’s built-in tokenizer. |
smooth_method | str | "exp" | Smoothing method to handle n-grams with zero matches. Options: 'none', 'floor', 'add-k'. |
smooth_value | Optional[float] | None | Value used for smoothing methods like 'floor' or 'add-k'. |
max_ngram_order | int | 4 | The maximum n-gram order for BLEU calculation. |
effective_order | bool | True | If True, adjusts for missing higher-order n-grams in short sentences. |
BLEU와 Weave Evaluations로 여러 모델 평가
Weave Evaluations 또한 다음과 같은 방식으로 여러 모델을 구조적으로 비교할 수 있게 해 줍니다, 예를 들어 GPT-4o 및 GPT-4o Mini. 공통 기준 데이터셋에 대한 예측을 평가하면 모델 간 성능 차이를 확인할 수 있습니다.
Weave를 사용해 이러한 평가를 설정하는 방법을 간략히 정리하면 다음과 같습니다:
import weaveimport timefrom litellm import acompletionimport asyncioimport nest_asynciofrom weave.scorers import BLEUScorerfrom weave import Evaluation# Initialize Weave with BLEU Scorerweave_client = weave.init("bleu-scorer-demo")dataset = weave.ref("weave:///c-metrics/rouge-scorer/object/longbench_gov_report_subset:qGNjItwJSEw1NF6xMXX2a0syHJfXVMjeYqwqVwWsdbs").get()class GPT4oMini(weave.Model):model_name: str = "gpt-4o-mini"temp: float = 0.0max_tokens: int = 2048top_p: float = 1.0@weave.op()async def predict(self, query: str) -> str:response = await acompletion(model=self.model_name,messages=[{"role": "system","content": "You are provided with government reports. Summarize the report in a few sentences but make sure to include all the important information."},{"role": "user","content": query}],temperature=self.temp,max_tokens=self.max_tokens,top_p=self.top_p)return response.choices[0].message.contentclass GPT4o(weave.Model):model_name: str = "gpt-4o-2024-08-06"temp: float = 0.0max_tokens: int = 2048top_p: float = 1.0@weave.op()async def predict(self, query: str) -> str:time.sleep(2)response = await acompletion(model=self.model_name,messages=[{"role": "system","content": "You are provided with government reports. Summarize the report in a few sentences but make sure to include all the important information."},{"role": "user","content": query}],temperature=self.temp,max_tokens=self.max_tokens,top_p=self.top_p)return response.choices[0].message.contentgpt4o = GPT4o()gpt4omini = GPT4oMini()nest_asyncio.apply()# Initialize BLEU Scorer with column mapscorer = BLEUScorer(column_map={"output": "query", "ground_truths": "ground_truth"})# Create the evaluationevaluation = Evaluation(dataset=dataset.rows[:30],scorers=[scorer],)# Evaluate the modelsasyncio.run(evaluation.evaluate(gpt4o))asyncio.run(evaluation.evaluate(gpt4omini))
모델은 보고서를 간결하고 유익한 문장으로 요약하는 과제를 수행합니다. 각 모델은 temperature, maximum tokens, top-p 등의 파라미터로 정의되며, Weave의 @weave.op 모델 예측을 추적하기 위한 데코레이터. BLEU 채점기 모델 출력과 해당 정답을 맞추기 위해 열 매핑과 함께 초기화됩니다.
평가는 데이터셋의 하위 집합을 사용하여 처음 30개 행을 비교 대상으로 선택합니다. 두 모델은 각각 독립적으로 평가되며, 결과는 Weave의 평가 프레임워크를 사용해 집계됩니다.
평가 결과는 다음과 같습니다:

문장 단위와 코퍼스 단위 BLEU 점수를 포함한 평가 결과는 Weave 대시보드에 표시됩니다. 이 인사이트를 통해 모델 성능과 출력 품질을 상세하게 비교할 수 있습니다.
코퍼스 수준에서 GPT4o Mini는 BLEU 점수 30.709와 간결성 패널티 0.940을 기록하여, 기준 텍스트와의 높은 정합성과 비교적 균형 잡힌 출력 길이를 보여줍니다. 반면 GPT4o는 코퍼스 수준 BLEU 점수 19.704와 간결성 패널티 0.590으로, 더 짧은 가설과 낮은 정합성을 시사합니다.
또한 Weave의 비교 보기에서 각 예시에 대해 각 모델의 개별 응답을 분석할 수 있습니다.

이 기능은 데이터셋의 각 개별 예시에 대해 각 모델이 생성한 출력과 해당 기준(reference) 텍스트를 나란히 상세 비교해 제공합니다. 이를 ��해 각 예측의 BLEU 점수뿐 아니라, 표현 방식의 차이나 핵심 정보 포함 여부 등 모델마다 과제를 수행하는 방식의 질적 차이도 함께 확인할 수 있습니다.
이러한 비교를 깊이 파고들면 각 모델의 강점과 약점에서 반복되는 패턴을 확인할 수 있어, 어떤 모델이 전반적으로 더 잘 수행하는지 또는 특정 상황에서 실패하는 이유를 더 깊이 이해할 수 있습니다. 이와 같은 세밀한 분석 수준은 디버깅과 모델 성능 개선에 매우 유용합니다.
BLEU의 한계
BLEU 점수는 널리 사용되지만, 연구 커뮤니티에서도 잘 알려진 몇 가지 중요한 한계가 있습니다:
- 문자열 일치가 의미적 이해를 앞지름 BLEU는 의미적 동등성을 무시하고 n-그램 중복을 기준으로 유사성을 평가합니다. 이는 “couch”를 “sofa”로 번역하는처럼 표현만 다른 타당한 번역이 부당하게 페널티를 받는다는 뜻입니다. 또한 BLEU는 말이 되지 않거나 일관성이 없는 순서로 배치되어도 올바른 n-그램이 포함되어 있으면 점수를 부여하기 때문에, 품질이 낮은 텍스트가 과대평가되는 결과를 초래할 수 있습니다.
- 참조에 대한 유연성 제한: BLEU의 성능은 참조 집합에 매우 민감합니다. 대부분의 평가가 인간이 작성한 단일 참조에 의존하기 때문에, 다양하지만 타당한 출력이 불이익을 받습니다. 여러 개의 참조를 사용하더라도, BLEU는 표현이나 의미에서 허용 가능한 변이의 전 범위를 충분히 포착하지 못합니다.
- 맥락 및 데이터셋 종속성 BLEU 점수는 특정 테스트 세트와 언어 쌍의 영향이 매우 커서, 서로 다른 데이터셋이나 도메인 간 비교의 신뢰성이 떨어집니다. 또한 의미 보존보다 토큰 중복에 초점을 맞추기 때문에, 실제 번역 품질을 평가하는 데에는 한계가 있습니다.
- 해석상의 과제: BLEU 점수의 작은 변화는 실제로 의미 있는 개선을 반영하지 않을 수 있어 해석이 어렵습니다. 또한 특정 테스트 세트에 과적합된 모델은 실제 성능 향상 없이도 인위적으로 높은 BLEU 점수를 얻을 수 있습니다.
이러한 한계는 모델 성능을 포괄적으로 이해하기 위해 BLEU를 다른 평가 지표와 함께 사용해야 함을 강조합니다. 의미적 동등성이나 인간 평가를 반영하는 지표는 BLEU를 보완하여 그 한계를 보완하고, 텍스트 품질을 보다 견고하게 평가할 수 있도록 해줍니다.
결론
한계에도 불구하고, BLEU 점수는 적절히 적용할 경우 기계 생성 텍스트를 평가하는 데 여전히 유용한 도구입니다. 문자열 일치에 대한 의존성과 의미 이해의 부족은 잘 알려져 있지만, BLEU의 단순성과 재현 용이성은 텍스트 생성 시스템의 벤치마킹에서 사실상 표준으로 자리 잡게 합니다.
Weave와 같은 도구는 평가 워크플로를 간소화하고 실행 가능한 인사이트를 제공하여 BLEU의 실용성을 한층 높여 줍니다. AI가 계속 발전함에 따라, BLEU는 텍스트 품질과 성능의 향상을 측정하는 신뢰할 수 있는 지표로 남아 있습니다.
GraphRAG: Enhancing LLMs with knowledge graphs for superior retrieval
This article introduces GraphRAG, a novel approach that combines knowledge graphs and hierarchical community detection to enable scalable, query-focused summarization and global sensemaking over large datasets.
Evaluating LLMs on Amazon Bedrock
Discover how to use Amazon Bedrock in combination with W&B Weave to evaluate and compare Large Language Models (LLMs) for summarization tasks, leveraging Bedrock’s managed infrastructure and Weave’s advanced evaluation features.
Building and evaluating a RAG system with DSPy and W&B Weave
A guide to building a RAG system with DSPy, and evaluating it with W&B Weave.
Training a KANFormer: KAN's Are All You Need?
We will dive into a new experimental architecture, replacing the MLP layers in transformers with KAN layers!
Add a comment