嵌入模型
此概念概述著重於基於文字的嵌入模型。
嵌入模型也可能是多模態的,但 LangChain 目前不支援此類模型。
想像一下,能夠以單一、精簡的表示形式捕捉任何文字的精髓——一則推文、文件或書籍。這就是嵌入模型的力量,它是許多檢索系統的核心。嵌入模型將人類語言轉換為機器可以理解並快速準確地比較的格式。這些模型以文字作為輸入,並產生固定長度的數字陣列,即文字語意含義的數字指紋。嵌入讓搜尋系統不僅可以根據關鍵字比對,還可以根據語意理解來尋找相關文件。
重要概念
(1) 將文字嵌入為向量:嵌入將文字轉換為數字向量表示。
(2) 測量相似度:可以使用簡單的數學運算來比較嵌入向量。
嵌入
歷史背景
多年來,嵌入模型的發展格局發生了顯著變化。2018 年 Google 推出 BERT (Bidirectional Encoder Representations from Transformers,變革器雙向編碼器表示法),這是一個關鍵時刻。BERT 應用變革器模型將文字嵌入為簡單的向量表示,這為各種 NLP 任務帶來了前所未有的效能。然而,BERT 並未針對有效率地產生句子嵌入進行最佳化。此限制促使 SBERT (Sentence-BERT,句子-BERT) 的創建,它調整了 BERT 架構以產生語意豐富的句子嵌入,可以透過餘弦相似度等相似度指標輕鬆比較,大幅降低了尋找相似句子等任務的計算負擔。如今,嵌入模型生態系統非常多元,眾多供應商都提供自己的實作。為了應對這種多樣性,研究人員和從業者經常求助於大規模文字嵌入基準 (MTEB) 此處 等基準進行客觀比較。
- 請參閱 開創性的 BERT 論文。
- 請參閱 Cameron Wolfe 對嵌入模型的 精采評論。
- 請參閱 大規模文字嵌入基準 (MTEB) 排行榜,以取得嵌入模型的全面概述。
介面
LangChain 提供了用於使用它們的通用介面,為常見操作提供標準方法。此通用介面透過兩種核心方法簡化了與各種嵌入供應商的互動
embed_documents
:用於嵌入多個文字(文件)embed_query
:用於嵌入單個文字(查詢)
這種區別很重要,因為某些供應商對文件(要搜尋的文件)與查詢(搜尋輸入本身)採用不同的嵌入策略。為了說明,以下是一個使用 LangChain 的 .embed_documents
方法嵌入字串列表的實務範例
from langchain_openai import OpenAIEmbeddings
embeddings_model = OpenAIEmbeddings()
embeddings = embeddings_model.embed_documents(
[
"Hi there!",
"Oh, hello!",
"What's your name?",
"My friends call me World",
"Hello World!"
]
)
len(embeddings), len(embeddings[0])
(5, 1536)
為了方便起見,您也可以使用 embed_query
方法來嵌入單個文字
query_embedding = embeddings_model.embed_query("What is the meaning of life?")
- 請參閱 LangChain 嵌入模型整合的完整列表。
- 請參閱這些 操作指南,以了解如何使用嵌入模型。
整合
LangChain 提供了許多嵌入模型整合,您可以在嵌入模型整合頁面上找到它們。
測量相似度
每個嵌入本質上都是一組座標,通常在高維空間中。在這個空間中,每個點(嵌入)的位置都反映了其對應文字的含義。正如相似的詞語可能在詞庫中彼此接近一樣,相似的概念最終在這個嵌入空間中彼此接近。這允許在不同的文字片段之間進行直觀的比較。透過將文字簡化為這些數字表示,我們可以使用簡單的數學運算來快速測量兩個文字片段的相似程度,而與它們的原始長度或結構無關。一些常見的相似度指標包括
- 餘弦相似度:測量兩個向量之間角度的餘弦值。
- 歐幾里得距離:測量兩點之間的直線距離。
- 點積:測量一個向量在另一個向量上的投影。
相似度指標的選擇應根據模型選擇。例如,OpenAI 建議其嵌入使用餘弦相似度,這可以輕鬆實作
import numpy as np
def cosine_similarity(vec1, vec2):
dot_product = np.dot(vec1, vec2)
norm_vec1 = np.linalg.norm(vec1)
norm_vec2 = np.linalg.norm(vec2)
return dot_product / (norm_vec1 * norm_vec2)
similarity = cosine_similarity(query_result, document_result)
print("Cosine Similarity:", similarity)
- 請參閱 Simon Willison 關於嵌入和相似度指標的精彩部落格文章和影片。
- 請參閱 Google 關於與嵌入一起考慮的相似度指標的此文件。
- 請參閱 Pinecone 關於相似度指標的部落格文章。
- 請參閱 OpenAI 關於 OpenAI 嵌入應使用何種相似度指標的常見問題解答。