前面整理 RAG 時有提到:
系統會先從知識庫裡找出和問題最相關的內容,再交給 AI 回答。
但這裡其實有一個很重要的問題:
系統到底要怎麼判斷「哪一段內容最相關」?
如果只靠關鍵字搜尋,其實很容易漏掉意思相近、但用詞不同的內容。
所以今天要整理的概念是:
Embedding。
Embedding 可以簡單理解成:
把文字轉換成一組可以被電腦比較的數字。
這組數字通常會形成一個向量,用來表示這段文字的語意。
例如:
最近晚上都睡不好
和:
這幾天一直失眠
兩句話使用的文字不完全相同,但意思其實很接近。
透過 Embedding,系統就可以判斷:
這兩段文字在語意上是相似的。
假設知識庫裡有一段資料:
睡眠品質下降可能和生活作息有關。
但使用者問的是:
最近都睡不好怎麼辦?
如果只靠完全相同的關鍵字,搜尋結果可能不一定準確。
但 Embedding 比較的不是單純文字,而是:
兩段內容的意思是否接近。
所以即使用詞不同,只要語意相近,系統還是有機會把它們找出來。
Embedding Model 會把一段文字轉換成一組數值。
可以簡化成:
文字
→ Embedding Model
→ Vector
例如:
「喜歡早上去公園散步」
→ Embedding
→ 一組向量
另一句:
「每天早上都會出去走走」
→ Embedding
→ 另一組向量
如果兩個向量彼此很接近,就代表兩段文字的語意也比較接近。
在 RAG 裡,文件被切成不同 Chunk 之後,每個 Chunk 都可以建立自己的 Embedding。
使用者提出問題時,問題本身也會轉成 Embedding。
接下來就可以比較:
使用者問題的向量,和哪些 Chunk 的向量最接近。
這樣系統才知道要把哪些內容提供給 AI。
所以 Embedding 在 RAG 裡的角色,可以理解成:
幫助系統找到語意最相關的資料。
Embedding 不只可以用來找知識庫資料。
前面提過的 Memory Retrieval 也可以使用相同概念。
例如 Memory 裡保存:
平常喜歡早上去公園散步。
長者今天說:
最近都不太想出去走。
兩句話沒有完全相同的文字,但語意上有關聯。
這時候 Embedding 就可以幫助系統找到相關 Memory。
所以在 VoCare 裡,Embedding 未來可能同時用在: