大模型在各类场景中落地后,长文本处理成为不可回避的核心议题。从8K到192K乃至更长的上下文窗口,已不再是实验性探索,而是实实在在的生产刚需。像GPT-4、Baichuan2-192K等模型,均将长文本能力作为关键卖点进行推广。
那么,业界究竟如何让大模型“看得远、记得住”?当前主流技术路线有哪些?本文围绕这一问题,从数据、模型、评估三个维度进行系统性梳理,旨在帮助读者快速建立对长文本领域的全景认知。
若希望阅读更系统的综述,推荐《Advancing Transformer Architecture in Long-Context Large Language Models: A Comprehensive Survey》(arXiv:2311.12351),内容详实,值得参考。
数据层面:长文本能力的基石
无论算法如何精巧,高质量训练数据始终是第一步。以下代表性工作从不同角度展示了长文本数据的构建思路。
LongAlpaca-12k
该数据集源自LongAlpaca项目,规模为12k条问答对。其中9k条为长文本问答,覆盖名著、论文、深度报道、财务报表等场景;为保持模型对短文本的处理能力,还从原始Alpaca数据集中选取约3k条短问答,混合构成此数据集。下载地址:Hugging Face - Yukang/LongAlpaca-12k。
LongQLoRA
该数据集来自LongQLoRA项目,开源了两部分数据:54k条预训练数据与39k条SFT数据,体量更为充裕。下载地址:Hugging Face - YeungNLP/LongQLoRA-Dataset。
Ziya-Reader
该工作的核心贡献并非开源数据本身,而是提出了一套构建长文本问答训练数据的方法,尤其适用于多文档或单文档问答场景。其思路借鉴了Chain-of-Thought,具体分为三步:

- 让模型先复述问题:防止模型在超长上下文中遗忘问题,从而确保生成回复始终紧扣提问。
- 预测正确的上下文段落索引:强制模型关注相关上下文片段,避免在整段文本中“盲目猜测”。
- 预测最终答案:在前两步基础上生成最终输出。
此外,通过构造负样本(如缺失正确上下文的情况)进一步增强模型的泛化能力。这套方法论即使不直接套用,也极具参考价值。
LongAlign
该项目聚焦于长文本SFT数据构建。具体做法是:从9个不同来源收集长篇文章,利用Claude 2.1结合给定长篇背景,自动生成任务与答案。数据已开源在Hugging Face上:THUDM/LongAlign-10k。
模型层面:长文本外推的核心技术
模型层面的核心矛盾在于:训练时模型仅见过长度L以内的位置编码与KV缓存,推理时面对更长文本,这两者均成为瓶颈。当前解决方案主要沿两条路径展开:改进位置编码与设计动态局部注意力机制。
路线一:突破位置编码的限制
首先回顾位置编码的演进:绝对位置编码 → 相对位置编码 → 旋转位置编码(RoPE)。RoPE的核心是通过旋转向量编码位置信息——将d维向量分成d/2组,每组按各自周期旋转,越靠后的分组旋转速度越慢、频率越低。


问题在于训练长度限制。当推理长度超过训练长度L时,模型无法处理新的旋转弧度,从而无法插入新位置信息。针对此,研究者提出了若干改进方案:
Position Interpolation(位置插值):思路简单直接。既然超长后的旋转弧度模型不认识,那就不让它超长。将每个位置的旋转弧度缩小为原来的1/λ,这样位置m可扩大λ倍,但旋转范围始终不超出训练时见过的区间。
NTK-Aware Interpolation:同样采用缩放,但方式不同。Position Interpolation将缩放因子置于外部,对所有分组一视同仁;NTK则将缩放因子连带指数形式置于内部,导致高频分量(靠前分组)缩小幅度小,低频分量(靠后分组)缩小幅度大。其逻辑在于:高频分量在训练时已见过多个完整旋转周期,外推能力较强;低频分量因旋转极慢,几乎未见过完整周期,外推能力弱,因此需要重点“照顾”。
NTK-by-parts Interpolation:更为“硬核”。高频分量完全不插值(因其已足够强),低频分量则进行插值。与NTK-Aware相比,做法更直接。
Dynamic NTK Interpolation:NTK系列方法在超过训练长度时表现良好,但在训练长度内可能不如原始方案。于是引入动态插值思路:当推理长度l仍在L以内时,不做任何插值;一旦超出,才启动NTK-Aware Interpolation。缩放因子本身也是动态值,随生成过程不断累加而调整。
路线二:优化KV缓存与局部注意力
推理时,每个token需查询之前所有token的KV值,通常将这些KV缓存起来。但上下文越长,缓存越大,最终必然导致OOM。这里存在两个核心痛点:性能与效果如何兼得?
EFFICIENT STREAMING LANGUAGE MODELS WITH ATTENTION SINKS (arXiv:2309.17453)

该工作观察到一个有趣现象:大量注意力分数会分配给初始的几个token,即使它们与当前任务毫无关联。基于此,作者提出一个简单但有效的方案:在常规滑动窗口之外,额外加入开头的几个token。这种设计既保证了效率,又不会因丢弃历史信息而显著降低性能,最终实现了无限外推。该代码已开源,Star数很高,值得深入研读。
LONGLORA: EFFICIENT FINE-TUNING OF LONG-CONTEXT LARGE LANGUAGE MODELS (arXiv:2309.12307)

该工作主要有两个贡献:开源长文本训练数据,以及提出Shift Short Attention。核心思路是将序列分组,仅在组内做self-attention。但组间信息无法交互,效果会打折扣,因此引入滑动窗口——用半个窗口长度做滑窗,本质上是分组+滑窗的组合方案。同时支持LoRA训练,便于快速适配部署。
LONGQLORA: EFFICIENT AND EFFECTIVE METHOD TO EXTEND CONTEXT LENGTH OF LARGE LANGUAGE MODELS (arXiv:2311.04879)
与LONGLORA大同小异,主要区别在于使用QLoRA进行训练,进一步降低资源门槛。同时开源了长文本数据集。
Soaring from 4K to 400K: Extending LLM’s Context with Activation Beacon (arXiv:2401.03462)

该工作的思路同样直接:既然历史信息过多,那就压缩。具体做法是将每个区间信息压缩成一个“激活信标”(Activation Beacon),后续用这些信标代表整个区间内容。设计信标时探索了三种方法:分段(每个信标只用自身区间信息)、逐步分段(每个信标可关注比前身多一个子区间)、完全覆盖(所有信标关注整个人文本)。实验结果显示,逐步分段效果最佳。有了信标后,可与滑动窗口结合使用,每个窗口由过去上下文区间的m个信标加上最新token组成。
评估层面:用什么衡量长文本能力
在迭代长文本能力的过程中,必须有可信的量化指标。目前业界已涌现一批专门的评测基准:
ZeroSCROLLS (arXiv:2305.14196):包含10个自然语言任务,涵盖摘要、问答、聚合(如给50条评论,让模型预测正面评论比例)等场景。
longeval (来自LongChat团队):通过设计主题和行数相关的长文本记忆任务,评估模型的记忆与检索能力。
L-Eval (arXiv:2307.11088):从公开数据集中收集数据,经人工过滤、校正和重新标注,质量较高。
LongBench (arXiv:2308.14508):涵盖单文档问答、多文档问答、摘要、Few-shot、合成任务、代码补全等,覆盖面广。
LooGLE (arXiv:2311.04939):从科学论文、维基百科、电影电视中收集样本,同样设计摘要等任务。
FinLongEval (GitHub: valuesimplex/FinLongEval):聚焦金融领域,金融场景的长文本评测需求具有特殊性。
总结
从当前技术栈来看,提升大模型长文本能力有两条主线:
第一条线:数据驱动。高质量长文本训练数据是根本。长文本预训练数据相对易得,但SFT数据构建难度更大,绝非简单拼接几个短文本至8K就能奏效。这种“伪长文本”对模型学习全局信息的帮助极为有限。如何真正构建高质量的长文本SFT数据,尤其是中文领域的数据,仍是值得深入探索的方向。一个可参考的思路是:从长文本评测任务中汲取灵感,反向设计训练数据。
第二条线:模型架构。核心是解决两个问题:位置编码的外推能力,以及KV缓存的动态压缩。前者主流的思路是缩放——通过调整旋转范围,使其与训练时一致,但能容纳更多或更长的位置;后者主流的思路是动态压缩历史信息,本质上均为滑动窗口的变体,只是在滑动逻辑上做了各种精细化改进。需注意,这两个技术点解决的是不同问题,合理结合它们才是工程落地的关键。
总体来看,一个可行的做法是:先尽可能收集和准备高质量长文本训练数据,在当前资源约束下训练到最大长度,然后在推理阶段借助各种外推手段进一步扩展。每一步都有不少技术细节值得深挖,希望本文的梳理能帮助大家少走一些弯路。
