Danh sách bài viết

Bài 55: Reference-based metrics — BLEU, ROUGE, BERTScore

Reference-based metric so sánh output của model với một (hoặc nhiều) reference cho trước — đây là cách đánh giá tự động đầu tiên trong NLP, có từ trước thời LLM và vẫn được dùng làm baseline cho mọi paper translation, summarization. Bài này phân tích ba metric chính: BLEU (Papineni et al. 2002, "BLEU: a Method for Automatic Evaluation of Machine Translation") tính n-gram precision với brevity penalty, chuẩn de-facto cho machine translation; ROUGE (Lin 2004, "ROUGE: A Package for Automatic Evaluation of Summaries") tính recall-based với ba biến thể chính ROUGE-N (n-gram recall), ROUGE-L (longest common subsequence) và ROUGE-W (weighted LCS), chuẩn cho summarization; BERTScore (Zhang et al. 2020, arXiv:1904.09675) dùng cosine similarity giữa BERT token embedding để bắt được semantic similarity, synonym và paraphrase mà n-gram metric miss hoàn toàn. Bài cung cấp công thức toán cho BLEU và ROUGE-L F-measure, range giá trị [0, 1] hoặc [0, 100], pros/cons từng metric, hai metric phụ METEOR (stem/synonym-aware cho translation) và chrF/chrF++ (character-level, phù hợp tiếng Việt và ngôn ngữ morphological-rich). Code Python ngắn với sacrebleu, rouge-score, bert-score và wrapper thống nhất qua evaluate của HuggingFace; use case matching cụ thể (translation → BLEU/chrF, summarization → ROUGE, open-ended generation → BERTScore hoặc LLM-as-Judge Bài 56); common pitfalls (single reference quá hạn chế, tokenizer mismatch khiến BLEU không so sánh được giữa hai paper, Goodhart's Law khi over-optimize BLEU); modern landscape 2024-2026 với COMET (Rei 2020) và BLEURT (Sellam 2020) — learned metric train trên human rating, G-Eval dùng GPT-4, và xu hướng LLM-as-Judge growing rapidly; bảng correlation từng metric với human eval (BLEU/ROUGE moderate, BERTScore cao hơn, LLM-as-Judge cao nhất); ví dụ minh hoạ với cặp "The cat sat on the mat." vs "A cat is sitting on a mat." để thấy BLEU rất thấp còn BERTScore cao; best practice multi-metric report và pair với human eval cho hệ thống quan trọng; bài tập compute từng metric trên dataset translation và summarization nhỏ.

25/05/2026
13 phút đọc
1 lượt xem
1

Mục tiêu bài học

Sau bài học, bạn sẽ:

  • Định nghĩa được reference-based metric và phân biệt với reference-free metric (Bài 56-58).
  • Đọc được công thức của BLEU và ROUGE-L, hiểu ý nghĩa từng thành phần.
  • Biết khi nào dùng BLEU, khi nào dùng ROUGE, khi nào dùng BERTScore.
  • Viết được code Python ngắn để compute cả ba metric trên một cặp (prediction, reference).
  • Tránh được các pitfall phổ biến: single reference, tokenizer mismatch, optimize một metric duy nhất.
  • Nắm được landscape 2024-2026 với COMET, BLEURT, G-Eval và xu hướng LLM-as-Judge.
2

Reference-based metric là gì

Reference-based metric là metric so sánh output của model (prediction) với một hoặc nhiều reference answer đã có (reference, ground truth) — thường do con người viết.

Pipeline đơn giản:

  1. Cho input x (vd câu nguồn tiếng Anh, đoạn văn cần tóm tắt).
  2. Model sinh y_hat (translation, summary).
  3. Có sẵn reference y do con người viết.
  4. Metric tính một số score(y_hat, y) phản ánh độ giống nhau.

Reference-based metric chỉ áp dụng được khi có reference rõ ràng. Với task open-ended (creative writing, dialogue, brainstorm), reference thường không có hoặc không duy nhất → reference-based metric kém phù hợp, phải chuyển sang LLM-as-Judge (Bài 56) hoặc human eval.

Bài 54 đã chỉ ra lý do đánh giá LLM khó: output đa dạng, không có một câu trả lời đúng duy nhất. Reference-based metric là cách giải quyết tự động lâu đời nhất — bằng cách chấp nhận một (hoặc vài) reference cố định và đo độ trùng khớp lexical hoặc semantic.

3

Ba metric chính

Ba metric reference-based phổ biến nhất trong NLP:

  • BLEU — Papineni et al. 2002 — n-gram precision, gốc cho machine translation.
  • ROUGE — Lin 2004 — recall-based, gốc cho summarization.
  • BERTScore — Zhang et al. 2020 — cosine similarity giữa BERT embedding, semantic.

Cả ba đều cho điểm số dạng số thực, range thường [0, 1] hoặc [0, 100]. Càng cao càng giống reference (không phải càng "đúng"). BLEU và ROUGE đo trùng khớp lexical (token, n-gram); BERTScore đo trùng khớp semantic (embedding).

4

BLEU — công thức

BLEU (Bilingual Evaluation Understudy) — Papineni, Roukos, Ward, Zhu (IBM, 2002) — được thiết kế cho machine translation, đo bằng n-gram precision giữa prediction và reference.

Công thức tổng quát:

\[ \text{BLEU} = \text{BP} \cdot \exp\left( \sum_{n=1}^{N} w_n \log p_n \right) \]

Trong đó:

  • \( p_n \): modified n-gram precision — số n-gram của prediction xuất hiện trong reference, chia cho tổng n-gram của prediction. "Modified" = mỗi n-gram chỉ được đếm tối đa số lần nó xuất hiện trong reference (tránh trick lặp một từ).
  • \( w_n \): trọng số cho mỗi n. BLEU-4 chuẩn dùng \( w_1 = w_2 = w_3 = w_4 = 1/4 \) — trung bình hình học của \( p_1, p_2, p_3, p_4 \).
  • \( \text{BP} \): brevity penalty, phạt khi prediction ngắn hơn reference:
\[ \text{BP} = \begin{cases} 1 & \text{nếu } c > r \\ \exp\left(1 - \frac{r}{c}\right) & \text{nếu } c \le r \end{cases} \]

với c = độ dài prediction (số token), r = độ dài reference (khi nhiều reference thì chọn cái gần c nhất).

Nếu không có brevity penalty, mô hình có thể "ăn gian" bằng cách output cực ngắn để precision = 1 (vd output 1 token trùng reference).

5

BLEU — range và variant

Range: \( \text{BLEU} \in [0, 1] \). Trong báo cáo thường nhân với 100 để đọc tiện — BLEU = 32.5 nghĩa là 0.325.

Biến thể phổ biến:

  • BLEU-1: chỉ unigram precision — gần với word overlap.
  • BLEU-2, BLEU-3: thêm bigram, trigram.
  • BLEU-4: default trong hầu hết paper translation — uniform weight 1/4 cho n=1..4.
  • Corpus BLEU vs Sentence BLEU: corpus tính trên toàn bộ tập test (cách paper chuẩn báo cáo); sentence tính cho từng câu rồi trung bình. Hai cách cho con số khác nhau — corpus BLEU thường ổn định hơn vì smoothing.
  • SacreBLEU (Post 2018): implementation chuẩn hóa tokenization, được khuyến nghị mặc định 2018+ để tránh BLEU score paper khác nhau do tokenizer khác nhau.

BLEU 30+ thường được coi là translation chấp nhận được; BLEU 40+ là tốt; BLEU 60+ rất hiếm và thường có nghĩa là gần với reference. Tuy nhiên các con số này phụ thuộc cặp ngôn ngữ và domain — không có ngưỡng tuyệt đối.

6

BLEU — pros / cons

Pros:

  • Standard de-facto cho translation từ 2002 — paper nào cũng báo cáo.
  • Nhanh: chỉ cần đếm n-gram, không cần model phụ.
  • Deterministic — cùng input cho cùng output.
  • Tương quan moderate với human eval cho translation ở mức corpus.

Cons:

  • Đo trùng khớp lexical exact: nếu prediction dùng synonym hoặc paraphrase, BLEU vẫn cho điểm thấp dù nghĩa đúng.
  • Câu ngắn: với sentence BLEU không có smoothing, một bigram trật là precision = 0.
  • Không phù hợp open-ended generation: dialogue, story writing → BLEU gần như random.
  • Phụ thuộc tokenization — đây là lý do SacreBLEU ra đời.
  • Tương quan kém với human eval ở mức câu (sentence-level).
7

ROUGE — định nghĩa

ROUGE (Recall-Oriented Understudy for Gisting Evaluation) — Chin-Yew Lin (ISI, 2004) — được thiết kế cho summarization: kiểm tra summary do model sinh có chứa các ý của reference summary không.

Tư duy ngược với BLEU: BLEU hỏi "bao nhiêu % của prediction đúng?" (precision); ROUGE hỏi "bao nhiêu % của reference được prediction bao phủ?" (recall). Lý do: summary quan trọng là không bỏ sót ý chính; nếu summary thêm vài từ thừa không nguy hiểm bằng thiếu ý.

Trong thực tế, ROUGE thường được báo cáo cả ba số P / R / F1 — không chỉ recall thuần.

8

ROUGE — các biến thể

Paper Lin 2004 định nghĩa nhiều biến thể, phổ biến nhất:

  • ROUGE-N (vd ROUGE-1, ROUGE-2): n-gram recall — số n-gram của reference xuất hiện trong prediction, chia cho tổng n-gram của reference. ROUGE-1 ≈ word overlap, ROUGE-2 ≈ bigram overlap.
  • ROUGE-L: dùng longest common subsequence (LCS) giữa prediction và reference — không yêu cầu liên tục, chỉ yêu cầu cùng thứ tự. ROUGE-L nắm được word order mà không bị strict như n-gram.
  • ROUGE-W: weighted LCS — phần subsequence liên tục được tính cao hơn không liên tục. Phức tạp hơn ROUGE-L, ít dùng.
  • ROUGE-S, ROUGE-SU: skip-bigram (cho phép bỏ qua từ ở giữa). Ít phổ biến.

Trong paper summarization 2018+, bộ chuẩn là {ROUGE-1, ROUGE-2, ROUGE-L} báo cáo F1.

9

ROUGE-L — công thức

Cho prediction \( X \) độ dài \( m \), reference \( Y \) độ dài \( n \), và \( \text{LCS}(X, Y) \) là độ dài longest common subsequence:

\[ R_L = \frac{\text{LCS}(X, Y)}{n}, \quad P_L = \frac{\text{LCS}(X, Y)}{m} \]

F-measure ROUGE-L (theo paper Lin 2004):

\[ \text{ROUGE-L}_F = \frac{(1 + \beta^2) \, R_L \, P_L}{R_L + \beta^2 P_L} \]

với \( \beta \) thường rất lớn (\( \beta \to \infty \)) — recall-dominant. Trong implementation phổ biến (Google rouge-score) dùng \( \beta = 1 \) → F1 đối xứng giữa P và R.

Ưu điểm ROUGE-L: chấp nhận output thay đổi thứ tự nhẹ hoặc thêm bớt từ giữa câu — không strict như n-gram match. Cùng một câu summary với phrasing khác có thể vẫn cho ROUGE-L cao.

10

BERTScore — ý tưởng

BERTScore — Zhang, Kishore, Wu, Weinberger, Artzi (Cornell, arXiv:1904.09675, ICLR 2020) — dùng contextual embedding của BERT (Bài 19 series này đã giới thiệu embedding) để đo độ giống nhau ngữ nghĩa.

Pipeline:

  1. Encode reference \( y \) và prediction \( \hat{y} \) qua BERT → ma trận embedding token-level.
  2. Với mỗi token \( y_i \) trong reference, tìm token trong prediction có cosine similarity cao nhất → tổng hợp lại thành recall.
  3. Với mỗi token \( \hat{y}_j \) trong prediction, tìm token trong reference có similarity cao nhất → precision.
  4. F1 = trung bình harmonic của precision và recall.

Công thức recall:

\[ R_{\text{BERT}} = \frac{1}{|y|} \sum_{y_i \in y} \max_{\hat{y}_j \in \hat{y}} \mathbf{e}_{y_i}^\top \mathbf{e}_{\hat{y}_j} \]

với \( \mathbf{e}_{y_i} \) là embedding (đã chuẩn hóa) của token \( y_i \). Precision tính tương tự đổi vai trò; F1 ghép lại bằng công thức harmonic mean.

BERTScore thường dùng model roberta-large hoặc bert-base theo ngôn ngữ — paper cung cấp bảng baseline rescaling theo từng model + layer để score đẹp hơn về mặt scale.

11

BERTScore — ưu / nhược

Ưu điểm:

  • Bắt được semantic similarity — synonym, paraphrase được tính giống nhau. BLEU/ROUGE bỏ lỡ.
  • Tương quan với human eval cao hơn BLEU/ROUGE trên nhiều benchmark (paper Zhang 2020).
  • Robust với câu ngắn — không bị precision = 0 đột ngột.

Nhược điểm:

  • Chậm: cần inference qua BERT cho mỗi prediction → vài chục ms đến vài trăm ms / sample. So với BLEU/ROUGE là milisecond.
  • Phụ thuộc model BERT chọn: bert-base-uncased vs roberta-large vs xlm-roberta cho điểm khác nhau → khó so sánh giữa các paper nếu không khai báo rõ.
  • Score raw thường nằm trong khoảng hẹp (vd 0.85-0.95) — khó nhìn ra khác biệt nếu không rescale với baseline.
  • Vẫn cần reference — không giải quyết được vấn đề open-ended generation thiếu reference.
  • Không bắt được lỗi factual: hai câu nghĩa gần nhau nhưng một câu sai sự thật, BERTScore vẫn cao.
12

METEOR và chrF / chrF++

Ngoài ba metric chính, hai metric phụ đáng biết:

METEOR (Banerjee & Lavie, 2005) — alternative cho translation, cải tiến BLEU bằng cách:

  • Cho phép match stem (chạy / chạy → coi như giống).
  • Cho phép match synonym (qua WordNet với tiếng Anh).
  • Tính F-measure (kết hợp precision và recall).
  • Có penalty cho thứ tự sai (fragmentation penalty).

METEOR tương quan với human eval tốt hơn BLEU trên translation tiếng Anh, nhưng cần WordNet → khó port sang tiếng Việt. Ít phổ biến trong giai đoạn 2020+ vì BERTScore và COMET (Bài 19 mục modern landscape) tốt hơn ở cùng tiêu chí.

chrF (Popović, 2015) và chrF++ (Popović, 2017) — tính F-score trên character n-gram thay vì token n-gram:

  • Phù hợp với ngôn ngữ morphological-rich (tiếng Việt với dấu, tiếng Đức, tiếng Phần Lan, tiếng Thổ) — nơi cùng một từ gốc có nhiều biến thể.
  • Robust với tokenization — không cần tokenizer thống nhất giữa các paper.
  • chrF++ thêm word n-gram bên cạnh character n-gram.

WMT (Workshop on Machine Translation) khuyến nghị báo cáo cả BLEU và chrF kể từ 2018. Cho tiếng Việt và các ngôn ngữ có dấu, chrF thường ổn định hơn BLEU.

13

Code Python — BLEU

Cài đặt: pip install sacrebleu.

from sacrebleu import corpus_bleu, sentence_bleu

predictions = [
    "The cat sat on the mat.",
    "A dog barked at the moon.",
]
references = [[
    "The cat is sitting on the mat.",
    "A dog barked at the moon last night.",
]]

# Corpus-level (chuẩn báo cáo trong paper)
bleu = corpus_bleu(predictions, references)
print(f"BLEU = {bleu.score:.2f}")
# vd: BLEU = 32.45

# Sentence-level
for pred, ref in zip(predictions, references[0]):
    s = sentence_bleu(pred, [ref])
    print(f"  {pred!r:40s} -> {s.score:.2f}")

sacrebleu dùng tokenization chuẩn (mặc định 13a cho ngôn ngữ Latin) — đảm bảo BLEU của bạn so sánh được với paper khác cũng dùng SacreBLEU.

Với tiếng Việt, set tokenize="none" nếu bạn đã tokenize sẵn, hoặc tokenize="char" để dùng character tokenization (gần với chrF).

14

Code Python — ROUGE

Cài đặt: pip install rouge-score (implementation chính thức của Google).

from rouge_score import rouge_scorer

scorer = rouge_scorer.RougeScorer(
    ["rouge1", "rouge2", "rougeL"],
    use_stemmer=True,
)

reference = "The cat sat on the mat in the living room."
prediction = "A cat is sitting on a mat inside the room."

scores = scorer.score(reference, prediction)
for k, v in scores.items():
    print(f"{k}: P={v.precision:.3f} R={v.recall:.3f} F={v.fmeasure:.3f}")
# rouge1: P=0.500 R=0.500 F=0.500
# rouge2: P=0.111 R=0.111 F=0.111
# rougeL: P=0.400 R=0.400 F=0.400

Lưu ý:

  • use_stemmer=True dùng Porter stemmer (chỉ tiếng Anh) — "sitting" và "sat" được coi gần như giống nhau.
  • Với tiếng Việt, dùng use_stemmer=False và tokenize sẵn trước khi gọi (vd qua underthesea hoặc pyvi).
  • Khi có nhiều reference, dùng scorer.score_multi([ref1, ref2, ...], prediction).
15

Code Python — BERTScore

Cài đặt: pip install bert-score.

from bert_score import score

predictions = ["A cat is sitting on a mat inside the room."]
references = ["The cat sat on the mat in the living room."]

P, R, F1 = score(
    predictions, references,
    lang="en",                  # tự chọn model phù hợp ngôn ngữ
    rescale_with_baseline=True, # rescale để dễ đọc
    verbose=False,
)
print(f"P={P[0]:.3f}  R={R[0]:.3f}  F1={F1[0]:.3f}")
# vd: P=0.612  R=0.598  F1=0.605

Tham số quan trọng:

  • lang: "en" dùng roberta-large mặc định; "vi" dùng xlm-roberta-base; có thể override bằng model_type="bert-base-multilingual-cased".
  • rescale_with_baseline=True: rescale score về scale [-1, 1] thay vì [0.85, 0.95] mặc định — giúp khác biệt rõ ràng hơn.
  • Lần chạy đầu sẽ download model BERT (~1-2 GB).

Tốc độ: ~50-100 sample / giây trên GPU, ~5-10 sample / giây trên CPU.

16

HuggingFace evaluate

HuggingFace cung cấp evaluate — wrapper thống nhất API cho hầu hết metric NLP. Tiện khi bạn muốn switch giữa các metric mà không thay đổi code nhiều.

Cài đặt: pip install evaluate sacrebleu rouge-score bert-score.

import evaluate

predictions = ["A cat sits on a mat."]
references = ["The cat sat on the mat."]

# BLEU (qua sacrebleu)
bleu = evaluate.load("sacrebleu")
print(bleu.compute(
    predictions=predictions,
    references=[[r] for r in references],
))
# {'score': 11.42, 'counts': [...], ...}

# ROUGE
rouge = evaluate.load("rouge")
print(rouge.compute(predictions=predictions, references=references))
# {'rouge1': 0.5, 'rouge2': 0.0, 'rougeL': 0.5, 'rougeLsum': 0.5}

# BERTScore
bertscore = evaluate.load("bertscore")
print(bertscore.compute(
    predictions=predictions, references=references, lang="en",
))
# {'precision': [0.93], 'recall': [0.93], 'f1': [0.93], 'hashcode': '...'}

Khi dùng trong training loop (vd Trainer.compute_metrics), evaluate tích hợp gọn — nhưng nhớ tính metric trên validation set, không tính trên training set.

17

Use case appropriate

Match metric với task:

  • Machine translation: BLEU (chuẩn paper) + chrF (cho ngôn ngữ morphology). Modern: thêm COMET hoặc BLEURT (mục 19).
  • Summarization: ROUGE-1 / ROUGE-2 / ROUGE-L. Thêm BERTScore cho semantic.
  • Image captioning: BLEU-4, METEOR, CIDEr (CIDEr là metric riêng cho captioning, không cover trong bài này).
  • Question answering (extractive): Exact Match + F1 token-level — không thuộc BLEU/ROUGE/BERTScore mà là metric riêng.
  • Open-ended generation (chatbot, creative writing): reference-based metric kém hiệu quả → chuyển sang BERTScore tốt nhất, hoặc LLM-as-Judge (Bài 56).
  • Code generation: BLEU/ROUGE rất kém vì cùng logic có thể viết nhiều cách. Dùng pass@k (execution-based) — sẽ cover ở Bài 59.

Quy tắc nhẹ: nếu task có reference cấu trúc cố định (translation, summary, headline) → reference-based metric hoạt động. Nếu output đa dạng và creative → cần metric khác.

18

Common pitfalls

  • Single reference: với 1 reference duy nhất, BLEU/ROUGE rất khắt khe. Model output đúng nghĩa nhưng phrasing khác → điểm thấp. Multi-reference (2-4 reference / sample) giúp robust hơn — paper WMT thường dùng 2 reference.
  • Tokenizer mismatch: BLEU phụ thuộc tokenization. Paper A dùng Moses tokenizer, paper B dùng WordPiece → BLEU khác nhau dù cùng output. Dùng SacreBLEU để có chuẩn chung.
  • Sentence vs corpus BLEU: sentence BLEU không có smoothing có thể = 0 khi câu ngắn. Corpus BLEU ổn định hơn. Đừng so sánh hai con số khi chúng đến từ phương pháp khác.
  • Goodhart's Law: "Khi một measure trở thành target, nó không còn là measure tốt." Optimize BLEU bằng RL hoặc loss trực tiếp có thể làm BLEU tăng nhưng chất lượng human-eval giảm — paper đã chỉ ra nhiều lần.
  • Chỉ báo cáo 1 metric: BLEU 32 nghe có vẻ tốt, nhưng nếu ROUGE-L thấp và BERTScore thấp thì model có thể đang "ăn gian" lexical mà không nắm semantic. Multi-metric cho bức tranh đầy đủ hơn.
  • Không có reference của tiếng Việt sạch: với task tiếng Việt, reference set chất lượng còn thiếu — eval phụ thuộc dataset bạn dùng. Nên kiểm tra reference trước khi tin số.
  • Không pair với human eval: với hệ thống production quan trọng, BLEU/ROUGE chỉ là proxy. Human eval định kỳ là bắt buộc.
19

Modern landscape 2024-2026

Sau BERTScore, một lớp metric mới — learned metric — train neural network trực tiếp trên human rating để dự đoán human eval score:

  • COMET (Rei et al., 2020, arXiv:2009.09025) — Crosslingual Optimized Metric for Evaluation of Translation. Encode source + reference + prediction qua XLM-R, train trên WMT human judgement. Khuyến nghị chính thức của WMT 2022+ cho translation.
  • BLEURT (Sellam et al., 2020, arXiv:2004.04696) — train BERT trên synthetic data và human rating. Cho score cao hơn về tương quan với human eval so với BLEU/BERTScore.
  • G-Eval (Liu et al., 2023, arXiv:2303.16634) — dùng GPT-4 với chain-of-thought prompt để chấm chất lượng. Là một dạng cụ thể của LLM-as-Judge.
  • UniEval, Prometheus, Llama-Judge: các judge model open-source thay GPT-4 — sẽ phân tích Bài 56.

BLEU và ROUGE vẫn được báo cáo trong paper 2024-2026 vì comparability với prior work, nhưng đi kèm BERTScore và/hoặc một learned metric / LLM-as-Judge. Một bài paper hiện đại không nên chỉ báo BLEU.

Sử dụng COMET ngắn:

from comet import download_model, load_from_checkpoint

model_path = download_model("Unbabel/wmt22-comet-da")
model = load_from_checkpoint(model_path)
data = [{"src": "Hello world", "mt": "Xin chào thế giới", "ref": "Chào thế giới"}]
output = model.predict(data, batch_size=8, gpus=0)
print(output.scores)  # [0.78]
20

Correlation với human eval

Tổng hợp empirical (paper Zhang 2020, Rei 2020, WMT meta-evaluation 2022, 2023):

Metric           Corpus-level corr   Sentence-level corr
BLEU             0.30 - 0.55         0.10 - 0.30  (kém)
ROUGE-L          0.40 - 0.60         0.15 - 0.35
chrF             0.40 - 0.65         0.20 - 0.40
METEOR           0.45 - 0.65         0.25 - 0.40
BERTScore        0.55 - 0.75         0.35 - 0.55
BLEURT           0.60 - 0.80         0.40 - 0.60
COMET            0.65 - 0.85         0.45 - 0.65
LLM-as-Judge     0.70 - 0.90         0.55 - 0.75

Số liệu dao động tuỳ task và dataset — bảng trên là khoảng tổng quát rút từ paper meta-evaluation. Hai điểm chính:

  • Sentence-level correlation luôn thấp hơn corpus-level — không metric nào tốt cho từng câu riêng lẻ.
  • Learned metric (BLEURT, COMET) và LLM-as-Judge tốt hơn rõ rệt so với n-gram metric — nhưng đổi lại đắt hơn và phụ thuộc model.
21

Ví dụ so sánh ba metric

Cùng một cặp prediction / reference, ba metric cho con số rất khác:

from sacrebleu import sentence_bleu
from rouge_score import rouge_scorer
from bert_score import score as bert_score

reference = "The cat sat on the mat."
prediction = "A cat is sitting on a mat."

# 1) BLEU-4 — không có 4-gram trùng → rất thấp
b = sentence_bleu(prediction, [reference])
print(f"BLEU = {b.score:.2f}")
# vd: BLEU ~ 5-15

# 2) ROUGE-L — LCS dài (cat, on, a, mat) → trung bình
scorer = rouge_scorer.RougeScorer(["rougeL"], use_stemmer=True)
r = scorer.score(reference, prediction)
print(f"ROUGE-L = {r['rougeL'].fmeasure:.3f}")
# vd: ROUGE-L ~ 0.50

# 3) BERTScore — semantic gần giống → cao
P, R, F1 = bert_score([prediction], [reference], lang="en",
                     rescale_with_baseline=True, verbose=False)
print(f"BERTScore F1 = {F1[0]:.3f}")
# vd: BERTScore ~ 0.70-0.80

Bài học: với một cặp câu đồng nghĩa nhưng phrasing khác, BLEU phạt nặng, ROUGE-L cho điểm trung bình (nhờ LCS bắt được cùng thứ tự), BERTScore cho điểm cao (semantic gần). Đây là trường hợp điển hình BERTScore ưu việt hơn — và cũng là trường hợp metric dễ "bị lừa" nếu prediction sai sự thật mà nghĩa gần.

22

Best practice

  • Multi-metric: báo cáo ít nhất 2-3 metric (vd BLEU + chrF + COMET cho translation; ROUGE-L + BERTScore cho summarization). Một metric tăng nhưng metric khác giảm là tín hiệu cần điều tra.
  • Pair với human eval cho hệ thống production: chấm tay 100-500 sample định kỳ, so sánh với metric tự động — kiểm tra metric vẫn track human judgement.
  • Báo cáo kèm baseline: BLEU = 32 không có ý nghĩa nếu không biết baseline. So với prior SOTA, so với rule-based, so với LLM-zero-shot.
  • Dùng SacreBLEU cho BLEU — luôn luôn — để score so sánh được giữa các paper.
  • Báo cáo cấu hình: model BERTScore dùng, layer nào, có rescale hay không. Cùng một metric với cấu hình khác cho con số khác.
  • Test set không leak: với LLM fine-tune (Bài 50-54), kiểm tra test set không nằm trong pretraining corpus → BLEU cao có thể chỉ là memorization.
  • Đừng optimize metric trực tiếp qua RL: Goodhart's Law sẽ làm giảm chất lượng thực tế.
23

Limitation chung

  • Cần reference: với task open-ended (chatbot, creative writing, coding open problem), không có reference duy nhất → reference-based metric không áp dụng được hoặc rất hạn chế.
  • Reference cũng có thể sai: human annotator không hoàn hảo, reference có thể có lỗi grammar / dịch sai → metric chấm dựa trên reference sai sẽ ra số sai.
  • Không phát hiện factual error: BLEU / ROUGE / BERTScore không kiểm tra prediction có đúng sự thật hay không, chỉ kiểm tra trùng khớp với reference. Hallucination (Bài 57) là vấn đề khác.
  • Không phát hiện safety / bias issue: prediction có thể có ngôn từ thiên kiến hoặc unsafe nhưng vẫn trùng reference → metric cao.
  • Bias ngôn ngữ: hầu hết metric được phát triển và benchmark trên tiếng Anh. Áp dụng cho tiếng Việt cần thẩm định lại.

Với open-ended generation và cần đánh giá toàn diện (factual, safe, helpful), LLM-as-Judge (Bài 56) và human eval là lựa chọn — không phải reference-based metric.

24

Bài tập

Bài 1 — Compute BLEU cho 5 translation pair. Tự tạo 5 cặp (source, reference, prediction) EN→VI (hoặc lấy từ opus-100). Compute sentence BLEU và corpus BLEU với SacreBLEU. Quan sát chênh lệch.

Bài 2 — Compute ROUGE cho 5 summarization pair. Lấy 5 article từ cnn_dailymail (HuggingFace dataset), generate summary bằng một LLM nhỏ (vd Llama 3.2 1B). Compute ROUGE-1, ROUGE-2, ROUGE-L với rouge-score. So sánh với reference summary có sẵn trong dataset.

Bài 3 — Apply BERTScore cho 1 batch. Lấy 20 cặp prediction/reference (translation hoặc summary). Compute BERTScore với lang="en"lang="multilingual". So sánh hai cấu hình. Time tốc độ trên CPU vs GPU.

Bài 4 — So sánh metric trên synonymous vs different meaning. Tạo 3 cặp:

  • Cặp A: reference = "The car is red.", prediction = "The vehicle is red." (synonym).
  • Cặp B: reference = "The car is red.", prediction = "The car is blue." (đổi 1 thuộc tính).
  • Cặp C: reference = "The car is red.", prediction = "I love pizza." (không liên quan).

Compute BLEU, ROUGE-L, BERTScore cho cả ba. Nhận xét: metric nào phân biệt được synonym (A) khỏi đổi nghĩa (B)? Metric nào nhầm A với B?

Bài 5 — (optional) Build correlation table với human eval mock. Lấy 50 cặp (prediction, reference) translation. Tự chấm tay theo thang 1-5 (mức adequacy). Compute BLEU, ROUGE-L, BERTScore. Vẽ scatter plot mỗi metric vs human score. Tính Spearman correlation. So sánh với bảng ở mục 20.

Bài 6 — (optional) chrF cho tiếng Việt. Lấy 10 cặp translation EN→VI. Compute BLEU (token) và chrF (character) với SacreBLEU. So sánh hai con số, thảo luận tại sao chrF phù hợp hơn với tiếng có dấu.

25

Tóm tắt

  • Reference-based metric so sánh output của model với reference cho trước; chỉ áp dụng khi có reference rõ ràng.
  • Ba metric chính: BLEU (Papineni 2002, n-gram precision, translation), ROUGE (Lin 2004, recall, summarization), BERTScore (Zhang 2020, semantic, embedding).
  • BLEU = \( \text{BP} \cdot \exp(\sum_n w_n \log p_n) \) — n-gram precision với brevity penalty; BLEU-4 là chuẩn paper translation; SacreBLEU là implementation chuẩn để so sánh giữa paper.
  • ROUGE biến thể chính: ROUGE-1, ROUGE-2 (n-gram recall), ROUGE-L (LCS-based, công thức F-measure \( \text{ROUGE-L}_F = \frac{(1+\beta^2) R_L P_L}{R_L + \beta^2 P_L} \)).
  • BERTScore: cosine similarity giữa BERT embedding token-level → F1 of precision/recall matching. Bắt được synonym và paraphrase.
  • METEOR (stem/synonym-aware) và chrF/chrF++ (character-level, phù hợp tiếng Việt) là hai metric phụ đáng biết.
  • Use case: translation → BLEU + chrF + COMET; summarization → ROUGE + BERTScore; open-ended → BERTScore hoặc LLM-as-Judge (Bài 56).
  • Pitfalls: single reference, tokenizer mismatch, optimize trực tiếp BLEU (Goodhart's Law), chỉ báo cáo một metric.
  • Modern landscape: COMET (Rei 2020) và BLEURT (Sellam 2020) là learned metric tốt hơn BLEU/BERTScore; G-Eval (Liu 2023) là LLM-as-Judge với GPT-4; xu hướng dùng LLM-as-Judge growing rapidly.
  • Correlation với human eval: BLEU/ROUGE moderate, BERTScore cao hơn, learned metric và LLM-as-Judge cao nhất; sentence-level correlation luôn thấp hơn corpus-level.
  • Best practice: multi-metric, pair với human eval cho production, dùng SacreBLEU, báo cáo cấu hình và baseline.
  • Limitation: không phát hiện factual error, không phát hiện safety/bias, cần reference (không áp dụng được open-ended).
  • Bài 56 sẽ giới thiệu LLM-as-Judge — dùng LLM mạnh để chấm chất lượng output mà không cần reference, giải quyết các pitfall của reference-based metric.