1. 现象拆解:中文提问,英文思考,到底发生了什么
第一次撞见这个现象的人,反应基本都一样:明明用中文问的问题,模型在“思考”阶段噼里啪啦吐出一大段英文,最后给出的答案又是中文。有人怀疑是模型没学好中文,有人怀疑是系统提示词写错了,还有人干脆认为这是某种“内部机制泄露”。
先把结论摆在前面:这大概率不是 bug,而是模型在推理阶段的一种自然行为,背后牵扯到训练数据分布、系统提示词设计、Token 效率、以及 Agent 框架对思考过程的处理方式这几件事。理解清楚这几层,你就能判断自己遇到的是正常现象、配置问题,还是真的踩到了坑。
这个现象最典型的触发场景有三类。第一类是带思考链的推理模型,比如各类带 thinking 模式的模型,你问一个需要多步推理的问题,它会先输出一段“思考内容”,再输出正式回答。第二类是 Agent 框架,比如你在自己搭的 agent 里让模型先规划再执行,规划那一步经常是英文。第三类是系统提示词里混入了英文模板,模型顺着模板的语言往下走。
适合读这篇的人包括:正在做 AI 应用开发、调 Agent 的工程师;写系统提示词的产品和运营;以及单纯好奇“模型脑子里在想什么”的重度用户。不管你是哪一类,读完应该能自己判断:我这次遇到的英文思考,是该改提示词,还是该调参数,还是根本不用管。
2. 为什么模型“一想事情就切英文”
2.1 训练数据里,推理类文本英文占比更高
大模型的预训练语料是一个巨大的混合体。中文语料在总量上不少,但在“结构化推理”“分步骤论证”“代码与逻辑推导”这类特定文本类型里,英文的占比明显更高。学术论文、技术文档、开源代码注释、Stack Overflow 问答、教科书习题解答,这些恰恰是模型学习“怎么一步步想问题”的主要素材来源。
你可以把模型想象成一个读过海量书的人。它读过的“教人怎么推理”的书,绝大多数是英文写的;它读过的中文书里,叙事、抒情、日常对话居多,专门讲“第一步第二步第三步”的偏少。所以当它被要求“展示你的思考过程”时,它下意识调用的就是那批英文推理素材的表达模式。
这不是说模型的中文推理能力差。你让它直接用中文回答,它照样能答得很好。区别在于:“思考”这个动作本身,在它的参数里和英文的关联度更高。一旦进入显式的、需要展开的推理模式,英文就成了默认通道。
2.2 系统提示词里的英文模板在“带节奏”
很多推理模型和 Agent 框架的系统提示词是英文写的。比如常见的结构是:“You are a helpful assistant. Think step by step before answering.” 或者 Agent 框架里的 “First, analyze the task. Then, plan your actions.”
模型对系统提示词的语言非常敏感。系统提示词用什么语言,模型的“内部独白”往往就跟什么语言。这不是硬性规则,而是一种强烈的倾向。你在系统提示词里写英文的思考指令,却期望它用中文思考,本身就是在给它制造语言冲突。
更隐蔽的一种情况是:系统提示词是中文的,但里面嵌了英文的格式标记,比如<thinking>、<plan>、Step 1:这类标签。模型看到这些英文标签,很容易把标签内的内容也一并切成英文。
2.3 Token 效率:英文在推理场景下更“省”
这一点很多人没意识到。同样一个意思,英文的 Token 数往往比中文少。中文一个字通常对应 1 到 2 个 Token,而英文一个常见单词也就 1 到 2 个 Token,但一个英文单词承载的信息量在推理场景下经常更大。
举个粗略的例子。“因为所以”这四个字,中文大概 4 个 Token;英文 “therefore” 一个词,1 到 2 个 Token。在需要大量逻辑连接词的推理过程中,英文在 Token 消耗上有天然优势。模型在生成思考内容时,如果它的解码策略倾向于“用更少的 Token 完成推理”,它就会偏向英文。
这跟成本直接挂钩。思考内容也是要计费的,思考越长,Token 用量越大。有些模型在训练时就被优化过“推理效率”,英文思考某种程度上是这种优化的副产品。
2.4 思考过程和最终回答是两套“输出通道”
这是理解整个现象最关键的一点。带思考模式的模型,输出通常分成两段:一段是思考内容,一段是正式回答。这两段在模型内部并不是完全一样的处理逻辑。
思考内容更像是模型的“草稿纸”,它的目标是帮模型自己理清思路,而不是给用户看。正式回答才是面向用户的,会严格遵循用户的语言和系统提示词里的输出要求。所以你会看到:草稿纸上写英文,正式答卷写中文。模型并不觉得这有什么矛盾,因为这两段本来就有不同的“读者”。
Agent 框架里也是同理。规划阶段是给框架自己看的,执行阶段才是给用户看的。规划用英文,执行用中文,在框架设计者眼里是合理的。
3. 系统提示词、Token 与 Agent 的三角关系
3.1 系统提示词怎么影响思考语言
系统提示词对思考语言的影响,比大多数人想的要大。我做过一组对比测试,同一个问题,只改系统提示词的语言,思考语言就跟着变。
| 系统提示词写法 | 思考语言倾向 | 正式回答语言 |
|---|---|---|
| 全中文,明确要求中文思考 | 中文为主 | 中文 |
| 全中文,未提思考语言 | 中英混杂 | 中文 |
| 英文思考指令 + 中文输出要求 | 英文为主 | 中文 |
| 全英文 | 英文 | 英文 |
从这张表能看出来,如果你在意思考语言,就必须在系统提示词里显式约束。不写,模型就按自己的倾向走;写了英文思考指令,就别怪它用英文想。
实操上,如果你希望思考也用中文,可以在系统提示词里加一句类似“请始终使用中文进行思考和回答,包括你的推理过程”。注意要明确说“包括推理过程”,只说“用中文回答”往往管不住思考段。
3.2 Token 用量与思考长度的权衡
思考内容是要消耗 Token 的。一个复杂问题,思考段可能几百到几千 Token。如果你用的是按 Token 计费的接口,思考越长,账单越高。
这里有个常见的误区:有人为了省钱,把思考长度压到很短,结果模型推理不充分,答案质量下降。也有人放任思考无限长,账单爆炸。合理的做法是给思考设一个预算上限,比如 512 或 1024 Token,让模型在这个范围内完成推理。
英文思考在这个背景下有个副作用:它可能让思考段更短,从而更省 Token,但代价是思考语言和用户语言不一致,可读性差。如果你不需要看思考过程,这其实无所谓;如果你需要审查思考过程,那就得权衡。
3.3 Agent 框架里的思考语言处理
Agent 框架对思考语言的处理,各家做法不一样。有的框架会把思考内容直接透传给用户,有的会过滤掉,有的会做语言转换。
如果你在自建 Agent,建议在框架层面做一件事:把“思考语言”和“输出语言”当成两个独立配置项。思考语言可以跟随模型默认,输出语言强制跟随用户。这样既不影响模型推理效率,也不影响用户体验。
另外,Agent 的多步规划里,中间步骤的语言往往和最终输出不一致。这不是问题,只要最终交付给用户的内容语言正确就行。但如果你要把中间步骤展示给用户看,那就得在框架里加一层处理。
4. 实操:怎么控制思考语言
4.1 方法一:系统提示词显式约束
最直接的办法。在系统提示词里写清楚思考语言要求。示例:
你是一个中文助手。在回答任何问题前,请先使用中文进行思考和分析。 你的思考过程必须使用中文,最终回答也必须使用中文。关键点是“思考过程必须使用中文”这句不能省。只写“用中文回答”,模型可能只约束最终输出。
实测下来,这个方法对大多数模型有效,但不是 100%。有些模型在遇到复杂推理时,还是会不自觉地切回英文。这时候需要配合下面的方法。
4.2 方法二:用 few-shot 示例锚定语言
在系统提示词里给一两个示例,展示“中文思考 + 中文回答”的完整格式。模型对示例的模仿能力很强,看到示例是中文思考,它跟着用中文的概率会大幅提升。
示例可以这样写:
用户:3 加 5 等于几? 助手思考:这是一个简单的加法问题,我需要把 3 和 5 相加。 助手回答:3 加 5 等于 8。这种 few-shot 锚定的效果通常比单纯的语言指令更稳,因为它给了模型一个具体的模仿对象。
4.3 方法三:框架层做语言后处理
如果你控制不了模型行为,或者模型就是不听话,那就在框架层兜底。具体做法是:拦截思考内容,检测语言,如果是英文且你要求中文,就做一次翻译或重新生成。
这个方法的成本是要多一次模型调用或翻译调用。适合对思考语言有硬性要求的场景,比如要把思考过程展示给用户看的产品。
4.4 方法四:接受它,只约束输出
最省事的办法其实是:不管思考用什么语言,只保证最终输出是中文。对绝大多数应用来说,思考过程用户根本看不到,纠结它用什么语言没有实际收益。
我个人的建议是:除非你要展示思考过程,否则不要在思考语言上浪费精力。把约束放在输出语言上,性价比最高。
5. 常见问题与排查速查
5.1 思考语言相关的典型问题
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 思考全英文,回答中文 | 系统提示词含英文思考指令 | 检查系统提示词语言 |
| 思考中英混杂 | 未显式约束思考语言 | 加中文思考指令或 few-shot |
| 思考英文且回答也英文 | 系统提示词或用户输入是英文 | 检查输入语言和输出约束 |
| 思考语言随机切换 | 模型本身语言倾向不稳定 | 用 few-shot 锚定或框架兜底 |
| 思考过长导致 Token 超限 | 未设思考预算 | 设置思考 Token 上限 |
5.2 排查顺序建议
遇到思考语言问题,按这个顺序排查:先看系统提示词,再看用户输入语言,再看模型本身的默认行为,最后看框架有没有做语言处理。大部分问题在前两步就能定位。
5.3 几个容易踩的坑
第一个坑:以为改了用户输入语言就能改思考语言。实际上系统提示词的影响更大。
第二个坑:在系统提示词里混用中英文标签。比如中文指令里嵌<thinking>标签,容易让模型把标签内容也切成英文。要么全中文标签,要么接受英文思考。
第三个坑:把思考语言问题当成模型能力问题。大多数情况下模型中文推理没问题,只是“默认通道”是英文。约束一下就好,不用换模型。
6. 我自己的处理经验和几个实用建议
调这类问题调多了,我慢慢形成一个习惯:先问自己“思考过程要不要给用户看”。要展示,就花力气约束语言;不展示,就只约束输出,思考爱用什么语言用什么语言。
另一个体会是,系统提示词里的语言一致性比想象中重要。你写提示词的时候,尽量保持一种语言贯穿到底,别中英夹杂。中英夹杂的提示词,模型的行为也会中英夹杂。
还有一点,思考预算这个参数值得花时间调。设得太小,推理不充分;设得太大,浪费 Token。我一般从 512 开始试,根据任务复杂度往上加。复杂任务给到 1024 到 2048,简单任务 256 就够。
最后分享一个判断技巧:如果你发现模型思考用英文但回答质量很好,那基本不用管;如果思考用英文且回答也开始跑偏,那就要检查系统提示词和输出约束了。语言跑偏往往是更深层配置问题的表面症状。