用 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%。

补一句。短句路由不要用长文本的阈值,多放几条原型比调阈值有效,评估时要同时看命中率和误分率。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189