For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
主要導覽

嵌入向量

了解如何將文字轉換為數字,實現搜尋等使用案例。

New embedding models
text-embedding-3-small and text-embedding-3-large, our newest and most performant embedding models, are now available. They feature lower costs, higher multilingual performance, and new parameters to control the overall size.

什麼是嵌入向量?

OpenAI 的文字嵌入向量用於衡量文字字串之間的關聯程度。嵌入向量常用於:

  • 搜尋 (根據結果與查詢字串的相關程度排序)
  • 分群 (根據相似程度將文字字串分組)
  • 推薦 (推薦文字字串彼此相關的項目)
  • 異常偵測 (找出關聯程度低的離群值)
  • 多樣性衡量 (分析相似度的分布)
  • 分類 (根據最相似的標籤將文字字串分類)

嵌入向量是由浮點數組成的向量(串列)。兩個向量之間的距離可用來衡量其關聯程度。距離越小,表示關聯程度越高;距離越大,表示關聯程度越低。

請參閱我們的定價頁面,了解嵌入向量的定價。請求會根據輸入中的 Token 數量計費。

如何取得嵌入向量

若要取得嵌入向量,請將文字字串連同嵌入模型名稱(例如 text-embedding-3-small)傳送至嵌入向量 API 端點

範例:取得嵌入向量
import OpenAI from "openai";
const openai = new OpenAI();

const embedding = await openai.embeddings.create({
  model: "text-embedding-3-small",
  input: "Your text string goes here",
  encoding_format: "float",
});

console.log(embedding);

回應會包含嵌入向量(浮點數串列)及一些額外的中繼資料。你可以擷取嵌入向量,將其儲存至向量資料庫,並應用於各種使用案例。

{
  "object": "list",
  "data": [
    {
      "object": "embedding",
      "index": 0,
      "embedding": [
        -0.006929283495992422, -0.005336422007530928, -4.547132266452536e-5,
        -0.024047505110502243
      ]
    }
  ],
  "model": "text-embedding-3-small",
  "usage": {
    "prompt_tokens": 5,
    "total_tokens": 5
  }
}

預設情況下,text-embedding-3-small 的嵌入向量長度為 1536text-embedding-3-large 的嵌入向量長度則為 3072。若要降低嵌入向量的維度,同時保留其表達概念的特性,請傳入 dimensions 參數。如需嵌入向量維度的詳細資訊,請參閱嵌入向量使用案例章節

嵌入模型

OpenAI 提供兩款功能強大的第三代嵌入模型(模型 ID 中以 -3 標示)。如需詳細資訊,請參閱嵌入模型 v3 的公告部落格文章

使用費用按輸入 Token 數量計算。下表以每美元可處理的文字頁數說明定價(假設每頁約有 800 個 Token):

模型每美元約可處理的頁數MTEB 評估表現輸入上限
text-embedding-3-small62,50062.3%8192
text-embedding-3-large9,61564.6%8192
text-embedding-ada-00212,50061.0%8192

使用案例

以下使用 Amazon 美食評論資料集,展示幾個具代表性的使用案例。

取得嵌入向量

此資料集共收錄 Amazon 使用者截至 2012 年 10 月留下的 568,454 則食品評論。我們取其中最新的 1000 則評論作為示範用的子集。這些評論以英文撰寫,內容通常偏向正面或負面。每則評論都包含 ProductIdUserIdScore、評論標題(Summary)及評論內文(Text)。例如:

產品 ID使用者 ID評分摘要文字
B001E4KFG0A3SGXH7AUHU8GW5品質優良的狗糧我買過好幾款 Vitality 罐頭……
B00813GRG4A1D87F6ZCVE5NK1與廣告不符收到的產品標示為超大鹽味花生……

以下將評論摘要與評論內文合併為一段文字。模型會將合併後的文字編碼,並輸出單一嵌入向量。

Get_embeddings_from_dataset.ipynb
import { mkdir, writeFile } from "node:fs/promises";
import OpenAI from "openai";

const client = new OpenAI();
const reviews = ["A rich cup of coffee.", "A bright herbal tea."];

const response = await client.embeddings.create({
  model: "text-embedding-3-small",
  input: reviews.map((review) => review.replaceAll("\n", " ")),
});

const csvField = (value) => `"${value.replaceAll('"', '""')}"`;
const rows = response.data.map(({ embedding }, index) =>
  [csvField(reviews[index]), csvField(JSON.stringify(embedding))].join(",")
);

await mkdir("output", { recursive: true });
await writeFile(
  "output/embedded_1k_reviews.csv",
  ["combined,ada_embedding", ...rows].join("\n") + "\n"
);

若要從已儲存的檔案載入資料,可以執行以下程式碼:

import pandas as pd

df = pd.read_csv("output/embedded_1k_reviews.csv")
df["ada_embedding"] = df.ada_embedding.apply(eval).apply(np.array)

常見問題

如何在產生嵌入向量前,得知字串包含多少個 Token?

在 Python 中,你可以使用 OpenAI 的 Token 化工具 tiktoken,將字串拆分成 Token。

範例程式碼:

import tiktoken


def num_tokens_from_string(string: str, encoding_name: str) -> int:
    """Returns the number of tokens in a text string."""
    encoding = tiktoken.get_encoding(encoding_name)
    num_tokens = len(encoding.encode(string))
    return num_tokens


num_tokens_from_string("tiktoken is great!", "cl100k_base")

對於 text-embedding-3-small 等第三代嵌入模型,請使用 cl100k_base 編碼。

如需更多詳細資訊與範例程式碼,請參閱 OpenAI Cookbook 指南:如何使用 tiktoken 計算 Token 數量

如何快速擷取距離最近的 K 個嵌入向量?

若要快速搜尋大量向量,我們建議使用向量資料庫。你可以在我們於 GitHub 上的 Cookbook 中,找到搭配使用向量資料庫與 OpenAI API 的範例。

我應該使用哪種距離函式?

我們建議使用餘弦相似度。通常,選擇哪種距離函式並不會造成太大差異。

OpenAI 嵌入向量均已正規化為長度 1,這表示:

  • 只需計算點積即可求得餘弦相似度,計算速度也會稍快一些
  • 餘弦相似度與歐幾里得距離會產生完全相同的排序結果

我可以在線上分享自己的嵌入向量嗎?

可以,客戶擁有提供給我們模型的輸入,以及模型產生的輸出,嵌入向量也不例外。你有責任確保輸入至我們 API 的內容不違反任何適用法律或我們的使用條款

V3 嵌入模型知道最近發生的事件嗎?

不知道,text-embedding-3-largetext-embedding-3-small 模型不具備 2021 年 9 月之後所發生事件的知識。相較於文字生成模型,這項限制對嵌入模型的影響通常較小,但在某些邊界情況下仍可能降低效能。