假設有一份合成文件,寫著「這個操作範例只適用於測試環境」。系統找到了正確文件,回答卻變成「所有環境都可以這樣操作」,句尾還附上來源。連結是真的,文字也確實取自那份文件,但回答已經把適用條件拿掉了。
這個假設接續第九天留下的問題:切片能回到原文,只讓我們有機會查核;下一步還要確認,原文究竟支持回答中的哪一句話。對「從心出發」而言,我想先把這條責任線整理清楚,再談如何讓回答更自然。
RAG 是 Retrieval-Augmented Generation,意指利用檢索到的資料輔助生成。Lewis 等人的原始研究結合生成模型與可檢索的外部記憶,讓生成過程使用取回的段落。這是理解架構的起點,並不是本專案能力的證明。原始研究摘要
完整的查詢規劃、檢索、依據核對、引用與回答組合,目前在本系列仍屬於 Planned。本日尚未完成此部分,以下先整理目前設計與下一步。現有局部程式與離線測試能說明一些資料邊界,還不足以把整條流程描述成已完成。
直覺上的流程很短:把問題轉成向量,找出相近片段,再交給模型回答。但這段描述省略了兩次判斷。第一,這份資料現在是否允許取用?第二,即使可以取用,它是否足以支持準備輸出的內容?
現有記憶體參考後端會先排除已關閉、或當下不符合取用資格的紀錄,再以向量相似度排序。這能讓生命週期限制先於排名生效,卻沒有回答第二個問題。相似度是比較向量的分數,不能當成「這句話有多大機率為真」,更不能替來源適用性作保。
而且,現有參考 embedding 是合成測試向量。即使某個片段排第一,也不能拿這個結果證明語意檢索品質。第九天檢查的是切片與向量有沒有綁對;今天要補上的,是從候選材料走到回答時,還缺哪些判斷。
我目前的設計選擇,是讓檢索結果保留候選材料的身分。它可以帶回內容、來源版本與原文位置,但不能因為被找到,就自動取得成為答案的資格。
接下來的 Planned 流程,會先界定問題要回答什麼,再選取符合來源資格的材料;組合回答時,則保留每個實質主張與支持段落之間的對應。這裡的 grounding,指的是回答內容與依據之間可以被核對的關係。
下圖是待實作的責任流程;箭頭表示預定的資料關係,並非已執行的紀錄。依據不足時,也應有離開生成路徑的出口。
flowchart TD
A["Planned:界定問題"] --> B["Planned:檢索合格材料"]
B --> C["Planned:核對主張、條件與支持段落"]
C -->|支持充分| D["Planned:組合回答並保留引用"]
C -->|不足或衝突| E["Planned:縮小主張或說明缺口"]
回到開場的合成文件,「只適用於測試環境」必須和操作說明一起交給後續步驟。如果候選片段只剩操作本身,我會把它視為上下文不足,設計成補取必要段落,或縮小回答範圍。不能在不知道條件的情況下,把句子補成一條普遍規則。
引用也需要更細的責任範圍。一個段落若同時談操作方式、適用條件與效果,單一連結未必支持全部內容。我希望審閱時能逐句追問:支持的是哪個部分?有沒有漏掉限制?有沒有加入來源沒有說的因果關係?這是後續驗證要落實的要求,尚不是已存在的自動判定器。
這樣做會增加保存追溯資訊與檢查內容的工作,也可能讓回答變短。但我寧可先限制回答能說到哪裡,再處理文字的完整感。把不確定的地方寫得順暢,並不會補上依據。
目前的 safe_retrieval 有一個值得注意的介面選擇:沒有後端、後端不可用、回傳不合法,或安全條件不允許檢索時,都可能回傳空 tuple,也就是不釋出任何知識材料。正常查詢沒有命中,也可能得到相同的空結果。
對這個局部邊界而言,不讓不合格材料流出去有明確作用;可是到了回答層,空結果本身無法告訴我們原因。若服務根本沒有完成查詢,回答「資料庫沒有相關資料」就說得太多。若是安全條件禁止取用,也不能當成一般的搜尋落空。
因此,後續整合需要區分「沒有命中」「目前無法取得」與「不允許取用」,再決定哪些資訊適合對使用者說明。這是待設計的結果契約,不是今天已新增的功能。現有程式還沒有將取回文字送進模型;本次離線測試也沒有測到模型如何面對這些差異。
同樣地,來源互相衝突時,不能只挑較高排名的一份來消除矛盾。我的驗證方案會要求保留衝突,檢查是否來自不同版本或適用條件;如果仍無法釐清,就限制回答。這些要求都還需要獨立的測試材料與輸出紀錄。
這次重跑的既有測試,使用合成資料檢查來源撤回、過期、跨資料範圍存取,以及檢索後端失敗等局部行為。這些案例有助於確認材料怎麼被擋下,卻沒有證明回答裡每一句話都有根據,更不代表真實使用情境下的可靠性或心理支持效果。
完整 RAG 的下一步驗證,應固定一份完成來源資格審查的語料快照,同時保留查詢、取回段落、引用與最終回答。除了正常案例,也要安排沒有結果、來源衝突、舊版本、供應端失敗,以及回答偷偷超出原文的案例。開場那句「所有環境都可以」,就應該成為明確要被拒絕的錯誤回答。這些是尚未執行的端到端驗證方案。
我也不會把「通過引用檢查」延伸成對個人的診斷或治療依據。工程上能追到來源,仍然需要另外面對內容的適用性與專業邊界;RAG 沒有賦予模型決定介入措施的權限。
今天想先留住的問題很具體:如果把回答拆成一句一句,每句話還找得到完整支持它的段落嗎?當答案是否定的,系統應該縮小主張、說明缺口,或停止輸出那個主張。等這條線清楚了,才能繼續討論哪些支持方式可以被收錄,以及誰有權決定它們何時可用。