使用Python调用OpenAI库计算Embedding
摘要: 使用 Python 调用 OpenAI 库计算 Embedding,为后续设计 item 合并算法作实践基础准备,并通过计算余弦相似度判断字符串的相似性。
为后续设计item合并算法作实践基础准备。
知识点
设置环境变量
设置 $OPENAI_API_KEY 作为v1验证的key。
设置 $OPENAI_BASE_URL 以使用自部署的OneAPI作为中转。
调用OpenAI库
调库并生成一个实例。
from openai import OpenAI
client = OpenAI()
调用Embedding,指定字符串和调用模型。
client.embeddings.create(
input=s, model="text-embedding-3-small"
).data[0].embedding
输出为一个向量。调试输出向量内容和len()长度(手动省略):
[-0.007801616098731756, -0.026818055659532547, ……, -0.019145511090755463, 0.008654918521642685]
1536
[Finished in 3.3s]
更换成 nomic-embed-text 亦可运行。我们的nomic跑在服务器端,时间略长。
实际上这里似乎还有归一化的问题,在FastGPT中直接调用nomic,相似度有会大于$1$。
但是本地运行未遇到归一化的问题。
[-0.007801616098731756, -0.026818055659532547, ……, -0.019145511090755463, 0.008654918521642685]
1024
[Finished in 10.1s]
定义函数
模式为:
def fuc_name(var):
return 0
函数体在缩进块内完成。
构建函数时指定传参类型
变量名后挂类型,如:fuc(s:str,n:int)
判断string是否为空
调用 len() 函数,不知道哪个库的。如:len(s)!=0
计算余弦相似度
调库
from sklearn.metrics.pairwise import cosine_similarity
s = cosine_similarity([a, b])
调用函数时注意要传入一个数组,会生成一个二维数组。
输出
[[1. 0.58309876]
[0.58309876 1. ]]
[Finished in 4.4s]
传入长度可以大于$2$,回返回每一对的余弦相似度。
[[1. 0.58309876 0.69302698]
[0.58309876 1. 0.6850905 ]
[0.69302698 0.6850905 1. ]]
[Finished in 5.3s]
代码
import os
os.environ["OPENAI_API_KEY"]= "sk-"
os.environ["OPENAI_BASE_URL"]= "http://x.x.x.x:3000/v1/"
from openai import OpenAI
client = OpenAI()
from sklearn.metrics.pairwise import cosine_similarity
def embedding(s:str):
if len(s)==0:
return
else:
return client.embeddings.create(
input=s, model="text-embedding-3-small" # nomic-embed-text text-embedding-3-small
).data[0].embedding
a=embedding("I tend to draw fine distinctions between similar feelings (e.g., depressed and blue; annoyed and irritated).")
b=embedding("我喜欢界定两种相似的情绪(如沮丧和忧伤,烦恼和被激怒)。")
c=embedding("I like to define two similar emotions (e.g., frustration and sadness, annoyance and irritation).")
# print(a,"\n",len(a))
s = cosine_similarity([a, b, c])
print(s)
传入的三条字符串来自Emotion Complexity Scale,mxr612对其作的中译本,以及Coco对中译本的回译。