前幾天整理了 Chunking、Embedding 和 Vector Database。
到這裡,RAG 的前半段流程已經差不多建立起來:
文件
→ Chunking
→ Embedding
→ Vector Database
→ 搜尋相關內容
但接下來還有一個很重要的問題:
系統搜尋到的內容,真的就是最適合拿來回答問題的資料嗎?
這就是今天要整理的 Retrieval。
Retrieval 可以理解成:
根據使用者目前的問題,從知識庫中找出最相關的內容。
例如使用者問:
最近晚上都睡不好,有什麼需要注意的?
系統會先把問題轉成 Embedding,再到 Vector Database 裡搜尋語意相近的 Chunk。
最後可能找到:
這些內容才會被交給 AI,作為回答的依據。
所以 Retrieval 的品質會直接影響最後的回答。
Vector Search 找的是:
語意上相近的內容。
但語意相近,不一定代表一定適合回答目前的問題。
例如使用者問的是:
怎麼改善睡眠環境?
系統可能同時搜尋到:
這些內容都和「睡眠」有關,但真正最重要的應該是「睡眠環境」。
所以 Retrieval 不能只看:
有沒有相關。
還要看:
哪一筆最相關。
搜尋時通常會設定一個 Top-K。
例如:
Top-3
代表取最相關的 3 個 Chunk。
Top-5
代表取前 5 個。
如果取太少,有可能漏掉重要資訊。
但如果取太多,又可能加入很多不相關內容,反而干擾 AI。
所以 Top-K 並不是越大越好。
重點還是:
取得足夠,而且真正有用的內容。
除了語意相似度之外,也可以搭配前一天提到的 Metadata。
例如每個 Chunk 都保存:
那搜尋時就可以限制:
只搜尋「睡眠」相關資料。
或:
只搜尋某一份指定文件。
這樣可以先縮小搜尋範圍,再做 Vector Search。
也就是:
Metadata Filter + Vector Search
兩者一起使用,可以讓搜尋結果更準。
RAG 做完之後,不能只確認:
「搜尋功能有正常執行。」
更重要的是檢查:
「搜尋出來的內容是不是對的?」
例如準備幾個固定問題:
忘記密碼怎麼辦?
最近睡不好要注意什麼?
VoCare 的語音功能怎麼使用?
再檢查系統搜尋出的 Chunk 是否真的包含正確資訊。
這樣才能知道問題到底出在:
到目前為止,RAG 的流程可以整理成:
使用者問題
→ Embedding
→ Metadata Filter
→ Vector Search
→ Top-K Relevant Chunks
→ 提供給 AI
→ 產生回答
所以 Retrieval 其實就是連接:
知識庫
和
AI 回答
之間最重要的一層。