嵌入向量
文本嵌入是文本的數值表示,可用於衡量語義相似度。本指南介紹了嵌入向量、其應用以及如何使用嵌入模型進行搜索、推薦和異常檢測等任務。
在實施嵌入向量之前
在選擇嵌入向量提供商時,根據您的需求和偏好,可以考慮以下幾個因素:
- 數據集大小和領域特異性: 模型訓練數據集的大小及其與您要嵌入的領域的相關性。更大或更具領域特異性的數據通常會產生更好的領域內嵌入
- 推理性能: 嵌入查找速度和端到端延遲。這對於大規模生產部署來說是一個特別重要的考慮因素
- 定制化: 在私有數據上繼續訓練的選項,或針對非常特定領域的模型專門化。這可以提高在獨特詞彙表上的性能
如何使用 Anthropic 獲取嵌入向量
Anthropic 不提供自己的嵌入模型。一個涵蓋上述所有考慮因素並具有多種選擇和功能的嵌入向量提供商是 Voyage AI。
Voyage AI 提供最先進的嵌入模型,並為金融和醫療保健等特定行業領域提供定制模型,或為個別客戶提供定制微調模型。
本指南的其餘部分是針對 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 = ["示例文本 1", "示例文本 2"]
result = vo.embed(texts, model="voyage-2", input_type="document")
print(result.embeddings[0])
print(result.embeddings[1])
result.embeddings
將是一個包含兩個嵌入向量的列表,每個向量包含 1024 個浮點數。
運行上述代碼後,兩個嵌入向量將顯示在屏幕上:
[0.02012746, 0.01957859, ...] # "示例文本 1" 的嵌入向量
[0.01429677, 0.03077182, ...] # "示例文本 2" 的嵌入向量
在創建嵌入向量時,您可以為 embed()
函數指定一些其他參數。以下是規範:
voyageai.Client.embed(texts : List[str], model : str, input_type : Optional[str] = None, truncation : Optional[bool] = None)
- texts (List[str]) - 作為字符串列表的文本列表,例如
["我喜歡貓", "我也喜歡狗"]
。目前,列表的最大長度為 128,列表中的總標記數最多為voyage-2
的 320K 和voyage-large-2
/voyage-code-2
的 120K。 - model (str) - 模型名稱。推薦選項:
voyage-2
,voyage-large-2
,voyage-code-2
。 - input_type (str, 可選, 默認為
None
) - 輸入文本的類型。默認為None
。其他選項:query
,document
- 當 input_type 設置為
None
時,輸入文本將直接由 Voyage 的嵌入模型編碼。或者,當輸入是文檔或查詢時,用戶可以將input_type
指定為query
或document
。在這種情況下,Voyage 將在輸入文本前添加一個特殊提示,並將擴展的輸入發送到嵌入模型 - 對於檢索/搜索用例,我們建議在編碼查詢或文檔時指定此參數以提高檢索質量。使用和不使用
input_type
參數生成的嵌入向量是兼容的
- 當 input_type 設置為
- truncation (bool, 可選, 默認為
None
) - 是否截斷輸入文本以適應上下文長度。- 如果為
True
,超長輸入文本將被截斷以適應上下文長度,然後由嵌入模型向量化 - 如果為
False
,如果任何給定文本超過上下文長度,將引發錯誤 - 如果未指定(默認為
None
),如果輸入文本略微超過上下文窗口長度,Voyage 將在將其發送到嵌入模型之前截斷輸入文本。如果它顯著超過上下文窗口長度,將引發錯誤
- 如果為
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": ["示例文本 1", "示例文本 2"],
"model": "voyage-2"
}'
您將得到的響應是一個包含嵌入向量和標記使用情況的 JSON 對象:
{
"object": "list",
"data": [
{
"embedding": [0.02012746, 0.01957859, ...],
"index": 0
},
{
"embedding": [0.01429677, 0.03077182, ...],
"index": 1
}
],
"model": "voyage-2",
"usage": {
"total_tokens": 10
}
}
Voyage AI 的嵌入端點是 https://api.voyageai.com/v1/embeddings
(POST)。請求標頭必須包含 API 密鑰。請求主體是一個包含以下參數的 JSON 對象:
- input (str, List[str]) - 單個文本字符串,或作為字符串列表的文本列表。目前,列表的最大長度為 128,列表中的總標記數最多為
voyage-2
的 320K 和voyage-large-2
/voyage-code-2
的 120K。 - model (str) - 模型名稱。推薦選項:
voyage-2
,voyage-large-2
,voyage-code-2
。 - input_type (str, 可選, 默認為
None
) - 輸入文本的類型。默認為None
。其他選項:query
,document
- truncation (bool, 可選, 默認為
None
) - 是否截斷輸入文本以適應上下文長度- 如果為
True
,超長輸入文本將在被嵌入模型向量化之前截斷以適應上下文長度 - 如果為
False
,如果任何給定文本超過上下文長度,將引發錯誤 - 如果未指定(默認為
None
),如果輸入文本略微超過上下文窗口長度,Voyage 將在將其發送到嵌入模型之前截斷輸入文本。如果它顯著超過上下文窗口長度,將引發錯誤
- 如果為
- encoding_format (str, 可選, 默認為
None
) - 嵌入向量的編碼格式。Voyage 目前支持兩個選項:- 如果未指定(默認為
None
): 嵌入向量表示為浮點數列表 "base64"
: 嵌入向量被壓縮為 Base64 編碼
- 如果未指定(默認為
Voyage 嵌入向量示例
現在我們知道了如何使用 Voyage 獲取嵌入向量,讓我們通過一個簡短的示例來看看它的實際應用。
假設我們有一個包含六個文檔的小型語料庫用於檢索
documents = [
"地中海飲食強調魚類、橄欖油和蔬菜,被認為可以減少慢性疾病。",
"植物的光合作用將光能轉化為葡萄糖,並產生必要的氧氣。",
"20世紀的創新,從收音機到智能手機,都圍繞著電子技術的進步。",
"河流提供水源、灌溉和水生物種的棲息地,對生態系統至關重要。",
"Apple 將於 2023 年 11 月 2 日星期四太平洋時間下午 2:00 / 東部時間下午 5:00 舉行電話會議,討論第四財季業績和業務更新。",
"莎士比亞的作品,如《哈姆雷特》和《仲夏夜之夢》,在文學中經久不衰。"
]
我們首先使用 Voyage 將每個文檔轉換為嵌入向量
import voyageai
vo = voyageai.Client()
# 嵌入文檔
doc_embds = vo.embed(
documents, model="voyage-2", input_type="document"
).embeddings
嵌入向量將允許我們在向量空間中進行語義搜索/檢索。然後我們可以將一個示例查詢,
query = "Apple 的電話會議安排在什麼時候?"
轉換為嵌入向量,然後進行最近鄰搜索,根據嵌入空間中的距離找到最相關的文檔。
import numpy as np
# 嵌入查詢
query_embd = vo.embed(
[query], model="voyage-2", 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"
來嵌入文檔和查詢。更多規範可以在這裡找到。
輸出將是第 5 個文檔,這確實是與查詢最相關的:
Apple 將於 2023 年 11 月 2 日星期四太平洋時間下午 2:00 / 東部時間下午 5:00 舉行電話會議,討論第四財季業績和業務更新。
可用的 Voyage 模型
Voyage 推薦使用以下嵌入模型:
模型 | 上下文長度 | 嵌入維度 | 描述 |
---|---|---|---|
voyage-large-2 | 16000 | 1536 | Voyage AI 最強大的通用嵌入模型。 |
voyage-code-2 | 16000 | 1536 | 針對代碼檢索進行了優化(比替代方案好 17%),並且在通用語料庫上也達到了最先進的水平。詳情請參閱 Voyage 的這篇博客文章。 |
voyage-2 | 4000 | 1024 | 基礎通用嵌入模型,針對延遲和質量進行了優化。 |
voyage-lite-02-instruct | 4000 | 1024 | 針對分類、聚類和句子文本相似性任務進行了指令微調,這些是該模型唯一推薦的用例。 |
voyage-2
和 voyage-large-2
是通用嵌入模型,在各個領域都能達到最先進的性能,並保持高效率。voyage-code-2
針對代碼領域進行了優化,提供了 4 倍的上下文長度,以實現更靈活的使用,儘管延遲相對較高。
Voyage 正在積極開發更先進和專門化的模型,並提供微調服務以為個別客戶定制專屬模型。如需有關專屬模型的更多信息,請發送電子郵件給您的 Anthropic 客戶經理或聯繫 Anthropic 支持。
voyage-finance-2
: 即將推出voyage-law-2
: 即將推出voyage-multilingual-2
: 即將推出voyage-healthcare-2
: 即將推出
AWS Marketplace 上的 Voyage
Voyage 嵌入向量也可在 AWS Marketplace 上獲得。以下是在 AWS 上訪問 Voyage 的說明:
- 訂閱模型包
- 導航到模型包列表頁面並選擇要部署的模型
- 點擊
Continue to subscribe
按鈕 - 仔細查看
Subscribe to this software
頁面上的詳細信息。如果您同意標準最終用戶許可協議 (EULA)、定價和支持條款,請點擊 “Accept Offer” - 選擇
Continue to configuration
並選擇區域後,您將看到一個 Product Arn。這是使用 Boto3 創建可部署模型所需的模型包 ARN- 複製與您選擇的區域相對應的 ARN,並在後續單元格中使用它
- 部署模型包
從這裡開始,在 Sagemaker Studio 中創建一個 JupyterLab 空間,上傳 Voyage 的筆記本,並按照其中的說明進行操作。
常見問題
定價
訪問 Voyage 的定價頁面以獲取最新的定價詳情。