嵌入式表示 Embeddings

OpenAI 的文本嵌入衡量文本字符串的相关性。 嵌入是常用的

什么是嵌入?

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

  • 搜索(结果按与查询字符串的相关性排名)
  • 聚类(其中文本字符串按相似性分组)
  • 建议(推荐带有相关文本字符串的项目)
  • 异常检测(识别出相关性很小的异常值)
  • 多样性测量(分析相似性分布)
  • 分类(其中文本字符串按其最相似的标签分类)

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

访问我们的定价页面 了解嵌入定价。 请求根据发送的 input 中的 tokens 数量计费。

要查看嵌入操作,请查看我们的代码示例

  • 分类
  • 主题聚类
  • 搜索
  • 建议

Browse Samples

如何获取嵌入

要获得嵌入,请将您的文本字符串发送到 embeddings API 端点,同时选择嵌入模型 ID(例如,text-embedding-ada-002)。 响应将包含一个嵌入,您可以提取、保存和使用它。

示例请求:

bash
curl https://api.openai.com/v1/embeddings \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "input": "Your text string goes here",
    "model": "text-embedding-ada-002"
  }'

Example response:

json
{
  "data": [
    {
      "embedding": [
        -0.006929283495992422,
        -0.005336422007530928,
        ...
        -4.547132266452536e-05,
        -0.024047505110502243
      ],
      "index": 0,
      "object": "embedding"
    }
  ],
  "model": "text-embedding-ada-002",
  "object": "list",
  "usage": {
    "prompt_tokens": 5,
    "total_tokens": 5
  }
}

OpenAI Cookbook 中查看更多 Python 代码示例。

使用 OpenAI 嵌入时,请记住它们的限制和风险

嵌入模型

OpenAI 提供了一个第二代嵌入模型(在模型 ID 中用“-002”表示)和 16 个第一代模型(在模型 ID 中用“-001”表示)。

我们建议对几乎所有用例使用 text-embedding-ada-002。 它更好、更便宜、更易于使用。 阅读博文公告

模型生成tokenizer最大输入令牌知识截止
V2cl100k_base8191Sep 2021
V1GPT-2/GPT-32046Aug 2020

使用价格为每个输入令牌,每1000个令牌的价格为0.0004美元,每美元约为约3,000页(假设每页约为800个令牌):

ModelRough pages per dollarExample performance on BEIR search eval
text-embedding-ada-002300053.9
*-davinci-*-001652.8
*-curie-*-0016050.9
*-babbage-*-00124050.4
*-ada-*-00130049.0

二代机型

Model nametokenizermax input tokensoutput dimensions
text-embedding-ada-002cl100k_base81911536
第一代机型(不推荐)
详情

用例

在这里,我们展示了一些有代表性的用例。 我们将使用 Amazon fine-food reviews dataset 作为以下示例。

获取嵌入

该数据集包含截至 2012 年 10 月亚马逊用户留下的总共 568,454 条食品评论。我们将使用 1,000 条最新评论的子集用于说明目的。 评论是英文的,往往是正面的或负面的。 每条评论都有一个 ProductId、UserId、Score、评论标题(摘要)和评论正文(文本)。 例如:

Product IdUser IdScoreSummaryText
B001E4KFG0A3SGXH7AUHU8GW5Good Quality Dog FoodI have bought several of the Vitality canned...
B00813GRG4A1D87F6ZCVE5NK1Not as AdvertisedProduct arrived labeled as Jumbo Salted Peanut...

我们将将评论摘要结合起来,并将文本审查为单个组合文本。 该模型将编码此组合的文本并输出单个向量嵌入。

获取数据集 Obtain_dataset.ipynb

py
def get_embedding(text, model="text-embedding-ada-002"):
   text = text.replace("\n", " ")
   return openai.Embedding.create(input = [text], model=model)['data'][0]['embedding']

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

要从保存的文件加载数据,您可以运行以下内容:

py
import pandas as pd

df = pd.read_csv('output/embedded_1k_reviews.csv')
df['ada_embedding'] = df.ada_embedding.apply(eval).apply(np.array)
二维数据可视化
详情
嵌入作为 ML 算法的文本特征编码器
详情
使用嵌入特征进行分类
详情
零样本分类
详情
获取用户和产品嵌入以进行冷启动推荐
详情
聚类
详情
使用嵌入的文本搜索
详情
使用嵌入的代码搜索
详情
使用嵌入的推荐
详情

局限性和风险

我们的嵌入模型可能不可靠或在某些情况下会带来社会风险,并且在没有缓解措施的情况下可能会造成伤害。

社会偏见

限制:模型编码社会偏见,例如。 通过对某些群体的刻板印象或负面情绪。

我们通过运行 SEAT May et al, 2019 和 Winogender Rudinger et al, 2018 基准。 这些基准一起包含 7 个测试,用于衡量模型在应用于性别名称、区域名称和某些刻板印象时是否包含隐性偏见。

例如,我们发现,与非裔美国人的名字相比,我们的模型更强烈地将 (a) 欧裔美国人的名字与积极情绪联系起来,以及 (b) 对黑人女性的负面刻板印象。

这些基准在几个方面存在局限性:(a) 它们可能无法推广到您的特定用例,以及 (b) 它们仅测试极小部分可能的社会偏见。

**这些测试是初步的,我们建议针对您的特定用例运行测试。**这些结果应被视为现象存在的证据,而不是对您的用例的明确描述。 请参阅我们的使用政策 了解更多详情和指导。

如果您有任何问题,请通过聊天联系我们的支持团队; 我们很乐意就此提供建议。

对最近发生的事件视而不见

限制:模型缺乏对 2020 年 8 月之后发生的事件的了解。

我们的模型在包含 8/2020 之前真实世界事件的一些信息的数据集上进行训练。 如果你依赖于代表最近事件的模型,那么它们可能表现不佳。

常见问题

在嵌入字符串之前如何知道它有多少个标记?

在 Python 中,您可以使用 OpenAI 的标记器 tiktoken 将字符串拆分为标记。

示例代码:

py
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-ada-002”等第二代嵌入模型,请使用“cl100k_base”编码。

更多详细信息和示例代码在 OpenAI Cookbook 指南如何使用 tiktoken 计算令牌 中。

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

为了快速搜索多个矢量,我们建议使用矢量数据库。 您可以在 GitHub 上找到使用矢量数据库和 OpenAI API 的示例 在我们的说明书中

矢量数据库选项包括:

  • Pinecone, a fully managed vector database
  • Weaviate, an open-source vector search engine
  • Redis as a vector database
  • Qdrant, a vector search engine
  • Milvus, a vector database built for scalable similarity search
  • Chroma, an open-source embeddings store

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

我们推荐 余弦相似度。 距离函数的选择通常无关紧要。

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

  • 仅使用点积可以稍微更快地计算余弦相似度
  • 余弦相似度和欧几里德距离将导致相同的排名

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

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