Embeddings 概述

文本 embeddings 是文本字串的數值表示,以一個浮點數向量的形式呈現。你可以使用兩個嵌入文本片段(無論是單詞、短語還是句子)之間的距離來衡量這些文本片段之間的相關性。一種常用的度量方式是餘弦相似度,但你也可以通過其他距離函數(如歐幾里得距離或點積)來衡量相似度(見下面的常見問題)。總的來說,距離越小,預測文本之間在語義或句法上的相關性越高

通過比較字串之間的相似度,或根據字串之間的距離對其進行聚類,可以實現各種應用,包括搜索(在 RAG 架構中很流行)、推薦異常檢測


如何通過 Anthropic 獲得 embeddings

在選擇 embeddings 提供商時,你可以根據自己的需求和偏好考慮幾個因素:

  • 數據集大小和領域特異性: 模型訓練數據集的大小及其與你要嵌入的領域的相關性。更大或更具領域特異性的數據通常會產生更好的領域內 embeddings
  • 模型架構: 模型設計和複雜性。更現代的技術和架構(如 Transformers)往往能學習並產生更高質量的 embeddings
  • 推理性能: Embedding 查找速度和端到端延遲。這對於大規模生產部署尤其重要
  • 定制化: 在私有數據上繼續訓練或針對非常特定的領域專門化模型的選項。這可以提高在獨特詞彙上的性能

Anthropic 不提供自己的 embedding 模型。一個在上述四個方面都有廣泛選擇和能力的 embeddings 提供商是 Voyage AI。Voyage AI 提供最先進的 embedding 模型,並為金融和醫療等特定行業領域提供定制模型,或為個別客戶提供定制的微調模型。

本指南的其餘部分是針對 Voyage AI 的,但我們鼓勵你評估各種 embeddings 供應商,以找到最適合你特定用例的供應商。


Voyage AI 入門

查看我們的 embeddings notebook 以查看 Voyage AI 實現示例。

要訪問 Voyage embeddings:

  1. Voyage AI 網站上註冊
  2. 獲取 API 密鑰
  3. 為方便起見,將 API 密鑰設置為環境變量:
Python
export VOYAGE_API_KEY="<your secret key>"

你可以通過使用官方的 voyageai Python 包或 HTTP 請求來運行 embeddings,如下所述。

Voyage Python 包

可以使用以下命令安裝 voyageai 包:

Python
pip install -U voyageai

然後,你可以創建一個客戶端對象,並開始使用它來嵌入你的文本:

Python
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-2", input_type="document")
print(result.embeddings[0])
print(result.embeddings[1])

result.embeddings 將是一個包含兩個 embedding 向量的列表,每個向量包含 1024 個浮點數。

運行上面的代碼後,兩個 embeddings 將打印在屏幕上:

Python
[0.02012746, 0.01957859, ...]  # "Sample text 1" 的 embedding
[0.01429677, 0.03077182, ...]  # "Sample text 2" 的 embedding

在創建 embeddings 時,你可以為 embed() 函數指定一些其他參數。以下是規範:

voyageai.Client.embed(texts : List[str], model : str, input_type : Optional[str] = None, truncation : Optional[bool] = None)

  • texts (List[str]) - 一個字串列表形式的文本列表,例如 ["I like cats", "I also like dogs"]。目前,列表的最大長度為 128,voyage-2 中列表的總令牌數最多為 320K,voyage-large-2/voyage-code-2 中最多為 120K。
  • model (str) - 模型名稱。推薦選項:voyage-2voyage-large-2voyage-code-2
  • input_type (str, 可選,默認為 None) - 輸入文本的類型。默認為 None。其他選項:querydocument
    • 當 input_type 設置為 None 時,輸入文本將直接由 Voyage 的 embedding 模型編碼。或者,當輸入是文檔或查詢時,用戶可以分別將 input_type 指定為 querydocument。在這種情況下,Voyage 將在輸入文本前添加一個特殊的提示,並將擴展後的輸入發送到 embedding 模型
    • 對於檢索/搜索用例,我們建議在編碼查詢或文檔時指定此參數,以提高檢索質量。使用和不使用 input_type 參數生成的 embeddings 是兼容的
  • truncation (bool, 可選,默認為 None) - 是否截斷輸入文本以適應上下文長度。
    • 如果為 True,超長的輸入文本將被截斷以適應上下文長度,然後由 embedding 模型進行向量化
    • 如果為 False,如果任何給定的文本超過上下文長度,將引發錯誤
    • 如果未指定(默認為 None),如果輸入文本略微超過上下文窗口長度,Voyage 將在將其發送到 embedding 模型之前截斷輸入文本。如果它明顯超過上下文窗口長度,將引發錯誤

Voyage HTTP API

你也可以通過請求 Voyage HTTP API 來獲取 embeddings。例如,你可以在終端中通過 curl 命令發送 HTTP 請求:

Shell
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-2"
  }'

你得到的響應是一個包含 embeddings 和令牌使用情況的 JSON 對象:

Shell
{
  "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 的 embedding 端點是 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-2voyage-large-2voyage-code-2
  • input_type (str, 可選,默認為 None) - 輸入文本的類型。默認為 None。其他選項:querydocument
  • truncation (bool, 可選,默認為 None) - 是否截斷輸入文本以適應上下文長度
    • 如果為 True,超長的輸入文本將在被 embedding 模型向量化之前被截斷以適應上下文長度
    • 如果為 False,如果任何給定的文本超過上下文長度,將引發錯誤
    • 如果未指定(默認為 None),如果輸入文本略微超過上下文窗口長度,Voyage 將在將其發送到 embedding 模型之前截斷輸入文本。如果它明顯超過上下文窗口長度,將引發錯誤
  • encoding_format (str, 可選,默認為 None) - embeddings 的編碼格式。Voyage 目前支持兩個選項:
    • 如果未指定(默認為 None):embeddings 表示為浮點數列表
    • "base64":embeddings 被壓縮為 Base64 編碼

Voyage embedding 示例

現在我們知道如何通過 Voyage 獲得 embeddings,讓我們通過一個簡單的示例來看看它的實際應用。

假設我們有一個由六個文檔組成的小語料庫,用於檢索

Python
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 將每個文檔轉換為一個 embedding 向量

Python
import voyageai

vo = voyageai.Client()

# 嵌入文檔
doc_embds = vo.embed(
    documents, model="voyage-2", input_type="document"
).embeddings

embeddings 將允許我們在向量空間中進行語義搜索/檢索。然後,我們可以將一個示例查詢,

Python
query = "When is Apple's conference call scheduled?"

轉換為一個 embedding,然後進行最近鄰搜索,根據 embedding 空間中的距離找到最相關的文檔。

Python
import numpy as np

# 嵌入查詢
query_embd = vo.embed(
    [query], model="voyage-2", input_type="query"
).embeddings[0]

# 計算相似度
# Voyage embeddings 被歸一化為長度 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'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 模型

Voyage 推薦使用以下 embedding 模型:

模型上下文長度Embedding 維度描述
voyage-large-2160001536Voyage AI 最強大的通用 embedding 模型。
voyage-code-2160001536針對代碼檢索進行了優化(比其他方法好 17%),並且在通用語料庫上也是 SoTA。有關詳細信息,請參閱 Voyage 的博客文章
voyage-240001024基礎通用 embedding 模型,在延遲和質量方面都進行了優化。
voyage-lite-02-instruct40001024針對分類、聚類和句子文本相似性任務進行指令調優,這是該模型唯一推薦的用例。

voyage-2voyage-large-2 是通用 embedding 模型,在各個領域都實現了最先進的性能,並保持了高效率。voyage-code-2 針對代碼領域進行了優化,提供 4 倍的上下文長度,可以更靈活地使用,儘管相對延遲較高。

Voyage 正在積極開發更先進和專業化的模型,並提供微調服務,為個別客戶定制專屬模型。有關專屬模型的更多信息,請發送電子郵件給你的 Anthropic 客戶經理或聯繫 Anthropic 支持。

  • voyage-finance-2:即將推出
  • voyage-law-2:即將推出
  • voyage-multilingual-2:即將推出
  • voyage-healthcare-2:即將推出

AWS Marketplace 上的 Voyage

Voyage embeddings 也可在 AWS Marketplace 上獲得。以下是在 AWS 上訪問 Voyage 的說明:

  1. 訂閱模型包
    1. 導航到模型包列表頁面並選擇要部署的模型
    2. 點擊 Continue to subscribe 按鈕
    3. 仔細查看 Subscribe to this software 頁面上的詳細信息。如果你同意標準的最終用戶許可協議 (EULA)、定價和支持條款,請點擊 “Accept Offer”
    4. 在選擇 Continue to configuration 並選擇一個區域後,你將看到一個 Product Arn。這是使用 Boto3 創建可部署模型所需的模型包 ARN
      1. 複製與你選擇的區域對應的 ARN,並在後續單元格中使用它
  2. 部署模型包

從這裡開始,在 Sagemaker Studio 中創建一個 JupyterLab 空間,上傳 Voyage 的 notebook,並按照其中的說明進行操作。


常見問題

如何計算兩個 embedding 向量之間的距離?

餘弦相似度是一個流行的選擇,但大多數距離函數都可以。Voyage embeddings 被歸一化為長度 1,因此餘弦相似度本質上與兩個向量之間的點積相同。這裡是一個用於計算兩個 embedding 向量之間餘弦相似度的代碼片段。

Python
import numpy

similarity = np.dot(embd1, embd2)
# Voyage embeddings 被歸一化為長度 1,因此餘弦相似度與點積相同。

如果你想在大型語料庫中找到 K 個最近的 embedding 向量,我們建議使用大多數向量數據庫中內置的功能。

在嵌入字串之前,我可以計算字串中的令牌數嗎?

可以!你可以使用以下代碼來實現。

Python
import voyageai

vo = voyageai.Client()
total_tokens = vo.count_tokens(["Sample text"])

定價

有關最新的定價詳情,請訪問 Voyage 的定價頁面