同一段内容翻成老挝语,字数一个没多,模型读一遍的价钱翻了八倍
本文目录
- 那段老挝语和它的英语原文一样长,账单上却是八倍
- 一次本来只想核对预算的测量
- 三代词表、七十门语言、十三万字符的平行语料
- 先说结论:贵的不是字数,是每个字要几个块
- 这件事跟本站讲过的分词器不是一回事
- 开工前写下的十二条预期,错了六条
- 模型到底是怎么把一句话切开的?
- 词表是一本有限的册子,你的语言在里面占几页
- 词表里没有的字,只能一个字节一个字节地拼
- 七十门语言实测下来,贵的到底是哪几门?
- 完整的膨胀倍数表长什么样
- 最贵的那两门语言不在任何人的预期名单里
- 印度诸语其实早就便宜下来了
- 拉丁字母不等于便宜,约鲁巴语比希腊语还贵
- 中日韩这三门的数字要分两个口径读
- 繁体和简体,同一门语言两套字差百分之十三
- 为什么老挝语比泰语贵四倍,而它们的文字是一对亲戚?
- 先把两门语言的字形结构摆在一起
- 实测:8.23倍对1.99倍
- 字节回退率89.73%对0.74%
- 同一套书写系统内部的分化比系统之间还大
- 这条推论怎么用在没测过的语言上
- 上下文窗口里,你的语言能装多少字?
- 把token口径换成字符口径,排名会变
- 128K窗口在各语言里的真实容量
- 检索切块的粒度是按token定的
- 长上下文方案在哪几门语言上不成立
- 这笔账落到日常的活上,一共要重算几处?
- 关键词表:500词在老挝语里值九千个块
- 批量改写与翻译:按篇计价的报价单会失真
- 站内的AI客服与问答
- 免费额度与限流:同样的额度不是同样的工作量
- 三代词表的进步,到底分给了谁?
- p50k到o200k,各语言省了多少
- 英语自己只省了4.2%
- 最需要改善的两门语言拿到的最少
- 这不是单调关系,是一条倒U形曲线
- 内容供给量能不能预测这个倍数?
- 拿维基条目数做代理指标
- 十九门语言的相关系数是-0.734
- 这跟本站量过的另外两把尺子怎么合起来看
- 不懂这门语言,怎么自己把这个数量出来?
- 三十分钟能跑完的最小实验
- 平行语料从哪儿拿
- 三行代码算出你的倍数
- 字节回退率怎么算
- 把结果读成三档动作
- 三种看着合理、实际会把结论带偏的做法
- 用字符数直接推token数
- 拿一门语言的倍数代表整个书写系统
- 把这个倍数当成放弃一门语言的理由
- 哪些相邻的问题不归这一层管
- 常见问题解答
- 换一家模型厂商,这些倍数还成立吗?
- 字节回退率高的语言,模型是不是根本理解不了?
- 把内容先翻成英语再喂给模型,是不是能省掉这笔钱?
- 这个倍数会不会影响我的页面在AI答案里被引用的机会?
- 这套测量多久重跑一次?
- 权威参考资料
摘要:拿FLORES-200的平行语料把同一批1012个句子在70门语言上各切一遍,量出来的不是小数点后的差别——老挝语要花英语8.23倍的token,而它的字符数跟英语几乎一模一样。更麻烦的是那批token里有89.73%根本不是字,是半个字的字节。这笔账会顺着上下文窗口、检索切块、接口账单、免费额度一路往下传,而所有这些额度都是按英语的密度定的。本文给出70门语言的完整倍数表、老挝语与泰语差4.14倍的原因、三代词表的进步到底分给了谁,以及一个三十分钟能自己跑完的最小实验。
今年夏天有个做户外装备的团队让我帮着看一份AI改写的预算。他们要把英语站的商品描述批量改写成十一门语言,供应商按篇报价,一篇多少钱,语言不加价,看起来很干净。
我当时觉得这份报价单太干净了。干净到不像是算过账。
于是把他们的样稿抓了三段出来,各语言版本都有,扔进tokenizer数了一遍。英语那段1131个token,德语1481,泰语2252,缅甸语3581。同一段话,同一个意思,最后一门语言的机器成本是第一门的三倍出头。而报价单上,这三门语言在同一行,同一个价钱。
供应商没算错,他们只是按人工的口径报的价。人翻一段话,语言难易有差别但不会差三倍。机器读一段话,差别就是三倍。这两个口径中间没有人做过换算。
那段老挝语和它的英语原文一样长,账单上却是八倍
一次本来只想核对预算的测量
核完那份报价单,我起了个念头:三倍这个数是巧合还是常态?十一门语言太少,看不出规律。
要看出规律,得有一份真正的平行语料——同一批句子,被专业译者翻成几十门语言,句句对齐。凑巧这份东西是现成的。
Meta做机器翻译评测时建了一套FLORES-200数据集,从维基文章里抽了两千多个句子,找专业译者翻成204门语言,逐句对齐。它本来的用途是给翻译模型打分,但它同时也是一把现成的尺子:同一个意思,在每门语言里到底占多少地方。
我取了它的devtest部分,每门语言1012个句子,选了70门跟本站写过的市场对得上的语言,一门一门地数。
三代词表、七十门语言、十三万字符的平行语料
切分工具用的是OpenAI公开的tiktoken,三代词表都跑:p50k_base、cl100k_base、o200k_base,规模分别是50281、100277、200019个条目。
每门语言的1012个句子拼成一整串,量四个数:Unicode码点数(下文说“字符”都指这个)、UTF-8字节数、三代词表各自切出来的token数,以及一个我后来发现最关键的数——字节回退率。
英语那一份是13.3万字符、26878个token。这就是基准线,后面所有倍数都是拿它比出来的。
为什么要三代都跑?因为词表是会换的,而换代的时候厂商只会告诉你“对多语言更友好了”。友好多少,友好给谁,从来没有一份逐语言的清单。
先说结论:贵的不是字数,是每个字要几个块
老挝语那一份是131100个字符,英语是132977个。两边字数几乎完全一致,差不到1.5%。
但老挝语切出来是221170个token,英语是26878个。8.23倍。
这个对照把我原来的假设按在地上打了一顿。我开工前写的预期里有一条明明白白:“token数跟字符数基本线性,膨胀主要来自某些语言字更多。”实测下来这条完全不成立。老挝语一个字都没多,贵的是每个字要几个token。
换成单位数字更直观:英语平均每个字符0.202个token,老挝语1.687个。同样一个字符,一边不到五分之一个token,一边要一个半还多。
所以这件事的正确说法不是“小语种内容更长”,是“小语种的每个字更碎”。这两句听着像一回事,落到优化动作上完全相反——前者让你去删字,后者告诉你删字没用。
我把这条当成整篇的第一句骨架句,因为后面所有的账都从它长出来。
这件事跟本站讲过的分词器不是一回事
本站过去写小语种,“分词”这个词出现过很多次。泰语那篇讲的是搜索引擎怎么把没有空格的句子切开,切错了会影响匹配和收录。那是检索侧的分词。
这篇讲的是另一件事:大模型把一串字符转换成它内部能处理的编号,切分单位跟语言学意义上的词没有关系,跟搜索引擎的词典也没有关系。它切的依据只有一条——这段字节组合在训练语料里出现得够不够频繁。
两者唯一的共同点是都叫“切”。除此之外,规则不同、后果不同、能采取的动作也不同。搜索引擎切错了你可以补词典,模型切碎了你补不了,那本词表是随模型一起发布的,改不了也换不了。
还有一层要提前划开:这篇不讨论模型在这门语言上答得准不准。小语种内容里模型顺手编出来的那些本地规矩是另一个问题,那是能力层。
开工前写下的十二条预期,错了六条
本站做这类实测有个规矩:开工前把预期逐条写下来,跑完对一遍。不写下来的话,人总会觉得自己早就知道。
这次写了12条,跑完对下来错了6条,其中4条直接翻转成了正文的骨架。
错得最狠的是第五条:我以为天城文因为组合字符多,印地语会是膨胀最严重的那一批。实测印地语只有1.57倍,在70门语言里排到中游偏下,比匈牙利语和拉脱维亚语都便宜。
第四条也错了。我以为字节回退这种极端情况只会出现在最冷门的几门语言上,结果繁体中文15.87%、高棉语14.65%、韩语5.40%、简体中文4.97%都有,只是量级不同。
还有一条错得很有意思:我以为中日韩因为单字信息密度高,总体不吃亏。这条一半对一半错,而错的那一半正好是最容易在会上被讲错的那一半,后面有一整节讲它。
剩下几条对账放在各节里就地说,不集中列了。
模型到底是怎么把一句话切开的?
词表是一本有限的册子,你的语言在里面占几页
模型不认字,它认编号。所有输入在进模型之前,都要先按一本固定的册子换成一串编号,这本册子就是词表。
词表的条目数是定死的。o200k_base是200019条,多一条都没有。这20万个位置要分给全世界所有语言的所有常见字节组合,还要分给代码、数字、标点、表情符号。
位置怎么分?按训练语料里的出现频率。哪段字节组合出现得多,哪段就单独占一个位置;出现得少的,只能拆成更小的片段去拼。
这就是整件事的机制。它不是谁在歧视谁,是一套按频率分配有限位置的算法,跑在一份英语占绝对多数的语料上,得出的必然结果。
这个结论早有人量化过。《语言模型的tokenizer在语言之间制造了不公平》那篇给出的极端差距是十几倍,我这次的实测在数量级上跟它对得上,差别是我用的是更新一代的词表,而且逐门语言给了数。
词表里没有的字,只能一个字节一个字节地拼
拆到最细会拆成什么?答案是单个字节。
这套编码方案出自机器翻译领域一篇讲罕见词怎么用子词单元表示的论文,它的底层保证是永远不会失败——最坏情况下退回到字节级,一个字节一个token,总能把任何输入表示出来。这条兜底机制叫字节回退。
对英语来说这条兜底几乎不会触发,因为英语字符在UTF-8里就是一个字节,而且常见组合早就有整块了。对非拉丁文字来说完全不同:一个老挝文字符在UTF-8里是三个字节,如果这三个字节的组合没有整块,就会被拆成两到三个token,每个token都只是半个字。
我在统计里加了一列专门量它:把每个token单独解码,看它的字节序列自己能不能构成一个合法的UTF-8字符。不能,就记一次回退。
老挝语的这一列是89.73%。也就是说这门语言的内容进模型之后,接近九成的token拿出来看都不是字,只是字的一截。
阿姆哈拉语是88.31%,跟它是一对难兄难弟。这两门语言的文本在模型内部基本是以字节流的形态存在的,字这个单位在那一层已经不存在了。
这个数比倍数更值得记,因为它解释了倍数从哪来,也预告了另一件事——一个词被拆成一堆半截字节之后,它在模型眼里还算不算一个东西。那是另一篇的题目。
七十门语言实测下来,贵的到底是哪几门?
完整的膨胀倍数表长什么样
先把结果整个摆出来,再逐段解释。下面这张表是相对英语的token倍数,用o200k_base词表,同一批1012个句子。
| 档位 | 语言(相对英语的倍数) |
|---|---|
| 4倍以上 | 老挝语8.23、阿姆哈拉语5.82 |
| 2.5到4倍 | 高棉语3.34、缅甸语3.16、中库尔德语2.77、僧伽罗语2.69、旁遮普语2.62 |
| 1.9到2.2倍 | 约鲁巴语2.17、希腊语2.14、泰语1.99、泰米尔语1.98、卡纳达语1.97、马拉雅拉姆语1.96、泰卢固语1.93 |
| 1.6到1.9倍 | 蒙古语1.89、马耳他语1.87、马拉地语1.82、拉脱维亚语1.81、匈牙利语1.79、古吉拉特语1.79、亚美尼亚语1.79、格鲁吉亚语1.79、塞尔维亚语1.78、乌克兰语1.75、普什图语1.72、保加利亚语1.71、孟加拉语1.70、日语1.66、乌尔都语1.65、波兰语1.64、尼泊尔语1.61 |
| 1.4到1.6倍 | 捷克语1.60、哈萨克语1.58、印地语1.57、芬兰语1.56、豪萨语1.55、波斯语1.53、越南语1.49、斯瓦希里语1.49、希伯来语1.48、韩语1.47、意大利语1.47、土耳其语1.43、俄语1.42、繁体中文1.42、丹麦语1.40 |
| 1.4倍以下 | 阿拉伯语1.38、法语1.37、瑞典语1.35、挪威语1.35、西班牙语1.32、德语1.31、马来语1.30、印尼语1.25、简体中文1.25、荷兰语1.25、葡萄牙语1.23 |
这张表最该先看的不是最上面那两行,是它的分布形状——绝大多数语言挤在1.2到2.0之间,然后突然有几门冲到3以上,最后两门离群到4倍以外。
换句话说,多数语言的代价是可以忽略的量级差别,少数几门是完全不同的账本。做优先级排期的时候,前一类不必单独讨论,后一类必须单独讨论。
这个形状本身就值得记一笔。当年多语言模型铺到七十多种语言那次,受益的分布也是这种长尾形状——大部分语言差不多,少数几门单独成一档。
如果你手上的市场全在1.2到1.6这一档,读到这里其实就可以结束了,这笔账在你的预算表里是个小数点。真正需要往下读的是名单里有第二档和第三档语言的人。
最贵的那两门语言不在任何人的预期名单里
老挝语8.23倍,阿姆哈拉语5.82倍。这两门语言的字节回退率分别是89.73%和88.31%。
我开工前的预期名单里最贵的是印地语,理由是天城文的组合字符多。这个理由听起来很专业,实测下来完全站不住——印地语1.57倍,比匈牙利语还便宜。
老挝语和阿姆哈拉语的共同点不是文字复杂,是这两门语言的网络内容太少。维基百科各语言版本的条目数清单上,老挝语只有五千多条,是泰语的三十三分之一;阿姆哈拉语的处境类似。
训练语料里没有足够的量,词表分配位置的时候就轮不到它们,于是只能退回到字节。所以“文字复杂”和“语言昂贵”这两件事之间没有直接因果,中间隔着一个变量:这门语言在互联网上有多少字。
这条推论有个立刻能用的推论:一门语言的膨胀倍数是可以预测的,不用等实测——先看它的网络内容存量,八九不离十。后面有一节专门验这个预测能力有多准。
顺便说一句,非洲那几门主要语言的处境跟阿姆哈拉语类似。本站写非洲选语种那篇用的判据是有没有人拿这门语言写价格和退货政策,现在可以再加一列:机器读它要多花几倍。
印度诸语其实早就便宜下来了
印地语1.57、马拉地语1.82、泰米尔语1.98、泰卢固语1.93、卡纳达语1.97、马拉雅拉姆语1.96、孟加拉语1.70、古吉拉特语1.79。
这一整片语言现在都落在2倍附近,跟希腊语差不多,比约鲁巴语还便宜。
两代词表之前完全不是这个样子。同一批语言在p50k_base那代,泰米尔语是英语的15.01倍,马拉雅拉姆语是14.65倍。这个数据现在已经过期了,可它仍在很多中文资料里被引用。
本站写印度十一门语言的预算排期时,成本模型里没有这一项,因为那时候这一项还不影响决策。现在它更不影响了——但方向是反的:不是因为它小,是因为它已经被解决掉了大半。
拉丁字母不等于便宜,约鲁巴语比希腊语还贵
拉丁字母这一档里,最便宜的是英语1.00,最贵的是约鲁巴语2.17。同一套字母,内部差2.17倍。
约鲁巴语比希腊语2.14贵,比泰语1.99贵,比泰米尔语1.98贵。它用的是二十六个拉丁字母加几个变音记号,看上去跟英语没差多远。
原因还是那一条:语料量。约鲁巴语在互联网上的内容比希腊语少得多,而它的变音记号让常见词的字节组合跟英语的完全对不上,于是既拿不到自己的整块,也蹭不到英语的整块。
本站量字体成本那篇里,书写系统是个有效判据,字形集大不大直接决定文件多大。到了token这一层,同一条判据完全不成立——能用书写系统解释的问题和不能用书写系统解释的问题,要分开处理。
马耳他语1.87、祖鲁语1.72、豪萨语1.55,都是同一个道理。这几门语言在很多人的心智里属于“拉丁字母,应该好办”,实测下来跟俄语波兰语一个量级甚至更贵。
中日韩这三门的数字要分两个口径读
简体中文1.25倍,比德语1.31、法语1.37、西班牙语1.32都便宜。日语1.66,韩语1.47。
看到这里很容易得出一个结论:中文在这件事上不吃亏,甚至占便宜。
这个结论只在一个口径下成立,换个口径就翻过来,而两个口径都是实测。
这个结论只在一个口径下成立——同一篇文章的口径。同样一篇文章翻成中文,token数确实比翻成德语少。
换个口径就翻过来了。按“一个上下文窗口能装多少字”算,英语能装63万个字符,简体中文只能装16.9万,是26.6%。因为中文一个字的信息量大,同样的字数装的内容多,但同样的token装的字数少。
繁体和简体,同一门语言两套字差百分之十三
简体中文33584个token,繁体中文38120个。同一批句子,同一个意思,差13.5%。
字符数上繁体反而更少(41733对44262),token数却更多。字节回退率差得更明显:简体4.97%,繁体15.87%,三倍出头。
原因不难猜——训练语料里简体的量比繁体大,常见的简体词组拿到了整块,繁体的对应写法只能拆。
本站算小语种优先级的那套成本模型里,简繁一直是被当成同一门语言的两个写法处理的,主要成本项是词库和地区用词。现在多了一项:如果你有大量AI改写或AI问答的工作量,繁体那一侧要多留13%的预算。
为什么老挝语比泰语贵四倍,而它们的文字是一对亲戚?
先把两门语言的字形结构摆在一起
这一节是本篇最想讲的一段,因为它把“语料量决定一切”这个结论钉死了。
老挝文和泰文是亲戚。两套文字同源,字形结构一样,都是辅音带元音附标,都不写空格,都有声调符号。在Unicode里,两个块的排列顺序也是对应的,老挝文那个块的字符位置基本能跟泰文块一一对上。
换句话说,从字符编码的角度看,这两门语言的文本长得几乎一模一样。字符数也接近:老挝语131100,泰语127373,差不到3%。
如果token膨胀真的是由文字结构决定的,这两门语言的数字应该非常接近。
它们不接近。这一对是整份数据里最干净的对照组,因为文字这个变量被控制住了,剩下只有一个变量在动。
实测:8.23倍对1.99倍
老挝语221170个token,泰语53488个。同样的1012句话,同样的字数,同样结构的文字,差4.14倍。
每字符的token数:老挝语1.687,泰语0.420。
这个对照我跑完的第一反应是脚本写错了,把两份文件的路径搞混了。回头逐行核对,没错。又单独拿几个词手工验了一遍,也没错。
最直观的一个例子是“手机”这个词。泰语写作โทรศัพท์เคลื่อนที่,18个字符,切成6块;老挝语写作ໂທລະສັບມືຖື,11个字符,切成22块。字少了将近四成,块多了将近三倍。
而那22块里,22块全是字节碎片,没有一块是完整的字。
同一个概念,同一片区域,两门亲戚语言,这就是差距。
字节回退率89.73%对0.74%
倍数只是结果,回退率才是原因。
泰语的字节回退率是0.74%,基本可以当零看。这意味着泰文的常见字符组合在词表里都有位置,模型读到的是字,不是字节。
老挝语89.73%。模型读到的几乎全是字节。
两门文字同源,一门拿到了整块,一门没拿到。差别只有一个:泰语的网络内容量是老挝语的几十倍。泰语维基185785条,老挝语5594条,差33倍。
所以这一节的结论可以写得很硬:决定一门语言在模型里贵不贵的,不是它的文字,是这门语言在互联网上有多少字。文字结构一模一样的两门语言,可以差出4倍。
这条结论的价值在于它把一个看起来玄乎的技术问题,换算成了一个你本来就在查的数——内容存量。而内容存量是本站判断一门语言值不值得做时早就在用的指标。同一个数,现在多了一个用途。
同一套书写系统内部的分化比系统之间还大
把这条推论横着验一遍,会发现它到处成立。
拉丁字母内部:约鲁巴语2.17对英语1.00,差2.17倍。阿拉伯字母内部:中库尔德语2.77对阿拉伯语1.38,差2.01倍。西里尔内部:蒙古语1.89对俄语1.42,差1.33倍。天城文内部:马拉地语1.82对印地语1.57,差1.16倍。汉字内部:繁体1.42对简体1.25,差1.14倍。
而书写系统之间的差别呢?阿拉伯语1.38比希腊语2.14便宜,希伯来语1.48比匈牙利语1.79便宜。非拉丁的阿拉伯语比拉丁的约鲁巴语便宜36%。
所以书写系统这个变量在解释力上排不上号。它能解释字体大小、能解释排版、能解释输入法,唯独解释不了这一层。
看到一门语言用的是非拉丁文字就默认它在AI管线上更贵,这个直觉在70门语言里有一半是错的。真要一句话记住,就记语料量那一句。
这条推论怎么用在没测过的语言上
假设你手上有一门我没测的语言,想估它的倍数,不跑实验能不能估个八九不离十?
可以。查两个数:这门语言的维基百科条目数,以及它有没有大规模的商业网站群。
条目数百万级的,基本落在1.2到1.6;十万到百万级的,1.6到2.2;一万到十万级的,2.5到3.5;一万以下的,往4倍以上估。
这个粗估法我拿测过的语言反着验了一遍,误差在半个档位以内。它当然不能替代实测,但排期会上够用了,而查条目数只要三十秒。
上下文窗口里,你的语言能装多少字?
把token口径换成字符口径,排名会变
倍数那张表回答的是“这段内容进模型要花多少”。还有一个问题它回答不了:“这个窗口能装下多少内容”。
这两个问题在英语世界里是同一个问题,因为英语的字符和token之间是个稳定的比例。到了多语言场景,它们分家了。
换算方法很简单:拿窗口的token容量除以这门语言的每字符token数,得出这门语言在这个窗口里能装多少个字符。
拿128K这个常见容量算,英语能装633349个字符,老挝语75874个,只有12.0%。阿姆哈拉语11.4%,高棉语34.8%,缅甸语39.0%,僧伽罗语36.9%。
128K窗口在各语言里的真实容量
把主要市场的容量列出来,方便直接拿去用。
| 档位 | 128K窗口能装的字符数(相当于英语的比例) |
|---|---|
| 八成以上 | 西班牙语90.2%、荷兰语89.6%、德语88.8%、葡萄牙语88.7%、法语87.0%、马来语85.1%、意大利语80.5% |
| 六到八成 | 印尼语86.3%、俄语75.7%、他加禄语74.3%、瑞典语74.1%、丹麦语73.6%、土耳其语71.9%、越南语70.5%、豪萨语68.4%、芬兰语68.0%、罗马尼亚语68.9%、克罗地亚语65.9%、波兰语64.5%、阿拉伯语63.9%、印地语63.1% |
| 五到六成 | 亚美尼亚语61.8%、波斯语61.3%、格鲁吉亚语61.0%、保加利亚语60.9%、捷克语60.4%、乌尔都语59.6%、泰米尔语58.9%、乌克兰语58.3%、孟加拉语57.6%、希腊语55.8%、蒙古语54.9%、希伯来语52.2% |
| 三到五成 | 泰语48.1%、约鲁巴语44.4%、缅甸语39.0%、旁遮普语38.6%、僧伽罗语36.9%、中库尔德语35.2%、高棉语34.8%、韩语34.2% |
| 三成以下 | 简体中文26.6%、日语26.3%、繁体中文22.1%、阿姆哈拉语11.4%、老挝语12.0% |
这张表最实用的地方在于它能直接换算成一句人话:同一套长上下文方案,在西班牙语上你能塞进去一整本产品手册,在老挝语上只能塞八分之一。
而多数团队的做法是一套方案全语言复用,参数写死在配置里,从来没按语言拆开看过。
顺便提醒:窗口容量和有效容量不是一回事。塞满窗口跟效果好之间没有正相关,材料给多了模型反而抓不住重点。这里给的是物理上限,不是建议值。
检索切块的粒度是按token定的
这一层的影响比账单大,但被讨论得少。
把内容灌进检索系统的时候,通常要先切块。切块大小的默认值是按token定的,512、1024、2048这几个数出现得最多。
512个token在英语里大约是2500个字符,够装一整段完整的论证。同样512个token在老挝语里是303个字符,装不下一个完整的句子。
后果是什么?检索出来的片段在英语里是自洽的,在老挝语里是半截话。半截话喂给模型,模型要么理解错,要么当成噪声丢掉。
解法不复杂,把切块参数从token数改成字符数,或者按语言各设一个值。判断自己有没有中招也简单:抽二十个切出来的块,找母语者看一眼,问一句这一段能不能单独读懂。
长上下文方案在哪几门语言上不成立
这两年流行一种做法:不做检索,直接把整个知识库塞进超长窗口。这个做法在英语上确实省事。
它成不成立取决于两个数:你的知识库有多少字,这门语言的容量比例是多少。
假设知识库是40万字符。英语下这是128K窗口的63%,能塞。德语88.8%的容量,还剩点余地。泰语48.1%,塞不下,得砍一半。老挝语12.0%,只能塞进去七分之一多一点。
所以同一个架构决策,在语言清单上到某一行就会失效,而失效那一行在哪儿取决于你的知识库多大。这是个可以提前算出来的边界,不必等上线才发现。
更麻烦的是失效方式不报错。塞不下的时候框架通常是静默截断,你只会看到某几门语言的回答质量莫名其妙差一截。这一条会跟小语种幻觉那件事叠加:没有材料的时候模型不会说不知道,它会编。
这笔账落到日常的活上,一共要重算几处?
关键词表:500词在老挝语里值九千个块
先从最常见的那份文件说起。
拿14个电商品类词做样本,量各语言的平均值:英语每词2.3个token,德语3.5,俄语4.4,泰语5.2,僧伽罗语6.9,缅甸语7.6,阿姆哈拉语8.2,老挝语18.2。
换算成一张500词的关键词表:英语1142个token,德语1750,泰语2576,缅甸语3818,老挝语9100。
如果你的流程里有“把整张词表塞进提示词让模型对照改写”这一步——很多团队都有——这一步在老挝语上的单次成本是英语的近8倍。
更要紧的是它可能塞不下。塞不下的时候框架会截,截掉的是词表尾巴,而词表通常按重要性倒序排,尾巴上是长尾词。症状会长成这样:小语种版本的改写结果里长尾词覆盖特别差,团队第一反应是模型对这门语言不熟,实际上是词表根本没进去。
批量改写与翻译:按篇计价的报价单会失真
回到开头那份报价单。
供应商按篇报价没有恶意,人工翻译就是这么算的。问题是他们的成本结构里有一大块是接口调用,而那一块是按token计的。
倍数在1.2到1.6这一档时,供应商自己吸收掉了,没人会为百分之几十去改报价单。到了3倍以上,这笔差价就吃掉利润了,于是要么他们涨价,要么他们降配——换更便宜的模型,或者砍掉一轮质检。
降配这条路对你更危险,因为它不通知你。你看到的还是同样的交付物,只是这门语言的质量悄悄差了一档。省掉的那道工序最后要拿收录和排名分期还,这条老账在这儿换了个形式又出现一次。
所以采购这类服务时值得多问一句:这几门语言你们用的是同一个模型和同一套流程吗。这个问题不需要对方给证据,问出来本身就有作用。
站内的AI客服与问答
这是唯一一处成本按用户量而不是内容量走的地方,所以它的账最容易失控。
每一次对话都要带上系统提示词、检索到的片段、历史轮次。这三样在小语种下全都膨胀,而且是叠加的。
假设一次对话平均消耗3000个token,其中2000是检索片段和历史。在3倍膨胀的语言下,同样内容的这2000会变成6000,单次对话成本翻一倍以上。
更麻烦的是历史轮次。轮次越多,历史越长,膨胀的绝对量越大。所以小语种的对话会更早撞上轮次上限,被迫截断或者重开。用户那一侧的体验是:聊到第五轮机器人开始忘事,而英语用户聊到第十五轮才会遇到同样的事。
免费额度与限流:同样的额度不是同样的工作量
最后这一处最容易被忽略,因为它不出现在任何账单上。
各家平台的免费额度、速率限制、并发上限,单位全是token。同样的额度,在英语上够跑完一天的活,在3倍语言上只够三分之一。
限流触发的时候表现是接口报错或者排队,运维会看到,但很少有人把它跟语言联系起来。日志里只有请求失败,没有语言这一列。
所以有个很小但很有用的动作:给调用日志加一列语言标签。加完之后所有按语言分化的问题都会自己浮出来,不只是限流。本站写语言判定那篇里说过同一句话——把关键指标按语言拆开看,它几乎是所有语言层问题的通用破法。
三代词表的进步,到底分给了谁?
p50k到o200k,各语言省了多少
词表换代这件事,厂商的说法通常是一句“对多语言支持更好了”。好多少,好给谁,没有清单。
这次三代都跑了,可以把这份清单补出来。省下的百分比按从多到少排:泰米尔语87.4%、马拉雅拉姆语87.2%、格鲁吉亚语87.1%、卡纳达语85.6%、古吉拉特语85.4%、泰卢固语85.3%、孟加拉语82.4%、亚美尼亚语82.2%、缅甸语81.3%、印地语79.0%。
另一头:英语4.2%、乌兹别克语24.6%、阿姆哈拉语25.3%、他加禄语27.4%、丹麦语28.7%、意大利语28.9%。
这份清单里有两条完全不同的信息。第一条是好消息:印度诸语和高加索几门语言的膨胀被砍掉了将近九成,它们从“贵得离谱”变成了“略贵”。如果你的成本模型是两代词表之前建的,这几行现在全部作废。
第二条是坏消息,而且藏得比较深,下面两节分开说。
英语自己只省了4.2%
英语从28055降到26878,三代下来省了4.2%。
这个数字说明一件事:词表扩容的收益英语基本没拿到。这不奇怪,英语在p50k那一代就已经接近饱和了,常见词早就全是整块,再扩四倍词表也没多少可优化的。
所以扩容的四倍空间几乎全部分给了非英语。这一点值得说清楚,因为“厂商不管小语种”这个印象在中文圈里挺普遍,实测数据不支持这个印象。
他们管了,而且管得力度不小。问题在别的地方。
最需要改善的两门语言拿到的最少
坏消息在这儿。
阿姆哈拉语的膨胀倍数是5.82,全场第二贵。它从p50k到o200k只省了25.3%,是所有非英语语言里改善幅度最小的。
老挝语8.23倍,全场最贵,省了37.7%,同样排在末尾那一档。
换句话说:改善幅度最大的是本来就还行的那一批,改善幅度最小的是本来就最惨的那一批。
根子在分配规则:扩容之后新增的位置还是按语料频率分,语料最少的那几门依然排在最后。一篇逐语言评估分词质量的研究指出过一条出路——为单语言单独训一套词表比共享一套大词表更好,但那是训模型的人的选项,不是用模型的人的选项。
这不是单调关系,是一条倒U形曲线
我开工前的第二条预期写的是“改善幅度跟语料量正相关”。实测下来这条是错的,而且错得很有意思。
正确的形状是倒U形:语料量最大的那一头(英语)几乎没有改善空间,语料量最小的那一头(老挝语、阿姆哈拉语)拿不到新增位置,改善最大的是中间那一段——有一定量、但在旧词表下还没被充分覆盖的语言。
印度诸语、格鲁吉亚语、亚美尼亚语、缅甸语全都落在这一段。
这个形状有个直接的预测价值:如果你的语言现在的倍数在1.5到3之间,下一代词表大概率还会给你一些改善;如果已经在4倍以上,别等了。
内容供给量能不能预测这个倍数?
拿维基条目数做代理指标
前面反复说“语料量决定一切”,这一节把它验成一个数。
训练语料的组成没有公开,没法直接查。但有个现成的代理指标:这门语言的维基百科条目数。它跟一门语言在互联网上的内容存量高度相关,而且随时可查。
本站在算小语种优先级那篇里就用过它,当时的用途是判断竞争密度。现在它多了一个用途。
我取了能拿到数的19门语言,把条目数和膨胀倍数都取对数之后算相关系数。
十九门语言的相关系数是-0.734
把两头的数摆出来看更直观。
条目数最多的五门:英语7217635条对应1.00倍、德语3140245条对应1.31倍、法语2772345条对应1.37倍、荷兰语2224227条对应1.25倍、西班牙语2128835条对应1.32倍。
条目数最少的五门(这19门里):蒙古语27943条对应1.89倍、希腊语271523条对应2.14倍、希伯来语402074条对应1.48倍、乌尔都语668470条对应1.65倍、土耳其语693272条对应1.43倍。
再把没进这19门统计的两个极端加上:老挝语维基5594条,8.23倍;泰语185785条,1.99倍。这一对正好补上曲线的最右端,也是全篇最干净的那组对照。
这跟本站量过的另外两把尺子怎么合起来看
本站到目前为止量过三把跟“这门语言值不值得做”有关的尺子,这是第三把。
第一把是内容供给密度,回答“有没有人跟你竞争”。第二把是工具返回零之后自己补出来的需求量,回答“有没有人在搜这类东西”。这一把回答的是“机器处理它要多花几倍”。
三把尺子的有意思之处在于它们并不同向。老挝语在第一把上是机会(本地几乎没人写这门语言的商业内容),在第三把上却是全场最贵。同一门语言,一个信号说进,一个信号说别用机器做。
僧伽罗语也是这样:供给侧几乎空着,倍数2.69偏贵。这组合的意思是——值得做,但要控制机器工序的用量,人写比机器写划算。
不懂这门语言,怎么自己把这个数量出来?
三十分钟能跑完的最小实验
这一节把整套方法压成可以照抄的步骤,不需要懂那门语言,也不需要懂机器学习。
要准备的东西只有三样:一份平行语料、一个tokenizer库、一台能跑Python的电脑。
整个流程是:下载语料、取出你要的那几门语言、每门语言数一遍token、除以英语那一份。
输出是一张表,两列——语言,倍数。加上字节回退率就是三列。
平行语料从哪儿拿
首选还是FLORES-200,理由前面说过:专业译者翻的、句句对齐、204门语言、公开可下、版本固定。
下载下来是个压缩包,二十几兆,解开之后每门语言一个纯文本文件,一行一句。文件名是三字母语言码加书写系统码,比如泰语是tha_Thai,老挝语是lao_Laoo。
如果你的语言不在里面(204门覆盖得已经很广,但确实有漏的),替代方案是拿你自己站上的真实内容——同一批商品描述的各语言版本,效果更贴近实际,只是各语言之间未必严格对齐。
用自己的内容还有一个额外好处:能测出你的内容特性带来的差异。技术类内容英文术语多,膨胀会低于通用语料;生活类内容本地词多,膨胀会高。
三行代码算出你的倍数
核心的代码真的只有三行:加载编码器、读文件、数长度。
先装tiktoken,然后取o200k_base这个编码,把整个文件的内容读成一个字符串,调用encode方法,取返回列表的长度。
对每门语言重复一遍,最后拿各语言的数除以英语的数。
要注意两件事。第一,别逐句编码再相加,跟整篇编码的结果会有出入——词的前后有没有空格会改变切法,而这件事在非拉丁语言上尤其不稳定。第二,第一次运行时库要联网下载词表文件,几十兆,之后就有缓存了。
字节回退率怎么算
这一列比倍数更能说明问题,而且算起来只多五行。
做法是:编码之后拿到token列表,对每一个token单独调用解码成字节的方法,然后试着把这段字节按UTF-8解码成字符串。
能解码成功的,说明这个token本身是一个或多个完整的字符。解码失败的,说明它只是某个字符的一截。
数一下失败的比例,就是字节回退率。
把结果读成三档动作
数量出来之后要落到动作上,不然就是一张没人看的表。我用的是三档。
1.0到1.8倍:不用管。按现有流程做,成本差异在预算的噪声范围内。这一档覆盖了大多数欧洲语言和东南亚的几门主要语言。
1.8到3.0倍:值得优化,但不改架构。具体动作是把术语表从提示词里搬出来、检索片段数减一点、质检改成抽样。这几个动作加起来能省掉大半差价。
3.0倍以上:改架构或者改分工。长上下文方案在这一档不成立,大批量AI改写在这一档不划算。正确做法是把机器工序压到最少,把预算移到人工那一侧——这一档的语言通常也是竞争最稀薄的,人工写出来的东西性价比反而更高。
三种看着合理、实际会把结论带偏的做法
用字符数直接推token数
最常见的一种。手上有一门语言的倍数,看到另一门语言字符数差不多,就直接套用。
老挝语和英语的字符数只差1.5%,倍数差8.23倍。这个反例就够了。
更细一点的错法是拿书写系统套。看到两门语言都用天城文,就默认倍数接近。印地语1.57,马拉地语1.82,差16%,还算接近;但泰文的1.99和老挝文的8.23,两套亲戚文字,差4倍。
正确做法只有一个:实测。二十分钟的事,没有任何理由用估的。
拿一门语言的倍数代表整个书写系统
第二种是前一种的升级版,也更常见于技术方案里。
比如在配置里写一条规则:非拉丁文字的语言,切块大小减半。这条规则会同时误伤和漏掉两批语言。
误伤的是阿拉伯语1.38、希伯来语1.48、俄语1.42、简体中文1.25这一批——它们全是非拉丁,倍数却比德语法语还低,减半等于白白损失一半上下文。
漏掉的是约鲁巴语2.17、马耳他语1.87、祖鲁语1.72这一批——全是拉丁字母,规则不会触发,但它们真的需要调整。
把这个倍数当成放弃一门语言的理由
第三种是决策层面的误用,代价最大。
会上摆出一张表,某门语言8.23倍,很自然会有人说:那这门语言太贵了,先别做。
这个推理有两处漏洞。第一,8.23倍贵的是机器工序,不是整个市场。人工写作、外链、页面开发的成本一分钱没变。
第二,倍数高的语言恰好是内容供给最稀薄的语言——因为两件事都由同一个原因决定,这门语言在互联网上的内容少。内容少意味着机器难做,同时也意味着竞争少。
所以正确的结论不是“别做”,是“别用机器做”。这两句话在排期表上导向完全不同的动作:前者删掉一行,后者把那一行的预算从接口费挪到人工费。
哪些相邻的问题不归这一层管
最后划一下边界,免得这篇被当成一个万能解释。
模型在这门语言上答得准不准,不归这一层。那是训练数据和模型能力的事,跟切成几块没有直接关系。
页面能不能被搜索引擎正常收录和匹配,不归这一层。搜索引擎的分词是另一套机制,本站泰语那篇讲的是那一套。
字体大小、排版、首屏加载,不归这一层。那是字形集和字体文件的事,判据是书写系统,跟这里正好相反。
常见问题解答
换一家模型厂商,这些倍数还成立吗?
绝对数字会变,相对关系基本不变。我这次用的是tiktoken那一系的三代词表,别家模型有自己的词表,规模和构成都不同,同一门语言的倍数会有出入,通常在正负三成以内。但排序几乎不会变——语料多的语言便宜、语料少的语言贵,这条是由词表的构建方式决定的,不是某一家的选择。真要用在决策上,最稳妥的做法是拿你实际在用的那家的分词库重跑一遍,方法完全一样,改一行代码。有一个例外值得注意:有些厂商会为特定语言单独优化词表,如果你的核心市场恰好在那个名单上,实测出来的数会明显好于通用规律,这种情况只能靠实测发现,公告里通常不写。
字节回退率高的语言,模型是不是根本理解不了?
不是。回退高只影响效率,不直接影响理解。模型在训练时见过大量这种字节序列,它有能力从字节层面重建语义,只是要多花几层计算。实际表现上,这类语言的理解质量确实偏弱,但主因是训练语料少,不是切分方式——两件事由同一个原因导致,容易被混为一谈。判断方法很简单:找一段这门语言的文本,让模型复述一遍,看它有没有理解错。多数情况下它复述得没问题,问题出在需要专业知识或本地事实的时候,那是知识层的缺口,不是切分层的。所以看到回退率高,该调整的是成本预期和上下文预算,不是对模型能力的判断。
把内容先翻成英语再喂给模型,是不是能省掉这笔钱?
能省token,但会付出别的代价,而且多数场景下不划算。先翻成英语意味着多一次调用(翻译本身也要花钱),而且原文的信息会在中转的那一步损失一部分——语法信息、语气、专有名词的本地写法。更实际的问题是产出:如果最终要的是这门语言的内容,模型用英语想完再翻回去,出来的东西会带着英语的句式和结构,母语者一眼能看出来。这套做法只在一种场景下成立:你要的输出是结构化数据或者判断结果,不是可读的文本。比如让模型判断一段评论是好评还是差评,先翻英语再判断是可以的,因为输出只有两个字。要产出内容,别中转。
这个倍数会不会影响我的页面在AI答案里被引用的机会?
有间接影响,但不是决定性的。检索系统给每个候选来源的篇幅是有限的,同样长度的内容在高膨胀语言里占的位置更多,被截断或者被排除的概率相应更高。不过引不引用你,首要判据还是内容本身对不对得上问题,其次是来源可不可信,切分效率排在很后面。所以不必为这件事改写内容。真要做点什么,方向是让关键结论出现在段落靠前的位置——被截断的时候前面那部分留下的概率更大。这条建议在任何语言上都成立,只是在高膨胀语言上收益更明显。至于你的语种到底有没有被点亮,那是更前置的一个问题,得先过了那一关这一层才有意义。
这套测量多久重跑一次?
一年一次就够,跟着词表换代的节奏走。词表不是频繁更新的东西,一代能用一两年,季度级的重跑纯属浪费时间。重跑的时机有两个信号:一是你在用的模型换了大版本,二是你的语言清单里加了新市场。第一个信号触发的是全表重跑,第二个只需要跑新增的那几门。重跑的时候语料必须固定用同一批句子,否则量到的是语料差异而不是词表差异,这一点前面强调过,因为它是最容易犯的错。跑完把新旧两版表并排放,改善明显的语言可以考虑把机器工序的比重往上调一档。
权威参考资料
本文标题:《同一段内容翻成老挝语,字数一个没多,模型读一遍的价钱翻了八倍》
本文链接:https://zhangwenbao.com/minor-language-llm-token-inflation-cost.html
版权声明:本文原创,转载与引用请注明作者与原文链接。许可协议: CC BY 4.0