English
主导航

旧版 API

向量嵌入

了解如何将文本转换为数字,从而解锁搜索等用例。

新嵌入模型
text-embedding-3-small and text-embedding-3-large,我们最新且性能最高的嵌入模型现已发布。它们具有更低的成本、更高的多语言性能,以及用于控制整体大小的新参数。

什么是嵌入?

OpenAI 的文本嵌入可测量文本字符串之间的相关性。嵌入通常用于:

  • 搜索 (其中结果按与查询字符串的相关性进行排名)
  • 聚类 (其中文本字符串按相似性进行分组)
  • 推荐 (其中会推荐具有相关文本字符串的物品)
  • 异常检测 (其中几乎没有相关性的异常值会被识别出来)
  • 多样性测量 (其中相似度分布会被分析)
  • 分类 (其中文本字符串按其最相似的标签进行分类)

嵌入是一个由浮点数组成的向量(列表)。两个向量之间的 距离 衡量了它们的相关性。距离小表示相关性高,距离大表示相关性低。

访问我们的 中找到 以了解嵌入定价。请求根据数量进行计费 token in the 输入.

如何获取嵌入

要获取嵌入,请将您的文本字符串发送给 embeddings API 端点 以及嵌入模型名称(例如, text-embedding-3-small):

示例:获取 embeddings
1
2
3
4
5
6
7
8
9
10
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);

响应中包含嵌入向量(浮点数列表)以及一些附加元数据。您可以提取嵌入向量,将其保存到向量数据库中,并用于许多不同的用例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
  "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
  }
}

默认情况下,嵌入向量的长度为 1536 for text-embedding-3-small or 3072 for text-embedding-3-large。要在不损失其概念表示特性的情况下减少嵌入的维度,请传入 dimensions 参数。请在 嵌入用例部分.

嵌入模型

OpenAI 提供两种强大的第三代嵌入模型(在模型 ID 中以 -3 表示)。阅读嵌入 v3 公告博客文章 for more details.

使用量按输入 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 条评论作为子集。这些评论均为英文,往往带有正面或负面情绪。每条评论都有一个 ProductId, UserId, Score, 评论标题(Summary)和评价正文(Text)。例如:

产品 Id用户 Id评分摘要文本
B001E4KFG0A3SGXH7AUHU8GW5优质狗粮我已经买了几罐 Vitality……
B00813GRG4A1D87F6ZCVE5NK1与宣传不符收到的产品标签写着是特级咸花生…

下面,我们将评论摘要和评论正文合并为一段组合文本。模型对该组合文本进行编码,并输出一个向量嵌入。

Get_embeddings_from_dataset.ipynb
1
2
3
4
5
6
7
8
9
from openai import OpenAI
client = OpenAI()

def get_embedding(text, model="text-embedding-3-small"):
    text = text.replace("\n", " ")
    return client.embeddings.create(input = [text], model=model).data[0].embedding

df['ada_embedding'] = df.combined.apply(lambda x: get_embedding(x, model='text-embedding-3-small'))
df.to_csv('output/embedded_1k_reviews.csv', index=False)

要从已保存的文件中加载数据,你可以运行以下命令:

1
2
3
4
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 的 tokenizer 将字符串拆分为 Token tiktoken.

示例代码:

1
2
3
4
5
6
7
8
9
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 encoding.

更多详情和示例代码请参阅 OpenAI Cookbook 指南 如何使用 tiktoken 计算 token.

如何快速检索 K 个最近的嵌入向量?

为了快速搜索大量向量,我们建议使用向量数据库。您可以在我们的向量数据库集成页面中找到使用向量数据库和 OpenAI API 的示例 in our Cookbook 在 GitHub 上。

我应该使用哪种距离函数?

我们推荐 余弦相似度。距离函数的选择通常影响不大。

OpenAI 嵌入已归一化为长度 1,这意味着:

  • 只需使用点积即可稍微更快地计算出余弦相似度
  • 余弦相似度和欧氏距离将产生相同的排名

我可以在线分享我的嵌入吗?

可以,客户拥有其模型的输入和输出,包括嵌入。您有责任确保输入到我们 API 的内容不违反任何适用法律或我们的 使用条款.

V3 嵌入模型了解近期事件吗?

不,这些 text-embedding-3-large and text-embedding-3-small 模型缺乏关于 2021 年 9 月之后发生的的知识。对于文本生成模型而言,这通常算不上太大的限制,但在某些极端情况下可能会降低性能。