关于similarity_search_with_score()的分数计算逻辑与文档重排机制的问询
关于similarity_search_with_score()的分数计算、原理与重排逻辑
分数计算方式
similarity_search_with_score()返回的分数本质是向量间的距离值,而非直接的相似度——具体取决于你使用的向量数据库默认的距离度量:
- 多数默认场景(比如FAISS、Chroma)用余弦距离:分数 = 1 - 余弦相似度,范围在0到2之间。0表示两个向量完全一致(语义完全匹配),2表示向量完全不相似。
- 如果用欧氏距离(L2距离):分数就是两个向量在高维空间中的直线距离,数值越小代表向量越接近,语义相似度越高。
- 部分存储支持自定义距离(比如内积),此时分数会对应相应的距离计算结果,需参考具体存储的文档。
背后的数学原理
整个检索的核心是语义嵌入的空间相似性:文本被转换成高维向量后,语义相似的文本向量在空间中位置更近。具体的距离计算逻辑:
- 余弦相似度与余弦距离:
对于两个向量A和B,余弦相似度的计算公式为:
其中cos_sim(A,B) = (A · B) / (||A|| * ||B||)A·B是向量点积,||A||、||B||是向量的L2范数(模长)。余弦相似度范围是-1到1,值越大代表向量方向越一致(语义越相似)。为了适配“越小越相似”的排序逻辑,转换成余弦距离:distance = 1 - cos_sim(A,B)。 - 欧氏距离:
计算公式为:
直接衡量两个向量在空间中的直线距离,数值越小代表向量越接近。euclidean(A,B) = sqrt( sum( (A_i - B_i)^2 ) )
基于分数的重排逻辑
similarity_search_with_score()的重排流程非常直接:
- 将输入的查询文本转换成对应的嵌入向量;
- 在向量数据库中,计算该查询向量与所有文档嵌入向量的距离(即返回的分数);
- 对所有计算出的分数进行升序排序——因为分数越小代表距离越近、语义相似度越高;
- 取出排序后前
top_k个结果,返回对应的文档内容和分数值。
内容的提问来源于stack exchange,提问作者Vikas Rathod
相关产品推荐
相关产品推荐

