1 向量(Vector) 就是文本的 '数字身份证'
它把一段文字的语义信息 转换成一串固定长度的数字列表,让计算机能看懂 ,文字的含义并做相似度计算。
向量的计算 (文本嵌入过程),可借助文本嵌入模型实现,如text-embedding-v1
向量的匹配通过算法实现,如余弦相似度
-
向量的维度表示一段文本在多个抽象语义特征方面的强度
- 维度数代表模型用多少个抽象语义特征方面的强度 - 维度越多,做语义匹配越精准 - 但性能压力也大
2 余弦相似度
向量的数字序列,共同决定了向量的高纬空间中的方向和长度,而余弦相似度主要就是撇除长度的影响,得到方向的夹角。夹角越越相似,即方向相同。
夹角 = 0° → 余弦值 = 1 → 完全同向,最相似
夹角 = 90° → 余弦值 = 0 → 完全无关
-
夹角 = 180° → 余弦值 = -1 → 完全反向
余弦相似度 = 方向相似度 = 夹角余弦值 余弦相似度-> 俩个向量的点积 ÷俩个向量模长的乘积
3 python 代码原理
""" 向量的点积 俩个向量同维度数字乘积之和"""
def get_dot( vec_a, vec_b):
if len(vec_a)!=len(vec_b):
raise ValueError('俩个向量必须维度数量相同')
dot_sum=0
for a, b in zip(vec_a,vec_b):
dot_sum+=a*b
return dot_sum
""" 向量的模长的 对单个向量的每个数字求平方在求和 在开根号 """
#pip install numpy
import numpy as np
def get_norm(vec):
sum_square=0
for v in vec:
sum_square+=v*v
return np.sqrt(sum_square)
""" 余弦相似度 俩个向量的点积 ÷俩个向量模长的乘积 """
def cosine_similarity(vec_a,vec_b):
result=get_dot(vec_a,vec_b) / ( get_norm(vec_a)* get_norm(vec_b) )
return result
if __name__ == "__main__":
vec_a=[0.5,0.5]
vec_b=[0.7,0.7]
vec_c=[0.7,0.5]
vec_d=[-0.6,-0.5]
print('ab=',cosine_similarity(vec_a,vec_b))
print('ac=',cosine_similarity(vec_a,vec_c))
print('ad=',cosine_similarity(vec_a,vec_d))
- 余弦相似度:看方向,不看大小
→ 适合文本、推荐、AI 特征
4 一般生成环境用 pip install scikit-learn
# 导入引用
from sklearn.metrics.pairwise import cosine_similarity
if __name__ == "__main__":
# 假设这是大模型生成的向量
query_vec = [0.1, 0.3, 0.5]
doc_vec = [0.12, 0.29, 0.48]
score = cosine_similarity([query_vec], [doc_vec])[0][0]
print("相似度得分:", score)