EN

5.6 在流程中執行查詢

實際丟幾個問題進去,觀察每一步發生了什麼,以及門檻值調整的過程。

RAG下一篇 →

系統建好了,接下來實際問它問題,觀察每一步。看過真實的輸出,比讀任何說明都更能理解 RAG 怎麼運作。

測試用的知識庫很小:兩份虛構的文件(員工手冊、報帳規定),一共切成 4 塊。

問題一:資料裡有答案

問:沒休完的特休假會怎麼處理?

檢索 [1] 距離 0.422|員工手冊.md > 員工手冊 > 特別休假

--- 送給模型的提示詞 ---
# 參考資料
[1](員工手冊.md > 員工手冊 > 特別休假)
員工在同一公司服務滿六個月未滿一年者,每年有三天特別休假。滿一年未滿兩年者,有七天。滿兩年未滿三年者,有十天。

特別休假的日期,由員工和公司協商安排。年度結束時沒有休完的天數,公司應該折算成工資發給員工。

# 問題
沒休完的特休假會怎麼處理?

觀察:

  • 問題裡的「特休假」和文件裡的「特別休假」字面不完全一樣,但仍然找到了正確的那一塊,距離 0.422。
  • 其他幾塊距離都比 0.5 大,被門檻擋掉,所以提示詞裡只有一段資料,很乾淨。
  • 如果接上模型,它會看到答案在「年度結束時沒有休完的天數,公司應該折算成工資發給員工」那一句。

問題二:換一份文件

問:出差住宿費有上限嗎?

檢索 [1] 距離 0.270|報帳規定.md > 報帳規定 > 差旅費

這次找到的是另一份文件,距離只有 0.270,比上一題更近,因為問題和內容「住宿費」「上限」直接對得上。

問題三:資料裡沒有答案

問:公司有提供員工旅遊補助嗎?

檢索:沒有夠相關的資料 → 直接回答「資料中沒有提到」,不呼叫模型

知識庫裡根本沒有旅遊補助的規定,檢索沒有找到夠近的資料,系統直接回答「資料中沒有提到」,連模型都沒呼叫。

門檻值是怎麼調出來的

這個結果不是一次就對。我一開始把門檻設成 0.8,結果三題的輸出變成這樣:

問題一  距離 0.422、0.596、0.647  (3 筆都放行)
問題二  距離 0.270、0.634、0.656  (3 筆都放行)
問題三  距離 0.582、0.599、0.737  (3 筆都放行)

問題三明明沒有答案,卻也找到了 3 筆,最近的距離是 0.582。如果把這些送給模型,模型就有機會把不相關的內容硬湊成答案。

比較三個問題「最近的那一筆」:

問題 有答案嗎 最近的距離
沒休完的特休假 有 0.422
出差住宿費 有 0.270
員工旅遊補助 沒有 0.582

有答案的都在 0.45 以下,沒有答案的是 0.582,所以我把門檻定在 0.5,剛好分開。

這個結果要小心解讀

這個 0.5 只是這個小範例的數字,不能拿去用在別的地方:

  • 只有 3 個問題,樣本太少,很容易剛好湊成「看起來有效」。
  • 知識庫只有 4 塊,真實的知識庫很大,無關資料的距離分布會完全不同。
  • 換一個嵌入模型,距離的範圍就整個不一樣。

真正要設門檻,需要準備一批真實的問題,標好每題的正確答案在哪裡,再去看怎麼設門檻,在「不漏掉有答案的問題」和「擋掉沒答案的問題」之間取得平衡。這正是第 6 章要講的評估。

查詢時怎麼觀察

當你在自己的資料上測試,建議每次都看這幾件事:

  1. 檢索到的是哪幾塊? 是不是你預期的那幾塊?
  2. 距離分數是多少? 相關和不相關的差距大不大?
  3. 提示詞長什麼樣? 資料有沒有被切得很怪?標題、來源有沒有帶上?
  4. 模型的答案和資料一致嗎? 有沒有加了資料裡沒有的內容?
  5. 答案的編號對得上嗎? 引用的來源是不是真的有這個內容?

問題出現的位置不同,要改的地方也不同:

現象 先檢查
找不到該找的資料 分塊、嵌入模型、k、門檻
找到了但答案不對 提示詞、模型
找到一堆不相關的 門檻、分塊大小、metadata 過濾
沒有答案卻硬答 門檻、提示詞中「沒有就說沒有」的規則
← 全部文章