先把当时的情况摆出来。用户输入三个字「退款慢」直接拿去做向量检索,top5 全是泛泛的售后政策段落,真正讲超时退款的文档排在第 30 位,加一步改写后 top3 就命中了。

排查方向其实有限,先把可能性排一排。短语语义信息太少,向量区分度低。少数情况下是知识库里的表述是超时未到账,用词对不上。

另外,没有同义词扩展与领域词典。少数情况下是chunk 偏长,单段覆盖多个主题。

上来先把短 query 的 top20 结果打出来看分布

python search_probe.py --query 退款慢 --topk 20 --out probe.json

接着让模型把 query 扩写成完整问句再检索

python rewrite_query.py --q 退款慢 --out q2.txt

随后用同义词表补上超时与未到账

python -c "print('退款慢 超时 未到账 到账时间')"

混合 BM25 与向量,对比改写前后的命中位置

python eval_recall.py --before probe.json --after probe2.json

别只看报错消失,验证要多做一步。同一问题下正确文档从第 30 位升到前 3,人工抽检 30 条查询命中率明显提高。

这里还有个坑。短查询补全比调 top_k 有效,先让 query 带上领域词,再考虑换 embedding 模型。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189