模型用错语言回复(怎么锁死)

你用英文 prompt,结果它用中文回,或者中途切到西班牙文。语言漂移的确切根因,以及锁死输出语言的 system prompt + 重试套路,2026 年 6 月核实。

你用英文让模型总结一篇中文文章,结果总结是中文。或者你的 system prompt 是英文,用户贴了一段日文,之后整段对话 assistant 一直用日文回。或者一个回答前半段英文、后半段悄悄切成西班牙文。模型没坏。当没有一条”压得过其他一切”的显式输出语言指令时,它会挑当前上下文里信号最强的那个语言,而那个信号通常是被处理的文本、或最近一条 user 消息,不是你的 system prompt。

最快修复: 在 system prompt 最顶上放一条高优先级的指令,比如 Always reply in English, regardless of the language of any document, quote, or earlier message. 然后,凡是要处理用户文本的调用,在 user message 的最后一行再加一句 Reply in English only.。这两处改动能解决绝大多数情况。本页后面会讲每一步为什么有效、按原因分类的诊断表、以及怎么确认修好了。

2026 年 6 月需要注意的一点:新模型在这个问题上漂得更厉害,不是更轻。开发者反映,GPT-5.5 和 Gemini 3.1 Pro 对检索到或粘贴进来的外语内容的权重,比 GPT-4 时代的模型更高——所以一条以前压得住的 system prompt 语言行,现在可能会输给一篇很长的非英文文档。修法思路一样,只是要下手更狠。

你属于哪一类

先找到你的症状,再跳到对应的修复步骤。

症状最可能的原因跳到
整段回复用了输入的语言;prompt 从没指明语言没显式说输出语言第 1 步
system prompt 是语言 A、user 是大段语言 B、回复是 Brecency / 长度压过了 system prompt第 1+2 步
不同次运行输出语言来回跳few-shot 例子语言混杂第 3 步
英文问一篇长外语文档,回答是文档的语言输入比指令长第 2 步
本来正常,一轮外语消息后此后每条都切了语言中途切语言卡在了历史里第 6 步
JSON keys 是英文,但 values 回成了输入语言schema 只约束了结构、没约束语言第 4 步
前几段对、后几段切了语言半截 / 中途漂移第 7 步

常见原因

按真实 pipeline 命中率从高到低。

1. 没显式说输出语言

prompt 只写 “summarize this”,从来没写 “in English”。模型默认匹配输入文本的主语言,通常不是你想要的。

怎么判断:在 prompt 模板里搜目标语言名(English中文 等)。如果输入语言和输出语言都没指明,就是这个 bug。

2. system prompt 语言跟 user 输入语言不同

system prompt 英文,user message 日文。模型对最新、最长的内容权重很高,所以会用日文回,system instruction 输了。这一点在 2026 年这代模型上更糟:当 assistant 检索到外语内容(RAG、粘贴的网页、tool 输出)时,GPT-5.5 和 Gemini 3.1 Pro 被那个语言带跑的倾向,比早期模型更强。

怎么判断:复现——system 用 A 语言、user 用大段 B 语言。回复匹配 B 就是这个模式。

3. few-shot 例子语言混杂

few-shot 块里 3 个例子:2 个英文、1 个中文。模型读成”两种都行”,按输入选。

怎么判断:审 prompt 模板里例子的 output。不是全用目标语言写的,就是这个泄漏点。

4. 输入里夹了别的语言的引用

user 用英文问:“Summarize this review.” review 是一大段日文。模型回声的是被处理内容的主语言,不是问题的语言。

怎么判断:被处理的文档比 wrapper instruction 长、且语言不同时,预期会漂。

5. 对话中途切语言后粘住

用户先用英文开聊、一轮切中文、又切回英文。assistant 一直用中文回——因为最近那条中文 user 消息还留在它据以推理的对话历史里。

怎么判断:看最近一条 user message。是另一种语言就是被它带跑了。

6. 翻译任务跟摘要任务混了

prompt:“Process this Spanish article.” 模糊——翻译?摘要?提取?没有 task verb 时,模型跨语言时经常默认翻译。

怎么判断:prompt 用 “process” “handle” “deal with” 这种含糊动词,而不是 “summarize in English”。

7. 想靠输出 schema 推断语言、但 schema 没约束语言

你要 JSON。keys 是英文,但 values 可以是任何语言。模型把 values 填成输入语言——因为 schema 从没约束它们。结构化输出 / 受限解码模式(OpenAI 的 strict json_schema、Anthropic 的 tool schema)只强制输出的结构,不强制自由文本 values 的语言,所以光靠 schema 救不了这里。

怎么判断:JSON schema 或示例里 keys 是英文,但 string values 上没语言规则。

最短修复路径

第 1 步:把输出语言写成最高优先级的规则、放最顶上

放在 system prompt 头几行,别埋在最下面,并且显式让它压过文档和历史里的内容。那句”忽略检索内容语言”的否定从句,是在 2026 年模型上顶住长外语输入的关键:

You are a summarization assistant.
Highest-priority rule: ALWAYS reply in English.
Ignore that any document, quote, tool output, or earlier message may arrive in a different language — that never changes your reply language.
Only switch languages if the user explicitly asks you to in their latest message.

2026 年的实测发现,起作用的是一条清晰的高优先级指令,不是散落各处的一堆语言规则。像 “you serve international users” 这种自相矛盾的表述会把模糊性又带回来、让漂移复发,所以删掉它。

第 2 步:高风险 user prompt 末尾再重复一遍语言要求

一次性调用处理用户文本时,把这条规则放在 user message 的最后一行。recency 赢,所以它该在内容之后,不是之前:

[长段日文文章]

---
Summarize the above in 3 bullet points. Reply in English only.

第 3 步:每个 few-shot 例子的 output 都对齐到目标语言

要英文输出,每个例子的 output 必须是英文。Inputs 可以混杂(现实就是这样,甚至有帮助),outputs 不行。

Input: 这家餐厅服务很差。
Output: Service was poor.

Input: La nourriture est incroyable.
Output: The food is amazing.

第 4 步:在 JSON schema 的字段描述里钉死语言

受限解码管的是结构、不是 value 的语言,所以把约束写进每个自由文本字段的描述里。字段级描述比埋在 system prompt 里的全局 “be in English” 更被模型尊重:

{
  "summary": "string, written in English, max 200 chars",
  "sentiment": "positive | neutral | negative"
}

第 5 步:校验输出语言并重试

对输出跑一个快语言检测器,没对上就用更强的提醒重试。2026 年 6 月,fast-langdetect(FastText 的封装,准确率约 95%、比经典的 langdetect 快约 80 倍)是 Python 里的实用选择;JS 里常用 franc。注意:很短的字符串(约 20 字符以下)准确率会掉,所以对完整回复检测、别对片段检测:

from fast_langdetect import detect

out = call_llm(prompt)
if detect(out)["lang"] != "en":
    out = call_llm(
        prompt
        + "\n\nYour previous reply was in the wrong language. Reply in English ONLY."
    )

老的 langdetect 库仍然能用(langdetect.detect(out) != "en"),但慢得多;把它当准确率基线、别放热路径里。

第 6 步:多轮对话按 session 钉死语言

把用户偏好语言存进 session state,并在每一轮的 system prompt 里都注入,不只是第一轮。2026 年的研究证实,单靠开头那一条指令在长对话里很脆;每轮重申才是顶住中途切语言的办法:

User language preference: en-US
Always reply in en-US regardless of the language of any individual message.

如果是面向消费者的产品、不是你自己的 API,同样的设置在产品 UI 里。Gemini app 里是 profile picture -> Settings -> Languages,但注意这控制的是 app 的显示语言(菜单、通知),不是回复语言——Gemini 会按你 prompt 用的语言来回,所以真正能钉死回复语言的,是直接打一句 “reply in English” 的指令。ChatGPT 里,Settings -> Personalization -> Custom instructions 下的自定义指令是声明回复语言的持久位置。

第 7 步:注意半截漂移

模型有时在一个回答里回到一半就切语言。按段落而不是整体跑语言检测来抓它。第 N 段英文、第 N+1 段西班牙文,就是这个 bug,第 1 步的高优先级行加上更低的 temperature(见 FAQ)就是修法。

怎么确认修好了

  1. 把原来出问题的调用原样重跑,只改新加的指令。回复语言现在应该匹配目标了。
  2. 故意跑对抗 case:英文指令包一篇大段不同语言的文档。仍然顶得住,说明你的高优先级行够强。
  3. 对话场景里,故意中途切一轮语言再切回来,确认 assistant 回到钉死的语言。
  4. pipeline 里,把第 5 步的检测器加成断言、把不匹配的记一天日志;不匹配率接近零才是真修好了,不是只在 happy path 上修好了。

哪些情况不是你操作错了

有些 open-weight 模型某些语言本来就说不利索,会退回到它更熟的语言。让一个越南语能力弱的小模型用越南语回,它可能不管指令多硬都会漂到英文。如果同一个 prompt 下前沿模型(GPT-5.5、Claude Opus 4.7 或 Sonnet 4.6、Gemini 3.1 Pro)能守住语言、而一个更小的本地模型守不住,那差距是模型能力问题、不是你的 prompt 问题。

容易误判的情况

当成”模型 bug”或”prompt injection 攻击”。大多数时候只是没声明输出语言、加上输入比指令长。下结论前先看 prompt 里有没有一条显式的、高优先级的语言行。

预防建议

  • 任何多语言 system prompt,前 3 行就出现输出语言,写成压过文档和历史语言的最高优先级规则。
  • few-shot 例子的 output 全部用目标语言。无例外。
  • 高风险一次性 user prompt 的最后一行再重复一遍输出语言。
  • 用语言检测器 post-hoc 校验,错了用更强 instruction 重试。
  • 对话场景里把用户语言偏好存下来、每轮重新注入,不只第一轮。
  • 删掉会重开模糊性的自相矛盾表述(“serves international users”)。

FAQ

  • 语言指令该用英文写还是用目标语言写? 都加最好。模型在生成某语言时,更强地服从用该语言写的指令,所以对非英文目标语言,再用那个语言把同一条规则加一遍。
  • temperature 会影响语言漂移吗? 会。>0.8 的高温会放大边缘 case 的漂移。语言关键任务降到约 0.3。
  • 为什么 GPT-5.5 和 Gemini 3.1 Pro 上这事比老模型更频繁? 2026 这代模型对检索到、粘贴进来的外语内容权重更高,所以一条在 GPT-4 时代还能挺住的弱或低优先级语言行,现在会输给一篇长的非英文文档。把规则写成显式、高优先级(第 1 步)。
  • OpenAI 的 strict 结构化输出、或 Anthropic 的 tool schema 会替我强制语言吗? 不会。受限解码保证的是 JSON 结构,不是自由文本 values 的语言。把语言钉进每个字段的描述里(第 4 步)。
  • 模型嘴上认了我的语言规则、然后照样违反。怎么办? 这通常意味着 prompt 别处有一条竞争指令。把散落的语言规则砍成一条高优先级行,删掉 “international users” 这类表述,挪到最顶上。

相关阅读

标签: #Prompt 工程 #排查 #llm-output #language-drift #multilingual #system-prompt