先把当时的情况摆出来。客服 Agent 前面加了一层语义路由,用 bge-m3 把问题分到售前、售后四条线,上线三天退款类问题有 27% 被分到售前,用户被转了两圈才有人处理,投诉量翻了一倍。
把日志和配置对完,能解释这个现象的基本就这几处。路由样本里退款和退货的表述几乎一样,分类器学不出边界。少数情况下是阈值设得太松,0.55 附近的样本一律取最高分。
还有一种情况,转人工话术被当成售后意图的强特征,权重被放大。另外,分类器输入截断到 128 token,后半句的诉求直接丢掉。
第一件事是把近三天误分的样本捞出来看实际标签
python dump_misroute.py --since 3d --out misroute.json
随后统计每个类目被分错的条数与平均分
python -c "import json;d=json.load(open('misroute.json'));print(len(d))"
补边界样本后重训路由模型
python train_router.py --data intents_v3.jsonl --epochs 3
末了看混淆矩阵确认两类是否还互相误判
python eval_router.py --model router_v3 --confusion
恢复的判定其实很直接。退款类样本的准确率从 0.71 回到 0.94,混淆矩阵里退款与退货的互相误判降到 3% 以下,转人工率同步回落。
语义路由不要只靠一个相似度阈值,边界类目得单独加关键词兜底,误分一次的成本往往比多调一次模型高得多。这类问题最好一次改到位,反复小改反而容易把原因搅混。
