如何从PostgreSQL余弦相似度查询中获取相似度得分?
获取PostgreSQL向量搜索的余弦相似度得分
首先说明:你当前使用的<=>是pgvector扩展中的欧氏距离运算符,如果需要获取余弦相似度得分,需根据向量是否归一化选择对应计算方式,同时可以调整排序逻辑以匹配余弦相似度的排序需求:
情况1:向量已归一化(L2范数为1)
此时欧氏距离与余弦相似度存在固定转换关系,可基于<=>的结果计算得分,同时保留原排序逻辑:
cursor.execute( "SELECT text, 1 - (embedding <=> %s::vector)^2 / 2 AS cosine_similarity FROM tbl_embeddings ORDER BY embedding <=> %s::vector LIMIT 1;", (get_embedding(txt), get_embedding(txt)), )
执行后,通过fetchone()获取结果,第二个元素即为余弦相似度得分(范围0~1,值越大表示文本越相似)。
情况2:向量未归一化
推荐使用pgvector提供的<#>运算符,它直接计算负余弦相似度(结果范围[-1,0],值越小,实际余弦相似度越高),取反后即可得到标准余弦相似度得分,同时用该运算符排序更准确:
cursor.execute( "SELECT text, -(embedding <#> %s::vector) AS cosine_similarity FROM tbl_embeddings ORDER BY embedding <#> %s::vector LIMIT 1;", (get_embedding(txt), get_embedding(txt)), )
同样,fetchone()返回的第二个元素就是目标得分,范围为0~1。
提取结果示例
查询执行完成后,可通过以下代码获取匹配的文本和对应的相似度得分:
result = cursor.fetchone() if result: matched_text = result[0] similarity_score = result[1]
内容的提问来源于stack exchange,提问作者D. Seah
相关产品推荐
相关产品推荐

