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 美食评论数据集展示一些典型的使用场景。

获取嵌入向量

该数据集包含截至 2012 年 10 月 Amazon 用户发表的共 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 的分词器 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 月之后发生的事件的相关知识。与文本生成模型相比,这一限制对嵌入模型的影响通常较小,但在某些边缘情况下可能会降低性能。