iT邦幫忙

2023 iThome 鐵人賽

DAY 10
1

全端 LLM 應用開發-Day10-Embedding 與向量資料庫

Embedding

Embedding 是 LLM 應用開發裡一個很重要的觀念。Embeddings 或作 Word Embeddings,一般翻譯成詞嵌入,是一種將單詞、句子或更大的文本片段投影到向量空間的技術。這些向量可以提供的語義資訊,使得語義相近的詞彙在向量空間中的位置也相近。舉例來說,在一個訓練過的文字 Embedding 模型中,「king」和「queen」的向量會比 「king」和「apple」的向量更接近,因為前者在語義上更相關,因而在向量空間中的位置相當接近。

假設我們的詞彙表中有四個詞 :「 柯 」、「 克 」、「 是 」、「 好人 」。如果我們使用 one-hot encoding 方法來表示這些詞,那麼每個詞都會被表示為一個長度為 4 的向量:

「柯」可能被表示為 [1, 0, 0, 0]
「克」可能被表示為 [0, 1, 0, 0]
「是」可能被表示為 [0, 0, 1, 0]
「好人」可能被表示為 [0, 0, 0, 1]

這種表示方式,就是所謂的稀疏向量,因為向量中的大部份數值都是零。

這種轉換成向量,會有一個問題,就是維度數量隨著詞彙量的增長而急劇增加。假設由 100 萬個單詞形成的語料庫,其維度也會變成 100 萬維,相當的巨大。

而 Embedding 是將單詞投影到低維的 密集向量 (Dense vector) 中,但是這個低維可能是 100 維、200 維等,至少不會像是上例中的 100 萬維。以 Open AI 的 text-embedding-ada-002 來說,是有 1536 維。

在 NLP 中,經典的詞嵌入模型例如說是 Word2Vec 和 GloVe。但是在 Transformer 當道的現代,如 BERT 和 GPT 系列,都可以透過他們的自注意力機制,得到每個單詞和單詞之間的相關程度與序列資訊。這也能夠學習到高品質的詞嵌入向量,這些向量不僅捕獲了單詞的語義,還捕獲了句子中的上下文資訊。像是上面提到的 text-embedding-ada-002 ,就是基於 GPT 家族系列的 transformer 來做 Embedding 模型。

向量資料庫

從前面我們知道,可以透過 embedding 的方式把文字轉換成向量,進而得到相關係程度的一種方式。而向量資料庫就儲存這些向量,並使用一些相似度的算法,用以查詢儲存進去的文字。

最常使用的相似度算法,往往是餘弦相似度(Cosine Similarity),這是利用兩個向量之間的夾角,來計算相似度。夾角愈小,表示其他關係程度愈相近。其他還有歐幾里德距離(Euclidean distance)或是內積法(dot product)等,但是都不如 cosine similarity 來得常用。需注意 cosine similarity 在 NLP 裡是用來取得相似度,而不是計算距離,因為也有可能距離近的卻是不同群(可以試著想像兩個向量在高維空間中即使很近,但是角度卻差異很大)。

如果要計算與目標向量相近的點,在向量資料庫裡常用的算法是 HNSW (Hierarchical Navigable Small World),是一種用於近似最近鄰(Approximate Nearest Neighbor, ANN)搜索的高效演算法,可以用於高維空間中快速找到一個點的最近鄰居。詳細的算法在這裡不展開,有興趣的朋友可參考這篇論文:Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs

簡單來說,HNSW 主要用於最近鄰搜索,而 Cosine Similarity 則通常用於計算文本或其他種類的向量相似度。換句話說,可以兩個搭配使用。

這裡舉個例子說明:
假設我們有兩篇文章做 embedding 後,得到兩個三維向量 A = [1, 0, 0.1] 和 B = [1, 0, -0.1]。

歐幾里得距離:這兩個向量在三維空間中非常接近,它們的歐幾里得距離會是非常小的。

角度差異:然而,這兩個向量、在第三維度上、實際上指向相對相反的方向,所以它們之間的角度會相對較大。

這種現象強調了為何單一相似度評估方式(如歐幾里得距離或餘弦相似度)可能不足以捕捉高維數據中的所有重要特性。這也解釋了為什麼在某些應用中,可能需要使用多種度量方式(包括但不限於 HNSW、餘弦相似度等)來獲得更全面的相似性或相異性評估。

實務上我們常常是這麼做的:先用 HNSW 來建立一個高效的近似最近鄰搜索結構。例如說在查找與給定文章最相似的其他文章時,先用 HNSW 來迅速縮小搜索範圍,找出一小部分的候選文章。接著再使用 Cosine Similarity 進行精確的相似度計算,從候選文章中找出最相似的文章。

了解了 Embedding 之後,我們明天開始來用 Hugging Face 來做 Embedding 吧!


上一篇
全端 LLM 應用開發-Day09-Hugging Face 整合 FastAPI
下一篇
全端 LLM 應用開發-Day11-用Hugging Face 來做 Embedding
系列文
全端 LLM 應用開發(向量資料庫, Hugging Face, OpenAI, Azure ML, LangChain, FastAPI and more)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言