當一個檢索增強系統給出錯誤答案,直覺反應是怪模型。但通常模型從來沒拿到正確的段落。它的回答已經好到上下文允許的極限,而上下文本身很差。
檢索品質是可以量度、也可以修好的。而且大部分工程精力本來就應該花在這裡。
Demo 語料在騙你
原型通常建在乾淨語料上:幾十份結構良好的文件、單一語言、格式一致。真實語料不是這樣。
真實語料是:文字層缺失或錯誤的掃描 PDF;壓平成一段文字後就失去意義的表格;同一個術語在五年之間有三種寫法;同一份政策有十個版本、只有一個仍然生效、而且沒有欄位說明是哪一個;同一頁裡混著多種語言。
以上每一項都是攝取問題,不是模型問題 —— 而且沒有一項會出現在乾淨的 Demo 裡。
檢索品質真正決勝的地方
解析。 如果你的解析器把表格變成一串讀不懂的字,再好的向量品質也救不回語意。版面感知解析、對純圖像頁的 OCR 降級、保留表格結構,對結果的影響大於任何重排序模型。
切塊。 固定長度切塊會切斷句子、把標題和它所管轄的條文分開、讓圖和圖說失散。結構感知切塊 —— 按文件章節切、標題跟著走、保留足夠重疊 —— 一點都不好看,但一直有效。
中繼資料。 生效日期、文件版本、司法管轄區、部門、狀態。沒有這些就無法過濾,而沒有過濾,系統就會很有信心地引用一份已被取代的文件。我們調查過的多數「幻覺」投訴,其實是從一份本來就不該被檢索到的文件裡,準確地引了一段話。
混合檢索。 密集向量會漏掉精確識別碼 —— 零件編號、法條引用、錯誤碼、人名。關鍵字檢索則會漏掉改述。兩者同時跑再融合結果,可以接住任何一方單獨使用時會掉的東西。
重排序。 先廣泛召回,再用交叉編碼器或小模型按與問題的實際相關度排序。這是多數系統中最便宜的一次大幅改善。
把檢索單獨量度
關鍵紀律:在生成步驟之前,單獨評估檢索。
拿一組真實問題。對每一條,標出一個稱職的人需要哪些段落才能作答。然後量度你的檢索器有沒有把它們找回來 —— recall@5、recall@20、第一個相關命中的位置。
如果 recall@20 只有 60%,再怎樣調提示都救不了答案品質。你在除錯錯誤的一層。先修檢索更快、更便宜,而且改善是永久的,不會隨模型改版而蒸發。
溯源與拒答
有兩種行為,把「用戶信任的系統」和「用戶不再打開的系統」分開。
點得開的引用。 每一個論斷都連回它的來源段落,而且連結會開到原文正確位置。用戶驗證一兩次、發現準確,就會校準出正確的信任程度。
真的會說「我不知道」。 當檢索找不到相關內容,正確的輸出是明確表示無法回答,而不是用鄰近材料拼出一段流暢的猜測。這件事必須刻意測試:在評估集裡放進語料真的答不了的問題,並為拒答評分。
動作順序
新系統上,這個順序一直有效:
- 先把攝取、解析與中繼資料做好,再碰提示。
- 用真實問題建立檢索評估集。
- 加入混合檢索與重排序,量度增益。
- 到這一步才調生成 —— 而且每次語料變動之後,重新量度檢索。
頭兩星期比較慢,之後快很多。跳過前面直接做第四步的團隊,會花好幾個月調提示,去對付一個本來就不會把正確段落交給他們的檢索層。
文章反映撰寫當時的工程實踐,僅供一般參考。