OpenAI:ChatGPT API 文档之 Embedding

news2024/11/24 19:36:34

在自然语言处理和机器学习领域,"embeddings" 是指将单词、短语或文本转换成连续向量空间的过程。这个向量空间通常被称为嵌入空间(embedding space),而生成的向量则称为嵌入向量(embedding vector)或向量嵌入(vector embedding)。

嵌入向量可以捕获单词、短语或文本的语义信息,使得它们可以在数学上进行比较和计算。这种比较和计算在自然语言处理和机器学习中经常被用于各种任务,例如文本分类、语义搜索、词语相似性计算等。

在中文语境下,"embeddings" 通常被翻译为 "词向量" 或者 "向量表示"。这些翻译强调了嵌入向量的特点,即将词汇转换成向量,并表示为嵌入空间中的点。

OpenAI 中的文本 Embedding 衡量文本字符串之间的相关性。Embedding 通常用于以下场景:

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

 

如何获取 Embedding

要获取 Embedding,将文本字符串和选定的 Embedding 模型 ID(例如 text-embedding-ada-002)发送到 Embedding API 端点。获得的响应中将包含一个 Embedding,你可以提取、保存和使用。

请求示例:

response = openai.Embedding.create(
    input="Your text string goes here",
    model="text-embedding-ada-002"
)
embeddings = response['data'][0]['embedding']

响应示例:

{
  "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 代码示例。

Embedding 模型

OpenAI 提供了一个第二代 Embedding 模型(在模型 ID 中标记为 -002)和 16 个第一代模型(在模型 ID 中标记为 -001)。

几乎所有用例我们都推荐使用 text-embedding-ada-002。这一模型更好、更便宜、更简单易用。相关信息可以阅读博客文章中的公告。

模型版本分词器最大输入 token 数知识截断日期
V2cl100k_base8191Sep 2021
V1GPT-2/GPT-32046Aug 2020

按输入 token 计费,费率为每 1000 个 token 0.0004 美元,约为每美元 3000 页(假设每页约 800 个 token):

模型每美元大约页数在 BEIR 搜索评估中的示例性能
text-embedding-ada-002300053.9
davinci-001652.8
curie-0016050.9
babbage-00124050.4
ada-00130049.0

第二代模型

模型名称分词器最大输入 token 数输出维度
text-embedding-ada-002cl100k_base81911536

第一代模型(不推荐使用)

所有第一代模型(以 -001 结尾的模型)均使用 GPT-3 分词器,最大输入为 2046 个 token。

第一代 Embedding 由五种不同的模型系列生成,针对三种不同的任务进行调整:文本搜索、文本相似度和代码搜索。其中搜索模型都有两个:一个用于短查询,一个用于长文档。每个系列包括不同质量和速度的四个模型:

模型输出维度
Ada1024
Babbage2048
Curie4096
Davinci12288

Davinci 是能力最强的,但比起其他模型来,更慢更昂贵。Ada 能力最弱,但明显更快更便宜。

相似性模型

相似性模型最擅长捕捉文本之间的语义相似性。

使用场景可用模型
Clustering, regression, anomaly detection, visualizationtext-similarity-ada-001
text-similarity-babbage-001
text-similarity-curie-001
text-similarity-davinci-001

文本搜索模型

文本搜索模型有助于衡量哪些长文档与短搜索查询最相关。使用两种模型:一种用于将搜索查询向量表示,另一种用于将要排序的文档向量表示。与查询 Embedding 最接近的文档 Embedding 应该是最相关的。

使用场景可用模型
Search, context relevance, information retrievaltext-search-ada-doc-001
text-search-ada-query-001
text-search-babbage-doc-001
text-search-babbage-query-001
text-search-curie-doc-001
text-search-curie-query-001
text-search-davinci-doc-001
text-search-davinci-query-001

代码搜索模型

与搜索模型一样,有两种类型:一种用于向量表示自然语言搜索查询,另一种用于向量表示代码片段以进行检索。

使用场景可用模型
Code search and relevancecode-search-ada-code-001
code-search-ada-text-001
code-search-babbage-code-001
code-search-babbage-text-001
对于 -001 文本 Embedding(不是 -002 ,也不是代码 Embedding),建议将输入中的换行符( \n)替换为一个空格,因为我们发现存在换行符时,结果会更差。

使用场景

这里展示了一些典型的使用场景,我们将在以下示例中使用亚马逊美食评论数据集。

获取 Embedding

该数据集包含截至 2012 年 10 月,亚马逊用户留下的共计 568454 条食品评论。我们将使用最近的 1000 条评论作为示例。这些评论是用英文撰写的,倾向有积极有消极。每个评论都有一个产品 ID、用户 ID、评分(SCORE)、评论标题(SUMMARY)和评论正文(TEXT)。例如:

PRODUCT IDUSER IDSCORESUMMARYTEXT
B001E4KFG0A3SGXH7AUHU8GW5Good Quality Dog FoodI have bought several of the Vitality canned...
B00813GRG4A1D87F6ZCVE5NK1Not as AdvertisedProduct arrived labeled as Jumbo Salted Peanut...

我们把评论摘要和评论文本合并为一个组合文本。模型将对这一组合文本进行编码,输出一个向量 Embedding。

Obtain_dataset.ipynb

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)

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

import pandas as pd

df = pd.read_csv('output/embedded_1k_reviews.csv')
df['ada_embedding'] = df.ada_embedding.apply(eval).apply(np.array)

二维数据可视化

Visualizing_embeddings_in_2D.ipynb

Embedding 的大小随着底层模型的复杂性而变化。为了可视化这些高维数据,我们使用 t-SNE 算法将数据转换为二维数据。

根据评价者所给出的星级评分来给评论着色:

  • 1星:红色
  • 2星:橙色
  • 3星:金色
  • 4星:青绿色
  • 5星:深绿色

可视化似乎产生了大约 3 个集群,其中一个集群的大部分都是负面评论。

import pandas as pd
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
import matplotlib

df = pd.read_csv('output/embedded_1k_reviews.csv')
matrix = df.ada_embedding.apply(eval).to_list()

# Create a t-SNE model and transform the data
tsne = TSNE(n_components=2, perplexity=15, random_state=42, init='random', learning_rate=200)
vis_dims = tsne.fit_transform(matrix)

colors = ["red", "darkorange", "gold", "turquiose", "darkgreen"]
x = [x for x,y in vis_dims]
y = [y for x,y in vis_dims]
color_indices = df.Score.values - 1

colormap = matplotlib.colors.ListedColormap(colors)
plt.scatter(x, y, c=color_indices, cmap=colormap, alpha=0.3)
plt.title("Amazon ratings visualized in language using t-SNE")

将 Embedding 用作 ML 算法的文本特征编码器

Regression_using_embeddings.ipynb

Embedding 可以被用作机器学习模型中的通用自由文本特征编码器。如果一些相关输入是自由文本,将 Embedding 加入模型会提高机器学习模型的性能。Embedding 也可以被用作机器学习模型中的分类特征编码器。如果分类变量的名称有意义且数量众多,比如“工作职称”,这将会增加最大的价值。相似性 Embedding 通常比搜索 Embedding 在这个任务上表现更好。

我们观察到向量表示通常都非常丰富和信息密集。使用 SVD 或 PCA 将输入的维度降低 10%,通常会导致特定任务的下游性能变差。

这段代码将数据分为训练集和测试集,将用于以下两个案例,即回归和分类。

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
    list(df.ada_embedding.values),
    df.Score,
    test_size = 0.2,
    random_state=42
)

使用 Embedding 特征进行回归

Embedding 提供了一种优雅的方法来预测数值。在这个例子中,我们基于评论文本预测评论者的星级评分。由于 Embedding 内包含的语义信息很高,即使只有很少的评论,预测结果也很不错。

我们假设分数是在 1 到 5 之间的连续变量,允许算法预测浮点数值。机器学习算法通过最小化预测值与真实分数之间的距离,实现了平均绝对误差为 0.39,这意味着还不到半个星级。

from sklearn.ensemble import RandomForestRegressor

rfr = RandomForestRegressor(n_estimators=100)
rfr.fit(X_train, y_train)
preds = rfr.predict(X_test)

使用 Embedding 特征进行分类

使用 Embedding 进行分类.ipynb

这次,不是让算法预测 1 到 5 之间的任意值,而是尝试将评价的精确星级分类为 5 个 bucket,从 1 星到 5 星。

经过训练后,模型可以学习到更好地预测 1 星和 5 星的评论,因为这两者情感表达更加极端,对于情感比较微妙的评论(2-4 星),可能学习效果较差。

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, accuracy_score

clf = RandomForestClassifier(n_estimators=100)
clf.fit(X_train, y_train)
preds = clf.predict(X_test)

零样本分类

使用 Embedding 进行零样本分类.ipynb

我们可以使用 Embedding 进行零样本分类,无需任何标记的训练数据。对于每个类别,我们将类别名称或类别的简短描述进行向量表示。要以零样本的方式对一些新文本进行分类,只需要将新文本的 Embedding 与所有类别 Embedding 进行比较,预测具有最高相似度的类别。

from openai.embeddings_utils import cosine_similarity, get_embedding

df= df[df.Score!=3]
df['sentiment'] = df.Score.replace({1:'negative', 2:'negative', 4:'positive', 5:'positive'})

labels = ['negative', 'positive']
label_embeddings = [get_embedding(label, model=model) for label in labels]

def label_score(review_embedding, label_embeddings):
   return cosine_similarity(review_embedding, label_embeddings[1]) - cosine_similarity(review_embedding, label_embeddings[0])

prediction = 'positive' if label_score('Sample Review', label_embeddings) > 0 else 'negative'

获取用户和产品的 Embedding 用于冷启动推荐

User_and_product_embeddings.ipynb

可以通过对某一用户的所有评论进行平均来获得该用户的 Embedding,通过对有关某产品的所有评论进行平均来获得该产品的 Embedding。为了展示这种方法的实用性,我们使用了包含 50k 个评论的子集以覆盖更多用户和产品的评论。

我们在单独的测试集上评估这些 Embedding 的有用性,将用户和产品 Embedding 的相似性绘制为评分的函数。有趣的是,基于这种方法,在用户收到产品之前,我们就可以预测他们是否会喜欢该产品,获得比随机预测更好的结果。

user_embeddings = df.groupby('UserId').ada_embedding.apply(np.mean)
prod_embeddings = df.groupby('ProductId').ada_embedding.apply(np.mean)

聚类

聚类.ipynb

聚类是理解大量文本数据的一种方法。Embedding 对于此任务很有用,因为它们提供每个文本的语义有意义的向量表示。因此,在无监督的方式下,聚类将揭示数据集中的隐藏分组。

在此示例中,我们发现四个不同的聚类:一个关注狗粮,一个关注负面评论,两个关注正面评论。

import numpy as np
from sklearn.cluster import KMeans

matrix = np.vstack(df.ada_embedding.values)
n_clusters = 4

kmeans = KMeans(n_clusters = n_clusters, init='k-means++', random_state=42)
kmeans.fit(matrix)
df['Cluster'] = kmeans.labels_

使用 Embedding 进行文本搜索

使用 Embedding 进行语义文本搜索.ipynb

为了检索出最相关的文档,我们使用查询嵌入向量和文档嵌入向量之间的余弦相似度,返回得分最高的文档。

from openai.embeddings_utils import get_embedding, cosine_similarity

def search_reviews(df, product_description, n=3, pprint=True):
   embedding = get_embedding(product_description, model='text-embedding-ada-002')
   df['similarities'] = df.ada_embedding.apply(lambda x: cosine_similarity(x, embedding))
   res = df.sort_values('similarities', ascending=False).head(n)
   return res

res = search_reviews(df, 'delicious beans', n=3)

使用 Embedding 代码搜索

Code_search.ipynb

代码搜索类似于基于 Embedding 的文本搜索。我们提供了一种从给定代码库的所有 Python 文件中提取 Python 函数的方法。然后每个函数都通过 text-embedding-ada-002 模型进行索引。

为了执行代码搜索,我们使用相同的模型以自然语言将查询进行向量表示。然后,计算查询结果 Embedding 和每个函数 Embedding 之间的余弦相似度。余弦相似度最高的结果最相关。

from openai.embeddings_utils import get_embedding, cosine_similarity

df['code_embedding'] = df['code'].apply(lambda x: get_embedding(x, model='text-embedding-ada-002'))

def search_functions(df, code_query, n=3, pprint=True, n_lines=7):
   embedding = get_embedding(code_query, model='text-embedding-ada-002')
   df['similarities'] = df.code_embedding.apply(lambda x: cosine_similarity(x, embedding))

   res = df.sort_values('similarities', ascending=False).head(n)
   return res
res = search_functions(df, 'Completions API tests', n=3)

使用 Embedding 进行推荐

Recommendation_using_embeddings.ipynb

因为嵌入向量之间的距离越短,表示它们之间的相似性越大,所以 Embedding 可以用于推荐系统。

下面我们展示一个基本的推荐系统。它接受一个字符串列表和一个 source 字符串,计算它们的嵌入向量,然后返回一个排序列表,从最相似到最不相似。上面链接的 Notebook 文件中,应用了这个函数的一个版本来处理 AG 新闻数据集(采样到 2000 个新闻文章描述),返回与任何给定 source 文章最相似的前 5 篇文章。

def recommendations_from_strings(
   strings: List[str],
   index_of_source_string: int,
   model="text-embedding-ada-002",
) -> List[int]:
   """Return nearest neighbors of a given string."""

# get embeddings for all strings
   embeddings = [embedding_from_string(string, model=model) for string in strings]

# get the embedding of the source string
   query_embedding = embeddings[index_of_source_string]

# get distances between the source embedding and other embeddings (function from embeddings_utils.py)
   distances = distances_from_embeddings(query_embedding, embeddings, distance_metric="cosine")

# get indices of nearest neighbors (function from embeddings_utils.py)
   indices_of_nearest_neighbors = indices_of_nearest_neighbors_from_distances(distances)
   return indices_of_nearest_neighbors

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1512312.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于支持向量机SVM的沉降预测,SVM详细原理,Libsvm详解

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 完整代码和数据下载链接:基于支持向量机SVM的沉降预测资源-CSDN文库 https://download.csdn.net/download/abc991835105/88947544 SVM应用实例,基于支持向量机SVM的沉降预测…

LED基础知识分享(一)

大家好,我是砖一。 今天给大家分享一下,LED的基础知识,有照明行业,或者对LED感兴趣的朋友,可以学习一下,希望对你有用~ 一,什么是LED (Light Emitting Diode)? 1,LED是一种发出某…

力扣面试经典150 —— 16-20题

力扣面试经典150题在 VScode 中安装 LeetCode 插件即可使用 VScode 刷题,安装 Debug LeetCode 插件可以免费 debug本文使用 python 语言解题,文中 “数组” 通常指 python 列表;文中 “指针” 通常指 python 列表索引 文章目录 16. [困难] 接…

深度学习——第10章 优化神经网络:如何防止过拟合(DNN)

第10章 优化神经网络:如何防止过拟合(DNN) 目录 10.1 什么是过拟合 10.2 L1、L2正则化 10.3 L2正则化的物理解释 10.4 Dropout正则化 10.5 其它正则化技巧 10.6 总结 上一课,我们一步步搭建了一个深层神经网络来实现图片的分类。结果显示,随着网络层数加深,隐藏层数…

【力扣 - 合并区间】

题目描述 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [start_i, end_i] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输入:int…

剑指offer C ++双栈实现队列

1. 基础 队列:先进先出,即插入数据在队尾进行,删除数据在队头进行; 栈:后进先出,即插入与删除数据均在栈顶进行。 2. 思路 两个栈实现一个队列的思想:用pushStack栈作为push数据的栈&#xff…

Linux 多进程开发(下)

第二章 Linux 多进程开发 2.6 进程间通信2.6.1 匿名管道2.6.2 有名管道2.6.3 内存映射2.6.4 信号2.6.5 共享内存 2.7 守护进程 网络编程系列文章: 第1章 Linux系统编程入门(上) 第1章 Linux系统编程入门(下) 第2章 L…

word中图片位置问题(后续遇到问题再更新)

问题1:图片插入后显示不全 具体表现为:复制黏贴、或者插入图片后,出现插入的图片显示不全,或者不显示。 例如: 这是因为:图片被设定了固定行距 解决方案:ctrl1 效果: 问题2&am…

南昌云宸网络发展有限公司-小分类客户可自选

南昌云辰网络发展有限公司是华东地区最大的互联网公司。 公司业务涉及互联网营销策划、移动互联网、物联网、广告传媒、微电影、***等,依托以互联网技术为核心的B2B企业贸易平台和O2O电子商务平台,提供为用户提供一站式网络营销策划和解决方案。 &#…

String类(C++)详解与应用

1. 标准库中的string类 1.1 string类 http://www.cplusplus.com/reference/string/string/?kwstringhttp://www.cplusplus.com/reference/string/string/?kwstring1. 字符串是表示字符序列的类2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的…

【数据库】Oracle内存结构与参数调优

Oracle内存结构与参数调优 Oracle 内存结构概览oracle参数配置概览重要参数(系统运行前配置):次要参数(可在系统运行后再优化调整): Oracle数据库服务器参数如何调整OLTP内存分配操作系统核心参数配置Disabling ASMM(禁…

力扣--课程表--bfs+dfs

整体思路: 这是一道拓扑序列的题目,我们将边的方向定义成从先修课指向后修课的方向,借一下官方的题解图片,我们需要判断的是形成的这个图结构是否存在环,如果存在环,那么代表不能完成所有课程的学习。 bfs思…

【leetcode】相同的树➕对称二叉树➕另一棵树的子树

大家好,我是苏貝,本篇博客带大家刷题,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 一. 相同的树二. 对称二叉树三. 另一棵树的子树 一. 相同的树 点击查看题目 思路: bool isSameTree(…

YOLOv9改进 添加新型卷积注意力框架SegNext_Attention

一、SegNext论文 论文地址:2209.08575.pdf (arxiv.org) 二、 SegNext_Attention注意力框架结构 在SegNext_Attention中,注意力机制被引入到编码器和解码器之间的连接中,帮助模型更好地利用全局上下文信息。具体而言,注意力机制通过学习像素级的注意力权重,使得模型可以对…

ChatGPT Prompt 的原理总结

ChatGPT Prompt 的原理总结 ChatGPT Prompt 是 OpenAI 开发的大型语言模型 ChatGPT 的一种使用方式。通过 Prompt,用户可以引导 ChatGPT 生成特定内容,例如回答问题、写故事、写代码等等。 Prompt 的原理 Prompt 本质上是一段文本,它告诉 C…

Opencv 插值方法 总结

一、概括 面试的时候问到了一个图,就是如何将一个算子放缩??我第一反应是resize(),但是后来我转念一想,人家问的是插值方式,今天来总结一下 最邻近插值法原理分析及c实现_最临近插值法-CSDN博…

【位运算】【脑筋急转弯】2749. 得到整数零需要执行的最少操作数

作者推荐 视频算法专题 本文涉及知识点 2749. 得到整数零需要执行的最少操作数 给你两个整数:num1 和 num2 。 在一步操作中,你需要从范围 [0, 60] 中选出一个整数 i ,并从 num1 减去 2i num2 。 请你计算,要想使 num1 等于 …

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的血细胞智能检测与计数(深度学习模型+UI界面代码+训练数据集)

摘要:开发血细胞智能检测与计数系统对于疾病的预防、诊断和治疗具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个血细胞智能检测与计数系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并对比了YOLOv7、YOLOv6、YOLOv5&a…

oracle临时表空间不释放

项目报错 nested exception is java.sql.SQLException: ORA-01652: unable to extend temp segment by 128 in tablespace TEMP 原因是临时表空间满了,临时表空间一直增长,未释放导致临时表空间使用率100%。 查询临时表空间使用率 --临时表空间利用率…

Selenium控制已运行的Edge和Chrome浏览器(详细启动步骤和bug记录)

文章目录 前期准备1. 浏览器开启远程控制指令(1)Edge(2)Chrome 2. 执行python代码(1)先启动浏览器后执行代码(2)通过代码启动浏览器 3. 爬取效果3. 完整代码共享3.1 包含Excel部分的…