admin管理员组

文章数量:1031968

Embeddings

什么是嵌入?

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

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

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

如何获取嵌入

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

示例请求:

代码语言:javascript代码运行次数:0运行复制
curl  \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{"input": "Your text string goes here",
       "model":"text-embedding-ada-002"}'

示例响应:

代码语言:javascript代码运行次数:0运行复制
{
  "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 提供 1 个第二代嵌入模型(用模型 ID 表示)和 16 个第一代模型(用模型 ID 表示)。-002-001

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

模型生成

分词器

最大输入令牌数

知识截止

V2 版

cl100k_base

8191

2021 年 9 月

V1 版

GPT-2/GPT-3

2046

2020 年 8 月

使用量按每个输入令牌定价,费率为每 1000 个令牌 0.0004 USD,或每美元约 ~3,000 页(假设每页 ~800 个令牌):

每美元粗略页数

BEIR搜索评估中的示例性能

文本嵌入-ADA-002

3000

53.9

*-达芬奇-*-001

6

52.8

*-居里-*-001

60

50.9

*-巴贝奇-*-001

240

50.4

*-阿达-*-001

300

49.0

第二代车型

型号名称

分词器

最大输入令牌数

输出尺寸

文本嵌入-ADA-002

cl100k_base

8191

1536

第一代型号(不推荐)

使用案例

在这里,我们展示了一些具有代表性的用例。对于以下示例,我们将使用亚马逊美食评论数据集。

获取嵌入

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

产品编号

用户标识

得分

总结

发短信

B001E4KFG0

A3SGXH7AUHU8GW

5

优质狗粮

我买了几个活力罐头...

B00813GRG4

A1D87F6ZCVE5NK

1

不像广告上所说的那样

产品到达时标有巨型盐渍花生...

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

Obtain_dataset.ipynb

代码语言:javascript代码运行次数:0运行复制
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'] = dfbined.apply(lambda x: get_embedding(x, model='text-embedding-ada-002'))
df.to_csv('output/embedded_1k_reviews.csv', index=False)

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

代码语言:javascript代码运行次数:0运行复制
import pandas as pd
 
df = pd.read_csv('output/embedded_1k_reviews.csv')
df['ada_embedding'] = df.ada_embedding.apply(eval).apply(np.array)

2D 数据可视化

嵌入为 ML 算法的文本特征编码器

使用嵌入特征进行分类

零镜头分类

获取用户和产品嵌入以进行冷启动建议

聚类

使用嵌入进行文本搜索

使用嵌入进行代码搜索

使用嵌入的建议

限制与风险

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

社会偏见

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

我们通过运行SEAT(May等人,2019)和Winogender(Rudinger等人,2018)基准测试在我们的模型中发现了偏见的证据。这些基准共同由 7 个测试组成,用于衡量模型在应用于性别名称、区域名称和一些刻板印象时是否包含隐性偏见。

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

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

这些测试是初步的,我们建议针对您的特定用例运行测试。这些结果应被视为该现象存在的证据,而不是您的用例的明确特征。请参阅我们的使用政策以获取更多详细信息和指导。

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

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

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

我们的模型在包含截至 2020 年 8 月的真实世界事件的一些信息的数据集上进行训练。如果您依赖代表最近事件的模型,那么它们可能无法很好地执行。

常见问题

在嵌入字符串之前,如何判断字符串有多少个标记?

在Python中,你可以使用OpenAI的tokenizertiktoken将字符串拆分为代币。

示例代码:

代码语言:javascript代码运行次数:0运行复制
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-002cl100k_base

更多详细信息和示例代码在 OpenAI 食谱指南如何使用tiktoken 计算代币。

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

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

矢量数据库选项包括:

  • 松果,一个完全托管的载体数据库
  • Weaviate,一个开源的矢量搜索引擎
  • Faiss,Facebook的矢量搜索算法
  • 作为矢量数据库的 Redis
  • Qdrant,一个矢量搜索引擎
  • Typesense,开源搜索引擎,带矢量搜索

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

我们建议余弦相似性。距离函数的选择通常并不重要。

OpenAI 嵌入被规范化为长度 1,这意味着:

  • 余弦相似性的计算速度稍快,只需使用点积即可
  • 余弦相似性和欧几里得距离将导致相同的排名
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2023-02-20,如有侵权请联系 cloudcommunity@tencent 删除模型入门系统apiopenai

Embeddings

什么是嵌入?

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

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

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

如何获取嵌入

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

示例请求:

代码语言:javascript代码运行次数:0运行复制
curl  \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{"input": "Your text string goes here",
       "model":"text-embedding-ada-002"}'

示例响应:

代码语言:javascript代码运行次数:0运行复制
{
  "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 提供 1 个第二代嵌入模型(用模型 ID 表示)和 16 个第一代模型(用模型 ID 表示)。-002-001

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

模型生成

分词器

最大输入令牌数

知识截止

V2 版

cl100k_base

8191

2021 年 9 月

V1 版

GPT-2/GPT-3

2046

2020 年 8 月

使用量按每个输入令牌定价,费率为每 1000 个令牌 0.0004 USD,或每美元约 ~3,000 页(假设每页 ~800 个令牌):

每美元粗略页数

BEIR搜索评估中的示例性能

文本嵌入-ADA-002

3000

53.9

*-达芬奇-*-001

6

52.8

*-居里-*-001

60

50.9

*-巴贝奇-*-001

240

50.4

*-阿达-*-001

300

49.0

第二代车型

型号名称

分词器

最大输入令牌数

输出尺寸

文本嵌入-ADA-002

cl100k_base

8191

1536

第一代型号(不推荐)

使用案例

在这里,我们展示了一些具有代表性的用例。对于以下示例,我们将使用亚马逊美食评论数据集。

获取嵌入

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

产品编号

用户标识

得分

总结

发短信

B001E4KFG0

A3SGXH7AUHU8GW

5

优质狗粮

我买了几个活力罐头...

B00813GRG4

A1D87F6ZCVE5NK

1

不像广告上所说的那样

产品到达时标有巨型盐渍花生...

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

Obtain_dataset.ipynb

代码语言:javascript代码运行次数:0运行复制
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'] = dfbined.apply(lambda x: get_embedding(x, model='text-embedding-ada-002'))
df.to_csv('output/embedded_1k_reviews.csv', index=False)

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

代码语言:javascript代码运行次数:0运行复制
import pandas as pd
 
df = pd.read_csv('output/embedded_1k_reviews.csv')
df['ada_embedding'] = df.ada_embedding.apply(eval).apply(np.array)

2D 数据可视化

嵌入为 ML 算法的文本特征编码器

使用嵌入特征进行分类

零镜头分类

获取用户和产品嵌入以进行冷启动建议

聚类

使用嵌入进行文本搜索

使用嵌入进行代码搜索

使用嵌入的建议

限制与风险

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

社会偏见

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

我们通过运行SEAT(May等人,2019)和Winogender(Rudinger等人,2018)基准测试在我们的模型中发现了偏见的证据。这些基准共同由 7 个测试组成,用于衡量模型在应用于性别名称、区域名称和一些刻板印象时是否包含隐性偏见。

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

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

这些测试是初步的,我们建议针对您的特定用例运行测试。这些结果应被视为该现象存在的证据,而不是您的用例的明确特征。请参阅我们的使用政策以获取更多详细信息和指导。

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

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

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

我们的模型在包含截至 2020 年 8 月的真实世界事件的一些信息的数据集上进行训练。如果您依赖代表最近事件的模型,那么它们可能无法很好地执行。

常见问题

在嵌入字符串之前,如何判断字符串有多少个标记?

在Python中,你可以使用OpenAI的tokenizertiktoken将字符串拆分为代币。

示例代码:

代码语言:javascript代码运行次数:0运行复制
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-002cl100k_base

更多详细信息和示例代码在 OpenAI 食谱指南如何使用tiktoken 计算代币。

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

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

矢量数据库选项包括:

  • 松果,一个完全托管的载体数据库
  • Weaviate,一个开源的矢量搜索引擎
  • Faiss,Facebook的矢量搜索算法
  • 作为矢量数据库的 Redis
  • Qdrant,一个矢量搜索引擎
  • Typesense,开源搜索引擎,带矢量搜索

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

我们建议余弦相似性。距离函数的选择通常并不重要。

OpenAI 嵌入被规范化为长度 1,这意味着:

  • 余弦相似性的计算速度稍快,只需使用点积即可
  • 余弦相似性和欧几里得距离将导致相同的排名
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2023-02-20,如有侵权请联系 cloudcommunity@tencent 删除模型入门系统apiopenai

本文标签: Embeddings