# 学习记录
首先我们需要知道文本是由一个个字,一个个词组成的,而在机器学习中这些都称之为token。
embedding又是什么捏,他有固定的维度D,每一个维度上都是小数组成的,而D个小数就成了token,那么大量的token集成在一起就组成一组稠密向量。embedding就可以表示一句话,一段话,一篇文章都行。
现在我们导入智谱的包,需要自己的虚拟环境中有zhipuai
首先请通过如下方式进行安装 SDK 包:
# 没有下载过的直接在自己的虚拟环境中下载
pip install zhipuai
# 如果原本就有老版本的zhipuai请更新到最新版本
pip install --upgrade zhipuai
导入zhipuai,首先填写自己的aip_key ,获取自己key,请前往智谱AI开放平台 (bigmodel.cn)
使用的是embedding-2的模型,要调用其他的可以查看zhipuai的API文档。
from zhipuai import ZhipuAI
zhipu = ZhipuAI(aip_key='you_key') # 请填写您自己的API Key
def get_embedding(text):
emb_req = zhipu.embedding.creat(
model="embedding-2",
input=text,
)
return emb_req.data[0].embedding
定义好过后,我们就只需要传参就行了。
test1 = "我喜欢你"
test2 = "你喜欢我"
test3 = "我爱上你"
emb1 = get_embedding(test1)
emb2 = get_embedding(test2)
emb3 = get_embedding(test3)
print(emb1, "\n", emb2, "\n", emb3)
我们可以将test被embedding过后的打印出来,打印出来那一串数字就是我们的test被embedding过后的一组稠密向量。
既然他们是向量,那么如何匹配捏,那么就是看那组向量更加相似,相当于求两个向量的夹角,垂直的向量与两相量成锐角的相比,那么肯定是成锐角的向量更加的相似。公式如下
1.我们可以将公式用python打出来
def cosine_similarity(vec1, vec2):
return np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))
2.当然啦!sklearn里面以及由集成好的了,我们直接调用就好了
from sklearn.metrics.pairwise import cosine_similarity
我们就可以求两两之间的相似度
similar_12 = cosine_similarity(emb1, emb2)
similar_23 = cosine_similarity(emb2, emb3)
similar_13 = cosine_similarity(emb1, emb3)
print(similar_12 , "\n", similar_23 , "\n", similar_13 )
可以看到emb1和emb3的相似对更高,但是文本之间的差距比emb1、emb2之间的文本差距大(指的是所用的字的差距大,并非文意),但是为什么1、3相似度会比1、2的相似的高呢,是因为embedding是联系上下文的,所以虽然文本没有什么差距,但是内涵是不一样的,所以相似度就没有内涵一样的高。
所以我们可以直接索引相似的高的作为输出。
所以我们在远古时期用的检索问题答案的方式就是,将你的问的问题(文本)embedding化,然后在官方的embedding库中检索,对比,将相似对最高的问题作为你的问的问题,然后将这个问题的答案放回给你。