Redis向量相似性查询返回空结果问题排查求助
问题排查与解决方案
1. 确认向量维度匹配
OpenAI text-embedding-ada-002 生成的向量维度是 1536,请确保你的 self.vector_dim 参数设置为 1536。如果维度不匹配,索引无法正确解析存储的向量,会直接导致查询无结果。
2. 检查查询向量的格式
存储向量时你将其转为了 float32 字节流,但查询时需确保传入的向量格式正确:
- 若传入的是 numpy
float32数组:Redis-Py 会自动处理为二进制格式,无需额外转换。 - 若传入的是原始浮点列表(从 OpenAI 返回的
embedding字段):必须先转为float32数组或字节流,否则 Redis 无法识别。
示例修正(如果查询时传入的是原始列表):
# 处理查询向量为float32数组 query_vector = np.array(openai_embedding_list, dtype=np.float32) # 或转为字节流 query_vector_bytes = query_vector.tobytes()
3. 验证查询逻辑是否遗漏过滤条件
你的 search_similar_documents 函数参数包含 entity_id 和 ticket_id,但当前查询未使用这些条件进行过滤。如果业务需要限制在特定 entity_id 下查询,需补充过滤条件:
query = ( Query("@entity_id:{entity_id}=>[KNN 2 @embedding $vec as score]") .sort_by("score") .return_fields("score", "ticket_id") .paging(0, 2) .dialect(2) ) query_params = {"vec": vector, "entity_id": entity_id}
4. 简化查询排除干扰项
暂时移除分页、排序等逻辑,测试基础查询是否返回结果:
def search_similar_documents(self, entity_id, vector, topK=5, ticket_id=None): query = Query("*=>[KNN 5 @embedding $vec as score]").dialect(2) query_params = {"vec": vector} result = self.r.ft(self.index_name).search(query, query_params) print(f"查询到 {len(result.docs)} 条结果") return result.docs
5. 验证存储的向量有效性
随机选取一个已索引的键(如 tickets:1),检查向量是否正确存储:
# 检查键是否存在 print(self.r.exists("tickets:1")) # 获取存储的向量 embedding_bytes = self.r.hget("tickets:1", "embedding") # 转为数组验证维度 embedding_array = np.frombuffer(embedding_bytes, dtype=np.float32) print(f"存储向量维度:{len(embedding_array)}")
6. 测试已知匹配的向量
取出某条已存储文档的向量,用它作为查询向量,看是否能返回该文档。如果能返回,说明索引和查询逻辑正常,问题可能是输入的查询向量与所有存储向量相似度极低;如果不能返回,则需检查索引构建或存储过程是否有误。
内容的提问来源于stack exchange,提问作者Danilo Toro
相关产品推荐
相关产品推荐

