摘要: 使用 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对中译本的回译。

标签: none

添加新评论