You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 15:29:55