B20
概念 · 核心构件
多语言与跨语言智能体。
一个在英文下运转良好的系统,换一种语言并不会优雅地退化——它会在三个彼此独立的地方同时崩坏,而人人都会去测的那一项「生成质量」,通常恰恰是坏得最轻的。同样的意思在中文里要多花约一倍的令牌,你的嵌入模型可能压根不会把中文提问连到那份英文文档上,而一套只有英文的评测集,对这一切一无所见。
STEP 1
令牌税是真实存在的,而且会叠加。
分词器是拟合它的训练语料的,而那份语料压倒性地是英文。英文平均约四个字符一个令牌;中文则接近一到两个字符一个令牌,于是同样的内容会变成大约两倍数量的令牌。那些分词器几乎没见过的文字系统更糟——若干印度语系与东南亚文字常见三到四倍,字符会被拆成一个个字节。
- 同样的活儿,账单翻倍。同样的用户、同样的问题,进出都是两倍令牌。
- 上下文窗口对折。20 万令牌的窗口在中文里装下的意思明显更少,于是检索到的文档与少样本示例被挤在一起互相抢地方——参见上下文窗口。
- 延迟随输出长度上升。输出令牌更多意味着解码步数更多,而解码是一次请求里串行的那一半;参见预填充与解码。
- 截断来得更早。照着英文输入调好的各种上限,会开始切掉真正的内容,而且通常悄无声息。
那个诱人的反向操作——改用更「便宜」的语言写提示词来省钱——大体上行不通。在编程任务上的实测表明,把提示词语言从模型最擅长的那种换开,解题率的损失大致会把令牌上省下的吐回去,有时还更多。按准确率来选语言;把令牌成本当作一个需要纳入预算的事实,而不是一个可以拨动的杠杆。
STEP 2
真正崩坏的地方是检索。
这正是被一段流畅答案盖住的那种失败。用英文训练的嵌入模型,会把中文提问放在离那份能回答它的英文文档很远的位置,于是检索器返回的不是「稍差一点的段落」,而是完全不相干的段落——然后模型据此写出一段自信的回答。
- 多语言嵌入模型。一个索引,任意语言的查询匹配任意语言的文档。BGE-M3 与 Qwen3-Embedding 一类模型正是为此而生。相较同语种最强模型会损失一点质量,换来的是巨大的简洁性。
- 在索引时翻译。把每份文档以每种支持语言各存一份。索引体积翻倍或翻三倍,而且把翻译错误永久烤了进去——此后每一次查询都要继承它们。
- 翻译查询。便宜、快、多一次调用。代价是丢失专有名词、产品名与习语,而这恰恰是最需要精确的地方。
- 关键词检索会无声地失效。混合检索靠 BM25,而 BM25 需要词边界。中文、日文与泰文没有空格,所以若没有语言感知的分析器,你的关键词那一半会切出一堆无意义的碎片、什么也贡献不了——却依然照常返回结果。参见分块与向量搜索。
- 分块边界也会移位。固定的字符数在不同语言里对应的内容量不同,于是你精心调过的分块大小,已经不再是你调过的那个了。
STEP 3
指令层与安全层会漏。
包在模型外面的一切都是用某一种语言写的,而那种语言会施加牵引力。
- 语言漂移。模型会用「附近最强信号」的语言作答——往往是你的英文系统提示词,或者对话中途返回的一条英文工具结果。请显式锁定输出语言,并把它当作一项可测试的要求,而不是一种偏好。
- 结构化输出需要把规则写明。schema 的键保持英文,值必须本地化。请在字段说明里讲清哪个是哪个,否则你会拿到一锅混合物——参见结构化输出。
- 安全分类器通常是按英文调的。一个在非英文输入上从不触发的审核或策略检查,比没有检查更糟,因为它报告一切正常。建立在关键词表上的护栏同理。
- 注入会比你的过滤器更早跨过语言。藏在第三种语言文档里的指令能绕开英文模式匹配,而模型读得毫无障碍——这又是一条理由,说明提示词注入的防御不能是词法层面的。
STEP 4
按语言分别评测,否则你只是在猜。
上面每一种失败,在一个总体分数里都是隐形的。如果十分之一的流量是第二语言,而其中一半失败,你的头号指标只会动五个点,看上去和噪声没两样。
- 把每个指标按语言切开。不是一个「多语言分数」,而是同一批任务下每种语言一个分数,分别追踪。参见评测。
- 不要用被测模型来翻译评测集。它会照着自己误读的方式去翻译,于是测试集会和 bug 达成一致。请用一位母语者,至少也要换一个模型。
- 把检索与答案分开打分。跨语言检索失败产出的是流畅、规整而错误的输出,端到端打分常常把它判为「一般般」,而不是「坏了」。
- 请母语者读语体。敬语、称谓、量词与句子节奏,才是让输出读起来像译文的东西。事实可以全对,而文本依然会让你失去读者的信任。
先做那个便宜的诊断。取二十条第二语言的真实查询,只跑检索这一步,然后看看返回了什么。在用英文搭起来的系统里,故障几乎总在这儿,而且从最终答案上完全看不出来——因为不管递给模型的是哪些文档,它都会写出一段像模像样的话。先修检索器,再去动任何一句提示词。