深入解析大语言模型(LLM)长文本处理技术

bg: lz 昨天让codex读了os大作业chaos中kernel.rs长达6400行的代码,观察到llm在推理过程中首先采用将这6400多行代码分成20多个300行的代码块进行处理,于是对大模型处理长文本、超长文本问题产生了好奇,遂学习了一下。其实只是读paper的时候突然走神了()

claim: 现在对长文本处理的技术应该很多,这里放的是一些我对长文本处理优化的idea,然后碰巧发现都有一些实现。

一、 核心痛点:为什么处理长文本那么难?

大语言模型主要基于 Transformer 架构,其核心的“自注意力机制(Self-Attention)”存在两个致命的物理瓶颈:

  1. 计算复杂度爆炸: 注意力机制的计算量与文本长度 $N$ 呈平方级增长,即 $O(N^2)$。长度增加 10 倍,算力需求增加 100 倍。
  2. 内存墙(Memory Wall): GPU 的计算核心算力极强,但全局显存(HBM)的读写速度很慢。标准计算过程需要频繁读写庞大的中间结果矩阵,导致时间全浪费在“搬运数据”上。
  3. 迷失在中间(Lost in the Middle): 即使硬件能撑住,模型对长文本中间部分的信息提取准确率也会急剧下降(呈现 U 型记忆分布)。

面对这些问题,业界采取了从上到下的分层解决策略。


二、 解决思路 Level 1:应用层的“喂饭法” (Chunking & RAG)

在无法改变模型底层能力的情况下,外层业务框架(如 LangChain)通常采用文本切块(Chunking)

  • 做法: 将 6000 行代码强制切分为 20 个 300 行的代码块,分批次喂给模型,或配合向量数据库进行检索增强(RAG)。
  • 优点: * 完美规避 OOM(爆显存)和极高的 $O(N^2)$ API 成本。
    • 强制模型保持局部专注,提高短期提取准确率。
  • 致命缺点: * 长程依赖断裂: 产生物理硬边界。如果第 10 行定义了变量,第 5800 行调用,由于不在同一个 Chunk 内,模型极易因为丢失上下文而产生幻觉。

三、 解决思路 Level 2:模型架构的“管中窥豹” (Sliding Window Attention)

为了降低模型内部的计算复杂度,Mistral 等模型在底层架构中引入了滑动窗口注意力(Sliding Window Attention)

  • 做法: 抛弃全局视野,模型在看当前词时,只计算它与前面 $W$ 个词的注意力。计算复杂度从 $O(N^2)$ 降为 $O(N \cdot W)$。
  • 优点:
    • 显存占用封顶: 当输入超过窗口大小后,显存不再增加,打破 OOM 诅咒。
    • 无限流式对话: 支持极低资源的 Streaming LLM,聊几天几夜也不会崩溃。
  • 致命缺点: * 依然无法解决代码这种强逻辑文本的“长程依赖”问题。滑出窗口的定义会被彻底遗忘(物理清空)。

四、 解决思路 Level 3:底层算子的极致压榨 (FlashAttention)

既然滑动窗口会损失精度,那能不能在保留 100% 全局精度的同时提速呢?这就涉及到底层 CUDA Kernel(算子)的优化,其中最伟大的成就是 FlashAttention

  • 核心做法: * 分块计算 (Tiling): 将庞大的 $Q, K, V$ 矩阵切成小块送入 GPU 极速的片上缓存(SRAM)。
    • 算子融合 (Operator Fusion): 在 SRAM 中一口气算完矩阵乘法和 Softmax,直接输出最终结果 $O$。
  • 核心价值: 坚决不把中间半成品($S$ 和 $P$)存回慢速的 HBM 显存。它结果 100% 精确,但通过打破“内存墙”,实现了几倍的提速和显存大幅节约。

五、 解决思路 Level 4:机房里的分布式魔法 (并行算法)

当文本长度达到几十万甚至上百万(如 Gemini 1.5 Pro),单张 H100 显卡即使榨干也装不下时,必须采用分布式多卡协同处理:

1. 环形注意力 (Ring Attention / Context Parallelism) CP并行算法

  • 思想:“代码不动,人动”。
  • 机制: 4 张显卡各拿 1/4 的代码。查询向量(Query)留在本地,而键值缓存(KV Cache)像接力棒一样在显卡构成的环形网络中流转。
  • 结果: 每张卡通过 Online Softmax 算法,吸收流转过来的全局知识。不存别人的原文,却算出了完美的全局注意力打分。

2. 尤利西斯并行 (DeepSpeed-Ulysses)

  • 思想:“乾坤大挪移”。
  • 机制: 利用多头注意力(Multi-Head Attention)的特性。4 张显卡瞬间洗牌(All-to-All),洗牌后每张卡拿到了完整的 6000 行代码,但只负责计算特定的几个注意力头
  • 优势: 通信次数极少,效率极高(前提是卡数不能多于注意力头数)。

3. 序列并行 (Sequence Parallelism, SP)

  • 补充机制: 在计算不需要全局信息的层(如前馈神经网络 MLP 和 LayerNorm)时,将数据沿序列维度切开,各算各的,极大节省中间激活值的显存。

总结

大模型处理长文本并非单一技术的胜利,而是一套组合拳

  1. 微观算子:FlashAttention 榨干单卡内存带宽。
  2. 宏观架构:Ring AttentionUlysses 进行多卡分布式拆解。
  3. 模型设计: 结合 Sliding Window 应对日常口语或无限流生成。
  4. 业务应用: 套上 ChunkingRAG 精确控制成本和专注度。

感谢Gemini 老师!