你用英文 prompt 让模型总结一篇中文文章——结果总结是中文。或者 system prompt 是英文,用户贴了一段日文,之后对话里 assistant 一直用日文回。更糟的——回答前半段英文、后半段悄悄切成西班牙文。模型没坏。没显式声明输出语言时,模型挑信号最强的那个语言,而最强信号通常来自被处理的文本本身,不是 system prompt。
这是知道在哪里改之后最便宜的一个 bug,也是多语言产品里最常见的一个。
常见原因
按真实 pipeline 命中率从高到低。
1. 没显式说输出语言
prompt 只写 “summarize this”,从来没写 “in English”。模型默认匹配输入文本的主语言,通常不是你想要的。
怎么判断:在 prompt 模板里搜 “English” “中文”(或目标语言)。如果输入语言和输出语言都没指明,就是这个 bug。
2. system prompt 语言跟 user 输入语言不同
system prompt 英文。user message 日文。现代模型对最新 / 最长的内容权重最大,所以会用日文回。system instruction 输了。
怎么判断:复现——system 用 A 语言、user 用大段 B 语言。回复匹配 B 就是这个模式。
3. few-shot 例子语言混杂
few-shot 块里 3 个例子——2 个英文、1 个中文。模型理解为”两种都行”,按输入选。
怎么判断:审 prompt 模板里的例子。不是全用目标语言写的,就改例子。
4. 输入里夹了别的语言的引用
user 用英文问:“Summarize this review.”review 是一大段日文。模型回声待处理内容的主语言,不是问题的语言。
怎么判断:被处理的文档比 wrapper instruction 长且语言不同时,预期会漂。
5. 对话中途切语言后粘住
用户先用英文开聊、一轮切中文、又切回英文。assistant 一直用中文回——因为它在 KV-cache 窗口里看到的最后一条 user message 是中文。
怎么判断:看最近一条 user message。是另一种语言就是被它带跑了。
6. 翻译任务跟摘要任务混了
prompt:“Process this Spanish article.”模糊——翻译?摘要?提取?没有 task verb 时,模型经常默认翻译,跨语言时尤其明显。
怎么判断:prompt 用 “process” “handle” “deal with” 这种动词,而不是 “summarize in English”。
7. 输出结构是 JSON、但 schema 没约束语言
你要 JSON。JSON keys 是英文。但 values 可以是任何语言。模型把 values 填成输入语言——因为 schema 没强制 English。
怎么判断:JSON schema/示例里 keys 是英文但 values 没语言约束。
最短修复路径
第 1 步:在 system prompt 顶部显式说输出语言
放最上面,不是最下面,用模型能直接解析的措辞。
You are a summarization assistant.
ALWAYS reply in English, regardless of the input language.
Never reply in Chinese, Japanese, or any other language unless explicitly asked.
负面约束很重要——没有它,遇到长非英文输入模型仍会漂。
第 2 步:高风险调用在 user prompt 里再重复一遍语言要求
一次性调用处理用户文本时,在 user message 末尾再说一遍:
[长段日文文章]
---
Summarize the above in 3 bullet points. Reply in English only.
“Reply in English only” 要放在 prompt 的最后——recency 赢。
第 3 步:few-shot 例子全部对齐到目标语言
要英文输出,每个例子的 output 必须是英文。Inputs 可以混杂(现实就是这样),outputs 不行。
Input: 这家餐厅服务很差。
Output: Service was poor.
Input: La nourriture est incroyable.
Output: The food is amazing.
第 4 步:在 JSON schema 里钉死语言
返回结构化输出时,按字段写语言约束:
{
"summary": "string, English, max 200 chars",
"sentiment": "positive | neutral | negative"
}
字段级描述比埋在 system prompt 里的全局 “be in English” 更被模型尊重。
第 5 步:校验输出语言并重试
用一个快语言检测库(Python 的 langdetect、JS 的 franc)检查输出。不匹配就用更强的提醒重试:
import langdetect
out = call_llm(prompt)
if langdetect.detect(out) != "en":
out = call_llm(prompt + "\n\nNote: previous reply was in the wrong language. Reply in English ONLY.")
第 6 步:多轮对话按 session 钉死语言
把用户偏好语言存 session、每个 system prompt 里都注入:
User language preference: en-US
Always reply in en-US regardless of message language.
中途切语言也不会出问题。
第 7 步:注意半截漂移
模型有时回答一半切换语言。按段落而不是整体跑语言检测。第 N 段英文、第 N+1 段西班牙文,就是这个 bug。
哪些情况可能不是你操作错了
有些 open-weight 模型某些语言能力本来就弱,它会退回到它更熟的语言。让 Llama 2 用越南语回,可能就漂到英文——纯粹是越南语能力不够。
容易误判的情况
当成”模型 bug”或”prompt injection 攻击”。大多数时候只是没声明输出语言加上输入比指令长。下结论前先看 prompt 里有没有显式语言行。
预防建议
- 任何多语言 system prompt,前 3 行必须出现输出语言。
- few-shot 例子的 output 全部用目标语言。无例外。
- 高风险一次性 user prompt 最后一行再重复一遍输出语言。
- 用语言检测库 post-hoc 校验,错了用更强 instruction 重试。
- 对话场景里把用户语言偏好存下来、每轮注入 system。
FAQ
- 语言指令该用英文写还是用目标语言写? 都加最好。模型在生成某语言时,更强地服从用该语言写的指令。
- temperature 会影响语言漂移吗? 会——
>0.8的高温会放大边缘 case 的漂移。语言关键任务降到 0.3。
相关阅读
- 最后一句覆盖前面的指令
- Prompt 把 system 和 user role 用错了
- 没指定输出格式
- 互相冲突的指令削弱输出
- 没给例子导致输出漂移
- Prompt 太长输出质量下降
- 语气混杂的 instruction
- Few-shot 例子太多反而压垮模型
- Prompt 缺少 context 层级
- AI 输出风格漂移
标签: #Prompt 工程 #排查 #llm-output #language-drift #multilingual #system-prompt