现场是这样的。用户问的问题文档里明确写了,检索却返回空列表,换一种问法又能命中。
中间走过弯路,把「过滤条件把目标文档排除了」当成主因,改完现象没变。
真正麻烦的地方在于,几个原因的现象几乎一样。入库时文本被切得太碎,关键信息被拆开;查询与文档的向量模型不是同一个;相似度阈值设得过高,全部被丢弃。
直接查库确认数据在不在
python -c "print(client.get_collection('docs').count())"
随后用原文片段做检索做对照
python -c "print(search('原始句子片段', k=5))"
临时去掉阈值与过滤观察结果
python -c "print(search(q, k=5, threshold=0.0))"
末了对比查询与文档的向量维度
python -c "print(len(qv), len(dv), model_name)"
别只看报错消失,验证要多做一步。原始片段能稳定命中,调整切分与阈值后用户问法也能召回,空结果比例明显下降。
换问法才有结果通常说明向量模型的语义匹配不够稳,可以考虑加关键词召回做兜底,而不是一直调阈值。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。