AI Core cho lập trình viên/Bốn kiểu hỏng của RAG
43/54
Bài 43 / 54~13 phútEmbedding, tìm kiếm & RAGMiễn phí lượt xem

Bốn kiểu hỏng của RAG

RAG giảm bịa nhưng không triệt tiêu. Bốn failure mode có tên chuẩn cho bạn khung chẩn đoán: hỏng ở retrieval hay generation, và generation hỏng theo kiểu nào.

TL;DR: RAG (bài trước) giảm hallucination bằng cách neo model vào đoạn tài liệu retrieve được, nhưng không triệt tiêu — model vẫn xử lý sai ngay cả khi có đúng đoạn trong tay. Sửa một hệ RAG hỏng, việc đầu tiên là cô lập bước hỏng: đáp án có trong kho tài liệu không, có được retrieve vào context không, rồi mới hỏi generation xử lý sao. Bốn cách generation có thể xử lý sai có tên chuẩn — noise robustness, negative rejection, information integration, counterfactual robustness — cho bạn khung tra cứu thay vì đoán mò.

Nhóm ở bài trước vừa dựng xong pipeline RAG cho chatbot tra policy nội bộ. Tuần triển khai đầu tiên, bốn ticket "bot trả lời sai" đổ về gần như cùng lúc:

  • Ticket 1: Hỏi "Nghỉ phép năm áp dụng cho intern không?" — bot trộn quy định nhân viên chính thức với đoạn nói về lương thực tập, hai đối tượng bị gộp làm một.
  • Ticket 2: Hỏi "Công ty có áp dụng tuần làm việc 4 ngày không?" — chính sách chưa từng tồn tại. Bot trả lời chắc nịch: "Có, áp dụng từ quý này."
  • Ticket 3: Hỏi "Tổng ngày nghỉ phép cộng dồn sau ba năm?" — đáp án cần cộng số ngày cơ bản (một đoạn) với thâm niên (đoạn khác). Bot chỉ lấy số ở đoạn đầu.
  • Ticket 4: Hỏi "Mức phụ cấp đi lại hiện tại?" — kho có bản nháp cũ (số lỗi thời) và bản đã duyệt (số mới), cả hai đều được retrieve đúng. Bot trích số ở bản nháp cũ.

Bốn ticket, cùng triệu chứng bề mặt ("bot trả lời sai"), nhưng đổ lỗi cho generation ngay lập tức là vội. Bài này dựng khung chẩn đoán để tách chúng ra.

Nhớ lại Hallucination

Model không có khái niệm đúng/sai, chỉ có phân phối xác suất token kế tiếp — khi phân phối đó không được neo bởi dữ liệu train hay context đủ thông tin, model vẫn phải chọn ra một token, sinh ra câu trả lời trôi chảy nhưng bịa. RAG là một cách neo context tốt hơn, nhưng bốn failure mode trong bài này chính là các cách cái neo đó vẫn có thể lỏng.

Nhớ lại Chunking

Tài liệu bị cắt thành đoạn (chunk) trước khi embed và index, vì embedding có độ dài cố định và context model có giới hạn. Chunk sai kích cỡ hoặc mất ngữ cảnh biên là nguồn gây retrieval hỏng — đúng đoạn nhưng đoạn đó tự nó đã thiếu hoặc lẫn thông tin, ảnh hưởng tới cả bốn failure mode ở bài này.

1. Analogy — thủ thư và người đọc

Bạn nhờ thư viện tìm tài liệu trả lời một câu hỏi. Hai vai trò tách biệt: thủ thư đi tìm và mang về trang liên quan (retrieval), người đọc cầm đúng trang đó và trả lời (generation). Thủ thư có thể mang nhầm sách, bỏ sót cuốn đúng — lỗi xảy ra trước khi người đọc chạm vào trang nào. Nhưng giả sử thủ thư mang đúng hết: người đọc vẫn có thể hỏng theo bốn kiểu — bị phân tâm bởi trang lạc đề kẹp chung xấp giấy, không dám nói "không có câu trả lời" mà bịa đại, chỉ đọc trang đầu quên trang sau dù cả hai đều cần, hoặc tin theo một trang ghi sai/lỗi thời. Bốn failure mode trong bài này toàn bộ là lỗi của người đọc, không phải lỗi thủ thư.

Thư việnRAGHỏng ở đâu
Thủ thư mang nhầm/thiếu sáchRetrieval fetch nhầm/sót đoạnRetrieval (ngoài 4 mode)
Người đọc bị trang lạc đề làm phân tâmNoise robustnessGeneration
Người đọc không dám nói "không có", bịa đạiNegative rejectionGeneration
Người đọc chỉ đọc trang đầu, quên trang sauInformation integrationGeneration
Người đọc tin theo một trang ghi sai/lỗi thờiCounterfactual robustnessGeneration

Một câu để nhớ: thủ thư mang nhầm sách = retrieval hỏng (ngoài 4 mode); người đọc đọc sai dù cầm đúng sách = 4 mode, ở generation.

2. RAG trả lời sai — hỏng ở bước nào?

Trước khi gọi tên một mode, cô lập bước hỏng bằng ba câu hỏi tuần tự — thứ tự quan trọng, bỏ qua bước đầu là nguồn phổ biến nhất khiến người đọc mode sai.

Cây chẩn đoán: đáp án vắng trong kho là negative rejection, có mà không được retrieve là retrieval hỏng, qua cả hai thì lỗi ở generation

Điểm mấu chốt là thứ tự: chỉ khi đã loại được "đáp án vắng mặt trong kho" (B1) và "retrieve sót" (B2) thì lỗi mới chắc chắn ở generation — lúc đó đặc điểm context cho biết mode nào trong ba mode còn lại (bảng bên dưới).

3. Bốn failure mode có tên gọi gì?

Bốn tên này không phải bài tự đặt: chúng lấy nguyên văn từ benchmark RGB (Chen et al., 2023 — xem Deep Dive §6), đo trên sáu large language model. Cả bốn đều kiểm tra cùng một thứ: generation xử lý context đã retrieve tốt tới đâu.

Lưu ý: bốn tên gọi là của RGB, nhưng khung ba bước ở mục 2 (tách "đáp án vắng mặt trong kho" khỏi "retrieve sót") là công cụ chẩn đoán thực hành bài tự xây để debug hệ RAG thật — không phải cách RGB vận hành testbed. Dùng nó như bản đồ cô lập lỗi, không phải định nghĩa formal.

1. Noise robustness. Context lẫn đoạn nhiễu — gần nghĩa nhưng không thật sự trả lời câu hỏi (vì embedding tìm theo độ gần nghĩa, không theo "có trả lời được không"). Model bỏ qua được nhiễu hay bị kéo lệch? Ticket 1 (trộn chính sách intern) là ca này.

2. Negative rejection. Không đoạn nào trong context chứa đáp án, vì đáp án thật sự không tồn tại trong kho — không phải bug. Hành vi đúng là nói "không tìm thấy thông tin này". Ticket 2 (tuần 4 ngày) là ca này: bot phải từ chối, nhưng nó bịa.

3. Information integration. Đáp án cần gộp thông tin từ nhiều đoạn — không đoạn nào một mình đủ trả lời trọn vẹn. Model có tổng hợp được, hay chỉ dùng đoạn đầu rồi dừng? Ticket 3 (tổng ngày phép cộng thâm niên) là ca này.

4. Counterfactual robustness. Một đoạn trong context chứa thông tin sai hoặc lỗi thời — không phải nhiễu vô hại mà là thông tin liên quan nhưng sai. Model có tin theo mù quáng hay phát hiện mâu thuẫn? (RGB đo khả năng này khi model được cảnh báo trước qua instruction rằng context có thể chứa thông tin sai; tự phát hiện mâu thuẫn mà không được nhắc là biến thể khó hơn.)

Triệu chứngMode / Bước
Đáp án không tồn tại trong kho tài liệu ở bất cứ đâuNegative rejection (generation phải biết từ chối)
Đáp án có trong kho, nhưng không đoạn nào trong context retrieve được chứa nóRetrieval hỏng (thượng nguồn, ngoài 4 mode)
Context có đoạn đúng lẫn đoạn nhiễu gần nghĩa, model bị nhiễu lái sang hướng khácNoise robustness (generation)
Đáp án cần gộp thông tin từ 2 đoạn trở lên, model chỉ dùng 1 đoạn rồi dừngInformation integration (generation)
Một đoạn trong context chứa thông tin sai/lỗi thời, model trích lại như thậtCounterfactual robustness (generation)
⚠️ Ranh giới dễ lẫn

Negative rejection và retrieval hỏng đều bắt đầu bằng "không đoạn nào trả lời được câu hỏi" — trông giống hệt nhau ở bề mặt context. Khác biệt nằm ở câu hỏi bước 1: đáp án có tồn tại trong kho tài liệu không, chứ không phải có tồn tại trong context đã retrieve không. Bỏ qua bước 1, đi thẳng vào bước 2, là cách nhanh nhất để quy nhầm một ca negative rejection (generation phải học cách từ chối) thành một ca retrieval hỏng (đi sửa nhầm pipeline fetch).

4. Ticket khó nhất — retrieval hỏng hay generation?

Ticket 1, 2, 3 đã gắn mode ở mục trên. Ticket 4 dễ nhầm nhất vì bề mặt trông giống retrieval hỏng — tự chẩn đoán trước khi xem đáp án.

Tự chẩn đoán trước khi xem đáp án — Ticket 4

Kho tài liệu có một bản nháp cũ (số phụ cấp lỗi thời) và một bản đã duyệt (số đúng). Cả hai bản đều được retrieve vào context — không có bug fetch nhầm. Bot trích số ở bản nháp cũ. Áp khung ba bước ở mục 2: đáp án đúng có tồn tại trong kho không, có được retrieve vào context không, và lỗi rơi vào mode nào? Viết câu trả lời trước khi cuộn tiếp.

Đáp án: cả hai bản đều được retrieve vào context — không phải lỗi fetch, đáp án đúng có mặt. Lỗi chắc chắn ở generation; "một đoạn sai/lỗi thời nằm cạnh đoạn đúng" đúng định nghĩa counterfactual robustness, không phải noise (bản cũ vẫn liên quan, chỉ sai) hay negative rejection (đáp án đúng có mặt). Đối lại, Ticket 2 (chính sách chưa từng ban hành) dừng ngay ở bước 1: không có gì để fetch, generation phải từ chối thay vì bịa — negative rejection.

5. Pitfall

Thấy bot trả lời sai là đi sửa prompt/model ngay: chạy khung ba bước trước. Nếu đáp án chưa được retrieve vào context, sửa prompt hay đổi model không giải quyết gì — model không thể trả lời đúng thứ chưa từng thấy. (Và nhớ: RAG giảm bịa chứ không triệt tiêu — có đúng đoạn không đảm bảo model dùng đúng nó.)

6. 📚 Deep Dive

📚 Nguồn gốc — đọc khi muốn xuống tầng sâu hơn

Caveat bắt buộc: RGB đánh giá sáu model trên corpus tiếng Anh và tiếng Trung — không có tiếng Việt. Bốn tên gọi mô tả cơ chế xử lý context nên chuyển giao được sang mọi ngôn ngữ, nhưng con số cụ thể (model nào mạnh/yếu ở mode nào) không tự động đúng cho tiếng Việt — phải tự đo trên dữ liệu thật, không suy từ bảng xếp hạng gốc.

Ghi chú: đối chiếu ngày 2026-07-23; bài không trích số phần trăm giảm hallucination nào — hai paper trên không công bố con số áp dụng chung, và benchmark đổi theo thời gian.

7. Liên hệ các bài khác

  • Bài 05 — RAG pipeline — bài này giả định pipeline embed → retrieve → context → generate đã chạy đúng luồng; bốn mode ở đây chẩn đoán khi luồng đó hỏng.
  • Bài 04 — Chunking — chunk sai kích cỡ hoặc mất ngữ cảnh biên là một nguồn gốc phổ biến đẩy một ca vào noise robustness hoặc information integration.
  • Hallucination — cơ chế gốc: model không có khái niệm đúng/sai, chỉ có phân phối xác suất. RAG là một cách neo phân phối đó tốt hơn, không phải cách xoá bỏ cơ chế.
  • Mini-challenge — chọn kiến trúc — dùng đúng khung chẩn đoán này khi cân nhắc RAG có phải lựa chọn phù hợp cho một use case hay không.

8. Tóm tắt

  • Chẩn đoán theo ba bước đúng thứ tự: đáp án có trong kho không, có được retrieve vào context không, rồi mới xét generation.
  • Đáp án không tồn tại trong kho → negative rejection, không phải lỗi retrieval — cần phân biệt rõ trước khi sửa.
  • Bốn tên gọi chuẩn: noise robustness, negative rejection, information integration, counterfactual robustness — đều mô tả cách generation xử lý context đã có (benchmark RGB, Chen et al., AAAI 2024).
  • RGB đo trên tiếng Anh/Trung, không có tiếng Việt — taxonomy chuyển giao được, con số cụ thể phải tự đo.

9. Tự kiểm tra

Tự kiểm tra
Q1
Một đồng nghiệp thấy bot trả lời sai liền kết luận ngay 'model kém, phải đổi model mạnh hơn'. Phản biện bằng khung ba bước trong bài.

Kết luận đó bỏ qua bước 1–2: phải kiểm đáp án có tồn tại trong kho tài liệu không, rồi có được retrieve vào context không, trước khi đổ lỗi cho generation. Nếu đáp án chưa từng được retrieve (retrieval hỏng), đổi model mạnh hơn không giúp gì — không model nào trả lời đúng thứ chưa từng thấy. Chỉ khi context đã có đáp án mà model vẫn sai, lỗi mới thật sự ở generation.

Q2
Ticket 2 (tuần 4 ngày) và Ticket 4 (phụ cấp lỗi thời) đều là 'bot trả lời sai'. Vì sao chúng lại là hai mode khác nhau?

Khác ở bước 1: đáp án đúng có tồn tại trong kho không. Ticket 2, chính sách chưa từng ban hành — không tồn tại ở đâu, nên là negative rejection: bot phải biết nói "không có thông tin này". Ticket 4, số phụ cấp mới có tồn tại và có được retrieve, chỉ nằm cạnh một đoạn sai/lỗi thời — đó là counterfactual robustness: phải phân biệt đoạn nào đáng tin.

Q3
Vì sao negative rejection và retrieval hỏng dễ nhầm nhất? Nêu một câu hỏi phân biệt hai ca này.

Cả hai biểu hiện giống nhau ở bề mặt: context không chứa đoạn trả lời được. Khác biệt nằm ở việc đáp án có tồn tại trong kho tài liệu hay không, chứ không phải trong context đã retrieve. Câu hỏi phân biệt: "Đáp án có tồn tại ở bất cứ đâu trong kho không?" — không có ở đâu cả là negative rejection; có nhưng không được fetch là retrieval hỏng.

Q4
Noise robustness và counterfactual robustness đều là 'một đoạn không đáng tin trong context'. Phân biệt hai mode này.

Noise robustness: đoạn đó không liên quan — gần nghĩa nên lẫn vào nhưng không nói sai gì, chỉ lạc đề; thử thách là bỏ qua nó. Counterfactual robustness: đoạn đó liên quan trực tiếp nhưng nội dung sai/lỗi thời; thử thách là phát hiện nó không đáng tin dù đúng chỗ.

Q5
Ticket 3 là information integration. Nếu bot chỉ nêu số ngày cơ bản, bỏ qua thâm niên, điều đó nói lên gì về cách generation xử lý context?

Generation đã lấy được đoạn chứa số cơ bản (context có đáp án một phần) nhưng dừng lại thay vì gộp thêm đoạn về thâm niên. Đây đúng đặc điểm information integration: câu trả lời cần tổng hợp nhiều đoạn, chỉ dùng một đoạn rồi dừng là dạng hỏng điển hình, không phải do thiếu dữ liệu.

Q6
Vì sao 'RGB đánh giá trên tiếng Anh và tiếng Trung' lại quan trọng khi áp taxonomy này vào một hệ RAG tiếng Việt?

Bốn tên gọi mô tả cơ chế xử lý context, không đặc thù ngôn ngữ, nên chuyển giao được sang tiếng Việt. Nhưng con số cụ thể (model nào mạnh/yếu ở mode nào) chỉ đo trên tiếng Anh/Trung — không đảm bảo đúng khi chuyển sang tiếng Việt, phải tự đo trên dữ liệu thật thay vì suy diễn từ bảng xếp hạng gốc.

Bài tiếp theo: Mini-challenge — chọn kiến trúc

Bài này đáng gửi cho bạn học cùng?

Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.

Bài này có giúp bạn hiểu bản chất không?

Hỏi đáp về bài này

Chưa có câu hỏi

Đặt câu hỏi

Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).

Đặt câu hỏi đầu tiên

Bài tiếp theo

Mini-challenge: chọn kiến trúc cho ba bài toán thật