嵌入
文字嵌入是文字的數值表示,可用於衡量語意相似度。本指南介紹嵌入、其應用,以及如何將嵌入模型用於搜尋、推薦和異常偵測等任務。
實作嵌入之前
在選擇「embeddings」(嵌入)供應商時,您可以根據自身需求與偏好考量以下幾個因素:
- 資料集大小與領域專精度:模型訓練資料集的大小,以及它與您想要嵌入之領域的相關性。較大或更具領域專精度的資料通常能產生更好的領域內嵌入
- 推論效能:嵌入查詢速度與端到端「latency」(延遲)。對於大規模正式環境部署而言,這是特別重要的考量
- 客製化:是否提供以私有資料持續訓練的選項,或針對非常特定領域進行模型專精化。這可以提升在獨特詞彙上的效能
如何透過 Anthropic 取得嵌入
Anthropic 並未提供自己的嵌入模型。Voyage AI 是一家擁有多樣選項與功能、涵蓋上述所有考量的嵌入供應商。
Voyage AI 打造最先進的嵌入模型,並針對金融與醫療等特定產業領域提供客製化模型,或為個別客戶提供量身打造的「fine-tuned」(微調)模型。
本指南其餘部分以 Voyage AI 為主,但您應評估多家嵌入供應商,以找出最適合您特定使用情境的選擇。
可用模型
Voyage 建議使用以下文字嵌入模型:
Voyage 4(最新一代)
| 模型 | 上下文長度 | 嵌入維度 | 說明 |
|---|---|---|---|
voyage-4-large | 32,000 | 1024(預設)、256、512、2048 | 最佳的通用與多語言檢索品質。詳情請參閱 Voyage 4 部落格文章。 |
voyage-4 | 32,000 | 1024(預設)、256、512、2048 | 針對通用與多語言檢索品質最佳化。在品質與效率之間取得平衡。詳情請參閱 Voyage 4 部落格文章。 |
voyage-4-lite | 32,000 | 1024(預設)、256、512、2048 | 針對延遲與成本最佳化。詳情請參閱 Voyage 4 部落格文章。 |
voyage-4-nano | 32,000 | 1024(預設)、256、512、2048 | 開放權重模型(Apache 2.0 授權),可於 Hugging Face 取得。詳情請參閱 Voyage 4 部落格文章。 |
前一代
| 模型 | 上下文長度 | 嵌入維度 | 說明 |
|---|---|---|---|
voyage-3-large | 32,000 | 1024(預設)、256、512、2048 | 最佳的通用與多語言檢索品質。詳情請參閱 voyage-3-large 部落格文章。 |
voyage-3.5 | 32,000 | 1024(預設)、256、512、2048 | 針對通用與多語言檢索品質最佳化。詳情請參閱 voyage-3.5 部落格文章。 |
voyage-3.5-lite | 32,000 | 1024(預設)、256、512、2048 | 針對延遲與成本最佳化。詳情請參閱 voyage-3.5 部落格文章。 |
voyage-code-3 | 32,000 | 1024(預設)、256、512、2048 | 針對程式碼檢索最佳化。詳情請參閱 voyage-code-3 部落格文章。 |
voyage-finance-2 | 32,000 | 1024 | 針對金融檢索與 RAG 最佳化。詳情請參閱 voyage-finance-2 部落格文章。 |
voyage-law-2 | 16,000 | 1024 | 針對法律與長上下文檢索與 RAG 最佳化。同時也提升了所有領域的效能。詳情請參閱 voyage-law-2 部落格文章。 |
此外,Voyage 建議使用以下多模態嵌入模型:
| 模型 | 上下文長度 | 嵌入維度 | 說明 |
|---|---|---|---|
voyage-multimodal-3.5 | 32,000 | 1024(預設)、256、512、2048 | 功能豐富的多模態嵌入模型,可將交錯的文字、圖片與影片向量化。作為首個正式環境等級的影片嵌入模型,包含影片支援。詳情請參閱 voyage-multimodal-3.5 部落格文章。 |
voyage-multimodal-3 | 32,000 | 1024 | 功能豐富的多模態嵌入模型,可將交錯的文字與內容豐富的圖片向量化,例如 PDF 截圖、投影片、表格、圖表等。詳情請參閱 voyage-multimodal-3 部落格文章。 |
以下情境化區塊嵌入模型可產生區塊層級的向量,無需手動補充中繼資料即可捕捉完整的文件上下文。請使用 contextualized_embed() 而非 embed() 來呼叫這些模型:
| 模型 | 上下文長度 | 嵌入維度 | 說明 |
|---|---|---|---|
voyage-context-4 | 120,000 | 1024(預設)、256、512、2048 | 針對通用與多語言檢索品質最佳化的情境化區塊嵌入。詳情請參閱 voyage-context-4 部落格文章。 |
voyage-context-3 | 120,000 | 1024(預設)、256、512、2048 | 針對通用與多語言檢索品質最佳化的情境化區塊嵌入。詳情請參閱 voyage-context-3 部落格文章。 |
Voyage AI 也提供「rerankers」(重新排序器),它接收一個查詢與一份文件清單,並依照與查詢的相關性排序後回傳。請使用 rerank() 呼叫這些模型:
| 模型 | 上下文長度 | 說明 |
|---|---|---|
rerank-2.5 | 32,000 | 最高準確度。建議用於大多數應用。詳情請參閱 rerank-2.5 部落格文章。 |
rerank-2.5-lite | 32,000 | 針對延遲與成本最佳化。詳情請參閱 rerank-2.5 部落格文章。 |
需要協助決定使用哪個文字嵌入模型嗎?請查看 Voyage AI 常見問題。
開始使用 Voyage AI
若要存取 Voyage 嵌入:
- 在 Voyage AI 網站上註冊。
- 取得 API 金鑰。
- 為方便起見,將 API 金鑰設定為環境變數:
export VOYAGE_API_KEY="<your secret key>"您可以使用官方的 voyageai Python 套件或 HTTP 請求來取得嵌入,如以下各節所述。
Voyage Python 函式庫
使用以下指令安裝 voyageai 套件:
pip install -U voyageai接著,您可以建立一個用戶端物件,並開始用它來嵌入您的文字:
import voyageai
vo = voyageai.Client()
# 這會自動使用環境變數 VOYAGE_API_KEY。
# 或者,您也可以使用 vo = voyageai.Client(api_key="<your secret key>")
texts = ["Sample text 1", "Sample text 2"]
result = vo.embed(texts, model="voyage-4", input_type="document")
print(result.embeddings[0])
print(result.embeddings[1])result.embeddings 是一個包含兩個嵌入向量的清單,每個向量包含 1024 個浮點數。執行上述程式碼後,這兩個嵌入會印在螢幕上:
[-0.013131560757756233, 0.019828535616397858, ...] # embedding for "Sample text 1"
[-0.0069352793507277966, 0.020878976210951805, ...] # embedding for "Sample text 2"建立嵌入時,您可以為 embed() 函式指定其他幾個引數。
如需更多關於 Voyage Python 套件的資訊,請參閱 Voyage Python 套件文件。
Voyage HTTP API
您也可以透過請求 Voyage HTTP API 來取得嵌入。例如,您可以在終端機中透過 curl 指令傳送 HTTP 請求:
curl https://api.voyageai.com/v1/embeddings \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $VOYAGE_API_KEY" \
-d '{
"input": ["Sample text 1", "Sample text 2"],
"model": "voyage-4"
}'您會收到的回應是一個包含嵌入與 token 用量的 JSON 物件:
{
"object": "list",
"data": [
{
"embedding": [-0.013131560757756233, 0.019828535616397858 /* ... */],
"index": 0
},
{
"embedding": [-0.0069352793507277966, 0.020878976210951805 /* ... */],
"index": 1
}
],
"model": "voyage-4",
"usage": {
"total_tokens": 10
}
}如需更多關於 Voyage HTTP API 的資訊,請參閱 Voyage HTTP API 文件。
AWS Marketplace
Voyage 嵌入可於 AWS Marketplace 取得。在 AWS 上存取 Voyage 的說明請參閱 Voyage AWS Marketplace 文件。
快速入門範例
以下簡短範例展示如何使用嵌入。
假設您有一個包含六份文件的小型語料庫可供檢索
documents = [
"The Mediterranean diet emphasizes fish, olive oil, and vegetables, believed to reduce chronic diseases.",
"Photosynthesis in plants converts light energy into glucose and produces essential oxygen.",
"20th-century innovations, from radios to smartphones, centered on electronic advancements.",
"Rivers provide water, irrigation, and habitat for aquatic species, vital for ecosystems.",
"Apple's conference call to discuss fourth fiscal quarter results and business updates is scheduled for Thursday, November 2, 2023 at 2:00 p.m. PT / 5:00 p.m. ET.",
"Shakespeare's works, like 'Hamlet' and 'A Midsummer Night's Dream,' endure in literature.",
]首先,使用 Voyage 將每份文件轉換為嵌入向量。
import voyageai
vo = voyageai.Client()
# 嵌入文件
doc_embds = vo.embed(documents, model="voyage-4", input_type="document").embeddings嵌入讓您能在向量空間中進行語意搜尋/檢索。給定一個範例查詢,
query = "When is Apple's conference call scheduled?"接著,將其轉換為嵌入,並進行最近鄰搜尋,根據嵌入空間中的距離找出最相關的文件。
import numpy as np
# 嵌入查詢
query_embd = vo.embed([query], model="voyage-4", input_type="query").embeddings[0]
# 計算相似度
# Voyage 嵌入向量已正規化為長度 1,因此點積
# 與餘弦相似度相同。
similarities = np.dot(doc_embds, query_embd)
retrieved_id = np.argmax(similarities)
print(documents[retrieved_id])請注意,input_type="document" 與 input_type="query" 分別用於嵌入文件與查詢。更多規格說明請參閱 Voyage Python 函式庫。
輸出為第五份文件,它確實是與查詢最相關的文件:
Apple's conference call to discuss fourth fiscal quarter results and business updates is scheduled for Thursday, November 2, 2023 at 2:00 p.m. PT / 5:00 p.m. ET.如果您正在尋找一套關於如何使用嵌入進行 RAG(包含向量資料庫)的詳細範例,請查看 RAG 範例。
常見問題
嵌入模型與生成式模型類似,仰賴強大的神經網路來捕捉並壓縮語意上下文。Voyage 經驗豐富的 AI 研究團隊對嵌入流程的每個環節進行最佳化,包括:
- 模型架構
- 資料收集
- 損失函數
- 最佳化器選擇
在 Voyage AI 部落格上進一步了解 Voyage 的技術方法。
對於通用嵌入,建議的模型為:
voyage-4-large:最佳品質voyage-4-lite:最低延遲與成本voyage-4:均衡的效能
對於檢索,請使用 input_type 參數指定文字是查詢還是文件類型。
領域專用模型:
- 法律任務:
voyage-law-2 - 程式碼與程式設計文件:
voyage-code-3 - 金融相關任務:
voyage-finance-2
對於區塊層級與文件層級檢索:voyage-context-4
您可以將 Voyage 嵌入搭配點積相似度、餘弦相似度或歐幾里得距離使用。關於嵌入相似度的說明,請參閱這份向量相似度指南。
Voyage AI 嵌入已正規化為長度 1,這表示:
- 餘弦相似度等同於點積相似度,而後者的計算速度更快。
- 餘弦相似度與歐幾里得距離會產生相同的排序結果。
請參閱 Voyage 分詞指南。
對於所有檢索任務與使用情境(例如 RAG),請使用 input_type 參數指定輸入文字是查詢還是文件。請勿省略 input_type 或設定 input_type=None。指定輸入文字是查詢還是文件,可以為檢索建立更好的稠密向量表示,進而帶來更好的檢索品質。
使用 input_type 參數時,會在嵌入之前於輸入文字前方加上特殊提示。具體而言:
📘 與
input_type相關的提示
- 對於查詢,提示為「Represent the query for retrieving supporting documents: 」。
- 對於文件,提示為「Represent the document for retrieval: 」。
- 範例
- 當
input_type="query"時,像「When is Apple's conference call scheduled?」這樣的查詢會變成「Represent the query for retrieving supporting documents: When is Apple's conference call scheduled?」- 當
input_type="document"時,像「Apple's conference call to discuss fourth fiscal quarter results and business updates is scheduled for Thursday, November 2, 2023 at 2:00 p.m. PT / 5:00 p.m. ET.」這樣的查詢會變成「Represent the document for retrieval: Apple's conference call to discuss fourth fiscal quarter results and business updates is scheduled for Thursday, November 2, 2023 at 2:00 p.m. PT / 5:00 p.m. ET.」
voyage-large-2-instruct 顧名思義,經過訓練可回應加在輸入文字前方的額外指令。對於分類、分群或其他 MTEB 子任務,請使用 voyage-large-2-instruct 指令。
嵌入中的「quantization」(量化)會將高精度數值(例如 32 位元單精度浮點數)轉換為較低精度的格式(例如 8 位元整數或 1 位元二進位值),分別將儲存空間、記憶體與成本降低 4 倍與 32 倍。支援的 Voyage 模型可透過 output_dtype 參數指定輸出資料型別來啟用量化:
float:每個回傳的嵌入是一個由 32 位元(4 位元組)單精度浮點數組成的清單。這是預設值,提供最高的精度/檢索準確度。int8與uint8:每個回傳的嵌入是一個由 8 位元(1 位元組)整數組成的清單,範圍分別為 -128 到 127 以及 0 到 255。binary與ubinary:每個回傳的嵌入是一個由 8 位元整數組成的清單,代表經位元打包、量化後的單一位元嵌入值:binary為int8,ubinary為uint8。回傳的整數清單長度為嵌入實際維度的 1/8。binary 型別使用偏移二進位法,您可以在嵌入常見問題中進一步了解。
二進位量化範例
考慮以下八個嵌入值:-0.03955078、0.006214142、-0.07446289、-0.039001465、0.0046463013、0.00030612946、-0.08496094 與 0.03994751。透過二進位量化,小於或等於零的值會被量化為二進位的 0,正值則量化為二進位的 1,得到以下二進位序列:0, 1, 0, 0, 1, 1, 0, 1。這八個位元接著會被打包成單一個 8 位元整數 01001101(最左邊的位元為最高有效位元)。
ubinary:該二進位序列直接轉換並表示為無號整數(uint8)77。binary:該二進位序列表示為有號整數(int8)-51,使用偏移二進位法計算(77 - 128 = -51)。
Matryoshka 學習會在單一向量中建立由粗到細表示的嵌入。支援多種輸出維度的 Voyage 模型(例如 voyage-code-3)會產生此類 Matryoshka 嵌入。您可以保留前段的維度子集來截斷這些向量。例如,以下 Python 程式碼示範如何將 1024 維向量截斷為 256 維:
import voyageai
import numpy as np
def embd_normalize(v: np.ndarray) -> np.ndarray:
"""
Normalize the rows of a 2D numpy array to unit vectors by dividing each row by its Euclidean
norm. Raises a ValueError if any row has a norm of zero to prevent division by zero.
"""
row_norms = np.linalg.norm(v, axis=1, keepdims=True)
if np.any(row_norms == 0):
raise ValueError("Cannot normalize rows with a norm of zero.")
return v / row_norms
vo = voyageai.Client()
# 產生 voyage-code-3 向量,預設為 1024 維的浮點數
embd = vo.embed(["Sample text 1", "Sample text 2"], model="voyage-code-3").embeddings
# 設定較短的維度
short_dim = 256
# 將向量調整並正規化為較短的維度
resized_embd = embd_normalize(np.array(embd)[:, :short_dim]).tolist()定價
請造訪 Voyage 的定價頁面以取得最新的定價詳情。
Was this page helpful?