Reading Guide
先问一个问题
模型每次到底「看得见」什么,以及为什么它对长材料的处理会不如预期?
- 适合读者
- 非技术背景、需要用 AI 处理长篇资料的读者
- 阅读基础
- what-language-models-do
Key Points
先记住这些
- 模型不按汉字或单词计量文本,而按 Token 计量;中文一般比同等信息量的英文占用更多 Token。
- 上下文窗口是单次交互中输入与输出可占用的 Token 总额,超出部分会被截断或需要另行处理。
- 在长上下文中,材料所处的位置会影响模型的使用效果,开头与结尾的信息通常比中间的更容易被用上。
- 多轮对话中的「记住」是把先前内容重新送进上下文,不是模型内部保存了状态;关掉会话即消失。
- 上下文越长越好是错觉:无关材料会稀释注意力、诱发张冠李戴,这就是上下文污染。
- 长篇资料的正确做法是分段处理加显式交接,而不是一次性全部贴入。
Terms
几个必要概念
- Token
模型处理文本的最小单位,通常是一个词、词的一部分或一个汉字。
所有的长度限制、计费与截断都以 Token 为准,估算材料能否放得下必须换算成 Token。- 上下文窗口
单次请求中系统指令、历史对话、输入材料与生成结果所能占用的 Token 上限。
它决定一次能给模型多少材料;输出也要占额度,因此并非全部窗口都能用于输入。- 上下文污染
上下文中混入了与当前任务无关、过时或彼此冲突的材料,导致输出出错。
在版本比较、多文档汇编这类工作中,这是最常见也最难察觉的错误来源。- 持久记忆
在会话之间保存并自动调用的信息。模型本身不具备,须由外部系统实现。
凡是需要跨天、跨项目沿用的约定,必须由你自己存成文件,不能依赖模型记得。
文本是按 Token 计量的
模型不直接读字符。输入的文字先被切成一串片段,这些片段叫 Token。常见的切分方法是把高频词整体保留、把低频词拆成更小的构件,这样既能覆盖生僻词,词表又不会无限膨胀。这类方法在神经机器翻译时期已经成型,今天仍是主流。S1
对中文使用者而言有两个实际后果。其一,同样一段内容,中文往往比英文占用更多 Token,因此在长度受限时中文材料更早触顶。其二,异体字、罕用字、生僻的古文用字会被切得更碎,处理长篇古籍时的 Token 消耗常常高于直觉估计。真要精确估算,应当用厂商提供的分词工具实测,而不是按字数折算。S1S2
窗口有多大,以及它为什么不等于「能用多少」
上下文窗口指一次交互中所有内容加起来的 Token 上限,包括系统指令、此前的对话、你贴进去的材料,以及模型即将生成的输出。窗口大小随模型不同而不同,且更新频繁,任何具体数字都应以当日的官方文档为准。S2
- 输出也占额度:若打算让模型产出一份三千字的整理稿,就必须为输出预留相应空间。
- 多轮对话是累加的:每一轮都会把此前内容再送一遍,长对话会在不知不觉中吃满窗口。
- 触顶后的行为因产品而异:有的直接报错,有的静默丢弃最早的内容,后者尤其危险,因为你最初交代的规则可能已经不在上下文里了。
放在哪里,会影响用不用得上
把材料放进窗口,不等于模型会平均地使用它。有研究测试了模型在长上下文中定位关键信息的表现,发现同一条信息放在开头或结尾时被正确利用的比例,明显高于放在中间的情形,而且上下文越长,这一落差越明显。这一现象常被称为「迷失在中间」。S3
由此可以得到几条不依赖具体产品的操作原则:关键的任务定义与验收标准放在最前面,需要模型逐条落实的清单放在最后重述一次,真正重要的原文尽量不要埋在一大堆背景材料的中段。这不是玄学,而是对已知规律的顺应。S3
所谓「记住」是怎么回事
模型在一次生成结束之后并不保留任何状态。你在第五轮里说「按刚才那个体例」,之所以有效,是因为前四轮的文字被重新送进了这一次的上下文。一旦这些内容被截断、被摘要压缩,或者你换了一个会话,约定就不复存在。有些产品提供跨会话的记忆功能,那是外部系统在替你保存并重新注入文本,属于产品能力,不是模型能力。S2
对本站这类长期项目,稳妥的做法是把所有需要沿用的东西外部化:体例约定写成一份文件,术语对照存成一张表,每次开工时显式贴入相关部分。这样做的好处不止于防止遗忘,还在于这些文件本身成了可以被审阅、被修订、被版本管理的对象。
把长材料拆开的几种做法
既然一次投喂不可靠,长材料就必须拆。拆法有三种,各适用于不同的文体。第一种是按结构拆,依卷、章、篇、条目的自然界限切开,每一段自成单位。这种拆法最省事,也最不容易破坏文意,适合体例整齐的著作、书目与年表。第二种是按任务拆,同一批材料过若干遍,每遍只做一件事:第一遍只抽取人名,第二遍只抽取年份,第三遍只标出存疑处。这种拆法的好处是每一遍的任务定义都极为单纯,出错时容易定位;代价是要多跑几遍。第三种是按疑难拆,先用程序或粗筛把明显无问题的部分挑出去,把剩下的疑难集中处理。这一种最省人力,但要求你事先能说清楚什么叫「明显无问题」。
无论哪一种拆法,接缝处都要有显式交接。所谓交接,是指每一段的处理不依赖你的记忆,而依赖一份写下来的东西。可行的做法是每处理完一段,就让模型输出一份极简的交接单,内容包括本段处理到哪里、沿用了哪些约定、留下了哪些待决问题、下一段需要注意什么。下一轮开工时,把交接单连同新的一段一并贴入,而不是指望上一轮的对话还在。交接单本身也是成果的一部分,它记录了这批材料是被怎样处理的。
- 每段的开头与结尾都加清晰的分隔标记与来源名称,不要依赖空行。
- 任务定义与验收标准每一轮都完整重贴一次,不要写「同上」。
- 术语对照表、体例约定这类跨段沿用的东西,单独成文件,每轮贴入相关部分。
- 每段的输出单独存档,不要在同一个文件里不断追加覆盖。
- 接缝处的条目额外抽查,因为跨段的信息最容易在切分时丢失。
- 若某段的处理结果明显异常,先检查是不是这一段超出了窗口而被静默截断。
还有一个常被忽略的细节:摘要不能代替原文。为了省空间而先让模型把前文压成一段摘要,再据以处理后文,等于把一次可能的失真固化下来,后面所有判断都建立在这份摘要之上。若确实需要压缩,应当压缩成结构化的要点清单而非散文式摘要,因为清单的每一条都还能回到原文核对,散文则不能。S3
Conclusion
结语
上下文是一块每次都要重新铺好的工作台,不是一个会自己积累东西的抽屉。谁来铺、铺什么、按什么次序铺,决定了这次工作的上限。
仍可追问
- 各家模型的具体窗口上限与超限后的处理方式变化频繁,任何写进正文的数字都需在发布前核对。
- 「迷失在中间」现象在最新一代长上下文模型上的严重程度是否已显著减轻,需要新的实测证据,本文未作断言。
- 中文与古文用字的 Token 消耗缺少公开的系统性统计,本文只作定性描述。
参考资料
- S1
Rico Sennrich, Barry Haddow, Alexandra Birch.Neural Machine Translation of Rare Words with Subword Units.2016
DOI / ISBN:10.18653/v1/P16-1162查看来源 - S2
OpenAI.OpenAI Platform Documentation: Models.2026
查看来源 - S3
Nelson F. Liu, Kevin Lin, John Hewitt, Ashwin Paranjape, Michele Bevilacqua, Fabio Petroni, Percy Liang.Lost in the Middle: How Language Models Use Long Contexts.2024
DOI / ISBN:arXiv:2307.03172查看来源