OpenAI Docs Guides Embeddings
📅 2024-06-04 | 🖱️
学习如何将文本转换为数字,从而解锁搜索等应用场景。
新的嵌入模型 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端点。响应将包含一个嵌入(浮点数列表),您可以提取该嵌入,将其保存在向量数据库中,并用于许多不同的应用场景。
1curl https://api.openai.com/v1/embeddings \
2 -H "Content-Type: application/json" \
3 -H "Authorization: Bearer $OPENAI_API_KEY" \
4 -d '{
5 "input": "Your text string goes here",
6 "model": "text-embedding-3-small"
7 }'
响应将包含嵌入向量以及一些额外的元数据。
1{
2 "object": "list",
3 "data": [
4 {
5 "object": "embedding",
6 "index": 0,
7 "embedding": [
8 -0.006929283495992422,
9 -0.005336422007530928,
10 ... (omitted for spacing)
11 -4.547132266452536e-05,
12 -0.024047505110502243
13 ],
14 }
15 ],
16 "model": "text-embedding-3-small",
17 "usage": {
18 "prompt_tokens": 5,
19 "total_tokens": 5
20 }
21}
默认情况下,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。
示例代码:
1import tiktoken
2
3def num_tokens_from_string(string: str, encoding_name: str) -> int:
4 """返回文本字符串中的token数量。"""
5 encoding = tiktoken.get_encoding(encoding_name)
6 num_tokens = len(encoding.encode(string))
7 return num_tokens
8
9num_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月之后发生的事件的知识。这通常不像对文本生成模型那样是一个限制,但在某些边缘情况下可能会降低性能。