一句话定义:上下文扩展(Context Extension)指不从头训练,靠改造位置编码(Position AI 词典:Embedding">Embedding)加少量适配,让只见过短序列的模型能吃下长得多的输入。YaRN(Yet another RoPE extensioN)是其中被广泛采用的一种方案。
位置编码是一把尺子
模型靠位置编码知道谁在前、谁在后。主流做法是旋转位置编码(RoPE,Rotary Position Embedding):把 token 向量按维度分成多组,每组按不同频率旋转一个角度,位置越靠后转得越多。低频维度转得慢,管“大致很靠后”;高频维度转得快,管“紧挨着的两个词”。
注意力打分只看两个 token 旋转后的相对角度差。训练时模型只在 0~8K 的刻度范围内见过这些角度。推理时突然喂 10 万 token,就冒出一大批没见过的角度组合,注意力打分失真,输出开始崩。这就是位置外推(extrapolation)失败。
改的是什么
最常见解法是插值(Interpolation):尺子不够长,就把刻度挤一挤——把 128K 的位置索引等比压回 8K 区间,让模型继续待在熟悉的刻度里干活。代价是相邻 token 的角度差也被压小,近距离区分度下降,一般要配一点微调。
更精细的做法是分频段处理:高频维度基本不动,保住局部精度;低频维度多压一些。YaRN 在此之上再加一个温度系数,补偿长上下文下注意力分布变平、变糊的问题,所需微调数据很少甚至免微调。
和相邻概念的区别
| 概念 | 做什么 | 代价 |
|---|---|---|
| 位置外推 | 什么都不改,直接喂长文本 | 通常直接崩 |
| 位置插值 | 等比压缩位置刻度 | 短距离分辨率下降 |
| YaRN | 分频段压缩 + 注意力温度补偿 | 更长时仍会衰减 |
| 长文本继续预训练 | 真拿长文档接着训 | 最彻底,也最贵 |
| RAG | 检索内容塞进上下文 | 不改变模型能吃多长 |
对从业者的意义
“标称 128K”和“128K 里都找得准”是两件事:扩出来的长上下文往往开头结尾清楚、中间容易丢,关键信息别放中段。另外 KV Cache 显存随长度线性增长,上下文翻倍不是免费的。
上下文扩展是把现有模型拉长,成本远低于从头训;真要重度依赖长文档理解,长文本继续预训练更扎实。具体支持长度和用法,以模型官方页面为准。
