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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 16:47:14