使用FAISS检索PostgreSQL存储语句时遇异常问题求助
问题分析与修复方案
核心问题分析
- 未定义相似性计算逻辑:代码直接使用
similarities变量,但完全没有实现提问向量与数据库存储向量的相似性计算逻辑,会导致运行报错或使用未初始化变量引发异常。 - 结果未正确收集:循环中生成了
top_results,但从未将其添加到最终的search_results列表,最终返回空结果。 - 索引越界风险:如果
similarities长度与sentences列表长度不匹配,np.argsort生成的索引会超出sentences下标范围,触发out of range错误。 - 逻辑顺序错误:在检查
query_text是否为空之前就执行了model.encode,属于无效计算,浪费资源。
修复后的完整代码
import json import numpy as np from sklearn.metrics.pairwise import cosine_similarity data = request.get_json() cursor = conn.cursor() query_text = data.get('query_text') # 先检查参数合法性,再执行编码操作 if not query_text: return jsonify({'error': 'Missing query_text parameter'}), 400 # 生成提问向量,FastText返回二维数组,取第一个元素转为一维适配相似度计算 query_vector = model.encode([query_text])[0].reshape(1, -1) cursor.execute("SELECT * FROM indexes") results = cursor.fetchall() if not results: return jsonify({'error': 'No indexes found'}), 404 search_results = [] for result in results: index_data = dict(zip(cursor.column_names, result)) vectors_from_db = json.loads(index_data['vectors']) vectors_np = np.array(vectors_from_db) sentences = json.loads(index_data['sentences']) # 检查向量与语句数量是否匹配,跳过异常数据 if len(vectors_np) != len(sentences): continue # 计算提问向量与所有存储向量的余弦相似度 similarities = cosine_similarity(query_vector, vectors_np)[0] top_k = 5 # 获取相似度从高到低排序的前top_k个索引 top_indices = np.argsort(similarities)[::-1][:top_k] top_results = [] for idx in top_indices: # 确保索引在有效范围内,避免越界 if 0 <= idx < len(sentences): top_results.append({ 'index': idx, 'sentence': sentences[idx], 'similarity': float(similarities[idx]) # 转为Python原生类型,兼容JSON序列化 }) # 将当前记录的匹配结果加入总结果列表 if top_results: search_results.extend(top_results) return jsonify({'results': search_results}), 200
关键修复说明
- 补充相似性计算:使用
cosine_similarity实现向量相似度计算,也可替换为FAISS的索引搜索逻辑(若已构建FAISS索引)。 - 修正结果收集逻辑:通过
search_results.extend(top_results)将每个数据库记录的匹配结果合并到总列表。 - 越界防护:
- 检查向量与语句数量是否一致,跳过数据异常的记录。
- 遍历索引时增加范围判断,确保索引不超出
sentences的有效下标。
- 优化逻辑顺序:先验证输入参数,再执行向量编码,避免无效计算。
- 兼容JSON序列化:将numpy浮点型相似度转为Python原生
float,避免序列化失败。
内容的提问来源于stack exchange,提问作者Igor Souza
相关产品推荐
相关产品推荐

