5.6 在流程中執行查詢
實際丟幾個問題進去,觀察每一步發生了什麼,以及門檻值調整的過程。
系統建好了,接下來實際問它問題,觀察每一步。看過真實的輸出,比讀任何說明都更能理解 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 章要講的評估。
查詢時怎麼觀察
當你在自己的資料上測試,建議每次都看這幾件事:
- 檢索到的是哪幾塊? 是不是你預期的那幾塊?
- 距離分數是多少? 相關和不相關的差距大不大?
- 提示詞長什麼樣? 資料有沒有被切得很怪?標題、來源有沒有帶上?
- 模型的答案和資料一致嗎? 有沒有加了資料裡沒有的內容?
- 答案的編號對得上嗎? 引用的來源是不是真的有這個內容?
問題出現的位置不同,要改的地方也不同:
| 現象 | 先檢查 |
|---|---|
| 找不到該找的資料 | 分塊、嵌入模型、k、門檻 |
| 找到了但答案不對 | 提示詞、模型 |
| 找到一堆不相關的 | 門檻、分塊大小、metadata 過濾 |
| 沒有答案卻硬答 | 門檻、提示詞中「沒有就說沒有」的規則 |