想知道 Index-Translate 能不能翻你要的那门语言,凭语言名去猜通常不靠谱。可核对的顺序一般是:先看模型卡里与语言相关的字段,再看分词器词表里该语言的字符片段是否存在,最后用三种难度的样例句在真实输入上跑一遍,把现象记下来。三条线索一致,才把该语言写进可用清单;对不上的,直接写成边界说明,而不是等上线后才发现。
判断 Index-Translate 的语言覆盖,建议按“模型卡字段 → 语言代码对齐 → 词表片段抽查 → 样例句验证”的顺序走。模型卡写明支持的语言只是入口,词表和实际输出行为才是边界。字段缺失时改查训练配置与仓库说明;同一语言有多种代码写法时,以词表里实际出现的那一种为准。任何语言在样例句跑通之前,都不宜当作可用能力对外承诺。
在模型卡的信息区找出语言相关字段
模型卡的信息区通常分成若干块,语言相关内容不一定集中在一处。先把这几类字段名找出来,用列表逐条确认是否出现:
- 语言列表类:
language、languages、supported_languages、language_code、lang。 - 任务类型类:
task、tasks、pipeline_tag,翻译类常见写法形如translation或translation_xx_to_yy,这里的 xx、yy 往往就是语言代码。 - 训练语料语言类:
training data、datasets、corpora、corpus、train段落里的语言标注。 - 旁证类:分词器配置中的
vocab_size、特殊 token 说明、示例代码里的输入输出语言对。
如果模型卡里这几类字段一个都没有,先不要下“不支持”的判断,改用另一条线索:看仓库根目录的 README 能力描述段、config.json、以及训练配置(数据配置里的语言或数据源字段)。这些位置同样缺失时,只能以第 3、4 节的词表抽查和样例句结果为准,并在记录里注明“模型卡未给出语言清单”。
把语言名换算成模型实际使用的语言代码
直接用中文语言名去比对参数,很容易误判,因为同一门语言在模型里可能写成 ISO 639-1(如 zh、en)、ISO 639-3(如 cmn、jpn)、带地区的 BCP 47(如 zh-Hans、pt-BR),也可能是模型自定义写法(如 zho_Hans、zh_cn)。建议做一张登记表,主键用模型卡或词表里实际出现的写法,其余写法作为别名挂在同一行:
语言名 | 主用代码 | 别名代码 | 来源字段/文件 | 状态
中文 | zh | zh-Hans, zho_Hans | config.json lang | 待验证
英语 | en | eng | 模型卡 language | 待验证
日语 | ja | jpn, ja-JP | 词表抽查 | 待验证
登记规则可以先定三条:大小写按原样保留,不自行转换;同一语言只保留一个主用代码,用于后续调用参数;脚本或配置里出现新写法时,作为别名补录,不新建一行。这样后续换模型版本时,只需要核对主用代码是否还在。
在分词器词表文件里抽查目标语言的字符片段
词表文件常见形态有 vocab.json、vocab.txt、tokenizer.json、spiece.model、sentencepiece.bpe.model,旁边往往还有 merges.txt。这些文件不一定都在仓库根目录,需要结合本机下载的模型目录确认。抽查只做一件事:看该语言的字符和常见词片段有没有出现在词表条目里。
以 JSON 词表为例,可以先只取条目数,再抽少量含中文字符的条目看现象:
python -c "import json;v=json.load(open('vocab.json'));print(len(v))"
python -c "import json;ks=list(json.load(open('vocab.json')));print([k for k in ks if any('\u4e00'<=c<='\u9fff' for c in k)][:20])"
如果拿到的是 tokenizer.json,且本机装了对应分词库,也可以直接看目标句被切成了什么片段:
python -c "from tokenizers import Tokenizer;t=Tokenizer.from_file('tokenizer.json');print(t.encode('今天下雨了。').tokens)"
记录方式建议只写现象:抽到的片段、该语言字符是否成片出现、是否出现大量单字切分或转义字节。不要根据抽查条目数去推算覆盖率,那属于另一类统计工作,凭抽样得不出可对外承诺的结论。
用三种难度的句子做覆盖验证
词表里有片段,不代表模型会翻。建议固定三组输入,同一批句子对所有候选语言复用,方便横向比对:
- 短句:一句日常主谓宾,不带标点歧义,例如“今天下雨了。”用来确认基本语序是否被处理。
- 含专有名词句:带人名、地名、产品名或机构缩写,例如“张伟把报告发给了 ACME 公司。”用来观察专名是被保留、音译还是被改写。
- 长句:带从句、数字、单位和括号,例如“如果服务器在 3 天内没有响应,请把日志(含时间戳)发回给运维组。”用来观察是否截断、漏译或错乱。
测试记录可以按下面的字段落地,逐条填,不合并:
句ID | 难度 | 目标语言代码 | 原始输出 | 现象归类 | 备注
S01 | 短句 | ja | | |
S02 | 专名 | ja | | |
S03 | 长句 | ja | | |
现象归类通常只需几种:原样输出(等于没翻)、空输出、异常报错、输出成另一门语言、漏译片段、数字或单位被改动。同一语言三组句子现象不一致时,按最差的一组记录,并在备注里写清是哪一句触发的。
把不可用语言写成明确的边界说明
边界记录的目标是让后来的人不必重跑一遍。格式可以固定为:语言名、语言代码、验证句 ID、现象、结论(支持 / 部分可用 / 不支持)、模型版本或路径、记录日期。结论只写这三档,不写“效果一般”这类无法判断的词。
语言 | 代码 | 验证句 | 现象 | 结论 | 模型版本/路径 | 日期
泰语 | th | S01-S03| 原样输出 | 不支持 | 本地模型目录 |
葡萄牙语| pt-BR| S01-S03| 短句可用,长句漏译 | 部分可用 | 本地模型目录 |
遇到不支持的语种,可行的替代方向有两个:一是换成明确列出该语言的模型,代价是接口和提示词要跟着改;二是在调用前先做预处理,把源语言转到模型支持的语言,再把结果转回去,这条路径会增加一次转换误差,需要结合业务对术语准确度的要求确认是否可接受。两类做法都应在边界记录里写明选了哪一种,避免下次重复讨论。