資料建模
在使用向量搜尋開發 AI 和機器學習 (ML) 應用程式時,以下是資料建模的一些考量因素。這些因素有助於有效利用向量搜尋,在應用程式中產生準確且有效的搜尋回應。
資料表示
向量搜尋依賴於將資料點表示為高維向量。向量表示的選擇取決於資料的性質。
對於由文字文件組成的資料,可以使用詞嵌入(例如,Word2Vec)或文件嵌入(例如,Doc2Vec)等技術將文字轉換為向量。也可以使用大型語言模型 (LLM) 來產生嵌入,例如 OpenAI GPT-4 或 Meta LLaMA 2 等更複雜的模型。Word2Vec 是一個相對簡單的模型,它使用淺層神經網路根據詞彙的上下文來學習詞彙嵌入。其關鍵概念是 Word2Vec 會為每個詞彙產生一個固定的向量,而與詞彙在何種上下文中使用無關。LLM 是更複雜的模型,它們使用深度神經網路(特別是變壓器架構)根據詞彙的上下文來學習詞彙嵌入。與 Word2Vec 不同,這些模型會產生上下文嵌入,這表示相同的詞彙可以有不同的嵌入,具體取決於其使用的上下文。
可以使用深度學習技術(例如 卷積神經網路 (CNN))或預先訓練的模型(例如 對比語言影像預訓練 (CLIP))來表示影像。選擇一個向量表示,以擷取資料的基本特徵。
資料集維度
對於向量搜尋,所有嵌入都必須在相同的向量空間中建立至關重要。這表示嵌入應遵循相同的原則和規則,以進行適當的比較和分析。使用相同的嵌入函式庫可以保證這種相容性,因為函式庫會以特定且明確的方式將資料持續轉換為向量。例如,比較 Word2Vec 嵌入與 BERT(LLM)嵌入可能會出現問題,因為這些模型具有不同的架構,並以根本不同的方式建立嵌入。
因此,向量資料類型是浮點數的定長向量。維度值由您使用的嵌入模型定義。有些機器學習函式庫會告訴您維度值,但您必須使用嵌入模型定義它。為您的資料集選擇一個嵌入模型,透過確保相關物件在嵌入空間中彼此相鄰,來建立良好的結構非常重要。您可能需要測試不同的嵌入模型,以確定哪一個最適合您的資料集。
預處理嵌入向量
正規化是針對資料進行縮放,使其長度為一。這通常是透過將向量中的每個元素除以向量的長度來完成。
標準化是針對資料進行位移(減去平均值)和縮放(除以標準差),使其平均值為零,標準差為一。
請務必注意,在嵌入向量的背景下,標準化和正規化並不相同。正確的預處理方法(標準化、正規化,甚至其他方法)取決於資料的特定特徵,以及您嘗試透過機器學習模型達成什麼目標。預處理步驟可能包含清理和標記化文字、調整影像大小和正規化影像,或處理遺失值。
正規化嵌入向量
正規化嵌入向量是一個程序,可確保向量空間中的每個嵌入向量長度(或範數)為一。這透過將向量的每個元素除以向量的長度(也稱為其歐幾里得
範數或L2
範數)來完成。
例如,請查看向量搜尋快速入門中的嵌入向量及其正規化對應項,其中所有向量都使用一致的長度
[0.1, 0.15, 0.3, 0.12, 0.05]
[0.45, 0.09, 0.01, 0.2, 0.11]
[0.1, 0.05, 0.08, 0.3, 0.6]
[0.27, 0.40, 0.80, 0.32, 0.13]
[0.88, 0.18, 0.02, 0.39, 0.21]
[0.15, 0.07, 0.12, 0.44, 0.88]
在處理嵌入時正規化向量的主要原因是,它使向量之間的比較更有意義。透過正規化,您可以確保比較不受向量比例的影響,並且僅基於其方向。這對於計算向量之間的餘弦相似性特別有用,其中重點在於向量之間的角度(方向關係),而不是其大小。
正規化嵌入向量是一種標準化高維資料的方法,以便不同向量之間的比較更有意義,且較不受原始向量比例的影響。由於點積
和餘弦對於正規化向量是等效的,但點積
演算法快 50%,因此建議開發人員將點積
用於相似性函數。
但是,如果嵌入未正規化,則點積
會靜默傳回無意義的查詢結果。因此,點積
未設定為向量搜尋中的預設相似性函數。
當您使用 OpenAI、PaLM 或 Simsce 來產生嵌入時,它們預設會正規化。如果您使用不同的程式庫,您會想要正規化向量,並將相似性函數設定為點積
。請參閱向量搜尋快速入門中如何設定相似性函數。
並非所有向量搜尋範例都需要正規化。
索引和儲存
SAI 索引和儲存機制是針對大型資料集(例如向量搜尋)量身打造的。目前,SAI 使用 JVector,一種近似最近鄰居 (ANN) 搜尋演算法,並且是階層可導航小世界 (HNSW) 的近親。
像 JVector 這樣的 ANN 搜尋演算法的目標是找到資料集中最接近(或最相似)給定查詢點的資料點。然而,找到確切的最近鄰居在計算上可能很昂貴,特別是在處理高維資料時。因此,ANN 演算法旨在近似找到最近鄰居,優先考慮速度和效率,而不是精確度。
JVector 通過建立一個圖形層級來實現這個目標,其中層級的每個層級對應於一個可導航的「小世界」圖形。它受到 DiskANN(一個磁碟備份 ANN 函式庫)的啟發,將圖形儲存在磁碟上。對於圖形中的任何給定節點(資料點),很容易找到通往任何其他節點的路徑。層級的較高層級節點較少,用於粗略導航,而較低層級節點較多,用於精細導航。這樣的索引結構通過將搜尋空間縮小到潛在匹配項,實現快速擷取。
JVector 還使用 Panama SIMD API 來加速索引建立和查詢。
相似度量
向量搜尋依賴於計算向量之間的相似度或距離,以識別相關匹配項。選擇適當的相似度量至關重要,因為不同的度量可能更適合特定類型的資料。常見的相似度量包括餘弦相似度、歐幾里得距離或傑卡德相似度。度量的選擇應與資料的特性和所需的搜尋行為保持一致。
向量搜尋支援三種相似性量度:餘弦相似度
、點積
和歐幾里得距離
。向量搜尋索引的預設相似性演算法為餘弦相似度
。建議在大部分應用程式中對標準化嵌入使用點積
,因為點積
比餘弦相似度
快 50%。
可擴充性和效能
隨著資料集擴充,可擴充性是一項重要的考量因素。向量搜尋演算法應設計為能有效率地處理大型資料集。使用向量搜尋的 Cassandra 資料庫會有效率地分配資料,並透過平行處理存取資料以提升效能。