主导航

遗留 API

向量嵌入 (Vector embeddings)

了解如何将文本转换为数字,从而开启搜索等应用场景。

新的嵌入模型
text-embedding-3-small text-embedding-3-large,即我们最新且性能最强的嵌入模型,现已推出。它们具备更低的成本、更高的多语言性能,以及用于控制整体维度的全新参数。

什么是嵌入?

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

  • 搜索(结果根据与查询字符串的相关性进行排序)
  • 聚类(文本字符串按相似性进行分组)
  • 推荐(推荐具有相关文本字符串的项目)
  • 异常检测(识别相关性较低的异常值)
  • 多样性测量(分析相似性分布)
  • 分类(根据最相似的标签对文本字符串进行分类)

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

访问我们的定价页面以了解嵌入服务的价格。请求根据输入中的令牌 (tokens)数量计费。

如何获取嵌入

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

示例:获取嵌入
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
  }
}

默认情况下,text-embedding-3-small 的嵌入向量长度为 1536text-embedding-3-large3072。若要在不丢失其概念表示属性的情况下减少嵌入维度,请传入 dimensions 参数。有关嵌入维度的更多详细信息,请参阅嵌入使用场景部分

嵌入模型

OpenAI 提供两种强大的第三代嵌入模型(由模型 ID 中的 -3 表示)。阅读嵌入 v3 公告博客文章以获取更多详情。

使用按输入令牌计费。以下是每美元(美元)对应的文本页面定价示例(假设每页约 800 个令牌):

模型~ 每美元页面数MTEB 评估性能最大输入
text-embedding-3-small62,50062.3%8192
text-embedding-3-large9,61564.6%8192
text-embedding-ada-00212,50061.0%8192

使用案例

在此,我们使用 亚马逊优质食品评论数据集 展示一些代表性的使用场景。

获取嵌入

该数据集包含截至 2012 年 10 月亚马逊用户留下的总计 568,454 条食品评论。为了演示,我们使用了其中 1000 条最新评论的子集。这些评论均为英文,且通常分为正面或负面。每条评论都有一个 ProductId(产品ID)、UserId(用户ID)、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)

常见问题

在嵌入字符串之前,如何知道它有多少个令牌?

在 Python 中,您可以使用 OpenAI 的分词器 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 编码。

更多详细信息和代码示例请参阅 OpenAI Cookbook 指南:如何使用 tiktoken 计算令牌

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

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

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

我们建议使用余弦相似度。距离函数的选择通常影响不大。

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

  • 余弦相似度可以使用点积更快速地计算出来
  • 余弦相似度和欧几里得距离将产生相同的排序

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

是的,客户拥有我们模型输入和输出的所有权,包括嵌入的情况。您有责任确保您输入到我们 API 中的内容不违反任何适用法律或我们的使用条款

V3 嵌入模型了解最近发生的事件吗?

不了解,text-embedding-3-largetext-embedding-3-small 模型缺乏 2021 年 9 月之后发生的事件的知识。这通常不像对于文本生成模型那样是一个巨大的限制,但在某些边缘情况下可能会降低性能。

© . This website operates independently and is not affiliated with or endorsed by OpenAI, Inc. All brand names, logos, and trademarks are the property of their respective owners.