网关按 Accept-Language 分流模型,zh-TW 和 zh-HK 的请求被判定成非中文,直接落到英文模型,用户看到的是英文回答,日志里 language=zh-HK 的请求有 1400 条。

一开始怀疑是「分流前没有做大小写和空格归一」,查了一圈,方向不对。

真正麻烦的地方在于,几个原因的现象几乎一样。语言判断只匹配 zh-CN 这一个前缀。另一种情况是浏览器传的是 zh-Hant-TW 这类带脚本的子标签。

少数情况下是CDN 改写了请求头,原始语言信息在中途丢了。

上来先统计各语言标签的真实分布

python lang_stat.py --file req.jsonl --top 20

再往下用 BCP47 解析库确认标签归一结果

python -c "from langcodes import standardize_tag as s;print(s('zh-Hant-TW'))"

接着把前缀匹配改成主语言匹配后重放样本

python route_replay.py --rule lang_primary --file sample_2k.jsonl

等前面都确认过,再在网关日志里补一个语言命中字段便于回溯

python -c "print('lang_rule=primary')"

恢复的判定其实很直接。zh-TW 与 zh-HK 请求全部落到中文模型,英文回答占比从 18% 降到 0.3%,重放样本的语言判定与人工标注一致。

容易忽略的是,语言标签的写法比想象中杂,zh-Hant、zh-TW、zh-HK 都可能出现,先用标准库归一再比较,别用字符串前缀硬判。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189