AI Hallucination — Tại sao LLM "bịa" và 6 tầng phòng thủ cho dev
Hallucination không phải bug mà là bản chất của next-token prediction. Bài đi sâu vào 4 cơ chế gây hallucinate, taxonomy 6 dạng dev thường gặp, và pyramid 6 tầng phòng thủ từ type-check đến human review.
Có một sự thật khó chịu về LLM mà dev phải hiểu trước khi dùng chúng ngày nào cũng hỏi: model không biết khi nào nó đang sai. Nó trả lời câu bịa với cùng độ tự tin như câu đúng. Và khác với người — người biết “cái này mình không chắc” — LLM không có cảm giác đó.
Đây là hallucination. Và nó không phải bug của ChatGPT hay Claude hay Gemini. Nó là đặc tính kiến trúc của mọi LLM hiện tại. Hiểu sâu để work around, không phải chờ “version tới sẽ hết”.
Bài này chia 2 phần: (1) vì sao hallucination chắc chắn xảy ra, và (2) 6 tầng phòng thủ bạn build vào workflow để hallucination không thành bug production.
1. Hallucination là gì — định nghĩa chính xác
Hallucination = model tạo output nghe plausible nhưng không có căn cứ trong training data hoặc context.
Từ “plausible” là chìa khoá. Output hallucinate không phải random gibberish — nó trông hợp lý đến mức bạn có thể không phát hiện:
// Hỏi model: 'Làm sao list user từ Supabase với limit 10?'
const { data } = await supabase
.from('users')
.select('*')
.limit(10)
.orderBy('created_at', 'desc'); // ← không có method này!
.orderBy() thực sự có trong Supabase? Không. Method đúng là .order('created_at', { ascending: false }).
Model trộn syntax từ Prisma / Mongoose / SQL vì tất cả nghe “giống
ORM”. Output đẹp, compile pass với TypeScript loose, runtime mới throw.
Nếu bạn không biết Supabase sẵn → copy-paste → bug.
2. Vì sao hallucination là bắt buộc phải xảy ra
Nghe cực đoan, nhưng đúng về mặt toán học. LLM hoạt động theo nguyên lý:
Input: "chuỗi token đã có"
Output: phân phối xác suất p(next_token | context)
Model chọn: token có xác suất cao nhất (hoặc sample từ phân phối)
Mọi next token đều có xác suất dương. Nghĩa là:
- Không có “token nào không được phép”.
- Không có cách nào model “nhận ra câu sau không thể có token X” theo kiểu logical reasoning.
- Nó chỉ biết pattern từ training data.
Khi context đưa vào là câu hỏi model chưa từng thấy data tương tự:
Q: "Hàm useDeepMemo của React 19 signature là gì?"
Model không có câu trả lời đúng trong training. Nhưng có hàng triệu
ví dụ useMemo(() => value, deps). Pattern mạnh → model output
signature tương tự với tên useDeepMemo. Xác suất output này cao hơn
“I don’t know”.
Muốn model nói “I don’t know”, phải train nó biết chấp nhận uncertainty — đây là một trong những bài toán khó nhất của AI hiện tại (mấy nghiên cứu calibration, abstention learning). Có tiến bộ, nhưng xa hoàn hảo.
Tóm lại: miễn model còn hoạt động theo next-token prediction, hallucinate là feature, không phải bug. Không có version nào “fix” được hoàn toàn.
3. 4 cơ chế gây hallucination phổ biến
3.1. Knowledge cutoff
Training data có ngày cut-off. Framework/library ra sau ngày đó → model phải đoán.
- React 19 ra 12/2024. Model train data end-2023 → đoán API dựa trên React 18 patterns.
- Astro 5 thay đổi content collections API cuối 2024.
- Next.js App Router thay đổi 3 lần trong 18 tháng.
Càng ecosystem “nhanh”, càng dễ hit cutoff.
3.2. Pattern bleeding
Model thấy nhiều framework có pattern giống → trộn lẫn:
# Hỏi Django query
queryset = User.objects.where(age__gt=18).order_by('name').limit(10)
Django dùng .filter(), không .where(). Model trộn với SQLAlchemy /
Prisma. Cũng .limit() — Django phải dùng slice [:10].
3.3. Confabulation dưới áp lực
User hỏi liên tục, model “muốn” giúp → cố gắng output gì đó thay vì “không biết”.
You: "Function này có bug? [paste code]"
AI: "Có, dòng 5 thiếu null check."
You: "Sửa dùm."
AI: [sửa, pattern match với null check chung]
You: "Sao vẫn lỗi?"
AI: "À có thể do dòng 12..."
Đây là confabulation — khi model không biết cause thật, nó đoán rồi đoán. Mỗi lần bạn feedback “vẫn lỗi”, model tự tạo hypothesis mới, không dựa trên understanding thật.
3.4. Context corruption
Context dài, AI đọc lướt. Đến cuối, nó miss thông tin ở đầu:
[100KB context ở đầu: tổng quan project, convention, không dùng axios]
...
[câu hỏi cuối: "gọi API thế nào?"]
AI output: const res = await axios.get('/api/...')
Không phải AI cố tình đi ngược convention — nó miss convention vì context quá dài. Đây là “lost in the middle” problem, có nghiên cứu chính thức.
4. Taxonomy 6 dạng hallucination dev thường gặp
Dạng 1: Method / API không tồn tại
array.shuffle(); // JS array không có .shuffle()
element.getTextContent(); // DOM API đúng là .textContent property
Pattern: tên nghe đúng, method thật thì khác chút.
Dạng 2: Import sai vị trí
import { useDebounce } from 'react'; // React không export useDebounce
import { Button } from '@shadcn/ui'; // Path thật là '@/components/ui/button'
Pattern: package/path plausible nhưng sai detail.
Dạng 3: Config option bịa
{
"tsconfig": {
"noImplicitAnyExport": true,
"strictOptionalProperties": "safe"
}
}
Sound technical, nhưng không có trong tsconfig schema.
Dạng 4: Type signature sai
// AI nói: React.useState trả về [state, setState, reset]
const [count, setCount, resetCount] = useState(0);
// Thực tế: chỉ 2 phần tử.
Dạng 5: Behavior implication sai
// AI nói: 'Array.prototype.sort không mutate'
const sorted = arr.sort();
// Thực tế: sort mutate arr GỐC + return reference của nó.
Code chạy không crash. Nhưng mental model của bạn bị corrupt — bugs lan ra chỗ khác.
Dạng 6: URL / reference ảo
"Xem thêm ở React docs: https://react.dev/reference/hooks/useDeepMemo"
URL valid format. Click vào 404. Model tạo URL theo pattern, không lookup thật.
5. Pyramid 6 tầng phòng thủ
┌──────────────┐
│ 6. Human │ Review PR, commit, merge
│ review │
┌───┴──────────────┴───┐
│ 5. Production │ Feature flag, canary, rollback
│ observability │
┌───┴──────────────────────┴───┐
│ 4. Integration + E2E test │ Behavior verification
┌───┴──────────────────────────────┴───┐
│ 3. Unit test │ Logic đúng
┌───┴──────────────────────────────────────┴───┐
│ 2. Lint + static analysis │ Style + import valid
┌───┴──────────────────────────────────────────────┴───┐
│ 1. Type-check (TypeScript, mypy...) │ Method tồn tại, signature đúng
└──────────────────────────────────────────────────────┘
Hallucination bị filter ở tầng thấp nhất catch được. Hiếm khi leak qua hết 6 tầng.
Tầng 1: Type-check
Tầng đầu và quan trọng nhất. TypeScript strict mode catch:
- Method không tồn tại →
Property 'orderBy' does not exist on... - Signature sai →
Argument of type X not assignable to Y - Import sai →
Module has no exported member
Bắt buộc: strict mode + noUncheckedIndexedAccess + exactOptionalPropertyTypes.
Không strict → type any ngầm → AI bịa method, TS không báo.
Tầng 2: Lint + static analysis
- ESLint catch: unused import (AI hay import thừa), unreachable code, no-undef.
- Custom rule: cấm
any, cấm@ts-ignore(AI hay dùng để “make it work”), cấm import từ path không tồn tại.
Tầng 3: Unit test
Type đúng chưa đủ. Behavior phải đúng:
test('sort returns sorted copy without mutating', () => {
const original = [3, 1, 2];
const sorted = sortAsc(original);
expect(sorted).toEqual([1, 2, 3]);
expect(original).toEqual([3, 1, 2]); // ← check mutation
});
Test này catch được “Dạng 5 — behavior implication sai” mà type-check không thấy.
Tầng 4: Integration + E2E
Unit test với mock → AI có thể “mock đúng với hallucination”. E2E test chạy thật → catch:
- Config option bịa (app không start hoặc runtime error)
- URL sai (404 trong test)
- DB query sai (empty result hoặc SQL error)
Tầng 5: Production observability
Lọt qua 4 tầng trên → tầng 5 bảo vệ user:
- Feature flag: tắt ngay khi có báo lỗi.
- Canary deploy: 5% traffic → thấy spike error → rollback trước khi 100% user bị ảnh hưởng.
- Error tracking (Sentry…): stack trace cho mọi exception.
- Structured log: query được bằng pattern.
Tầng 6: Human review
Cuối cùng là mắt người. Dev reviewer có context tribal:
- “Team từ năm ngoái quyết định không dùng axios.” → AI không biết.
- “Field
statusphải dùng enum từ@/types/order, không phải string.” → AI miss. - “Function này nhìn đúng nhưng performance sẽ vỡ với >1000 rows.” → AI không biết data distribution.
Quy tắc: người review phải hiểu từng dòng diff. Không “accept all” mà không đọc.
6. Khi nào AI ít hallucinate hơn
Hiểu điều kiện → giảm tần suất:
- Context càng cụ thể càng tốt: attach file thật, dán docs, link ticket. Không để AI đoán.
- Tool/MCP đọc docs real-time (Context7…): giảm hallucinate version lib rõ rệt.
- Thinking models (Claude thinking, o1-preview…): chậm hơn, thường bảo thủ hơn — sẵn sàng nói “chưa chắc” hơn.
- Grounding trong retrieval: RAG setup tốt → AI nhìn source thật, giảm confabulate.
- Task well-defined: “Refactor function này theo 3 rule cụ thể” hallucinate ít hơn “Improve this code”.
Và ngược lại, điều kiện AI dễ hallucinate:
- Context mơ hồ (“fix this”).
- Library non-mainstream / mới / internal.
- Task mở (“design architecture for…”).
- Conversation dài + zero feedback loop.
7. Socratic method — ép AI tự phát hiện hallucination
Technique không ai hay nhắc: hỏi AI xác thực chính output của nó:
You: "Viết function X"
AI: [code với .orderBy()]
You: "Check lại output trên. Xác thực từng method/import có thật trong
version library X.Y.Z không. Nếu không chắc, nói 'chưa chắc'."
Khoảng 60-70% case, AI tự phát hiện sai và revise. Không phải vì AI “nhớ ra” — mà vì câu hỏi verification kích hoạt pattern check khác (pattern “kiểm tra docs” thay vì pattern “generate code”).
Không phải silver bullet, nhưng là layer kiểm tra free, chi phí 5s và vài hundred token.
8. “You’re absolutely right” — confabulation trá hình
Một dạng hallucination tinh vi: model đồng ý với giả thuyết sai của bạn.
You: "Tôi nghĩ bug là do useEffect bị gọi 2 lần trong strict mode."
AI: "You're absolutely right! Trong strict mode, useEffect..."
[AI tiếp tục generate content support giả thuyết]
Thực tế bug có thể là race condition không liên quan strict mode. Model được reward khi user happy → xuôi theo user.
Countermeasure:
- Đừng đưa giả thuyết quá sớm. Chỉ mô tả symptom, để AI đưa hypothesis.
- Sau khi AI đồng ý, challenge: “Chứng minh đi. Cho tôi test case reproduce giả thuyết đó.”
- Nếu AI không reproduce được → giả thuyết sai (dù cả 2 đang đồng ý).
Đây là lý do minimal reproduction (xem bài debugging) quan trọng: nó objective hóa debate, chống confabulation.
9. Khi nào hallucination nguy hiểm nhất
Không phải mọi hallucination đều equal. Ranking theo mức nguy hiểm:
| Mức | Loại | Ví dụ |
|---|---|---|
| 🔴 Cực cao | Security / crypto | AI “implement” encryption bằng base64 |
| 🔴 Cao | Payment / money | AI tính tax sai decimal |
| 🟡 Trung bình | Logic nghiệp vụ core | AI sort wrong field |
| 🟡 Thấp-TB | UI behavior | AI trigger event sai name |
| 🟢 Thấp | Style / format | AI dùng tab thay vì space |
Tầng phòng thủ càng phải dày khi mức càng cao. Security code không được trust AI output mà không có:
- Unit test với known-correct vector (RFC test vectors cho crypto).
- Security review bởi người thật.
- Audit trail (ai approve, khi nào).
10. Hallucination trong tương lai
Model ngày càng giỏi. Hallucination giảm tần suất nhưng không biến mất. Vì sao?
- Coverage gap: ecosystem tech mới hàng tuần. Training data luôn trễ.
- Domain specificity: internal code của công ty → không model nào train được.
- Ambiguity của ngôn ngữ tự nhiên: cùng 1 prompt, 10 interpretation. Model chọn 1 → có thể sai.
Điều thay đổi là:
- Model mạnh hơn ở “biết mình không biết” (calibrated uncertainty).
- Tool-use / retrieval tốt hơn → grounding thực tế hơn.
- Interactive agent loop → verify step-by-step, ít gom chung sai.
Nên bộ skill “verify AI output” tăng giá trị theo thời gian, không giảm. Đầu tư giờ, xài 5-10 năm tới.
11. Nguyên tắc làm việc với LLM
Tổng kết thành 5 câu:
- LLM là confident bullshitter by design. Không phải bug, là nature.
- Mọi output là hypothesis, không phải fact. Verify trước khi commit.
- Pyramid phòng thủ 6 tầng — hallucinate nào cũng filter được ở 1 tầng.
- Prompt cụ thể = giảm tần suất hallucinate 10x.
- Don’t trust confidence của AI. Trust test + type + review.
Dev làm tốt với AI không phải dev “tin AI hơn”. Ngược lại — dev hoài nghi có phương pháp hơn.
Đọc thêm trong series
- Tokens & Pricing — chi phí thật của AI coding
- Working with Coding Agents
- Finding and Fixing Bugs with AI
- Reviewing and Testing Code with AI
Reference
- Google Research — “Lost in the Middle” (arxiv.org/abs/2307.03172)
- Anthropic — Calibration & uncertainty papers
- Cursor Learn (cursor.com/learn) — course nhập môn AI coding tiếng Anh