檢索
檢索(retrieval)把使用者問題變成「模型即將看到的那幾段文字」。RAG 品質的上限,幾乎由這一步決定。
基本流程
- 用同一個嵌入模型把問題編成向量。
- 在向量庫做相似度搜尋,取 top-k。
- 可再依 metadata 過濾(產品、權限、日期)。
- 把塊的原文交給生成步驟。
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
docs = retriever.invoke("差旅可以申請哪些補助?")
for d in docs:
print(d.metadata, d.page_content[:80])
k 太小容易漏掉答案所在的那一塊;太大則把不相干段落送進提示,模型更容易胡謅或忽略重點。4–8 是常見起點,再用 評估 調。
分數低也會回傳
ANN 幾乎總會給你 k 筆,即使庫裡沒有相關內容。若最高分其實很低,生成時應允許模型說「資料裡找不到」。進階做法是加一道評分:LLM 或重排序模型判斷這塊與問題是否真的有關,無關就丟掉,見 重排序與混合搜尋 與 Agentic RAG。
問題寫得很差時
使用者問「那個呢」「退費」這種短句,嵌入後可能對到錯誤主題。對策:
- 對話系統先把追問改寫成獨立問題(query rewriting)。
- 一次生成多個查詢變體,見 查詢轉換。
- 關鍵字與向量並用,專有名詞才不會漂走。
權限
檢索必須在「這個使用者能看的子集」裡做。把整庫最相關的段落送進提示,等於洩密。過濾要發生在檢索時(metadata filter 或獨立索引),不要指望模型自己保密。
下一頁:生成。影片:LangChain Part 3 Retrieval。