2.2 向量嵌入簡介
嵌入(embedding)把一段文字變成一串數字,讓電腦可以比較意思像不像。
電腦沒辦法直接「理解」文字,它能處理的是數字。嵌入(embedding) 做的事情,就是把一段文字轉成一串數字,也就是向量(vector),並且讓這串數字保留這段文字的意思。
什麼是向量
向量就是一組有順序的數字,例如 [0.12, -0.53, 0.88, ...]。每個數字代表某一個「維度」上的值。
在 RAG 裡用的向量通常有幾百到幾千個維度。我們沒辦法想像那麼多維的空間,但可以先用平面來理解。
用平面來想像
假設只有兩個維度,每一段文字就是平面上的一個點。意思相近的文字,會被放在相近的位置。
這張圖的重點:
- 「特休假規定」「年假怎麼算」「請假流程」,意思相關,所以聚在一起。
- 「軟胎、硬胎」「賽車進站策略」是另一群。
- 「今天天氣很好」跟哪一群都不太像,離得很遠。
- 使用者的問題「新進員工什麼時候能請年假?」落在特休假那一群的旁邊,所以檢索會找到那一群。
嵌入模型
把文字轉成向量的,是一種專門的模型,叫做嵌入模型(embedding model)。它事先看過大量文字,學會把意思相近的句子放到相近的位置。
你只要把一段文字丟進去,就會拿到一個固定長度的向量:
"特休假要工作滿半年才會開始計算" → [-0.006, -0.0002, -0.0008, -0.018, 0.056, ... ]
(共 384 個數字,維度依模型而定)
不管輸入是一個詞、一個句子、還是一整段,輸出的向量長度都是一樣的。
幾個重要的觀念
- 維度由模型決定。 例如有的模型輸出 384 維,有的是 768、1024、1536 或更多。維度高通常能表達更細的差異,但也要用更多空間和運算。
- 比較向量,必須用同一個模型產生的。 不同模型的向量空間是各自獨立的,混著比較沒有意義。所以問題和知識庫的每一段,要用同一個嵌入模型。
- 換模型就要重做。 如果之後換了嵌入模型,知識庫裡所有的向量都要重新產生。
- 它抓的是意思,不是字面。 「退費」和「退款」會很接近,但「蘋果公司」和「蘋果好吃」會被分開,因為語境不一樣。
嵌入的限制
嵌入很好用,但不是萬能:
- 模型沒學好的語言或領域,向量品質會下降。例如拿只學過英文的模型處理中文,效果通常很差。
- 非常專門的術語、縮寫、代號,模型可能沒見過,向量就不準。
- 一個向量只能把整段話壓縮成固定長度,段落很長時,細節會被稀釋。這也是為什麼要做分塊,第 3 章會講。