如何在Redis Stack中获取两个指定索引项的向量相似度分数?
如何计算Redis中两个已知ID对象的向量相似度分数
可以获取,有两种可行的方法,具体如下:
方法一:取出向量后本地计算
Redis本身没有直接计算两个存储向量相似度的命令,你可以先将两个对象的向量从Redis中取出,再用Python本地计算余弦相似度。
步骤示例:
- 获取两个对象的二进制向量:
# 替换为你的两个对象的实际key vector1 = redis.hget("products:23", "embedding") vector2 = redis.hget("services:45", "embedding")
- 将二进制向量解码为浮点数组:
import numpy as np # 解码FLOAT32类型的二进制向量 vec1 = np.frombuffer(vector1, dtype=np.float32) vec2 = np.frombuffer(vector2, dtype=np.float32)
- 计算余弦相似度:
cosine_similarity = np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))
方法二:通过Redis FT查询获取分数
你可以用其中一个对象的向量作为查询条件,同时过滤另一个对象的ID,从查询结果中提取相似度相关分数。
步骤示例:
- 获取用于查询的向量:
# 取出第一个对象的向量作为查询向量 query_vector = redis.hget("products:23", "embedding")
- 构造查询语句(以查询services索引中ID为"45"的对象为例):
# 用@id过滤目标对象,同时指定KNN查询匹配向量 query = '@id:{45} => [KNN 1 @embedding $vector]'
- 执行查询并转换为相似度分数:
results = redis.ft("services").search(query, query_params={"vector": query_vector}) if results.docs: # 注意:若索引使用COSINE距离度量,返回的score是余弦距离值,相似度为1 - score distance_score = results.docs[0].embedding_score similarity_score = 1 - distance_score print(f"相似度分数: {similarity_score}")
说明:Redis Stack中,当向量字段设置
DISTANCE_METRIC: "COSINE"时,KNN查询返回的embedding_score是余弦距离(取值范围0-2),因此需要用1 - 距离值得到余弦相似度(取值范围-1到1,越接近1相似度越高)。
内容的提问来源于stack exchange,提问作者snewcomer
相关产品推荐
相关产品推荐

