公司动态
大模型推理时为何会“遗忘”?输入格式与注意力机制的影响
最近一周在刷 arXiv 的 AI 前沿快报时我注意到两个放在一起看非常有意思的现象一个是 AI 在推理过程中会“忘掉世界”另一个是某些推理任务中把输入改成大写模型准确率居然能上升。第一次看到这两个结论我的第一反应是“这又是模型的神秘玄学”但冷静下来之后我发现这两件事指向的是同一个核心问题大模型对输入格式和上下文顺序的敏感程度比我们通常以为的要具体得多。对普通用户来说这只是“模型有点怪”但对做工程落地的人而言这直接影响推理准确率、任务稳定性和最终交付质量。这篇文章不打算只转述论文结论而是想从工程视角聊清楚这两个现象背后到底发生了什么以及我们能不能把这些“怪异发现”转化成可复用的项目经验。1. 别把“AI 忘掉世界”理解成失忆它是推理过程中的上下文漂移1.1 模型不是不知道而是不会在推理时稳定地“调用”已知约束很多人看到“AI 推理时会忘掉世界”这句话第一反应是模型知识库过期了或者模型本身不够聪明。但在实际调试中我发现问题往往不是模型不知道某个知识而是它在执行长任务时没能稳定地参照之前已经给出的背景信息。我举一个经常遇到的场景给模型一段产品需求文档里面明确写了“用户角色仅限企业内部员工”然后让它继续设计登录流程。模型很可能在某个步骤里突然默认“用户可以通过手机号注册并对外公开”和最初的约束完全矛盾。如果单看模型对这个步骤的回答你会觉得它“忘了”需求背景但如果把同样的约束放进问题最近的上下文中它又马上能回答正确。这就是“推理时遗忘”更准确的解释模型在长上下文中推理当任务复杂度上来之后早期信息会被后续内容干扰注意力不再稳定地分配给关键约束。它不是数据库被清空了更像一个很长的工作记忆被后续信息挤压早期内容从“高亮状态”逐渐变成了“背景噪声”。从机制上看Transformer 的注意力虽然能覆盖整个上下文但“能覆盖”不等于“会聚焦”。当推理步骤变多、中间穿插大量新信息时那些离当前生成位置较远的约束如果表达方式不够突出就可能被模型忽略了。这也是为什么很多长期有效的经验里都会反复提醒“把关键约束放在用户消息的最后面”本质上就是在对抗这种漂移。1.2 推理链越长早期信息越容易变成背景噪声这类现象在复杂推理任务中会尤其明显。比如让模型执行一个多步任务先读一份数据表再完成清洗、统计、画图建议最后输出结论。到后面几步时模型不是没有能力处理数据而是可能忘记了数据表的字段含义、时间范围、单位等基础设定。它会在“局部上下文”里自洽地推理但和全局背景发生了偏移。工程上可以把这种风险理解为一个公式任务复杂度越高上下文需要调用的知识点越多推理链越长早期关键约束被稀释的概率就越大。所以要防御的并不是“模型没记住”而是“如何让关键信息在长任务中始终处于高注意力区域”。一个比较有用的思路是阶段性地重置注意力锚点。比如在提示词里明确要求“每一步生成前先回顾原始约束”或者把核心约束拆分到每一个子任务前面而不是只放在系统提示词里。还有一种做法是让模型在输出中先复述约束再开始推理相当于给它一个“回忆动作”强制激活早期的信息。这些方法并不是每篇论文都验证过但在生产实践里它们是低成本、高收益的防御策略。它改变的不是模型的底层能力而是我们使用模型的方式。2. 大写提升准确率与其说是玄学不如说是 Token 分配带来的注意力偏移2.1 大小写会改变 Token 的切分方式进而改变模型的注意力分布第二个现象在刚看到时更让人摸不着头脑。某些英文推理任务中把提示词里的关键内容全部改成大写准确率居然会上升。乍一听很像是巧合但这件事其实可以从 tokenizer 的角度给出比较合理的解释。大模型处理文本的第一步是把文本切分成 token而不是按单词直接理解。同一个英文单词在不同大小写形式下可能会被切分成不同的 token。模型对 token 序列的注意力分配是跟着 token 的表示来走的。当你把“product requirement”改成“PRODUCT REQUIREMENT”它们的 token 序列很可能变长了或者被切分得更细这会让模型在注意力计算时不得不对这些 token 投入更长的处理路径。某种程度上这种“视觉上的强调”在模型内部被转化成了“计算上的强调”。另一个可能的因素是大写会消除某些词的歧义。比如有些词汇在句子中会作为普通词出现但全大写后更像一个专有名词或关键指令模型会从“语义内容”模式切换成“执行指令”模式。这在英文模型里尤其常见因为英文语料的 tokenizer 本身对大小写敏感。我更愿意把它理解成一种“格式显著性”当关键内容和其他内容的视觉差异变大时模型在注意力分配上会更倾向于这些区域。这和我们人类阅读时看到全大写或加粗文字会下意识认为“这是重点”是类似的道理。2.2 全大写不能无脑套用中文场景和英文场景的处理逻辑完全不同不过这里有一个很重要的边界这项现象大概率是英文场景、英文模型上的规律不能直接照搬到中文场景。中文 tokenizer 通常没有大小写差异这个维度你把“用户需求”改成“用户需求”也看不出变化。除非你用的是夹杂英文术语的中文 prompt比如“请根据 REQUIREMENT 来设计”否则大小写策略在中文里基本失效。另外就算是在英文场景也绝不是说“把所有内容变成大写”就能提升准确率。全大写会导致文本失去重点所有内容都一样突出等于没有突出还可能让模型在长文本阅读时产生异常切分反而损失上下文语义。从实践角度我建议这样做只对真正的关键指令或术语使用大写而不是整段大写。在“混合语言 prompt”中把英文术语保持统一大小写比如“API”“README”这类词不要一会儿全大写一会儿首字母大写。把大小写作为一种变量纳入 prompt 实验的测试范围不要默认有效也不要默认无效。对于纯中文任务把精力放在换行、分隔符、编号和格式一致性上这比大小写的影响更直接。所以在这条研究发现里最有价值的不是“以后全用大写”而是“模型的推理结果会受到输入格式层面细节的影响而这些细节过去往往被我们忽略”。3. 一个更值得记住的结论输入格式也是模型推理链路的一部分3.1 把 prompt 工程升级成“输入工程”从变量角度看待格式这两个 arXiv 现象放在一起看会得到一个更通用的启示我们在设计 AI 应用时不能只关注“提示词写了什么”还要关注“输入成什么形式模型接收到的信号才最稳定”。很多团队做 prompt 工程时核心精力都花在措辞上——怎么把指令写得更清楚、怎么给例子、怎么规定输出格式。这当然没错但容易忽略一个维度同一条语义内容用不同的排版、大小写、字段顺序、分隔符、换行方式输入进去模型的表现可能会产生肉眼可见的波动。我认识不少做 AI 应用的朋友都遇到过同一个问题明明已经用得很好的 prompt换一个项目复制过去效果就变了。很多时候不是模型变笨了而是输入内容的结构变了比如字段顺序换了、系统提示和用户消息的合并方式变了、某个关键词从粗体变成了普通文本。模型还是同一个模型但输入分布变了输出概率自然就变了。所以我更喜欢用一个更工程化的词输入工程。它比 prompt 工程更宽一些把输入格式、字段顺序、上下文位置、模板一致性都纳入考虑范围。当你把输入格式当成一个会影响结果的关键变量时很多“模型忽好忽坏”的困惑就变得可解释了。3.2 先做单变量验证再固化模板不要直接用论文结论既然输入格式是变量那就要用对待变量的方式去处理它——做实验、记录、对比、再下结论。很多人看到“大写能提升准确率”这种发现后最容易犯的错误是把自己的 prompt 立刻全部改成大写然后发现效果不如预期就认为论文是错的。问题在于他没有做单变量验证。每篇论文里的实验都会限定模型、任务、语言、上下文长度、采样参数。你的项目环境几乎不可能完全一致。所以正确做法是把论文发现当成线索而不是结论。在自己的任务集上抽出一部分样例做一个“原 prompt 对照”和“新格式 prompt 对照”的实验控制其他变量不变多跑几次看平均效果再决定要不要投入使用。这里有一个简单的实验设计流程适合大多数场景选一个有代表性的测试集不要只有几条样例至少几十条或上百条。固定模型版本、temperature、top_p固定随机种子如果可以设置的话。构造两个版本基线 prompt 和变更后的 prompt唯一差异是你要验证的格式变量。分别运行多次采样比较准确率、通过率或人类评价。再换一个不同难度的任务验证一下避免结果只在单一任务上成立。这个流程不复杂但它能把“网上说有效”变成“我的项目里确实有效”。花半小时做一次小规模验证往往比盲从论文结论更节省后续调试时间。4. 工程上如何防御“推理时遗忘”锚定、拆解、检查点4.1 三步防御法锚定世界知识拆解推理步骤设置中间检查点针对“AI 推理时会忘掉世界”这一现象工程上可以有一套固定的防御思路。我给它总结成三步锚定、拆解、检查点。第一步锚定。把最关键的世界知识或业务约束放在离推理任务尽可能近的位置。不要只写在系统提示词中也不要在用户消息里一笔带过。更好的做法是在用户消息的最后单独分段重复核心约束或者明确写出“请始终基于上面的假设进行推理如果出现和假设矛盾的情况请停止并提示”。这种锚定不是简单的重复而是让模型在每次生成前都有一个“高亮记忆点”可参照。第二步拆解。把长推理任务拆成多个子任务每个子任务保持较小的上下文跨度。比如你要模型完成“数据清洗到报告生成”的完整流程不要让它一口气输出而是分步完成先清洗输出清洗结果再统计基于清洗结果输出统计指标最后生成报告基于统计指标生成结论。每一步的输入都保留上一步的输出而不是把全部历史混在一个很长的上下文里。这样做会让“世界知识”被不断重置为最新状态减少早期信息被稀释的风险。第三步检查点。在关键节点设置校验要求。比如在生成最终结论前要求模型先输出“我回顾一下原始约束……”或者在生成过程中要求模型输出结构化中间结果由程序检查是否满足条件不满足就回退重试。检查点不一定都要让模型自己做也可以由外部代码判断关键字段是否存在、是否合法。这三步听起来都不复杂但组合起来能显著降低长任务中的发散风险。它们本质上是把大模型的“单次长跑”拆成“多次短跑”每一次的起点都是明确、聚焦的输入这比让模型一次性处理更多内容要稳定得多。4.2 排查链路从现象倒推输入、格式、提示词和模型边界如果你在实际项目中已经遇到了类似问题比如模型答案和背景矛盾、后续步骤忘掉前文设定、输出逐渐偏离主题我建议按照下面这条链路排查而不是一上来就换模型或调 temperature。先看现象。是偶尔偏离还是稳定偏离是输出在前几步就错了还是到后面才漂移这个判断会影响排查方向。再看输入。背景知识、字段定义、业务约束是否都出现在了用户消息中是否被截断、被其他冗长内容淹没如果关键信息埋在第 2000 行中间模型忽略它是大概率事件。再看格式。关键信息是否在明显的位置有没有用分隔符、编号、标题等方式做视觉区分大小写、标点、换行是否一致格式混乱可能是隐性干扰源。再看提示词结构。指令是否清晰有没有让模型知道“这些背景知识是最高优先级”输出格式是否明确期望的步骤是否写清楚了再看模型边界。上下文长度是否已经接近窗口上限任务复杂度是否超过了模型当前版本的推理能力如果输入本身包含大量无关信息再强的模型也可能被噪声干扰。最后再考虑重试策略或模型升级。以上几层都确认没问题后再尝试加验证、重试和更强大的模型。这条链路的价值在于它把“模型忘事”从一个神秘问题变成了一个可定位的输入问题。你会发现大多数情况下问题的根因并不在模型智商而在输入信号的组织方式。5. 把 arXiv 发现用进生产环境前先避开四个误区5.1 误区一把论文现象当成“生产规则”忽略基线arXiv 上的前沿快报很多都是实验室里的发现使用的模型、数据集、任务类型和你的生产环境不一定匹配。直接把“大写能提准确率”“推理时会忘掉世界”当成固定规则会让项目陷入不必要的调整。更稳妥的做法是在所有输入工程调整前先建立自己的基线。把当前 prompt 在当前测试集上的表现记录下来包括准确率、失败样例、响应耗时、不稳定点。有了基线后续任何发现都可以通过 A/B 测试快速验证不会人云亦云。5.2 误区二只改格式不做统计验证被单次结果带偏大模型生成本身有随机性单次效果好不代表整体效果提升。比如你把某条 prompt 改成大写后恰好一条样例通过了就说“大写有效”这是不严谨的。正确的做法是在固定其他条件不变的情况下每个版本都运行多次然后看整体分布。如果新版在高分和低分上都有明显变化而且能复现那才是值得保留的调整。否则它更可能只是噪声带来的波动。5.3 误区三只关注准确率不关注召回、成本和稳定性“准确率上升”只是一个维度。在真实项目里你还需要关注这种改动会不会带来新的问题。比如全大写可能让输出格式变得奇怪可能让某些专用名词被错误切分可能增加 token 消耗进而提高成本。如果准确率提升了 1%但成本增加了 20%那这个改动的价值就需要重新衡量。在评估时我建议同时记录准确率、召回率、格式合格率、平均 token 消耗、失败重试率。用一组指标综合判断而不是只盯着一个数字。5.4 误区四忘记模型版本差异把旧模型的规律迁移到新模型不同模型甚至同一模型的不同版本tokenizer、指令遵循能力和推理能力都会有差异。在一个模型上有效的格式技巧迁移到另一个模型上可能完全无效。所以如果你更换了底层模型之前总结的 prompt 模板和输入格式经验最好重新验证一遍。不要相信“同样的 prompt换个模型还能一样”这种假设。模型升级后原本需要大写强调的地方可能已经不需要了原本稳定的分步推理可能因为新模型能力增强而可以合并成一步。6. 我的建议把 arXiv 快报当成“认知实验”而不是行动清单6.1 一个可复用的验证流程选任务、设基线、做 A/B、看长尾结合前面的讨论我建议你在工作中建立一个处理这类前沿发现的固定流程不要每次都被新结论牵着走。具体可以分成四步第一步选任务。从当前最关注的任务里选一个有代表性的子集至少覆盖正常、边界和失败三类样例。第二步设基线。在改动之前先把现有配置的效果稳定下来记录所有指标。第三步做 A/B。针对 arXiv 上看到的发现构造一个最小改动版本只改变一个变量其他全部不变然后对比基线和实验组。第四步看长尾。不要只看平均成绩还要看哪些样例从正确变错了哪些从错误变对了。如果新格式让原本不该错的样例变错那这个改动可能引入新的风险。这个流程本身不复杂但能避免大部分“论文结论很好用一进项目就翻车”的情况。6.2 长期视角模型的怪异行为是系统的特性不是可以消灭的 bug最后说一点更底层的感受。模型对大小写敏感、推理时遗忘早期约束看起来都是“缺陷”但它们更像是当前架构下的系统特性。只要模型还是通过 token、注意力、概率分布来生成内容这些现象就会在不同场景下反复出现。所以与其追求一个“完全不受输入格式影响”的理想模型不如在业务流程里把这些行为纳入设计。这就是系统工程的意义你知道模型的脾气在哪里知道它在什么条件下会跑偏然后通过输入设计、流程拆解、结果校验把模型的可用性稳定在可接受范围内。下次再看到 arXiv 上有类似“小改动带来大提升”的发现时先别急着收藏也不急着否定。准备一个基线把现象当作一个变量放进自己的任务里验证一遍。这个过程本身往往比结论更能帮你理解模型。