SuperAPI AI 工具集

long-context

智能体与模型

查看项目

更新于 10-21 16:18

技能介绍

用途

Long Context 技能用于扩展 Transformer 模型的上下文窗口,使其能够处理 32k、64k、128k+ token 的长文档。适用场景包括:用 Transformer 模型处理长文档;扩展预训练模型(LLaMA、Mistral 等)的上下文窗口;实现高效的位置编码(RoPE、ALiBi);训练具备长度外推能力的模型;部署可高效处理变长输入的模型;以最小算力微调现有模型以支持更长上下文。

主要能力

该技能覆盖四类关键技术:

  • RoPE(Rotary Position Embeddings,旋转位置编码):通过旋转矩阵编码绝对位置,在注意力中提供相对位置依赖,支持长度外推。数学形式为 q_m = (W_q * x_m) * e^(imθ),k_n = (W_k * x_n) * e^(inθ),其中 θ_j = base^(-2j/d)。优点是 token 间依赖随距离衰减、兼容线性注意力、外推能力优于绝对位置编码。
  • YaRN(Yet another RoPE extensioN):核心创新包括 NTK 感知插值、注意力温度缩放,能以比基线少 10 倍的 token 高效扩展上下文。配置参数包括 scale、original_max_position、extrapolation_factor、attn_factor、beta_fast、beta_slow。可将 LLaMA 扩展到 128k token,训练步数比基线少 2.5 倍。
  • ALiBi(Attention with Linear Biases):不向 token 添加位置嵌入,而是直接对注意力分数施加与键查询距离成正比的惩罚,公式为 attention_bias[i, j] = -m * |i - j|。相比正弦嵌入训练快 11%、内存少 11%,长度外推能力强(训练 1k、测试 2k+),具有近因归纳偏置。
  • 位置插值(Position Interpolation):线性缩小位置索引,在已训练范围内插值而非外推,公式为 scaled_position[i] = i / extension_factor。可将 LLaMA 7B-65B 扩展到 32k token,1000 步微调即可,稳定性比外推高 600 倍。

使用方式

安装依赖:

pip install transformers torch
pip install einops
pip install rotary-embedding-torch
pip install flash-attn --no-build-isolation

技能提供 RoPE、ALiBi、位置插值的代码示例,以及基于 HuggingFace Transformers 的微调示例。位置插值可通过修改模型配置实现:

model.config.rope_scaling = {"type": "linear", "factor": 16.0}

或使用动态缩放:

model.config.rope_scaling = {"type": "dynamic", "factor": 16.0}

YaRN 微调示例:

git clone https://github.com/jquesnelle/yarn
cd yarn
python scripts/train.py \
    --model meta-llama/Llama-2-7b-hf \
    --scale 16 \
    --rope_theta 10000 \
    --max_length 32768 \
    --batch_size 1 \
    --gradient_accumulation 16 \
    --steps 400 \
    --learning_rate 2e-5

方法对比

方法 最大上下文 所需训练 内存 外推 最适合
RoPE 8k-32k 完整预训练 中等 良好 新模型
YaRN 32k-128k 极少(效率高 10 倍) 中等 优秀 扩展现有模型
ALiBi 无限制 完整预训练 低(-11%) 优秀 从零训练
位置插值 32k+ 极少(1k 步) 中等 差(设计使然) 快速扩展

适用场景与最佳实践

  • 从零训练新模型:选 ALiBi,外推最好、内存最低。
  • 扩展现有 RoPE 模型:选 YaRN,扩展效率最高(数据少 10 倍)。
  • 以最小算力快速扩展:选位置插值,约 1000 步。
  • 中等扩展且效率良好:选线性 RoPE 缩放,内置且简单。

缩放因子选择:保守 2.0(8k→16k)、中等 4.0(8k→32k)、激进 8.0(8k→64k)或 16.0(8k→128k)。因子越大所需微调步数越多,粗略估计为 steps_needed = 100 * scaling_factor。

微调数据应使用与目标长度匹配的长文档(如 PG-19、arXiv 论文、长对话、GitHub 仓库拼接文件),避免仅用短文档。常见陷阱:应用位置插值后不微调会导致效果差;过于激进的缩放(如直接扩到 1M token)在缺乏大量微调时不可行;建议增量扩展(8k→16k→32k→64k,每步微调)。

生产部署

推理时可加载长上下文模型(如 togethercomputer/LLaMA-2-7B-32K),使用 tokenizer 处理长文本并生成。内存优化手段包括:梯度检查点、Flash Attention 2(快 2-3 倍)、vLLM 的分页注意力(max_model_len=32768)。

限制与注意事项

  • 应用位置插值等缩放后必须微调,否则模型表现会变差。
  • 缩放因子越大,所需微调步数越多。
  • 商业或公开发布前需检查模型与数据集许可证。
  • 版本相关细节可能过时,应以所安装版本的官方文档为准。
  • 遇到大输入内存不足时,可降低序列长度、使用半精度或分块处理。
  • 若指令中的函数、标志或端点在当前安装版本中不存在,应查阅该版本文档并告知用户,不得臆造 API。

相关资源

  • RoPE 论文:https://arxiv.org/abs/2104.09864(RoFormer)
  • YaRN 论文:https://arxiv.org/abs/2309.00071
  • ALiBi 论文:https://arxiv.org/abs/2108.12409
  • 位置插值论文:https://arxiv.org/abs/2306.15595
  • HuggingFace RoPE 工具:https://github.com/huggingface/transformers/blob/main/src/transformers/modeling_rope_utils.py
  • YaRN 实现:https://github.com/jquesnelle/yarn
  • Together AI 博客:https://www.together.ai/blog/llama-2-7b-32k

技能还包含参考文档:references/rope.md(RoPE 实现与理论)、references/extension_methods.md(YaRN、ALiBi、位置插值对比)、references/fine_tuning.md(上下文扩展微调指南)、references/implementation-patterns.md(实现模式、代码示例与参数表)。