低资源语言缺乏英文那样丰富的隐式先验,Prompt 必须补足结构、语域和术语。通过 Wikipedia 词条量、网络爬虫占比、Token 化效率四个代理指标评估语言资源丰富度。
一份在英语中有效的 Prompt 做了大量你看不见的工作:它依赖于模型从一个稠密的先验知识中推断出结构、语体和术语。而在一个覆盖率只有其千分之一的语言中,这种先验知识并不存在,Prompt 必须包含先验本应提供的内容。
这个标签是相对的,值得用一个可以在规划之前就能验证的东西来替代。四个代理指标,全部可以在一个下午内查证:
Wikipedia 条目规模。Wikimedia Foundation 发布的各语言 Wikipedia 列表给出了每种语言的条目数量。这跨越了四到五个数量级,是最快的单一信号,因为对于小语种来说,那里的 Wikipedia 通常是现存最大的干净语料库。
网页抓取语言统计中的出现率。从 Common Crawl 衍生的语料库项目会发布各语言的字节计数。一种语言只占抓取量的万分之一,意味着它在训练数据中的出现频率也是万分之一。
分词器效率。发送一段文字,统计每字符的 token 数量。严重的碎片化意味着这种文字在拟合词表时代表性不足——这既是成本问题,也是能力问题——参见分词器词表瓶颈。
基准测试覆盖。如果一种语言不在 FLORES 中、不在任何多语言评估套件中、也没有已发布的结果,说明没有人测量过它——也就意味着没有人针对它做过优化。这是一个没有标准基准的语言。
在写任何 Prompt 之前需要内化一个后果:能生成某种语言的模型不一定能遵循用该语言给出的指令。这是两种从不同数据中学习的不同能力,而且预训练的覆盖范围总是比指令微调的覆盖范围更广。
稀薄的覆盖率不会产生普遍更差的文本。它产生四种特定的、可识别的失败,而 Prompt 的构建正是要堵住每一种。
隐性语言替换。模型用一种相关的、资源更丰富的语言回答,却不会提及。提格雷尼亚语的请求用阿姆哈拉语回答;博杰普尔语用印地语回答;吉库尤语用斯瓦希里语回答;新挪威语用书面挪威语回答。当两种语言共用同一套文字时,对于不读该语言的人来说这是不可见的,这就是为什么它能在审查中存活。总体行为取决于模型对自己不熟悉的语言会做什么。
指令坍缩。在英语中可靠成立的约束——字数限制、必需的部分、输出格式、拒绝规则——不再被遵守。不是因为模型误解了,而是因为遵守这些约束的行为是在其他语言中训练的。
虚构词汇。当被要求提供一个该语言可能尚未定论的技术术语时,模型以完全自信的态度生成一个看似合理的逐词翻译。这是低资源语言产生更多幻觉的一般趋势中最尖锐的边缘,因为一个编造的术语是流畅的,如果没有母语者就无从检测。
文字和正字法漂移。用多种文字书写、或拼写惯例尚未固定的语言,会产生混合两者的输出:塞尔维亚语在西里尔字母和拉丁字母之间滑动,库尔德语在阿拉伯字母和拉丁字母之间滑动,或者最近改革了正字法的语言在一个段落中混用两个版本。
这个方法是一个想法的五种应用:无论模型本应从稠密先验中推断出什么,就把什么作为显式产物放入 Prompt。一条英语 Prompt 可以说"写一封支持回复"并依赖模型知道这个体裁。沃洛夫语 Prompt 不能这样做,所以你给它一个骨架。
用高资源语言写指令,内容用目标语言。通常是英语;但如果区域通用语更接近目标语言且覆盖更好,有时会更好——比如对几种西非语言用法语,对几种南亚语言用印地语,对东非部分用斯瓦希里语。
无歧义地命名语言。英语名称、当地名称和 ISO 639-3 代码一起给出。"Tigrinya(ትግርኛ,ISO 639-3 tir),用吉兹字母书写"远比"Tigrinya"更难被替换掉。
字面地给出输出形状。不是"写三段",而是实际的小标题、实际的字段名、实际的顺序,用字符数而非字数来设定长度预算——在几种这些语言中,单词边界假设会失效,正如原生语言 Prompt 一文中所论述的。
提供词汇表。你关心的每个领域术语,从源语言映射到你想要的确切目标语言术语。这是防止虚构词汇唯一可靠的方法,并将不可验证的输出转化为可检查的输出。
提供比英语中更多的示例。两到四个母语演示,选择形状各异的。这些是在与一个薄弱的先验竞争,因此按比例承担更多负载——这是目标语言少样本示例的机制。
两个解码设置遵循同样的推理。保持低温:低温采样在薄分布中更可能游荡到相邻语言而非产生有趣的散文。提高 max_tokens 到足够大:因为重的 token 化意味着相同内容消耗的 token 预算是在英语中的数倍,而截断的回答看起来像是质量问题。
用英语编写指令块,并声明目标语言及其当地名称和 ISO 代码加上文字体系。
添加一条明确的反替换条款,命名你预期它会漂移过去的语言:"不要用阿姆哈拉语或英语回答。如果你无法生成提格雷尼亚语,准确回复:UNSUPPORTED,别无其他。"给模型一个合法的拒绝方式是让无声失败变成可见失败。
将词汇表粘贴为两列块,并声明这些术语是强制性的。
在每个请求的内容之前添加两到四个完全符合输出形状的母语示例,这样它们会落在可缓存的前缀中。
字面指定输出结构,并给出字符预算。
设置低温和一个慷慨的 token 限制。
在任何输出到达用户之前运行以下检查。
{
"model": "<your-model>",
"temperature": 0.2,
"max_tokens": 1600,
"messages": [
{
"role": "system",
"content": [
"Write in Tigrinya (ትግርኛ, ISO 639-3 tir), Ge'ez script.",
"Do NOT answer in Amharic, Tigre or English.",
"If you cannot produce Tigrinya, output exactly: UNSUPPORTED",
"",
"MANDATORY TERMS (source -> Tigrinya). Use these exact forms;",
"do not coin alternatives:",
" invoice -> <term>",
" due date -> <term>",
" refund -> <term>",
"",
"OUTPUT SHAPE, exactly these three sections in this order:",
" 1. Greeting, one sentence, max 120 characters",
" 2. Explanation, max 600 characters",
" 3. Next step, one sentence, max 120 characters",
"Return nothing else. No English. No transliteration."
].join("\n")
},
{ "role": "assistant", "content": "<native example 1>" },
{ "role": "assistant", "content": "<native example 2>" },
{ "role": "user", "content": "<the case details>" }
]
}
你最终需要一个母语者;这些检查的意义在于它们先捕获机械失败,这样母语者的时间就只花在那些只有母语者才能做的判断上。
文字断言。检查输出的字符落在预期的 Unicode 区块中,且拉丁字符的比例接近零。这直接捕获文字漂移和英语泄漏。
替换探测。对输出运行语言识别器。它不会可靠地区分相近的语言——这就是相似语言难以区分的问题所在——但对相邻语言的自信预测是一个强信号,值得报警,即使检测器较弱。
词汇表断言。每个强制术语必须在源文本包含其对应词的地方逐字出现。一个缺失的术语意味着模型编造了什么东西。
结构和预算。三部分,按顺序,在字符限制内。指令坍缩首先在这里显现,而且检测是免费的。
回译,附警告。将输出回译是值得做的,但并不足够。通过同一个模型回译会洗掉其自身的错误:一个编造的术语往返后会变成你要求的那个词,因为模型相信自己的创作。用它来捕捉大的意义失败,永远不要用它来认证术语。
审查每个模板的一个输出,一次,与一个母语者一起。模板是稳定的;个体生成不是。审查模板是负担得起的,而且能捕捉到上述所有都无法捕捉的语体和语调。
给定语言的覆盖范围在不同模型系列之间差异很大,而最适合你的语言的模型往往不是你标准化的那个。能将同一请求发送到多个模型并在自己的检查上比较——文字断言、词汇表遵守、结构——是找出答案的实际方法,而且当它们在一个 API 和一个密钥后面时更容易,这就是 Multigrid 提供的价值。
Why Low-Resource Languages Hallucinate More Often
Why Tokenizer Vocabulary Size Is a Bottleneck for Low-Resource Languages
What Happens When You Ask an AI Model a Question in a Language It Barely Knows