03-上下文系统 · 经典论文导读合集
面向零基础新手的详细中文导读,共 10 篇。
撰写日期:2026-05-27
总览:什么是上下文窗口,为什么扩展它这么难?
在开始读论文之前,我们先用几段话把背景讲清楚。
什么是上下文窗口?
大模型在回答问题或生成文字时,并不是"记住了所有事",而是每次都看着一段文字(这段文字叫做"上下文")来决定下一步怎么写。这段文字的最大长度,就是"上下文窗口"。早期 GPT-2 只能看约 1,000 个字(token),GPT-3 能看 4,096 个,而现在的模型已经能看 128,000 甚至更多。上下文窗口越长,模型就能"一口气"处理更长的文章、更复杂的任务。
为什么扩展很难?核心障碍一:O(n²) 注意力复杂度
Transformer 里有一个叫"自注意力"(self-attention)的核心机制:每个词都要和上下文里所有其他词互相打分,判断"哪些词对我最重要"。如果上下文有 n 个词,那就需要算 n × n 次打分——复杂度是 O(n²)。序列长度翻倍,计算量就变成 4 倍;翻 10 倍,计算量变成 100 倍。这就像一个班级开会,10 人互相交流需要 100 次对话,1,000 人互相交流则需要 100 万次——随着人数增加,代价呈爆炸式增长。
核心障碍二:位置编码外推问题
Transformer 用"位置编码"告诉模型每个词在哪个位置。训练时只见过长度 ≤ 4,096 的文本,测试时突然来了 20,000 词的文本,模型就像一个从没学过三位数加法的孩子突然被要求算四位数——位置编码完全失效,性能大幅下滑。这叫"外推失败"。
核心障碍三:KV 缓存和显存
推理时模型要把每个词的"键(Key)"和"值(Value)"存起来,随上下文增长线性占用显存。百万 token 的上下文,KV 缓存能吃掉几十 GB 显存。
本合集 10 篇论文的关系与分类
这 10 篇论文从四个不同角度出发,解决"如何让模型处理更长上下文"这一核心问题:
① 改注意力结构(让计算变稀疏)
- Longformer(2020):滑动窗口 + 全局注意力,把 O(n²) 降到 O(n)
- Big Bird(2020):随机 + 局部 + 全局注意力,理论证明稀疏也够用
- Ring Attention(2023):把长序列切分到多台机器,环形传递 KV,突破单机显存限制
- Infini-attention(2024):注意力 + 压缩记忆模块,实现真正的"无限"上下文
② 改位置编码(让模型认识更远的位置)
- ALiBi(2021):抛弃传统位置编码,改用注意力分数上的线性惩罚,自然外推
- YaRN(2023):在 RoPE 基础上改造插值策略,低成本将已有模型扩展到更长窗口
③ 管理 KV 缓存 / 外部记忆(不存所有,选择存)
- LongLoRA(2023):用"移位稀疏注意力"配合 LoRA 高效微调,让普通 GPU 也能训练长上下文模型
- StreamingLLM(2023):发现"注意力汇"现象,只保留开头几个 token + 滑动窗口,实现无限流式推理
- MemGPT(2023):把 LLM 包装成操作系统,用分层记忆 + 函数调用来突破上下文限制
④ 揭示问题现象(长上下文用得好吗?)
- Lost in the Middle(2023):揭示模型在超长上下文中只擅长用开头和结尾的信息,中间部分被遗忘
它们的时间线与递进关系:
Longformer / Big Bird 是"改结构"的早期探索(2020年);ALiBi 引入更优雅的位置编码思路(2021年);2023 年是大爆发之年——Lost in the Middle 揭示问题,YaRN / LongLoRA / StreamingLLM / Ring Attention / MemGPT 各自从不同维度给出解法;Infini-attention(2024)则走向更激进的"无限上下文"目标。
第 1 篇:Longformer — 长文档处理的开山之作
arXiv: 2004.05150 | Beltagy et al., Allen AI, 2020
一句话概括
把全注意力中的"所有词两两相互关注"改成"每个词只关注附近邻居 + 少数全局关键词",把计算复杂度从 O(n²) 降到 O(n),从而让 Transformer 能高效处理数万字的长文档。
背景与动机
2020 年,BERT 和 GPT-2 已经证明了 Transformer 的强大,但它们都被限制在 512 个 token 左右(约 400 个中文字)。想处理一篇完整的学术论文、一份法律合同、一本书的某个章节?不行——不仅显存装不下,计算时间也无法接受。
类比理解 O(n²) 问题: 想象一个 100 人的学术会议,每个人都要和其他 99 人逐一握手交流,共需 4,950 次握手。如果会议规模扩大到 1,000 人,握手次数变成近 50 万次。标准 Transformer 就是这样——每个词都要和所有其他词"握手"。Longformer 的做法是:大多数人只和坐在自己旁边的人交流,只有"主持人"(全局 token)才和所有人打招呼。
论文结构与格式
论文共 10 页(含附录),结构清晰:引言说明长文档的挑战 → 提出三种注意力模式 → 描述预训练策略 → 在多个任务上实验 → 分析效率。图表约 5 个,以效率对比曲线和任务性能表格为主。写作风格偏工程实践,代码和实现细节充分。
核心方法/架构详解
Longformer 提出了三种注意力模式的组合:
1. 滑动窗口注意力(Sliding Window Attention)
每个词只能看到它前后各 w/2 个词(w 是窗口大小,例如 512)。就像你阅读一篇文章时,每次只盯着当前句子的前后几句——局部语境通常已经足够理解当前词的含义。计算复杂度从 O(n²) 降为 O(n × w),当 w 远小于 n 时大幅提速。
2. 膨胀滑动窗口(Dilated Sliding Window)
在更高层的 Transformer 层,窗口不再是连续的,而是"隔几个词取一个"(类似空洞卷积)。这样同样的计算量能覆盖更远的距离——就像你用望远镜看远处,分辨率低一些但看得更远。
3. 全局注意力(Global Attention)
对少数几个特殊 token(如 BERT 的 [CLS] 分类符、问答任务中的问题 token),允许它们与所有词互相关注。这些 token 扮演"全局聚合器"的角色,把各个局部窗口的信息汇总起来。全局 token 的数量远小于 n,所以额外开销可接受。
预训练策略: 作者没有从头预训练,而是在 RoBERTa 的权重基础上,用"位置编码复制扩展"的技巧(把 512 的位置编码向量复制多遍以覆盖更长位置)继续在长文档上训练,大幅节省算力。
主要创新点
- 将滑动窗口、膨胀窗口、全局注意力三种模式整合进统一架构,复杂度降为 O(n)
- 提出任务自适应的全局注意力分配策略(针对分类、问答等不同任务设置不同的全局 token)
- 通过继续预训练而非从头训练,降低了实用门槛
- 实现了最长 4,096 token(部分实验到 16,384 token)的高效处理
实验设置
- 任务: 文本分类(IMDb 情感分析)、共指消解(OntoNotes)、问答(TriviaQA、WikiHop、HotpotQA)、摘要(Arxiv/PubMed)
- 基线: RoBERTa(截断到 512)、Sparse Transformer
- 指标: F1、Accuracy、ROUGE
- 最长上下文: 4,096 token(部分设置到 16,384)
- 算力: 在 8 块 V100 上预训练约 65,000 步
实验表明 Longformer 在多个长文档任务上显著超越截断基线,且推理速度与序列长度几乎呈线性关系。
写作风格特点
实用主义风格,重视工程细节。作者专门讨论了 CUDA 实现的注意力 kernel,以及如何在 PyTorch 中高效实现滑动窗口——这在学术论文中比较少见。适合边读论文边跑代码。
图表亮点
- 图1:三种注意力模式的示意图(每种模式哪些位置之间有连线),直观展示稀疏结构
- 图2:序列长度 vs 推理时间/显存的对比曲线,清楚显示 O(n²) vs O(n) 的差距
新手阅读建议
建议先读第 1-3 节(引言、相关工作、模型),理解三种注意力模式。第 4 节实验可以挑感兴趣的任务看。难点在于理解"全局注意力为什么必要"——可以思考:如果只有局部窗口,不同窗口间的信息怎么传递?全局 token 就是答案。代码已开源于 HuggingFace Transformers,可直接上手实验。
第 2 篇:Big Bird — 稀疏注意力的理论基础
arXiv: 2007.14062 | Zaheer et al., Google Research, 2020
一句话概括
用"随机注意力 + 局部注意力 + 全局注意力"三者组合构造稀疏注意力,并从理论上证明这种组合能模拟完整的全注意力,将复杂度降到 O(n),同时在长序列任务上取得强劲效果。
背景与动机
Longformer 解决了工程效率问题,但留下了一个理论问题:稀疏注意力真的和全注意力一样强吗?少了很多连接,会不会丢失某些重要的远程依赖信息?Big Bird 的贡献正在于此——它不只做工程优化,还给出了理论保证。
类比理解: 想象一个城市的通信网络。全注意力是"每个人直接给所有人打电话"——代价极高但信息完整。Big Bird 的方案是:每个人只和邻居联系(局部),偶尔随机拨出去一个电话(随机),再加上几个可以联系所有人的基站(全局)。理论上可以证明:通过足够多的中转,任何信息都能从任何地方传到任何地方。
论文结构与格式
论文正文约 10 页,附录约 20 页(主要是数学证明)。结构为:问题提出 → 理论分析(图灵完备性 + 通用逼近性) → 模型设计 → 实验。写作风格兼顾理论和实践,但附录的数学推导相当深,新手可以暂时跳过。
核心方法/架构详解
Big Bird 的稀疏注意力由三个部分叠加而成:
1. 随机注意力(Random Attention)
每个 token 除了局部邻居外,再随机选取 r 个 token 建立连接。这引入了"长程随机跳跃"的能力,类似社交网络中的"弱连接"——你朋友的朋友可能来自完全不同的圈子,从而传递远方信息。
2. 局部窗口注意力(Local Window Attention)
每个 token 关注它前后各 w 个邻居,和 Longformer 的滑动窗口相同。这保证了局部语义的连贯性。
3. 全局 Token 注意力(Global Token Attention)
设置 g 个全局 token(可以是新增的 [CLS] 型 token,也可以是原文中选出的重要词),它们与所有 token 双向关注。Big Bird 提出两种方式:BigBird-ITC(在原序列中插入全局 token)和 BigBird-ETC(额外加一组全局 token)。
理论贡献:
论文证明了以下结论:
- 完整的全注意力 Transformer 是图灵完备的(能模拟任何程序)
- Big Bird 的稀疏注意力同样是图灵完备的,且是通用函数逼近器
- 稀疏的关键条件:图的直径(任意两点间最短路径)需要有上界
这意味着稀疏注意力在理论表达能力上并不输于全注意力——只是需要通过多层 Transformer 来"中转"远程信息。
主要创新点
- 首次从图灵完备性角度为稀疏注意力提供理论保证
- 随机 + 局部 + 全局三元组合,各有分工
- 适用于 encoder(如 BERT 式)和 decoder(生成)两种架构
- 将长度扩展到 4,096 token,在问答、摘要、基因组学(长 DNA 序列)任务上有显著提升
实验设置
- 任务: 问答(Natural Questions、TriviaQA、HotpotQA、WikiHop)、文档摘要(Arxiv、PubMed、BigPatent)、基因组序列分类(深度内含子预测)
- 基线: RoBERTa-large(512 截断)、Longformer
- 指标: F1、Rouge、准确率
- 上下文长度: 4,096 token(实验中部分达 8,192)
- 算力: Google TPU v3,预训练约 50 万步(从头训练较耗资源)
在多个任务上 Big Bird 以小幅度超越 Longformer,且理论基础更扎实。
写作风格特点
兼顾理论严谨与实验多样,是一篇"又有推导又有实验"的综合型论文。附录的定理证明相当完整,适合有一定数学基础的读者深入学习。
图表亮点
- 图1:用图(Graph)的方式可视化三种注意力模式的连接结构,随机边、局部边、全局边用不同颜色标注,非常直观
- Table 2:不同稀疏注意力方案(只随机、只局部、只全局、组合)的消融实验,清晰说明三种成分缺一不可
新手阅读建议
建议只读第 1 节(引言)、第 3 节(模型方法)和第 5 节(实验);附录的图灵完备性证明可作为选读。重点理解"为什么单独用局部注意力不够,还需要随机和全局"。可以把三种注意力想成三种不同的通信渠道,各自解决不同距离的信息传递问题。
第 3 篇:ALiBi — 用线性惩罚取代位置编码
arXiv: 2108.12409 | Press et al., UW / Meta AI, 2021(ICLR 2022)
一句话概括
彻底抛弃学习式位置编码,在注意力分数上直接加一个"距离越远扣分越多"的线性惩罚项(ALiBi = Attention with Linear Biases),使模型能自然地外推到比训练时更长的序列,且训练更快、内存更省。
背景与动机
2021 年时,主流 Transformer 用的是两种位置编码:绝对位置编码(给每个位置学一个向量,BERT 用)或正弦位置编码(GPT-2 用)。但这两种方式都有一个共同缺陷:外推失败——训练时只见过长度 ≤ T 的序列,推理时遇到更长序列,位置 T+1 从没被学过,模型性能急剧下滑。
类比: 就像一个只学过从 1 加到 100 的小学生,被要求计算 150 + 73。数字本身没问题,但他从没接触过三位数,大脑就会"不知所措"。
另一个现实问题是:位置编码需要占用参数量,且训练时每个位置都需要一定量的样本来学好——这增加了计算和数据成本。
论文结构与格式
论文约 9 页,结构简洁:引言 → 方法描述(不到 1 页)→ 外推实验 → 推理速度和内存分析 → 各类语言建模实验。写作非常简练,方法本身极其简单,大量篇幅用于验证其有效性。
核心方法/架构详解
ALiBi 的核心思想用一句话说完:在计算注意力分数时,对距离较远的词对施加线性惩罚。
标准注意力打分公式:
Attention(Q, K) = softmax(Q·Kᵀ / √d)
ALiBi 改为:
Attention(Q, K) = softmax(Q·Kᵀ / √d + m · M)
其中 M 是一个偏置矩阵,M[i,j] = -(i - j)(即位置 i 关注位置 j 时,惩罚值等于它们的距离);m 是每个注意力头各自固定的斜率(slope),不同头使用不同的 m 值(按几何级数分布,如 1/2, 1/4, 1/8...)。
直觉理解: 想象你在读一本书,当前在第 100 页,你需要判断第 50 页的内容与当前的相关性。ALiBi 说:距离越远,默认相关性越低——除非这个词的内容本身非常重要(Q·Kᵀ 得分很高),能盖过距离惩罚。不同注意力头的斜率不同,有的头对距离特别敏感(局部专注),有的头对距离不那么敏感(擅长远程关联)。
为什么能外推? 训练时最远看到距离 T 的词,推理时遇到距离 T+100 的词——ALiBi 直接把惩罚值扩展就好,不需要"学过"这个位置,只是惩罚更大而已。模型已经学会了"远=惩罚更多"的模式,自然能推广到更远的距离。
不需要学习的位置信息: ALiBi 中的斜率 m 是固定的超参数,不是学出来的。整个模型参数量减少,训练效率提升(论文报告训练速度提升约 11%)。
主要创新点
- 零参数量的位置编码方案,无需为每个位置学习向量
- 线性偏置比正弦/学习式编码具有更强的外推能力
- 不同注意力头使用不同斜率,形成多尺度的位置感知
- 训练时用较短序列(1,024/2,048),推理时可用到 2,048/4,096 以上,性能不降反升
实验设置
- 任务: 语言建模(WikiText-103、Books、CC-100 子集)
- 模型规模: 125M 到 1.3B 参数,多种规模测试
- 基线: Sinusoidal 位置编码、学习式位置编码、旋转位置编码(RoPE)、T5 的相对位置编码
- 关键实验: 训练长度 1,024,测试长度 1,024 → 2,048 → 4,096,比较困惑度(Perplexity)变化
- 指标: 困惑度(Perplexity),越低越好
结果:ALiBi 在推理时序列长度超出训练长度 2-4 倍时,困惑度仍然平稳甚至下降(而其他方法会急剧上升)。
写作风格特点
极其简洁清晰,是一篇"方法简单但洞察深刻"的论文典范。作者对各种位置编码方案做了系统对比,结论表达非常直接。适合新手通读全文,无太多技术门槛。
图表亮点
- 图2:训练长度 vs 推理长度的困惑度热力图,ALiBi 在超出训练长度后依然保持低困惑度,而其他方法出现大幅跳升,视觉对比极为震撼
- 图1:ALiBi 偏置矩阵的可视化,展示不同斜率如何影响注意力分布
新手阅读建议
这篇论文非常适合新手入门,方法简单、写作清晰。建议重点看图2(外推实验),理解"位置编码外推失败"和"ALiBi 的外推优势"。方法部分(第3节)只有一页左右,一定要仔细读。读完本文,你会对"位置编码是什么、为什么重要"有非常清晰的认识,为后续读 RoPE 和 YaRN 打下基础。
第 4 篇:Lost in the Middle — 揭示长上下文的"中间遗忘"问题
arXiv: 2307.03172 | Liu et al., Stanford / Berkeley, 2023
一句话概括
通过系统性实验揭示:现有大语言模型在处理长上下文时,倾向于利用开头和结尾的信息而忽视中间部分,且上下文越长这种偏差越严重,同时提出了针对这一问题的评估方法和缓解策略。
背景与动机
2023 年,各大模型纷纷宣传"支持 128K 上下文",但一个关键问题被忽视了:支持长输入≠能有效利用长输入。模型也许能在技术上接受 100,000 个 token,但真的能从中准确找到需要的信息吗?
类比: 想象你让人在一本 1,000 页的书里找一条特定信息。如果这条信息在第 1 页或最后一页,他可能很快找到。但如果在第 500 页的某个角落,他可能根本就没仔细读那里——尽管他把书"接收了"。
这篇论文就是要测试:大模型在长上下文中,到底有没有认真"读"中间的部分?
论文结构与格式
论文约 12 页,结构为:问题定义 → 两个核心任务的实验设计 → 结果分析(位置效应)→ 影响因素分析 → 缓解方案讨论。实验非常系统,图表数量多(约 15 个),呈现方式清晰。
核心方法/架构详解
这篇论文的"方法"主要是实验设计,而非新模型:
实验任务 1:多文档问答(Multi-Document QA)
给模型提供 K 个文档,其中只有一个文档包含问题答案,其余是干扰文档。改变"答案所在文档的位置"(放在第 1 个、第 K/2 个、第 K 个……),测试模型的准确率。
实验任务 2:Key-Value 检索
给模型一个包含 N 个键值对的列表(如 "name: Alice, age: 25, ......"),要求模型检索特定键对应的值。同样改变目标键值对的位置,测试准确率。这个任务设计排除了语言理解的干扰,纯粹测试"位置感知能力"。
核心发现:U 形性能曲线
实验结果非常一致:无论哪种任务,性能曲线呈 U 形——答案在开头或结尾时性能最好,放在中间时性能最差。上下文越长,U 形越明显,中间的性能谷越深。
测试的模型: GPT-3.5-Turbo(16K)、Claude-1.0(100K)、LongChat-13B-16K、MPT-30B-Instruct(8K)等多个当时主流模型。
追加分析:
- 上下文长度的影响: 总文档数量越多(上下文越长),中间位置的性能下降越明显
- 模型本身的影响: 指令微调(Instruction Tuning)在一定程度上缓解这一问题,但无法消除
- Query-aware 文档排序: 提前把最相关的文档移到开头或结尾,能显著提升性能
主要创新点
- 首次系统性定量揭示"位置偏差"现象(U 形曲线)
- 设计了两种控制变量严格的实验方案,结论可信度高
- 涵盖多个主流闭源和开源模型,结论的普适性强
- 提出了一个简单有效的缓解方案:把重要信息移到上下文的首尾
实验设置
- 模型: GPT-3.5-Turbo-16K、Claude-1.0、LongChat-13B-16K、MPT-30B-Instruct、OpenLLaMA-13B 等
- 数据集(问答): NaturalQuestions(多跳问答)、自建合成 KV 检索集
- 上下文长度范围: 10 到 30 个文档(视模型最大长度而定)
- 指标: 准确率(Exact Match 或字符串匹配)
写作风格特点
这是一篇典型的"分析型/发现型"论文,而非提出新模型。写作以实验数据说话,语言平实,图表丰富。每个主要结论都有多个图表支撑,论证严谨。适合作为"警示牌"阅读——提醒你不要盲目相信"支持长上下文"的宣传。
图表亮点
- 图2/图3:不同模型在不同答案位置下的准确率折线图,U 形曲线在所有模型上都清晰可见,视觉冲击力强
- 图5:上下文长度从 10 增加到 30 时,中间位置的性能变化趋势,量化了"越长越遗忘"的效应
新手阅读建议
这篇论文不需要太多技术背景就能读懂,非常适合新手从这里开始了解"长上下文的实际挑战"。建议先看摘要和图2(U 形曲线),然后理解实验设计逻辑。读完后你会对"长上下文利用"有更清醒的认识——下游的 YaRN、MemGPT 等论文提出的方法,都是在尝试解决(或绕过)这里揭示的问题。
第 5 篇:YaRN — 低成本扩展 RoPE 上下文窗口
arXiv: 2309.00071 | Peng et al., EleutherAI, 2023
一句话概括
针对旋转位置编码(RoPE)的频率特性提出改进的插值策略(NTK-aware + 注意力温度缩放),以极少的微调步骤(约 400 步),将现有 LLaMA-2(4K)扩展到 128K 上下文,且性能远优于此前的线性插值方法。
背景与动机
RoPE(Rotary Position Embedding,旋转位置编码)是 2023 年最主流的位置编码方案,被 LLaMA、Mistral 等主流开源模型采用。RoPE 把位置信息编码成旋转角度——token i 在向量空间里旋转了 i × θ 度。它的优雅之处在于:两个 token 的相对位置只取决于它们的旋转角度差,不依赖绝对位置,因此理论上有利于外推。
但实际上,直接外推 RoPE 效果很差——模型训练时只见过 θ × 4096 以内的旋转角度,推理时遇到更大的旋转角,依然茫然。
此前的解法——线性插值(Position Interpolation / PI):
2023 年 Meta 提出了一个简单方法:把更长的序列"压缩"映射回训练长度内。例如训练长度 4096,要推理 16384 的序列,就把位置索引除以 4,使最大旋转角保持不变。类比:你的尺子最长量 10 厘米,现在要量 40 厘米的东西,就把整体缩小到 1/4 再量。缺点是:压缩后短距离内的分辨率变差——原本相邻两个位置差 1,现在差 0.25,模型难以区分近邻。
YaRN 的出发点: 能否在扩展长度的同时保持短距离的高分辨率?
论文结构与格式
论文约 16 页,包含方法推导、与 PI/其他方法对比、大量困惑度曲线和下游任务评测。附录有实现细节和消融分析。写作风格较为技术性,需要对 RoPE 有基本了解。
核心方法/架构详解
YaRN = Yet another RoPE extensioN,方法包含两个关键改进:
改进 1:NTK-aware 插值(非均匀频率插值)
RoPE 对不同维度使用不同频率的旋转——高维度旋转快(高频),低维度旋转慢(低频)。这些频率类似于信号处理中的不同频道。
关键洞察:高频成分对短程位置信息很重要(相邻词的区分),低频成分对长程位置信息更重要(远距离词的区分)。 线性插值对所有频率等比缩放,会破坏高频成分(近距离分辨率下降)。
YaRN 的做法:对高频部分做少量甚至不做插值(保持近距离分辨率),对低频部分做更多插值(让远距离位置可达)。这像一把"可变焦"的望远镜——近处清晰,远处也能看到。具体实现通过调整每个 RoPE 维度的基频(base)来实现。
改进 2:注意力温度缩放(Attention Temperature Scaling)
序列变长后,注意力分数的方差会发生变化,softmax 变得过于集中或分散。YaRN 引入一个缩放因子 √(log n / log n_train) 对注意力分数进行温度调整,让更长序列的注意力分布保持合理形态。
微调策略: 在目标长度的数据上只微调约 400 步(相比从头训练几十万步)即可激活模型在扩展位置上的能力。
主要创新点
- 从信号处理角度分析 RoPE 频率特性,提出非均匀插值方案
- 注意力温度缩放解决长序列下注意力熵失调问题
- 微调成本极低(~400 步),实用性极强
- 将 LLaMA-2-7B 从 4K 扩展到 128K,在 SCROLLS 等长文档基准上超越所有同期方法
实验设置
- 基础模型: LLaMA-2-7B(4K)、LLaMA-2-13B(4K)
- 目标长度: 64K、128K
- 微调数据: 来自 The Pile 的长文本,约 400 步
- 对比方法: Position Interpolation (PI)、Code LLaMA(官方扩展版)
- 指标: 困惑度(Perplexity on Proof-Pile)、SCROLLS 长文档问答基准、Passkey Retrieval(在超长文本中找隐藏密码,测试真实长程利用能力)
- 算力: 4 块 A100-80GB
在 Passkey Retrieval 任务上,YaRN-128K 在 128K 位置仍能 100% 找到隐藏信息,而线性插值版本在超过训练长度后迅速失败。
写作风格特点
技术深度较高,大量公式推导,但每个公式都有直觉解释。适合已经了解 RoPE 基本原理后阅读。作者开源了代码,并发布了 YaRN 微调过的 LLaMA-2 权重,实用价值高。
图表亮点
- 图3:不同插值方案在各 RoPE 频率维度上的插值程度对比,直观展示 YaRN 对高频的保护
- 图4:Passkey Retrieval 准确率热力图,横轴为密码位置,纵轴为总上下文长度,YaRN 的绿色方块 vs 其他方法的大片红色,对比鲜明
新手阅读建议
建议先搜索并简单了解"RoPE 是什么"(约 15 分钟),再读本文。核心方法在第 3 节,可重点阅读。如果公式太多,只理解"高频不动、低频缩放"的直觉就够了。YaRN 是实用价值极高的方法,是很多后续长上下文模型的基础,值得深读。
第 6 篇:LongLoRA — 普通 GPU 也能微调长上下文模型
arXiv: 2309.12307 | Chen et al., CUHK / MIT, 2023
一句话概括
提出"移位稀疏注意力"(S²-Attn)+ LoRA 微调的组合,让在单机 8 块 A100 上微调 LLaMA-2-7B 到 100K 上下文成为可能,同时保持接近全注意力的性能。
背景与动机
2023 年,YaRN 等方法解决了"如何让模型认识更长位置"的问题,但还有一个实际障碍:微调成本。即使只微调几百步,如果每步都用全注意力(O(n²)),100K 序列的一个 batch 就需要几百 GB 显存,远超普通实验室的硬件条件。
换言之:推理时可以用优化的注意力实现(如 FlashAttention),但训练时需要反向传播,显存需求更高。
LongLoRA 的核心问题: 能不能用稀疏注意力训练,但用全注意力推理,且两者性能接近?
论文结构与格式
论文约 10 页,结构紧凑:方法(S²-Attn 和 LoRA+ 策略)→ 消融实验 → 与其他方法对比 → 案例分析。写作清晰,消融实验设计很好。
核心方法/架构详解
LongLoRA 包含两个独立但互补的贡献:
贡献 1:移位稀疏注意力(Shifted Sparse Attention,S²-Attn)
朴素的想法是:把长序列分成若干固定块(如每块 4096 token),每个块内部做全注意力,块间不交流。这样复杂度从 O(n²) 降为 O(n),但问题是块间没有信息流动——不同块的词无法相互看到。
移位的妙处: LongLoRA 把注意力头分成两组,一组按正常方式分块(token 1-4096 一块,4097-8192 一块……),另一组的分割点移位半个块长度(token 2048-6144 一块,6147-10240 一块……)。这样两组头的分块方式交错,每个 token 都能通过某一组头间接接触到相邻块的信息,避免了信息孤岛问题。
类比: 想象把一排学生分成若干小组讨论,一轮正常分组,一轮分组边界移位——两轮下来,每个人都和更多同学交流过,信息流通了。
更重要的是:S²-Attn 只在训练时使用,推理时换回标准全注意力——因为稀疏训练已经让模型学会了在全局关注下处理长序列的能力。
贡献 2:LoRA 可训练嵌入和归一化层(LoRA+)
标准 LoRA 只在注意力权重上加低秩适配,其他层(嵌入层、归一化层)保持冻结。作者发现:扩展上下文长度后,嵌入层和归一化层也需要微调,否则性能受限。LongLoRA 额外解冻这两类层,使 LoRA 参数量略增但效果显著提升。
主要创新点
- 移位稀疏注意力训练、全注意力推理,无需特殊推理框架
- 识别出嵌入层和归一化层对长上下文微调的重要性
- 开源了 LongAlpaca 数据集(针对长上下文的指令微调数据)
- 在单机 8 块 A100 上将 LLaMA-2-7B 扩展到 100K,LLaMA-2-70B 扩展到 32K
实验设置
- 基础模型: LLaMA-2-7B、13B、70B(原始 4K 窗口)
- 目标长度: 32K(主要实验),部分到 100K
- 微调数据: RedPajama 长文本,约 1,000 步
- 对比方法: Full Fine-tuning(全参数微调)、普通 LoRA(不解冻嵌入归一化)、PI 插值
- 评估: 困惑度(PG19 测试集)、Passkey Retrieval、LongBench 问答任务
- 算力: 8 块 A100-80GB(7B 模型 32K 约需 23GB 显存/卡,相比全参数微调的 >200GB 大幅降低)
写作风格特点
工程实践导向,重视消融分析(专门做了"S²-Attn 是否必要"、"解冻哪些层最关键"等对照实验)。代码和模型权重完全开源,是复现性很好的工作。
图表亮点
- 图2:S²-Attn 的移位分块示意图,不同颜色块显示两组头的不同分割方式,清晰展示"移位"如何解决边界信息孤岛
- Table 3:不同组件组合的消融表,量化了 S²-Attn 和 LoRA+ 各自的贡献
新手阅读建议
建议先了解 LoRA 的基本思想(低秩适配,用少量参数微调大模型),再读本文。重点关注第 3 节方法和消融实验。LongLoRA 是一篇"工程技巧型"好论文,读完你会理解长上下文微调的成本瓶颈在哪里,以及如何用训练-推理解耦来绕过这个瓶颈。
第 7 篇:StreamingLLM — 发现"注意力汇",实现无限流式推理
arXiv: 2309.17453 | Xiao et al., MIT / Meta, 2023
一句话概括
发现 Transformer 存在"注意力汇"(Attention Sink)现象——模型倾向于把大量注意力集中在最初几个 token 上——利用这一发现,通过保留初始 token + 滑动窗口的 KV 缓存策略,在不重新训练的情况下实现内存稳定的无限流式文本生成。
背景与动机
大模型在实际部署中有一个常见场景:流式对话或超长生成(如多轮长对话、实时文档处理)。此时模型需要持续生成文字,序列不断增长,KV 缓存也不断扩大——直到撑爆显存。
现有解法的问题:
1. 截断: 只保留最近 N 个 token 的 KV 缓存(滑动窗口)。但实验发现,一旦丢弃了最初的几个 token,模型性能就会崩溃(困惑度飙升)。这非常奇怪——最初的几个 token 里可能只是"你好"之类的开场白,为什么那么重要?
2. 重新计算: 每次都重算所有 KV,代价太高。
论文结构与格式
论文约 11 页:问题发现(注意力汇)→ 方法设计 → 在流式生成任务上的实验 → 与其他 KV 缓存方案对比。写作风格清晰,有明显的"发现驱动"叙事结构。
核心方法/架构详解
核心发现:注意力汇(Attention Sink)
作者可视化了各层的注意力权重分布,发现一个惊人规律:无论当前词是什么,注意力分数中有相当大的比例集中在序列的前几个 token(通常是前 4 个),即使这些 token 在语义上与当前词毫无关系。
为什么会有注意力汇?
作者给出的解释:softmax 要求所有权重加和为 1,即使某个 token 在语义上对当前位置没用,但模型还是需要把注意力权重"停放"在某处。序列开头的几个 token(尤其是 SOS/BOS token)经过大量训练,成了稳定的"停车场"——无用的注意力汇聚于此,不影响真正重要的信息。就像办公室里有个老员工,大家开会时不管讨论什么,总会习惯性地看一眼他,即使他不发言。
StreamingLLM 的方法:
既然注意力汇必须保留,那策略就清晰了:
KV 缓存 = 初始几个 token(Attention Sink Tokens)+ 最近 W 个 token 的滑动窗口
计算示意:
- 固定保留前 4 个 token 的 KV(注意力汇)
- 滑动窗口保留最近 2,048 个 token 的 KV
- 总 KV 缓存大小固定为 4 + 2,048,不随序列增长
当新 token 进来时,窗口滑动,最旧的"近期"token 被丢弃,但最初 4 个 token 永远保留。
额外发现: 如果在训练阶段就加入一个专门的"占位"token(sentinel token)作为人工注意力汇,可以让模型不那么依赖真实内容的前 4 个 token,进一步提升流式性能。
主要创新点
- 首次命名并系统分析"注意力汇"现象
- 无需重新训练,即插即用地解决流式推理的 KV 缓存溢出问题
- 与窗口注意力方案的关键区别:保留初始 token vs 纯滑动窗口
- 实验证明在多个模型(LLaMA、MPT、Falcon)上普遍有效
实验设置
- 模型: LLaMA-2-7B/13B、MPT-7B/30B、Falcon-7B/40B、Pythia-6.9B
- 任务: 流式文本生成(4 Million token 以上),评估困惑度是否稳定
- 基线: 密集注意力(截断至最大长度)、窗口注意力(纯滑动窗口)、重新计算
- 指标: 困惑度稳定性(是否随生成长度增长而崩溃)
- 关键对比: 在 4M token 的长序列上,StreamingLLM 困惑度保持稳定,纯滑动窗口的困惑度在截断开始后立即飙升
写作风格特点
"发现导向"的叙事风格,先用一系列图表揭示注意力汇现象,再顺水推舟提出解法。可视化图表做得极好,直观有力。适合当作"科学探索式论文"的范本阅读。
图表亮点
- 图1/图2:多层注意力权重热力图,清晰展示序列前 4 个 token 上的异常高注意力,颜色对比明显
- 图5:流式生成中不同方案的困惑度随生成长度变化曲线,StreamingLLM 的平稳线 vs 窗口注意力的突然跳升
新手阅读建议
这篇论文的故事讲得非常好,非常适合新手阅读。建议按顺序读:先看图 1/2 感受注意力汇现象,再读第 3 节的方法,最后看实验曲线。这篇论文会改变你对"Transformer 注意力如何工作"的直觉认知,极具启发性。思考题:如果注意力汇现象真实存在,那 Longformer 的"全局 token"是不是也在做类似的事?
第 8 篇:Ring Attention — 把长序列切分到多台机器上
arXiv: 2310.01889 | Liu et al., UC Berkeley, 2023
一句话概括
将超长序列的上下文切分到多台设备上,通过"环形"通信拓扑让各设备依次交换 Key-Value 信息,在计算本地块注意力的同时完成通信,实现设备数量与可处理序列长度的线性扩展——无需任何近似,精确等效于全注意力。
背景与动机
假设你有 8 台 GPU,每台能处理最长 8K 的序列。现在想处理一篇 64K 的论文,怎么办?最简单的想法是:把 64K 的序列切成 8 段,每台 GPU 处理一段。但问题是:注意力机制要求每个 token 都能看到所有其他 token——切分后,不同机器上的 token 互相"看不见"对方。
Ring Attention 的核心问题: 如何让分布在 8 台机器上的 token 都能"看到彼此",同时不让通信成为瓶颈?
论文结构与格式
论文约 10 页,包含方法推导、通信分析、在不同硬件规模下的扩展性实验,以及与 FlashAttention 的组合。写作较为技术性,重点在系统设计和通信分析。
核心方法/架构详解
基本思路:流水线式 KV 传递
假设有 4 台 GPU(设备 0、1、2、3),序列切成 4 段(块 0、1、2、3),设备 i 持有块 i。
直觉上,每台设备需要看到所有 4 个块的 KV。如果直接广播,通信量是 O(n²/设备数);但 Ring Attention 用了更聪明的方式:
环形传递: 将 4 台设备排成一个环(0→1→2→3→0)。每一步,每台设备:
1. 用当前持有的 KV 块计算对应的部分注意力
2. 将自己的 KV 块传给环中的下一台设备(同时从上一台设备接收 KV 块)
3. 重复 4 步
4 步之后,每台设备都已经用过了所有 4 个 KV 块,完成了完整的注意力计算。通信和计算交叠(overlap)进行,设备在接收 KV 块的同时,就在用上一步收到的 KV 块做计算,通信延迟几乎被完全隐藏。
类比: 4 个厨师围坐一桌,每人手里有一种食材。每轮:先用手里的食材做一部分菜,同时把食材传给左边的厨师。4 轮后每人都用过了所有食材,做完了各自的全部菜。传递过程和烹饪过程同时进行,不浪费时间等待。
与 FlashAttention 结合: Ring Attention 需要在每台设备内部仍然使用高效注意力实现(如 FlashAttention)。Ring Attention 解决的是"跨设备"的扩展,FlashAttention 解决的是"单设备内"的效率——两者天然互补,可以组合使用。
精确性保证: Ring Attention 不是近似算法,每台设备计算的是完整注意力的一个精确子集,汇总后结果与标准全注意力完全等价。
主要创新点
- 纯精确计算,无需近似,适用于任何 Transformer 架构
- 计算-通信重叠,最大化硬件利用率
- 可处理的最大序列长度与设备数量线性相关
- 与 FlashAttention、LoRA、各类位置编码完全兼容
实验设置
- 硬件: 最多 256 块 TPU v4
- 模型: 基于 JAX 框架实现,以 LLaMA 架构为基础进行测试
- 关键实验: 设备数量从 8 扩展到 256,测量吞吐量(tokens/秒)和可处理最大序列长度
- 可处理序列长度: 256 块 TPU 下可处理约 100 万 token 的序列
- 指标: 训练吞吐量(MFU,模型算力利用率)、内存使用
写作风格特点
系统论文风格,偏重于分布式计算和通信分析。数学推导清晰,系统图(展示环形通信过程)做得很好。适合对分布式训练感兴趣的读者。
图表亮点
- 图1:环形通信示意图,展示 4 台设备 4 步通信的过程,带时间轴清晰展示计算-通信重叠
- 图3:序列长度 vs 设备数量的扩展性曲线,线性扩展趋势清晰
新手阅读建议
这篇论文偏系统/工程,建议有一定分布式训练基础后阅读。核心概念"计算-通信重叠"是理解本文的关键。如果类比方便理解:Ring Attention 本质上把"流水线"的思路(一边做A一边准备B)应用到了跨机器的注意力计算上。对于不做大规模训练的读者,了解其核心思想即可,无需深究通信协议细节。
第 9 篇:MemGPT — 把 LLM 包装成操作系统
arXiv: 2310.08560 | Packer et al., UC Berkeley, 2023
一句话概括
借鉴操作系统虚拟内存管理的思想,设计了一个分层记忆架构(主上下文/外部存储/归档),通过让 LLM 自己调用函数来主动管理记忆的读写和换入换出,从而突破有限上下文窗口的物理限制,处理理论上无限长的对话和文档。
背景与动机
无论上下文窗口扩展到多大(4K、128K 还是更长),总有上限。处理一部《战争与和平》全本(约 58 万词)、或者一段持续数月的长期对话记录,终究会超出任何有限的窗口。
操作系统的类比是本文的核心: 你的电脑内存(RAM)只有 16GB,但你的硬盘有 1TB,操作系统通过"虚拟内存"让程序以为自己有 1TB 的内存可用——需要的数据从硬盘调入内存,不用的数据换出到硬盘。MemGPT 把同样的思路搬到 LLM 上:有限的上下文窗口 = 内存(RAM),外部存储(向量数据库、文件系统)= 硬盘,LLM 自身 = 操作系统 + 运行的程序。
论文结构与格式
论文约 13 页,结构为:类比与动机 → MemGPT 架构设计 → 两个应用场景的实验(长期对话、文档问答)→ 深入分析。写作叙事性强,类比生动,适合阅读。
核心方法/架构详解
MemGPT 的架构分为三层:
1. 主上下文(Main Context / 相当于 RAM)
LLM 实际能看到的内容,包括:
- 系统提示区(System Prompt): 不变的角色设定、记忆管理指令
- 工作记忆区(Working Context): 当前对话轮次和短期重要信息摘要
- 对话历史区(FIFO Queue): 最近几轮对话,先进先出
2. 外部存储(External Storage / 相当于硬盘)
- 回忆存储(Recall Storage): 所有历史对话的向量化存储,通过语义搜索检索
- 归档存储(Archival Storage): 外部知识库(文件、数据库),也支持语义搜索
3. LLM 作为处理器
LLM 不只是"被动生成文字",而是可以主动调用函数(类比 OS 的系统调用):
- recall_memory_search(query) — 从对话历史中检索相关内容
- archival_memory_search(query) — 从知识库检索
- archival_memory_insert(content) — 将重要信息存入知识库
- core_memory_replace(old, new) — 更新工作记忆中的信息
运作流程: 每次用户发消息,MemGPT 先决定是否需要调用记忆函数(如"这个用户上次说了什么爱好?"→ 调用 recall_memory_search),把检索到的内容填入主上下文,再生成回复。当上下文快满时,系统自动把旧对话压缩摘要后存入回忆存储,腾出空间。
这相当于 LLM 有了"主动注意力"——它能决定自己需要记住什么、忘记什么、当下应该关注什么。
主要创新点
- 将操作系统虚拟内存范式完整迁移到 LLM 上下文管理
- LLM 主动控制记忆的存取,而非被动截断
- 支持跨会话的长期记忆(对话结束后下次依然记得)
- 提供了一个统一框架,兼容不同底层 LLM(GPT-4、LLaMA 等)
实验设置
- 应用场景 1:文档问答(Document QA)
- 数据:超过 GPT-4 上下文长度的长篇小说/法律文档
- 基线:朴素截断、人工摘要、RAG(检索增强生成)
-
指标:问答准确率
-
应用场景 2:长期对话代理(Conversational Agent)
- 数据:模拟多轮长期对话,要求记住用户信息
-
评估:人工评测记忆连贯性和信息保留率
-
底层模型: GPT-3.5-Turbo、GPT-4(实验时均可用)
- 结果:MemGPT 在需要跨越上下文边界的任务上显著超越截断方法
写作风格特点
叙事流畅,类比生动,学术技术性适中。这篇论文更像一个"系统设计提案"——核心贡献是架构设计理念和系统实现,而非新的数学方法。适合对 AI Agent 和系统设计感兴趣的读者。
图表亮点
- 图1:MemGPT 整体架构图,三层记忆结构 + 函数调用接口的完整示意,清晰展示与传统截断方式的区别
- 表2:长期对话任务的消融实验,逐步添加各记忆组件后性能的变化
新手阅读建议
这篇论文非常适合新手阅读,技术门槛低,类比生动。建议按顺序全文阅读,第 2 节(操作系统类比)尤其精彩。读完后可以思考:MemGPT 本质上是把"检索增强生成(RAG)"和"Agent 工具调用"结合在了一起,它与直接用 RAG 的主要区别是什么?(答案:LLM 在 MemGPT 中可以主动决定何时检索、何时写入,而不是被动等待触发。)
第 10 篇:Infini-attention — 无限上下文的注意力机制
arXiv: 2404.07143 | Munkhdalai et al., Google, 2024
一句话概括
在标准注意力机制中嵌入一个可压缩的"线性注意力记忆"模块,使每个注意力层既能处理当前局部上下文,又能通过压缩记忆访问任意久远的历史信息,实现参数量固定下的无限上下文处理。
背景与动机
前面的论文已经把上下文窗口扩展到了 128K 甚至 100 万 token,但这些方法本质上仍然是有限窗口——只是窗口更大了。随着序列继续增长,KV 缓存终究会超出限制,或计算成本变得不可接受。
真正的"无限上下文"需要一种内存占用不随序列长度增长的设计——就像人类的记忆:你不会因为活得更长就需要更大的大脑,大脑容量是固定的,但能以某种压缩形式存储大量信息。
Infini-attention 的类比: 每个注意力头不只是一个"当前词查询最近记录"的检索器,而是同时维护一个压缩记忆矩阵,这个矩阵把所有历史信息以固定大小存储,新信息不断写入(覆盖最不重要的),查询时同时查本地注意力和压缩记忆。
论文结构与格式
论文约 9 页,结构紧凑:问题动机 → 方法(Infini-attention 公式推导)→ 从头预训练 + 持续预训练实验 → 与其他无限上下文方案对比。公式较多,但直觉清晰。
核心方法/架构详解
Infini-attention 在每个标准注意力层中引入一个额外的记忆模块,具体如下:
线性注意力记忆(Linear Attention Memory)
论文使用线性注意力(Linear Attention)公式来维护一个固定大小的记忆矩阵 M:
-
写入(Memory Update): 每处理一个新的 token,其 Key-Value 对都被写入 M:
M_new = M + (K^T · V)
这是一个矩阵累加操作,可以理解为把新信息"叠加"进记忆矩阵。 -
读取(Memory Retrieval): 用当前 token 的 Query 向量检索记忆:
A_mem = Q · M_norm
(M_norm 是归一化后的 M)
与局部注意力结合
每个注意力头同时计算两种注意力:
1. 局部注意力(Local Attention): 标准的点积注意力,针对当前段(segment)内的 token
2. 记忆注意力(Memory Attention): 从压缩记忆矩阵中检索的结果
两者通过一个可学习的门控系数 β 加权求和:
A_final = sigmoid(β) · A_mem + (1 - sigmoid(β)) · A_local
模型自己学习对于每个位置,应该更多依赖局部信息还是历史记忆。
分段处理: 超长序列被切成固定长度的段(segment),每段处理完后记忆矩阵更新一次。关键是:记忆矩阵大小固定,不随段数增加而增长——真正实现 O(1) 的记忆开销。
注意事项: 这种线性注意力记忆是有损压缩——不是所有历史信息都能被完美保留,就像人类长期记忆会遗忘细节。但对于许多任务,关键信息能被保留下来就已足够。
主要创新点
- 在标准多头注意力中无缝嵌入压缩记忆,无需改变模型整体架构
- 记忆模块参数量固定(与历史长度无关),实现真正的 O(1) 内存开销
- 门控机制让模型自适应地平衡局部细节和长程历史
- 单个注意力层就同时具备局部感知和无限历史访问能力
实验设置
- 实验 1:持续预训练(Continual Pre-training)
- 基础模型:LLaMA(10B,4K 训练长度)
- 在 4B token 数据上持续训练,扩展到 128K 上下文
-
评估:书籍摘要任务(约 100K token 的书籍摘要)、困惑度
-
实验 2:从头预训练(Pre-training from Scratch)
-
1B 参数模型,比较标准 Transformer vs Infini-attention
-
长度外推测试: 训练长度 4K,推理测试长度 100K+
-
基线: Vanilla Transformer(截断)、Memorizing Transformer、RMT(循环记忆 Transformer)
-
结果: Infini-attention 在 500M 参数模型上,用 5K token 的上下文(每次只看 5K,其余靠记忆矩阵)完成了 128K 书籍摘要任务,ROUGE 分数领先同期方法
写作风格特点
公式推导与直觉解释并重,Google 风格的严谨实验设计。论文特意强调"即插即用"特性——只需修改注意力层内部,不改变模型接口,与现有框架兼容。
图表亮点
- 图1:Infini-attention 的架构示意图,展示局部注意力和记忆注意力两条并行路径 + 门控融合,与标准 MHA 的对比清晰
- 图3:序列长度 vs 困惑度曲线,Infini-attention 在超出训练长度后困惑度继续下降(更多历史信息 = 更好),而标准方法困惑度飙升
新手阅读建议
这篇论文是这 10 篇中技术密度最高的之一。建议先对"什么是线性注意力"有初步了解,再读本文。如果公式太难,可以只理解以下核心直觉:每个注意力头有一个"小本子"(记忆矩阵),不断把读过的内容压缩记下来;回答问题时既看眼前的内容,也翻翻小本子,两者综合判断。 小本子大小固定,写满了就覆盖最旧的内容。理解了这个比喻,就抓住了本文的精髓。
附录:10 篇论文快速对比表
| 论文 | 年份 | 核心方法 | 复杂度 | 最大测试长度 | 是否需要重训 |
|---|---|---|---|---|---|
| Longformer | 2020 | 滑动窗口+全局注意力 | O(n) | 16K | 继续预训练 |
| Big Bird | 2020 | 随机+局部+全局稀疏 | O(n) | 8K | 从头预训练 |
| ALiBi | 2021 | 线性距离惩罚偏置 | O(n²) | >4K外推 | 从头/继续 |
| Lost in Middle | 2023 | —(实验分析论文) | — | 16-100K | 否 |
| YaRN | 2023 | NTK插值+温度缩放 | O(n²) | 128K | 约400步微调 |
| LongLoRA | 2023 | S²-Attn+LoRA+ | O(n)训练 | 100K | LoRA微调 |
| StreamingLLM | 2023 | 注意力汇+KV滑窗 | O(n·w) | ∞(流式) | 否 |
| Ring Attention | 2023 | 环形KV分布计算 | O(n²/设备数) | ~1M | 配套使用 |
| MemGPT | 2023 | 分层记忆+函数调用 | — | 理论无限 | 否 |
| Infini-attention | 2024 | 局部注意力+线性记忆 | O(n·s) | 128K+ | 少量持续训练 |
注:O(n·w) 中 w 为窗口大小;O(n·s) 中 s 为段长度。
导读合集完。如有勘误或补充,欢迎反馈。