引言:对于接口,不了解参数含义,就不知道它能咋用?而了解参数的含义最好有例子,基于这个认知,整理了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/
源码:
向量数据库 Pinecone
Pinecone 是一个托管、闭源的向量数据库,使用 Kafka 进行流处理,使用 Kubernetes 集群实现高可用性以及Blob存储。
向量数据库 Qdrant
用Rust编写的开源的,托管/自托管向量搜索引擎和数据库。
网站:https://qdrant.tech/
源码:https://github.com/qdrant/qdrant
总结
考虑到安全、对话效果、对话时减少胡说八道、成本等因素,目前做专业领域的对话方案,大家都是选择把专业知识库做Embedding,并存在本地向量数据库中。
当用户提问时,根据提问的关键字或向量做本地知识库向量数据库搜索,找到相关几条内容作为Prompt的一部分,再提交给OpenAI.ChatCompletion.create 接口这个方案。并且提交给OpenAI的敏感内容做脱敏,近一步解决安全问题。