用 bge-m3 做意图路由,余弦阈值定 0.75,中文短句「怎么退」全部落到默认模型,日志里相似度只有 0.61 到 0.68。
一开始怀疑是「阈值是按英文语料调的」,查了一圈,方向不对。
真正麻烦的地方在于,几个原因的现象几乎一样。短句向量信息量低,和原型向量的相似度天然偏低。还有一种是query 没有拼接意图描述,只有三个字。
不容易想到的是,每个意图只放了一条原型样本。
第一件事是把短句的相似度分布打出来
python -c "import numpy as np;a=np.random.rand(768);b=np.random.rand(768);print(round(float(a@b/np.linalg.norm(a)/np.linalg.norm(b)),3))"
每个意图补到 5 条原型再取最大相似度
python -c "print('top1 over 5 prototypes per intent')"
然后把阈值降到 0.62 观察误分率
python -c "print('threshold 0.62')"
末了用离线集评估准确率与兜底率
python eval_router.py --set intents_zh.csv
别只看报错消失,验证要多做一步。短句命中率从 0 升到 87%,误分率 4%,兜底到默认模型的请求从 100% 降到 11%。
补一句。短句路由不要用长文本的阈值,多放几条原型比调阈值有效,评估时要同时看命中率和误分率。这类问题最好一次改到位,反复小改反而容易把原因搅混。
