Mục lục
- Mục tiêu bài học
- Hallucination là gì
- Intrinsic vs Extrinsic
- 5 ví dụ hallucination thường gặp
- Vì sao model hallucinate
- Tần suất theo loại model
- Tổng quan 7 phương pháp phát hiện
- Method 1 — Reference-based fact-check
- Method 2 — Self-Consistency (Wang 2022)
- Method 3 — SelfCheckGPT (Manakul 2023)
- Method 4 — Chain-of-Verification (Dhuliawala 2023)
- Method 5 — LLM-as-Judge với web search
- Method 6 — Citation grounding
- Method 7 — Log-probability confidence
- Benchmark hallucination
- TruthfulQA score 2024-2026
- Cách giảm hallucination ở model
- Mitigation trong prompt
- Hallucination cho code
- Rủi ro trong production
- Monitoring trong production
- Code Python — SelfCheckGPT-style consistency
- Code Python — Chain-of-Verification
- Code Python — FActScore-like
- DeepEval HallucinationMetric
- Landscape 2024-2026
- TruthfulQA pitfall
- Bài tập
Mục tiêu bài học
Sau bài này, bạn cần:
- Phân biệt hallucination intrinsic và extrinsic, lấy ví dụ cụ thể cho mỗi loại.
- Giải thích 4 nhóm nguyên nhân chính: training data xung đột, knowledge cutoff, pressure to answer, pattern completion bias.
- Mô tả 7 phương pháp phát hiện: reference-based, self-consistency, SelfCheckGPT, Chain-of-Verification, LLM-as-Judge có web search, citation grounding, log-prob confidence.
- Biết các benchmark TruthfulQA, FActScore, HaluEval, FELM dùng để đo lường.
- Liệt kê các kỹ thuật giảm hallucination ở tầng model (RAG, refusal training, RLHF) và ở tầng prompt.
- Hiểu rủi ro hallucination trong các use case nhạy cảm (customer support, medical, legal) và cách monitor production.
- Cài và chạy được
HallucinationMetriccủa DeepEval.
Hallucination là gì
Hallucination = LLM generate output với giọng tự tin, trôi chảy, đúng ngữ pháp, đúng format, nhưng nội dung sai sự thật hoặc không có căn cứ. Khác lỗi ngữ pháp hay lỗi format, hallucination khó phát hiện vì câu chữ trông hợp lý.
Đặc trưng hallucination:
─────────────────────────────────────────────────────────
- Trôi chảy, mạch lạc.
- Tự tin về giọng văn ("Theo nghiên cứu năm 2019...").
- Sai ở mức fact (số, ngày, tên, sự kiện, nguồn).
- Không có cảnh báo "tôi không chắc".
- Cần kiến thức ngoài để phát hiện.
Ji et al. 2023 (Survey of Hallucination in Natural Language Generation, arXiv 2202.03629) cung cấp định nghĩa chuẩn hóa được dùng rộng rãi: hallucination là output "không trung thành với input hoặc không phù hợp với thế giới thực".
Intrinsic vs Extrinsic
Hai loại hallucination (Ji 2023):
─────────────────────────────────────────────────────────
Intrinsic
Output mâu thuẫn với input context.
Ví dụ: input ghi "công ty thành lập 2010", output viết
"công ty hoạt động từ 2005".
→ Phát hiện được bằng cách so output với input.
Extrinsic
Output thêm thông tin KHÔNG có trong input và sai factually.
Ví dụ: tóm tắt bài báo về sản phẩm A, model thêm câu
"CEO là John Smith" — input không nhắc, và sai thật.
→ Phát hiện cần kiến thức ngoài (KB, web search).
Trong RAG, intrinsic hallucination tương ứng với faithfulness thấp (output không bám context retrieve), còn extrinsic ít gặp hơn nếu prompt đã ép model chỉ trả lời theo context. Bài 58 đi sâu faithfulness và metric RAG; bài này tập trung khái niệm chung.
5 ví dụ hallucination thường gặp
1. Bịa tác giả / paper
"Theo nghiên cứu của Nguyen et al. 2021 trong tạp chí
Nature Machine Intelligence..."
→ Tác giả không có, paper không tồn tại, tạp chí có thật
nhưng không xuất bản bài đó.
2. Sai ngày / fact
"Albert Einstein nhận giải Nobel năm 1922 cho thuyết
tương đối."
→ Năm sai (1921, trao 1922), lý do sai (cho photoelectric
effect, không phải tương đối).
3. Misattributed quote
"Như Einstein từng nói: 'Không có gì gọi là thất bại,
chỉ có phản hồi.'"
→ Câu này không phải của Einstein, thường gán nhầm
trên Internet.
4. URL ảo
"Xem chi tiết tại https://docs.python.org/3/library/asyncio-typing.html"
→ URL trông hợp lệ, format đúng, nhưng trang không tồn tại.
5. Sai tên hàm code
import pandas as pd
df.merge_left(other, on='id') # không có merge_left
df.merge(other, on='id', how='left') # đúng phải vậy
Năm dạng này xuất hiện trong gần như mọi chatbot LLM khi câu hỏi nằm ngoài knowledge của model hoặc khi prompt buộc model trả lời "có" thay vì "không biết".
Vì sao model hallucinate
4 nhóm nguyên nhân:
─────────────────────────────────────────────────────────
1. Training data có conflict
Cùng 1 sự kiện được mô tả khác nhau trên các nguồn:
Wikipedia vs blog vs Reddit. Model học cả hai → trộn lẫn,
ra phiên bản trung bình không chính xác.
2. Knowledge cutoff
Pretrain corpus dừng ở thời điểm T. Sự kiện sau T model
không biết, nhưng có thể "ghép" từ pattern training cũ.
3. Pressure to answer
RLHF reward "trả lời hữu ích" cao. Model học rằng
nói "tôi không biết" bị phạt → cố nặn câu trả lời.
4. Pattern completion bias
Model là next-token predictor. Khi prompt có cấu trúc
"Theo paper năm ...", model tự nhiên điền số năm và
tên tác giả nghe hợp lý — bất kể có thật hay không.
Tổng hợp 4 nguyên nhân giải thích vì sao hallucination khó "biến mất" hoàn toàn: nó là sản phẩm phụ của chính cách model được huấn luyện. Các giải pháp ở mục 17-18 đều nhắm vào từng nguyên nhân cụ thể.
Tần suất theo loại model
Tần suất hallucination (ước lượng theo FActScore,
HaluEval, báo cáo nhà cung cấp 2024-2026):
─────────────────────────────────────────────────────────
GPT-4 / GPT-4o ~3-5% factual claim sai
Claude Opus / Sonnet Tương đương, một số task thấp hơn
Llama 3.1 70B / 405B ~5-10%
SLM (≤ 7B parameter) 10-20%
Reasoning model Thấp hơn baseline cùng size nhờ
(o1, o3, DeepSeek-R1, verify chain-of-thought nội bộ
Claude 3.7 thinking) trước khi trả lời.
Lưu ý:
- Số phụ thuộc nặng vào benchmark cụ thể.
- Tăng mạnh ở câu hỏi out-of-distribution (long-tail,
multilingual, mới sau cutoff).
- Giảm khi có tool use (search) hoặc RAG.
Các con số trên là điểm vào để so sánh, không phải số tuyệt đối. Khi đánh giá cho dự án thật, luôn dựng test set riêng và đo trên distribution của chính bạn.
Tổng quan 7 phương pháp phát hiện
Phương pháp Cần Phát hiện được
─────────────────────────────────────────────────────────
1. Reference-based KB / web Extrinsic, intrinsic
2. Self-Consistency Sample Extrinsic (qua mâu thuẫn)
3. SelfCheckGPT Sample Extrinsic, sentence-level
4. Chain-of-Verification Prompt Cả hai (qua self-check)
5. LLM-as-Judge + search API search Extrinsic, intrinsic
6. Citation grounding Source DB Cả hai (verify citation)
7. Log-prob confidence Logprob Phát hiện uncertainty
Trong thực tế, không có phương pháp đơn lẻ giải quyết mọi trường hợp. Pipeline production thường kết hợp 2-3 phương pháp: ví dụ citation grounding cho hard fact + LLM-judge cho open-ended + log-prob để chọn case cần human review.
Method 1 — Reference-based fact-check
Quy trình:
─────────────────────────────────────────────────────────
1. Tách output thành các "atomic claim" (mỗi câu = 1 fact).
2. Với mỗi claim:
- Tra trong KB nội bộ / Wikipedia / kết quả search.
- Đánh dấu: support / contradict / not_found.
3. Tính tỉ lệ claim được support → FActScore.
Manual fact-check: chậm, đắt (1-2 phút / claim).
Automated: tốn API search + embedding, độ tin cậy
phụ thuộc retrieval + judge.
Min et al. 2023 (FActScore, arXiv 2305.14251) chuẩn hóa quy trình này: tách thành atomic fact, retrieve evidence từ Wikipedia, dùng LM để verify mỗi fact, tính precision. Đây là gold standard cho long-form generation eval.
Method 2 — Self-Consistency (Wang 2022)
Ý tưởng:
Nếu model thực sự "biết" fact, sample N lần với
temperature > 0 sẽ ra cùng câu trả lời.
Nếu model "đoán", các sample sẽ mâu thuẫn nhau.
Bước:
1. Sample N response (N = 5-20) với temperature 0.7.
2. So các response.
3. Nếu consistency cao → tin cậy hơn.
Nếu mâu thuẫn → flag uncertain → khả năng hallucinate.
Wang et al. 2022 (Self-Consistency Improves Chain of Thought Reasoning, arXiv 2203.11171) đề xuất kỹ thuật này cho reasoning (math, QA). Áp dụng cho hallucination detection là một mở rộng: dùng độ consistency làm signal uncertainty. Hạn chế: tốn N lần inference, và model có thể "tự tin sai" — ra cùng câu trả lời sai ở mọi sample.
Method 3 — SelfCheckGPT (Manakul 2023)
SelfCheckGPT (Manakul et al. 2023, arXiv 2303.08896):
─────────────────────────────────────────────────────────
Zero-resource hallucination detection — không cần KB.
Bước:
1. Sample 1 response chính ở temperature thấp (R0).
2. Sample N response phụ ở temperature cao (R1..Rn).
3. Tách R0 thành các câu s1, s2, ...
4. Với mỗi câu si:
- So si với toàn bộ R1..Rn.
- Đo consistency: BERTScore, n-gram overlap,
hoặc dùng NLI ("Ri có entail si không?").
5. Câu si consistency thấp → khả năng hallucinate.
Variants:
- SelfCheck-BERTScore
- SelfCheck-MQAG (multi-question answering)
- SelfCheck-NLI
- SelfCheck-Prompt (dùng LLM hỏi "đoạn dưới có support
câu này không?")
SelfCheckGPT mạnh ở chỗ không cần external KB, áp dụng được với mọi domain. Yếu điểm: vẫn tốn N lần sample và phụ thuộc giả định "model nhất quán = chính xác" — không phải lúc nào cũng đúng nếu model nhất quán sai.
Method 4 — Chain-of-Verification (Dhuliawala 2023)
CoVe (Dhuliawala et al. 2023, arXiv 2309.11495):
─────────────────────────────────────────────────────────
1. Generate baseline response.
2. Plan verification questions:
"Để kiểm tra câu trên, cần hỏi gì?"
→ Sinh ra list câu hỏi verify từng fact.
3. Execute verification (trả lời từng câu hỏi
ĐỘC LẬP với baseline để tránh anchor bias).
4. Generate final response — chỉ giữ fact pass verify.
Ưu:
- Giảm hallucination 30-50% trên long-form QA
so với baseline (số trong paper).
- Không cần KB nếu model tự verify.
Nhược:
- Tốn 3-4 lần inference.
- Nếu fact sai nhất quán trong model, verify cũng sai.
CoVe là một trong các kỹ thuật prompt-only đơn giản và hiệu quả nhất. Có thể dùng độc lập hoặc kết hợp với RAG: verification question chạy qua retrieval thay vì chỉ qua LLM nội bộ.
Method 5 — LLM-as-Judge với web search
Mở rộng LLM-as-Judge (Bài 56) cho fact-check:
─────────────────────────────────────────────────────────
1. Tách output thành claim.
2. Cấp judge LLM quyền search web / KB.
3. Với mỗi claim:
- Judge tự query.
- Đọc kết quả search.
- Kết luận: support / contradict / inconclusive.
4. Aggregate → tỉ lệ claim đúng.
Ưu điểm: judge có access dữ liệu cập nhật, vượt qua knowledge cutoff. Nhược: tốn API search, judge có thể bị ảnh hưởng bởi nguồn web kém chất lượng, và có bias judge (xem Bài 56). Trong thực tế, dùng cho high-stakes domain (medical, legal) hơn là eval đại trà.
Method 6 — Citation grounding
Cách làm:
─────────────────────────────────────────────────────────
1. Trong prompt yêu cầu LLM trích nguồn (URL, doc id,
span) cho mỗi claim.
2. Verify automatically:
- Citation có tồn tại?
- Đoạn cited có support claim? (NLI hoặc LLM-judge)
3. Claim không có citation hoặc citation không match
→ flag hallucinate.
Format ví dụ:
"Capital of France is Paris [src: wiki:Paris#sec=1]."
"GDP 2024 of VN is $476B [src: imc-2024-report#p12]."
Citation grounding là cơ sở của RAG có trích dẫn (Bing Chat / Perplexity / Claude Sonnet thinking). Bonifacio et al., Gao et al. (RARR, arXiv 2210.08726) và nhiều paper sau cung cấp pipeline tự động attribution. Khi citation bắt buộc trong prompt, tỉ lệ hallucinate giảm đáng kể.
Method 7 — Log-probability confidence
Ý tưởng:
Token có log-probability thấp = model không chắc.
Câu trả lời với token uncertainty cao → khả năng hallucinate.
Bước:
1. Generate output, lưu logprob cho từng token.
2. Tính avg logprob hoặc min logprob theo câu.
3. Threshold: dưới ngưỡng → flag.
Hạn chế:
- Calibration kém: model có thể tự tin sai (high
logprob nhưng sai).
- RLHF model thường over-confident (mất calibration
so với pretrain checkpoint).
- Không phải provider nào cũng expose logprob
(OpenAI có; Anthropic chỉ logprob giới hạn).
Kadavath et al. 2022 (Language Models (Mostly) Know What They Know, arXiv 2207.05221) cho thấy logprob có correlation với độ chính xác, nhưng correlation yếu sau RLHF. Trong thực tế, log-prob confidence là signal phụ, dùng kết hợp với phương pháp khác chứ không nên là phương pháp duy nhất.
Benchmark hallucination
Benchmark Năm Đặc điểm
─────────────────────────────────────────────────────────
TruthfulQA 2022 Lin et al. 817 câu hỏi với
common misconception. Đo khả
năng model tránh đáp án sai
do mê tín / urban legend.
arXiv 2109.07958.
FActScore 2023 Min et al. Atomic fact verify
với Wikipedia. Long-form QA.
arXiv 2305.14251.
HaluEval 2023 Li et al. 35K sample hallucinate
có nhãn cho QA / dialogue /
summarization. arXiv 2305.11747.
FELM 2023 Chen et al. Fact extraction +
verification benchmark.
arXiv 2310.00741.
Khác: TruthfulQA-Multi, Halu-J,
SimpleQA (OpenAI 2024), HaluBench.
Mỗi benchmark có thiên hướng: TruthfulQA test misconception; FActScore test long-form biography; HaluEval test multi-task. Khi báo cáo, ghi rõ benchmark nào, version nào, vì điểm số chỉ so sánh được trong cùng setting.
TruthfulQA score 2024-2026
TruthfulQA (multi-choice, MC2) — số tham khảo:
─────────────────────────────────────────────────────────
GPT-4 / GPT-4o ~78-82%
Claude Opus / Sonnet ~83-87%
Llama 3.1 405B ~73-77%
Llama 3.1 70B ~65-72%
Mistral Large 2 ~70-75%
SLM 1-3B (Phi-3 mini, ~40-60%
Llama-3.2-1B/3B)
Human (chuyên gia) ~94%
Lưu ý đọc số: TruthfulQA MC2 không phản ánh hallucination trong generation tự do. Một model có MC2 cao vẫn có thể hallucinate khi viết long-form. Số trên dùng để so tương đối giữa các model, không phải dự đoán tỉ lệ lỗi production.
Cách giảm hallucination ở model
6 nhóm kỹ thuật:
─────────────────────────────────────────────────────────
1. RAG — ground câu trả lời vào document retrieve được.
Output bám theo context, ít bịa.
2. Citation forcing — bắt model trích nguồn cho mỗi claim.
Verify được tự động.
3. Refusal training — fine-tune để model nói "tôi không
biết" khi không chắc. Trade-off: tăng refuse rate.
4. Better data — clean training data, giảm conflict,
thêm fact-check pair.
5. RLHF với truthfulness reward — reward model phạt
output sai fact. Lin et al., Bai et al., OpenAI
InstructGPT, Anthropic HH-RLHF.
6. Reasoning model — verify internal chain-of-thought
trước khi trả lời. o1 / DeepSeek-R1 / Claude 3.7
thinking giảm hallucinate nhờ self-verify ở thinking phase.
Trong sáu nhóm, RAG và citation forcing là biện pháp dễ áp dụng nhất ở tầng ứng dụng (không cần training). Bốn cách còn lại nằm ở tầng model provider hoặc team có capacity fine-tune.
Mitigation trong prompt
Câu lệnh đơn giản giảm hallucinate đáng kể:
─────────────────────────────────────────────────────────
- "Nếu không chắc, trả lời 'tôi không biết'."
- "Chỉ trả lời dựa trên context được cung cấp.
Không thêm thông tin ngoài."
- "Trích nguồn cho mỗi claim. Nếu không tìm thấy
nguồn, ghi 'no source'."
- "Khi đề cập số / ngày / tên riêng, ghi rõ độ tin cậy
hoặc 'không chắc chắn'."
- "Không bịa URL, paper, tên tác giả. Nếu không nhớ
chính xác, viết '[cần xác minh]'."
Bonus: kết hợp với CoVe prompt:
"Sau khi viết, liệt kê các fact bạn vừa khẳng định
và đánh dấu cái nào bạn không chắc."
Các câu lệnh trên không loại bỏ hallucination hoàn toàn nhưng cải thiện đáng kể với chi phí gần như bằng không. Áp dụng ngay được trong system prompt của chatbot.
Hallucination cho code
Dạng hallucination đặc thù code:
─────────────────────────────────────────────────────────
- Gọi function không tồn tại trong thư viện.
np.linalg.fast_inverse(A) # không có
- Import sai package.
from sklearn.preprocessing import MaxScaler # MinMaxScaler
- Sai signature.
pd.read_csv(path, separator=',') # đúng là sep=','
- Bịa API endpoint (URL, version).
POST /api/v3/users/bulk-update (endpoint không có)
- Tạo type / class không có trong library.
Phát hiện tự động:
- Linter (ruff, pylint).
- Type checker (mypy, pyright).
- Compile / run trong sandbox.
- Static analysis dependency graph.
- LSP gợi ý function tồn tại.
Lợi thế của code: có thể "run" để verify. Pipeline AI coding hiện đại (Aider, Cursor, Claude Code) đều có vòng feedback chạy test / lint sau mỗi sinh code. Đây là dạng "automatic ground truth" hiếm có cho hallucination.
Rủi ro trong production
Mức độ nguy hiểm theo domain:
─────────────────────────────────────────────────────────
Customer support Sai chính sách, sai giá, sai SLA
→ khách hàng giận, refund claim, kiện.
Medical Sai liều, sai chỉ định, sai cảnh báo
tương tác thuốc → ảnh hưởng sức khỏe.
Legal Sai luật, sai án lệ, sai điều khoản
→ thua kiện, vi phạm compliance.
Tài chính Sai tỷ giá, sai cách tính thuế, sai
quy định KYC → tổn thất tiền, phạt.
Compliance Sai quy chuẩn ISO / GDPR / HIPAA
→ phạt nặng, audit fail.
Quy tắc thực hành: domain nào có hậu quả pháp lý / sức khỏe / tài chính cao thì bắt buộc có (a) RAG + citation, (b) human-in-the-loop review, (c) disclaimer rõ ràng, (d) logging đầy đủ để truy vết. Không chỉ dựa model thuần.
Monitoring trong production
Pipeline monitor hallucination:
─────────────────────────────────────────────────────────
1. Log toàn bộ request / response.
2. Sample N% (1-5%) cho human review hàng tuần.
3. Thu thập user feedback:
- Thumbs up / down sau câu trả lời.
- "Report wrong info" button.
- Regenerate count.
4. Tự động flag:
- Câu chứa số / ngày / tên riêng (cao rủi ro).
- Confidence (logprob) thấp.
- User feedback negative.
5. Build "hallucination radar":
- Tỉ lệ flag / ngày theo loại query.
- Top intent có lỗi.
- Trend qua các version model / prompt.
6. Đưa case fail vào regression test set.
Vòng lặp "log → review → bổ sung test set → fix → re-evaluate" là cách bền vững. Một dashboard đơn giản (Grafana / Metabase) trên log đã đủ giá trị; không cần công cụ phức tạp giai đoạn đầu.
Code Python — SelfCheckGPT-style consistency
pip install openai bert-score nltk
from openai import OpenAI
from bert_score import score as bert_score
import nltk
nltk.download("punkt", quiet=True)
from nltk.tokenize import sent_tokenize
client = OpenAI()
def sample(prompt: str, temperature: float, n: int = 1):
r = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
temperature=temperature,
n=n,
)
return [c.message.content for c in r.choices]
def selfcheck(prompt: str, n_samples: int = 5, threshold: float = 0.7):
# 1. Response chính (temp thấp)
main = sample(prompt, temperature=0.0)[0]
# 2. Sample phụ (temp cao)
samples = sample(prompt, temperature=0.8, n=n_samples)
# 3. Tách câu trong main
sentences = sent_tokenize(main)
# 4. Tính BERTScore từng câu vs từng sample
flags = []
for sent in sentences:
sims = []
for s in samples:
P, R, F1 = bert_score([sent], [s], lang="vi", verbose=False)
sims.append(F1.item())
avg_sim = sum(sims) / len(sims)
flags.append({
"sentence": sent,
"consistency": round(avg_sim, 3),
"hallucinate": avg_sim < threshold,
})
return {"main": main, "samples": samples, "checks": flags}
result = selfcheck("Ai là người đoạt giải Nobel Vật lý 1903?")
for c in result["checks"]:
print(c)
Code minh họa nguyên lý SelfCheckGPT. Trong production, dùng package selfcheckgpt (pip install) với các variant NLI / MQAG / Prompt sẽ chính xác hơn BERTScore thuần.
Code Python — Chain-of-Verification
from openai import OpenAI
client = OpenAI()
def ask(prompt: str, temperature: float = 0.0) -> str:
r = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
temperature=temperature,
)
return r.choices[0].message.content.strip()
def cove(question: str):
# 1. Baseline answer
baseline = ask(question)
# 2. Plan verification questions
plan_prompt = (
f"Câu hỏi gốc: {question}\n"
f"Câu trả lời: {baseline}\n"
"Liệt kê 3-5 câu hỏi YES/NO hoặc factual để verify "
"từng fact trong câu trả lời trên. Mỗi câu trên 1 dòng."
)
questions = ask(plan_prompt).split("\n")
questions = [q.strip("- ").strip() for q in questions if q.strip()]
# 3. Execute verification — hỏi ĐỘC LẬP để tránh anchor bias
verifications = []
for q in questions:
a = ask(q) # không kèm baseline
verifications.append({"q": q, "a": a})
# 4. Revise final
revise_prompt = (
f"Câu hỏi gốc: {question}\n"
f"Câu trả lời ban đầu: {baseline}\n"
f"Kết quả verify:\n" +
"\n".join(f"- Q: {v['q']}\n A: {v['a']}" for v in verifications) +
"\nDựa trên verify, viết lại câu trả lời cuối cùng. "
"Loại bỏ fact không pass verify. Nếu không chắc, "
"ghi 'tôi không chắc'."
)
final = ask(revise_prompt)
return {
"baseline": baseline,
"questions": questions,
"verifications": verifications,
"final": final,
}
r = cove("Hãy mô tả tiểu sử ngắn của nhà toán học Évariste Galois.")
print("BASELINE:", r["baseline"][:200])
print("FINAL :", r["final"][:200])
CoVe pattern này áp dụng tốt cho biography, fact-heavy QA, technical writeup. Với reasoning model (o1 / Claude 3.7 thinking), một phần CoVe đã được thực hiện ngầm trong thinking phase, dùng prompt CoVe vẫn cải thiện nhưng biên độ nhỏ hơn.
Code Python — FActScore-like
from openai import OpenAI
client = OpenAI()
def ask(prompt: str) -> str:
r = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}],
temperature=0.0,
)
return r.choices[0].message.content.strip()
def extract_atomic_facts(text: str) -> list[str]:
prompt = (
"Tách đoạn văn dưới thành các câu fact riêng lẻ, "
"mỗi câu chỉ chứa 1 thông tin. Mỗi câu trên 1 dòng.\n\n"
f"Đoạn văn:\n{text}"
)
out = ask(prompt)
return [line.strip("- ").strip() for line in out.split("\n") if line.strip()]
def verify_fact(fact: str, evidence: str) -> str:
prompt = (
f"Fact: {fact}\n"
f"Evidence: {evidence}\n"
"Evidence có support fact không? Trả về: SUPPORT / "
"CONTRADICT / NOT_FOUND."
)
return ask(prompt)
def fact_score(text: str, retrieve_fn):
facts = extract_atomic_facts(text)
results = []
supported = 0
for f in facts:
evidence = retrieve_fn(f) # ví dụ: search Wikipedia
verdict = verify_fact(f, evidence)
results.append({"fact": f, "verdict": verdict})
if verdict.startswith("SUPPORT"):
supported += 1
return {
"facts": results,
"score": supported / len(facts) if facts else 0.0,
}
# Demo: retrieve_fn trả về string evidence — thay bằng RAG thật
def dummy_retrieve(q):
return "(insert search result here)"
r = fact_score("Évariste Galois sinh năm 1811 tại Paris...", dummy_retrieve)
print("FActScore:", r["score"])
Pipeline FActScore thật dùng Wikipedia + dense retrieval + LM verifier có fine-tune. Đoạn trên đủ làm khung; thay dummy_retrieve bằng RAG (Bài 58) hoặc Wikipedia API là chạy được.
DeepEval HallucinationMetric
pip install -U deepeval
from deepeval.metrics import HallucinationMetric
from deepeval.test_case import LLMTestCase
# threshold = ngưỡng pass (0-1). Càng cao càng nghiêm.
metric = HallucinationMetric(threshold=0.5, model="gpt-4o-mini")
test_case = LLMTestCase(
input="Tóm tắt đoạn sau.",
actual_output=(
"Công ty X thành lập năm 2010 tại Hà Nội bởi "
"Nguyễn Văn A và có 500 nhân viên năm 2024."
),
context=[
"Công ty X thành lập năm 2010 tại Hà Nội. "
"Founder là Trần Thị B. Số nhân viên hiện chưa công bố.",
],
)
metric.measure(test_case)
print("Score :", metric.score)
print("Reason:", metric.reason)
print("Pass :", metric.is_successful())
DeepEval đo intrinsic hallucination dạng pytest-style: so actual_output với context ground truth, dùng judge LLM tách claim và verify. Tích hợp được vào CI: mỗi commit chạy test set 50-200 case và fail build nếu score giảm.
Landscape 2024-2026
3 xu hướng giảm hallucination 2024-2026:
─────────────────────────────────────────────────────────
1. Reasoning model (o1, o3, DeepSeek-R1, Claude 3.7
thinking) hallucinate ít hơn baseline cùng size nhờ
verify chain-of-thought trước khi trả lời.
2. Tool use (search, code interpreter, KB query) đã
tiêu chuẩn ở mọi API lớn. Khi model gọi search rồi
trả lời, hallucination giảm rõ rệt.
3. Grounded generation (RAG) trở thành default cho
doc QA, customer support, knowledge agent.
Mọi framework (LangChain, LlamaIndex, Haystack)
đều có pipeline RAG sẵn.
Hậu quả thực tế:
- Hallucination KHÔNG biến mất nhưng giảm theo từng
đợt cải tiến.
- Đo lường vẫn cần — không có model nào "free of
hallucination" trên distribution thật.
- Pipeline hybrid (reasoning + tool + RAG + verify)
là kiến trúc phổ biến cho high-stakes app.
Lưu ý: reasoning model hallucinate ít hơn trong tasks có verify được (math, code, logic) nhưng vẫn có thể bịa khi thinking đi sai hướng. Không có "fix" duy nhất.
TruthfulQA pitfall
Cẩn thận khi đọc TruthfulQA score:
─────────────────────────────────────────────────────────
- 817 câu là một sample nhỏ, có thể bị contaminate
(xem Bài 54). Các câu phổ biến trên Internet có thể
đã nằm trong pretrain corpus.
- Multi-choice (MC1, MC2) khác với open-ended:
model giỏi MC chưa chắc giỏi viết long-form đúng.
- Bias dataset: chủ yếu English, chủ yếu common
misconception phương Tây.
- Một bộ test KHÔNG đại diện cho production của bạn.
Khuyến nghị:
- Dùng TruthfulQA như 1 trong nhiều signal, không phải
số quyết định.
- Xây test set hallucination riêng cho domain bạn dùng.
- Đo trên multiple benchmark (TruthfulQA + FActScore
+ HaluEval + test set nội bộ).
- Re-evaluate khi đổi model hoặc fine-tune.
Goodhart's Law (Bài 54) áp dụng mạnh ở đây: nếu provider optimize cho TruthfulQA, điểm tăng nhưng hallucination thật ngoài đời có thể không giảm tương ứng. Đánh giá đa chiều quan trọng hơn 1 con số.
Bài tập
- Sinh 5 historical claim từ GPT-4o-mini (ví dụ: "Ai phát minh điện thoại?", "Năm nào Việt Nam gia nhập WTO?", "Tác giả cuốn 'Số đỏ' là ai?"). Fact-check thủ công bằng Wikipedia, ghi nhận tỉ lệ đúng.
- Implement self-consistency: với 1 câu hỏi, sample 5 lần với temperature 0.8, đếm số response nhất quán. So với câu trả lời temperature 0.
- Áp dụng pipeline CoVe ở bước 23 cho 1 prompt "viết tiểu sử nhân vật ít nổi tiếng". So sánh baseline và final response — đếm số fact bịa.
- So sánh hallucination rate gpt-4o-mini vs gpt-4o trên 20 câu hỏi chuyên ngành (chọn domain bạn quen) bằng
HallucinationMetriccủa DeepEval. - Đọc paper SelfCheckGPT (arXiv 2303.08896), so các variant MQAG / NLI / Prompt — variant nào phù hợp nhất với dự án của bạn? Vì sao?
- Viết một system prompt mitigation cho chatbot customer support: kèm 5 nguyên tắc tránh hallucinate, ép trả lời "tôi cần kiểm tra lại" khi không chắc.
- (Mở rộng) Tích hợp
HallucinationMetricvào CI: tạo test set 30 case, chạy mỗi PR; fail build nếu score < threshold.
- Ji et al. — Survey of Hallucination in Natural Language Generation (arXiv 2202.03629)
- Lin et al. — TruthfulQA: Measuring How Models Mimic Human Falsehoods (arXiv 2109.07958)
- Min et al. — FActScore: Fine-grained Atomic Evaluation of Factual Precision (arXiv 2305.14251)
- Li et al. — HaluEval: A Large-Scale Hallucination Evaluation Benchmark (arXiv 2305.11747)
- Chen et al. — FELM: Benchmarking Factuality Evaluation of Large Language Models (arXiv 2310.00741)
- Manakul et al. — SelfCheckGPT: Zero-Resource Hallucination Detection (arXiv 2303.08896)
- Dhuliawala et al. — Chain-of-Verification Reduces Hallucination (arXiv 2309.11495)
- Wang et al. — Self-Consistency Improves Chain of Thought Reasoning (arXiv 2203.11171)
- Kadavath et al. — Language Models (Mostly) Know What They Know (arXiv 2207.05221)
- Gao et al. — RARR: Researching and Revising What Language Models Say (arXiv 2210.08726)
- Tonmoy et al. — A Comprehensive Survey of Hallucination Mitigation Techniques (arXiv 2311.08401)
- SelfCheckGPT — Reference implementation
- FActScore — Reference implementation
- HaluEval — Benchmark and dataset
- DeepEval — HallucinationMetric documentation
- Vectara — Hallucination Leaderboard cho summarization
- OpenAI — SimpleQA benchmark for factuality
