Python获取PostgreSQL HNSW向量搜索相似度分数报错求助
问题解决:PostgreSQL+pgvector+SQLAlchemy无法获取相似度分数
问题根源
从报错栈可以明确:pgvector的Vector类型处理器错误地将相似度计算的float结果当成向量文本解析。因为SQLAlchemy默认未给<->运算符的计算结果指定类型,导致结果被关联到向量类型处理器,而处理器试图对float执行向量文本的切片操作(value[1:-1]),最终触发TypeError。
解决方案
方案1:显式指定相似度分数的类型为Float
通过type_coerce给相似度计算结果指定正确的Float类型,绕过pgvector的向量处理器:
from sqlalchemy import Float, type_coerce similarity_score = type_coerce( (Document.answer_embedding.op('<->')(embedding_array)) + (Document.answer_keyword_embedding.op('<->')(keyword_embedding_array)), Float ) query = ( select(Document.doc_id, Document.answer, similarity_score.label("similarity")) .order_by(similarity_score) .limit(max_neighbors) ) results = session.execute(query).all()
方案2:使用cast强制转换结果类型
直接用SQLAlchemy的cast函数把计算结果转为float类型:
from sqlalchemy import cast, Float similarity_score = cast( (Document.answer_embedding.op('<->')(embedding_array)) + (Document.answer_keyword_embedding.op('<->')(keyword_embedding_array)), Float ) query = ( select(Document.doc_id, Document.answer, similarity_score.label("similarity")) .order_by(similarity_score) .limit(max_neighbors) ) results = session.execute(query).all()
方案3:修复原生SQL的运算符问题
如果使用原生SQL,首先确保已在PostgreSQL中启用pgvector扩展:
CREATE EXTENSION IF NOT EXISTS vector;
然后执行查询时,确保运算符<->被正确识别(pgvector的L2距离运算符就是<->,无需替换为<=>):
SELECT "Document"."DocId", "Document"."Answer", ("Document"."AnswerEmbedding" <-> :AnswerEmbedding_1) + ("Document"."AnswerKeywordEmbedding" <-> :AnswerKeywordEmbedding_1) AS similarity FROM "Document" ORDER BY ("Document"."AnswerEmbedding" <-> :AnswerEmbedding_1) + ("Document"."AnswerKeywordEmbedding" <-> :AnswerKeywordEmbedding_1) LIMIT :param_1
验证说明
执行上述修改后,SQLAlchemy会将相似度分数按float类型处理,不再触发pgvector的向量解析逻辑,即可正常获取文档ID、答案内容和对应的相似度分数。
内容的提问来源于stack exchange,提问作者MrAssel
相关产品推荐
相关产品推荐

