知识库以英文 RFC 为主,用户用中文问「令牌过期怎么续」,top20 里只有 4 条相关,同样的意思用英文问 top5 就命中,embedding 用的是 bge-m3 但没做任何语言处理。
排查方向其实有限,先把可能性排一排。单语向量空间里中英文落点不同;查询没有翻译,直接用中文向量检索;文档 chunk 中英混杂,向量被稀释;没有配置多语言模型或多路召回。
拿同义的中英文两个 query 分别检索并对比
python search_probe.py --query '令牌过期怎么续' --topk 20 --out zh.json
随后把 query 翻成英文再检索一次
python search_probe.py --query 'how to refresh expired token' --topk 20 --out en.json
两路结果用 RRF 合并再截断
python rrf_merge.py --a zh.json --b en.json --k 60 --out merged.json
评估 merged 的命中率变化
python eval_recall.py --pred merged.json --gold gold.json
这次没动代码,只在配置和运行环境上找原因。
别只看报错消失,验证要多做一步。中文提问下正确文档进入前 5,整体命中率从两成提升到七成以上。
多语言知识库要么用多语言向量模型,要么在查询侧做翻译,只靠一个中文 query 打天下很难覆盖。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
