嵌入模式
学习怎么将文本转换成数字,解锁搜索等案例。
新的嵌入模型
text-embedding-3-small 和 text-embedding-3-large,是目前最新的并且性能最好的嵌入模型,成本低,支持多语言,拥有控制所有大小的新参数
1. 什么是嵌入?
OpenAI的文本嵌入衡量文本字符串的相关性。嵌入通常用于:
- 搜索(通过一个查询字符串的相关性将结果排序)
- 聚类(通过相似性将文本字符串进行分组)
- 推荐(推荐与文本字符串相关的条目)
- 异常检测(相关性不大的异常值被识别出来)
- 多样性衡量(分析相似度分布)
- 分类(通过最相似的标签分类文本字符串)
嵌入是一个浮点型的向量。用距离衡量两个向量的相关性。小的距离暗示高相关性,大的距离暗示低相关性。
2. 怎样获得嵌入?
要获得嵌入模式,将文本字符串与嵌入模型ID一起发送到嵌入API端点(例如:text-embedding-3-small)。响应会包含一个嵌入模式(浮点型列表),能被提取保存到一个向量数据库,能被许多的应用案例所使用。
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参数来降低嵌入的维度,而不会使嵌入模式失去其表示概念的属性。
3. 嵌入模型
OpenAI提供两个功能强大第三代嵌入模型(使用模型ID -3表示)。
模型版本 | 分词器 | 最大输入tokens |
---|---|---|
V3 | cl100k_base | 8191 |
V2 | cl100k_base | 8191 |
4. 使用案例
亚马逊美食评论数据集 提取码: a5uh 案例开发如下:
4.1 获得嵌入
数据集总计包含568,454条食品评论。只使用1000条数据子集。评论内容使用英文,其中有正面和负面的。评论字段:ProductId,UserId,Score,Summary,Text,例如:
ProductId | UserId | Score | Summary | Text |
---|---|---|---|---|
B001E4KFG0 | A3SGXH7AUHU8GW | 5 | Good Quality Dog Food | I have bought several of the Vitality canned… |
B001E4KFG0 | A1D87F6ZCVE5NK | 1 | Not as Advertised | Product arrived labeled as Jumbo Salted Peanut… |
我们将把评论摘要和评论文本合并为一个综合文本。该模型将对该组合文本进行编码,并输出单个向量嵌入
from openai import OpenAI
client = OpenAI()
def get_embedding(text, model="text-embedding-3-small"):
text = text.replace("\n", " ")
return client.embeddings.create(input = [text], model=model).data[0].embedding
df['ada_embedding'] = df.combined.apply(lambda x: get_embedding(x, model='text-embedding-3-small'))
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'