导航

OpenAI.Embedding 接口参数说明

Posted on 2023-03-29 09:54  蝈蝈俊  阅读(3857)  评论(0编辑  收藏  举报

引言:对于接口,不了解参数含义,就不知道它能咋用?而了解参数的含义最好有例子,基于这个认知,整理了OpenAI几个主要API的接口参数说明。

OpenAI的Embeddings接口主要用于将自然语言文本转换为向量表示,以便计算机可以更轻松地对文本进行处理和分析。

这些向量表示可以捕捉到文本中的语义和语法信息。使用这些嵌入向量,可以进行词汇相似性比较、文本分类、情感分析、命名实体识别、机器翻译等各种NLP任务。

在实际应用中,OpenAI的Embeddings接口可以用于各种场景,如智能客服、智能搜索、广告推荐、社交媒体分析等。在这些场景下,文本数据是非常丰富和复杂的,使用嵌入向量可以使得计算机更好地理解和处理这些文本数据。

参数说明

通用的参数可以看OpenAI.Completion 接口参数说明,下面我们只介绍不同的注意点。

参数 model

官方建议使用 text-embedding-ada-002 这个模型。
https://platform.openai.com/docs/guides/embeddings/what-are-embeddings

按照https://openai.com/blog/new-and-improved-embedding-model这里的分析,
这个模型比以前:性能更高,支持更长的token,价格更低。
不过在文本分类场景下,性能略差点,建议这种场景下进行对比后使用。

Key Value
模型名称
MODEL NAME
text-embedding-ada-002
知识截止时间 2021年9月(ChatGPT/GPT4都是这个)
分词器
TOKENIZER
cl100k_base
最大输入Tokens
MAX INPUT TOKENS
8191
输出向量维度
OUTPUT DIMENSIONS
1536
价格 $0.0004 / 1K tokens

参数 input

输入参数input支持传入一个字符串或一个字符串列表。

如果传入一个字符串列表,则会将所有字符串拼接起来形成一个大字符串,然后进行嵌入表示计算。

所以长度8192的限制,这是所有字符串拼接后的总长度限制。

例:比较两段文本的相似度

可以使用多种方法来比较Embeddings出来的两个向量的相似度,其中一种常用的方法是计算它们之间的余弦相似度,下面是例子:


import openai
import numpy as np

# 首先需要设置OpenAI的API密钥
openai.api_key = "YOUR_API_KEY"

# 定义要比较的两段文本
text1 = "The cat jumped over the lazy dog."
text2 = "The quick brown fox jumps over the lazy dog."

# 使用GPT-2模型对两段文本进行嵌入表示
embedding1 = openai.Embedding.create(model="text-embedding-ada-002", document=text1).vector
embedding2 = openai.Embedding.create(model="text-embedding-ada-002", document=text2).vector

# 计算两个向量的余弦相似度
cosine_sim = np.dot(embedding1, embedding2) / (np.linalg.norm(embedding1) * np.linalg.norm(embedding2))

# 输出相似度
print("相似度为:", cosine_sim)

这个例子中,我们使用numpy库中的dot()函数计算两个向量的点积,并使用numpy库中的norm()函数计算向量的范数(即长度),最终计算余弦相似度。

OpenAI的embeddings被规范化为长度 1,这意味着:

  • 余弦相似性的计算速度快,只需使用点积即可,上面的计算可以少一部分。
  • 余弦相似性(Cosine similarity)和欧几里得距离(Euclidean distance)将导致相同的排名。

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

为了快速搜索多个向量,建议使用向量数据库。

您可以在https://github.com/openai/openai-cookbook/tree/main/examples/vector_databases找到使用向量数据库和 OpenAI API 的示例。

向量数据库 Milvus

来自国人(上海赜睿信息科技有限公司(Zilliz))的专门设计用于处理输入向量查询的数据库。在https://www.modb.pro/dbRank向量数据库排行榜列第一。

网站:https://milvus.io/
源码:

技术文档:https://milvus.io/docs/

向量数据库 Pinecone

Pinecone 是一个托管、闭源的向量数据库,使用 Kafka 进行流处理,使用 Kubernetes 集群实现高可用性以及Blob存储。

网站:https://www.pinecone.io/

向量数据库 Qdrant

用Rust编写的开源的,托管/自托管向量搜索引擎和数据库。
网站:https://qdrant.tech/
源码:https://github.com/qdrant/qdrant

总结

考虑到安全、对话效果、对话时减少胡说八道、成本等因素,目前做专业领域的对话方案,大家都是选择把专业知识库做Embedding,并存在本地向量数据库中。

当用户提问时,根据提问的关键字或向量做本地知识库向量数据库搜索,找到相关几条内容作为Prompt的一部分,再提交给OpenAI.ChatCompletion.create 接口这个方案。并且提交给OpenAI的敏感内容做脱敏,近一步解决安全问题。