附录:向量检索得分(_score)的计算方法

本文介绍Lindorm向量检索中返回值_score的计算方式,帮助您理解Lindorm向量检索的评分机制。

前提条件

已安装Python环境,且Python版本为3.10及以上版本。

准备工作

在运行前您需要安装以下依赖:

pip install numpy

稠密向量

说明

稠密向量(Dense Vector)是指向量中大部分元素为非零元素的向量。

向量检索的原理:通过计算两个向量之间的距离,来判断它们的相似程度。两个向量的距离越近,相似度越高。Lindorm搜索引擎兼容开源Elasticsearch,_score得分越大,表示检索效果越好,匹配结果越相关。

在向量检索领域中,余弦相似度是最主流的相似性计算方法。因此,本示例将以余弦相似度为例,说明如何计算得分_score的值。实际使用时,仅需将代码中的示例向量 vector1 和 vector2 替换为您的原始向量,即可获得对应的得分。

该示例可以帮助您判断如何设置合理的min_score阈值,从而过滤掉不相关的检索结果。

import numpy as np

def cosine_distance(vector1, vector2):
    # 将输入向量转换为NumPy数组
    A = np.array(vector1)
    B = np.array(vector2)
    # 计算余弦相似度,范围是[-1, 1]
    cosine_similarity = np.dot(A, B) / (np.linalg.norm(A) * np.linalg.norm(B))
    print(f"cosine_相似度{cosine_similarity}")
    # 计算余弦距离[0, 2]
    cosine_distance = 1 - cosine_similarity
    return cosine_distance

def get_score(distance:float):
    if distance >= 0:
        return 1 / (1 + distance);
    return -distance + 1;

# 示例向量
vector1 = [0.00807,0.00651,0.01601]
vector2 = [0.01029,0.01977,0.01501]
# 计算余弦距离
distance = cosine_distance(vector1, vector2)
print(f"Cosine Distance: {distance}")
score = get_score(distance)
print(f"Score {score}")

通过上述公式可以得出基本结论:在Lindorm向量检索中如果使用余弦距离,得分_score范围为[1/3, 1]

以上示例将返回如下结果:

cosine_相似度0.8819894016413957
Cosine Distance: 0.11801059835860428
Score 0.8944459037044368

稀疏向量

说明

稀疏向量(Sparse Vector)是指向量中大部分元素为0,只有很少一部分非零元素的向量。

在处理稀疏向量时,仅支持使用内积(Inner Product,IP)作为相似度或距离的计算方式。

def sparse_inner_product(indices1, values1, indices2, values2):
    # 创建一个字典来存储向量1的非零值
    vector1_dict = dict(zip(indices1, values1))
    
    # 初始化内积结果
    inner_product = 0.0
    
    # 遍历向量2的非零维度,检查是否也存在于向量1中
    for idx, value in zip(indices2, values2):
        if idx in vector1_dict:
            inner_product += vector1_dict[idx] * value
    print(f"inner_product: {inner_product}") 
    return inner_product


def calculate_distance(inner_product):
    print(f"1 - inner_product {1 - inner_product}")
    return 1 - inner_product


def get_score(distance):
    if distance >= 0:
        return 1 / (1 + distance)
    else:
        return -distance + 1


def calculate_score(indices1, values1, indices2, values2):
    # 计算内积
    ip = sparse_inner_product(indices1, values1, indices2, values2)
    
    # 计算距离
    distance = calculate_distance(ip)
    
    # 计算得分
    score = get_score(distance)
    
    return score


# 示例输入
indices1 = [30, 3301, 16722, 148212, 158835, 164691]
values1 = [0.2204025, 0.23698522, 0.29177716, 0.30742973, 0.3072948, 0.21784203]

indices2 = [30, 3715, 7499, 9421, 11140]
values2 = [0.11099276, 0.09458554, 0.23360626, 0.06949466]

# 计算得分
final_score = calculate_score(indices1, values1, indices2, values2)
print("Score:", final_score)

以上示例将返回以下结果:

inner_product: 0.0244630817859
1 - inner_product 0.9755369182141
Score: 0.5061915020570749

相关文档

不同SDK获取向量相似度得分_score的方式如下: