6.5 常見故障模式
RAG 常見的出錯方式,依流程的順序整理,以及怎麼判斷問題出在哪裡。
RAG 出錯的地方很多。把常見的故障依流程順序整理起來,遇到問題時就能有條理地排查,而不是亂猜。
先找出是哪一段出問題
整條流程從前到後:
資料載入 → 分塊 → 嵌入 → 檢索 → 組提示詞 → 生成 → 後處理
排查的基本原則:從前面往後面查。 前面出錯,後面再怎麼調都沒用。最常見的第一步,是直接看「檢索到了什麼」。
資料與分塊
| 故障 | 現象 | 做法 |
|---|---|---|
| 文件讀取出錯 | 亂碼、空白、段落順序亂掉、表格被打散 | 載入後親眼看過文字(3.1) |
| 資料根本不在知識庫 | 問什麼都找不到相關的 | 確認文件有被載入、有進索引 |
| 資料過期或有新舊版本 | 答案引用舊的規定,或兩份矛盾的資料 | 用日期、版本 metadata 管理(3.5、3.6) |
| 答案被切成兩半 | 資料有找到,但每一塊都只有一半的答案 | 調整分塊策略和重疊(3.3、3.4) |
| 塊太大 | 一塊混了好幾個主題,向量變得籠統 | 切小一點 |
| 塊太小 | 缺少上下文,看不出在講什麼 | 切大一點,或加上標題(3.5) |
嵌入與檢索
| 故障 | 現象 | 做法 |
|---|---|---|
| 用詞落差 | 使用者說「在家上班」,文件寫「遠端工作」,找不到 | 查詢改寫、換更好的嵌入模型、加入同義詞(6.6) |
| 語意太相近的詞混淆 | 問「事假」,卻找到「特別休假」 | 加標題進嵌入內容、重排序、混合檢索 |
| 專有名詞、代號找不準 | 型號、縮寫、人名搜尋失敗 | 混合檢索,結合關鍵字比對 |
| 嵌入模型不支援該語言或領域 | 整體都找不準 | 換模型,並在自己的資料上測試(2.3) |
| 正確答案排得太後面 | Hit@5 高但 Hit@1 低 | 重排序 |
| metadata 過濾太緊或太鬆 | 該找的被擋掉,或看到不該看的 | 檢查過濾條件和權限(3.5) |
| 門檻值設得不好 | 沒有答案的問題也被放行,或有答案的被擋掉 | 用測試集校準,6.7 有實例 |
提示詞與上下文
| 故障 | 現象 | 做法 |
|---|---|---|
| 塞太多段資料 | 答案被不相關的內容干擾 | 減少 k、設門檻(4.4) |
| 關鍵資料被放在中間 | 模型漏掉它 | 調整順序,把最相關的放前面(4.3) |
| 資料互相矛盾 | 答案前後不一致,或挑了舊的 | 指示裡說明如何處理衝突;從資料源頭處理 |
| 提示詞不夠明確 | 模型自由發揮,不照規則 | 把規則寫具體(4.2) |
| 提示詞注入 | 資料裡的惡意文字改變了模型的行為 | 隔離資料和指示、不信任來源(4.2) |
| 超過長度限制 | 資料被截掉,或答案被攔腰截斷 | 預留空間給回答(4.4) |
生成
| 故障 | 現象 | 做法 |
|---|---|---|
| 忽略資料 | 模型用自己的記憶回答,和資料不符 | 強化「只根據資料」,降低溫度 |
| 混入資料沒有的內容 | 資料講一半,模型自己補另一半 | 提示詞要求逐句有依據,用忠實度評估檢查 |
| 誤讀資料 | 把條件、數字、否定句看錯 | 換更強的模型,或把資料整理得更清楚 |
| 沒答案卻硬答(幻覺) | 編出看似合理的答案 | 提示詞要求拒答、檢索端設門檻、在測試集加入無答案的問題 |
| 過度拒答 | 資料裡有答案卻說沒有 | 放寬提示詞、檢查檢索有沒有真的把資料送進去 |
| 引用錯誤 | 編號不存在,或引用內容無法支撐那句話 | 程式驗證編號,並評估引用準確度(4.6) |
| 答案太長、太短或格式不對 | 在指示裡規定格式 |
系統層面
- 索引沒有更新:文件改了,索引還是舊的。要有更新機制。
- 權限洩漏:檢索時沒有依使用者權限過濾,讓人看到不該看的內容。
- 太慢:檢索、模型呼叫、提示詞太長都會拖慢。
- 太貴:每次問答的 token 用量太大。
- 沒有紀錄:出了問題無從追查。
一個排查的順序
遇到「答案不對」,建議照這個順序問:
- 資料裡有答案嗎? 沒有,就是資料的問題,不是 RAG 的問題。
- 檢索有找到那一塊嗎? 沒有,查檢索(分塊、嵌入、k、門檻、過濾)。
- 找到了,排在哪裡? 太後面,考慮重排序或調整 k。
- 提示詞看起來正常嗎? 資料有沒有被放進去、長度有沒有被截斷。
- 模型有沒有照資料回答? 有資料卻答錯,才是生成的問題。
絕大多數的問題,都是在步驟 1 到 3 就能找到原因。 所以先看檢索,再調提示詞和模型。