Có một quan niệm khá phổ biến về AI hallucination (ảo giác): chủ yếu là do prompt xấu, đưa context tốt hơn là nó hết bịa. Đấy là câu chuyện dễ chịu — sửa prompt, sửa output, mọi thứ trong tầm kiểm soát. Thực tế rối hơn thế nhiều. Hallucination có lớp lang, và context chỉ là lớp trên cùng.
Context quan trọng, nhưng không phải tất cả
Context xấu chắc chắn gây ra hallucination. Prompt mơ hồ, quá dài, nhiều nhiễu, hoặc chứa giả định sai ngay từ đầu — model dễ bám vào tín hiệu sai hoặc phải “đoán cho tròn câu.” Đầu ra nghe hợp lý nhưng không đúng.
Hỏi kiểu “so sánh nó với bản cũ hơn” mà không nói “nó” là gì, model sẽ tự suy diễn. Có khi đúng, có khi tự tin mô tả so sánh giữa hai thứ chưa từng tồn tại. Nhét quá nhiều tài liệu vào một context window giới hạn, model bỏ sót phần quan trọng hoặc nối nhầm các mẩu thông tin — output vẫn mượt mà, sự thật thì sai.
Context hygiene quan trọng thật. Nhưng ngay cả với prompt hoàn hảo, hallucination vẫn xảy ra, vì vấn đề nó nằm sâu hơn prompt.
Ba lớp của hallucination
Lớp 1: Prompt và context. Cái này ai cũng nói tới. Prompt mơ hồ, thông tin mâu thuẫn, thiếu ràng buộc. Sửa được: viết prompt rõ hơn, bỏ nhiễu, nói rõ mình muốn gì và không muốn gì.
Lớp 2: Bản thân model. Đây mới là phần khó chịu. LLM không tra cứu sự thật từ database — nó dự đoán token tiếp theo có xác suất cao nhất trong ngữ cảnh hiện tại. Toàn bộ mục tiêu huấn luyện là “sinh ra văn bản trông có vẻ đúng”, không phải “sinh ra văn bản đúng sự thật.” Một câu trả lời trôi chảy, tự tin và một câu trả lời đúng về mặt thực tế là hai thứ khác nhau, mà model được tối ưu cho cái thứ nhất.
Thêm nữa, LLM API hiện tại đều stateless. Mỗi request model chỉ thấy đúng tokens trong request đó. Muốn nó nhớ đoạn chat trước? Phải gửi lại toàn bộ lịch sử. Thiếu gì là nó đoán, mà đoán là sai chồng sai. Context window cũng hữu hạn — vấn đề đủ phức tạp là phải có thứ bị bỏ, model không nói cho bạn biết nó quên gì, cứ tiếp tục chắp vá suy luận từ những mảnh còn sót lại. Nghiên cứu cũng chỉ ra: context càng dài, chất lượng suy luận càng giảm.
Lớp 3: Dữ liệu huấn luyện và tri thức bên ngoài. Đây là nền móng. Dữ liệu huấn luyện thiếu, lệch, hoặc có thông tin sai — model học ra các tương quan không đúng từ ngày đầu. Kiến thức lỗi thời — model tự tin trả lời về sự kiện xảy ra sau thời điểm huấn luyện. Overfitting — model nhớ pattern nhưng không tổng quát hóa được, input hơi khác một tí là suy luận lệch. Kiến thức trong LLM bị nén vào trọng số, không gắn với nguồn cụ thể: model “biết” điều gì đó nhưng không biết nó đến từ đâu. Và nó luôn có xu hướng cố trả lời thay vì nói “tôi không biết” — nên hễ có lỗ hổng là nó tự lấp bằng thứ nghe hợp lý.
Trong thực tế thì sao
Mình đã ngừng hỏi “có phải hallucination không?” mà chuyển sang “nó đến từ lớp nào?”
Claude Code tự tin bịa ra một function không tồn tại trong codebase — thường là Lớp 1: không đưa đủ context về những gì thực sự có trong dự án. Nó đưa ra lời giải thích nghe cực kỳ hợp lý cho con bug nhưng hoàn toàn sai — thường là Lớp 2: model xây dựng một câu chuyện mạch lạc từ việc chọn token theo xác suất, chứ không phải từ hiểu biết runtime state thực tế. Nó trích dẫn một tính năng thư viện không tồn tại hoặc một API đã deprecated hai năm trước — đó là Lớp 3: vấn đề dữ liệu huấn luyện hoặc kiến thức lỗi thời.
Biết hallucination đến từ lớp nào thay đổi cách phản ứng. Lớp 1 — sửa prompt. Lớp 2 — đọc từng dòng code sinh ra, hỏi “tại sao” chứ không chỉ “làm thế nào.” Lớp 3 — đưa tài liệu liên quan vào context (RAG) thay vì tin vào kiến thức có sẵn của model.
Cách giảm thiểu trong thực tế
Không có gì triệt tiêu được hallucination hoàn toàn, nhưng mấy thứ sau giúp giảm đáng kể:
- Viết prompt rõ đến mức ngớ ngẩn. Nêu đúng thực thể, thời gian, phạm vi, tiêu chí. “Viết một function” là lời mời gọi hallucination. “Viết một TypeScript function validate email theo chuẩn RFC 5322, return
{ valid: boolean, reason?: string }” thì an toàn hơn nhiều. - Context ngắn gọn nhưng đủ. Bỏ nhiễu, bỏ mâu thuẫn, bỏ ba cách tiếp cận khác mà mình đã quyết định không dùng. Mỗi mẩu thông tin thêm vào là thêm một cơ hội để model rối về cái gì quan trọng.
- Với mọi thứ cần độ chính xác cao hoặc dữ liệu mới, đưa nguồn trực tiếp vào context. Đừng hỏi model nó “biết” gì — nó không biết, nó dự đoán. Đưa tài liệu vào và bảo nó chỉ trả lời dựa trên tài liệu đó.
- Yêu cầu nêu nguồn và chuỗi suy luận — không phải vì model có thể xác minh sự thật (nó không thể), mà vì nhìn được cách nó suy luận giúp mình dễ phát hiện chỗ nó sai hơn. Một hallucination có chuỗi suy luận là một bug mình debug được. Một hallucination không có suy luận chỉ là lời khẳng định mình có thể tin nhầm.
- Đọc output. Tất cả. Bước dễ bỏ nhất, và cũng quan trọng nhất.
Tóm lại
“Hallucination là do context xấu” là câu chuyện dễ chịu — nó hàm ý mình hoàn toàn kiểm soát được nếu viết prompt tốt hơn. Sự thật kém dễ chịu hơn: hallucination được xây dựng sẵn trong cách LLM hoạt động. Next-token prediction sinh ra văn bản trông có vẻ đúng, không phải văn bản đúng sự thật. Dữ liệu huấn luyện có lỗ hổng và thiên lệch. Kiến thức lạc hậu theo thời gian. Model không thể kiểm chứng sự thật, cũng không tự nói “tôi không biết.” Prompt tốt hơn giúp được, kiến trúc tốt hơn giúp được, RAG giúp được. Nhưng kỹ năng thực sự không phải là ngăn chặn hallucination — mà là thói quen kiểm chứng mọi thứ, kể cả khi câu trả lời nghe hoàn hảo. Cái hallucination cắn đau nhất không phải cái trông có vẻ sai — mà là cái trông có vẻ đúng.