学习如何将文本转换为数字,从而解锁搜索等应用场景。
新的嵌入模型 text-embedding-3-small和text-embedding-3-large是我们最新且性能最强的嵌入模型,现在已经可用,具有更低的成本、更高的多语言性能,以及用于控制整体规模的新参数。
什么是嵌入(embeddings)?
OpenAI的文本嵌入用于衡量文本字符串之间的相关性。嵌入通常用于以下场景:
- 搜索(Search): 根据与查询字符串的相关性对结果进行排序。
- 聚类(Clustering): 按相似性将文本字符串分组。
- 推荐(Recommendations): 推荐具有相关文本字符串的项目。
- 异常检测(Anomaly detection): 识别相关性较低的异常值。
- 多样性测量(Diversity measurement): 分析相似性分布。
- 分类(Classification): 根据最相似的标签对文本字符串进行分类。
嵌入是一个浮点数向量(列表)。两个向量之间的距离衡量它们的相关性。较小的距离表明较高的相关性,而较大的距离表明相关性较低。
访问我们的定价页面了解嵌入的定价。请求的费用根据输入(input)中的token数量计算。
如何获取嵌入
要获取嵌入,您可以将文本字符串和嵌入模型名称(例如,text-embedding-3-small)一起发送到嵌入API端点。响应将包含一个嵌入(浮点数列表),您可以提取该嵌入,将其保存在向量数据库中,并用于许多不同的应用场景。
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-3-small"
}'响应将包含嵌入向量以及一些额外的元数据。
{
"object": "list",
"data": [
{
"object": "embedding",
"index": 0,
"embedding": [
-0.006929283495992422,
-0.005336422007530928,
... (omitted for spacing)
-4.547132266452536e-05,
-0.024047505110502243
],
}
],
"model": "text-embedding-3-small",
"usage": {
"prompt_tokens": 5,
"total_tokens": 5
}
}默认情况下,text-embedding-3-small的嵌入向量长度为1536,text-embedding-3-large的嵌入向量长度为 3072。您可以通过传递维度(dimensions)参数来减少嵌入的维度,而不会失去嵌入的概念表示属性。我们在嵌入使用案例部分中对嵌入维度进行了更详细的介绍。
嵌入模型
OpenAI提供了两种强大的第三代嵌入模型(在模型ID中以-3表示)。您可以阅读 embedding v3 公告博客文章了解更多详情。
使用费用按输入token数计算。以下是每美元可处理文本页数的示例(假设每页约800个token):
| Model | ~ Pages per dollar | Performance on MTEB eval | Max input |
|---|---|---|---|
| text-embedding-3-small | 62,500 | 62.3% | 8191 |
| text-embedding-3-large | 9,615 | 64.6% | 8191 |
| text-embedding-ada-002 | 12,500 | 61.0% | 8191 |
使用场景
这里展示了一些代表性的使用场景。我们将使用亚马逊美食品评论数据集进行以下示例。
- 获取嵌入
- 基于嵌入的搜索进行问答
- 使用嵌入进行文本搜索
- 使用嵌入进行代码搜索
- 使用嵌入进行推荐
- 二维数据可视化
- 嵌入作为机器学习算法的文本特征编码器
- 使用嵌入特征进行分类
- 零样本分类
- 获取用户和产品嵌入以解决冷启动推荐问题
- 聚类
FAQ
如何在嵌入字符串之前知道它有多少个token?
在Python中,你可以使用OpenAI的分词器tiktoken将字符串分割成token。
示例代码:
import tiktoken
def num_tokens_from_string(string: str, encoding_name: str) -> int:
"""返回文本字符串中的token数量。"""
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计算token“部分找到。
如何快速检索K个最近的嵌入向量?
为了快速搜索大量向量,我们推荐使用向量数据库。你可以在我们GitHub上的Cookbook中找到使用向量数据库和OpenAI API的例子。
我应该使用哪种距离函数?
我们推荐使用余弦相似度cosine similarity。距离函数的选择通常不太重要。
OpenAI的嵌入向量已经标准化为长度1,这意味着:
- 余弦相似度可以仅使用点积稍快地计算
- 余弦相似度和欧几里得距离将得到相同的排序结果
我可以在线分享我的嵌入吗?
是的,客户拥有他们输入和输出到我们模型的内容,包括嵌入的情况。你有责任确保你输入到我们API的内容不违反任何适用法律或我们的使用条款。
V3嵌入模型知道最近的事件吗?
不,text-embedding-3-large和text-embedding-3-small模型缺乏2021年9月之后发生的事件的知识。这通常不像对文本生成模型那样是一个限制,但在某些边缘情况下可能会降低性能。