Long-Context

GitHub
601 46 较难 1 次阅读 2周前Apache-2.0语言模型开发框架
AI 解读 由 AI 自动生成,仅供参考

Long-Context 是 Abacus.AI 开源的一个项目,旨在突破大型语言模型(LLM)原有的上下文长度限制。它主要解决了传统模型(如基于 RoPE 编码的 Llama)在处理超过预训练长度(例如 2048 token)的文本时,信息检索能力急剧下降的难题。

该项目提供了一套完整的代码库、评估脚本及基准测试任务,帮助开发者复现实验并构建支持长上下文的模型。通过实验发现,简单的线性缩放结合指令微调(IFT)是目前最稳健的扩展方案。项目方甚至开源了经过优化的模型权重(如 Scale 16 版本),使其能有效处理长达 16k 至 24k token 的上下文,远超理论计算值。此外,项目还探索了傅里叶基截断、随机化位置向量以及 xPos 衰减机制等多种前沿技术路径。

Long-Context 非常适合 AI 研究人员、大模型开发者以及需要处理长文档分析、复杂问答任务的技术团队使用。它不仅提供了可落地的模型权重,还分享了详尽的实验数据与训练策略,是社区探索长文本理解能力的重要参考资源。

使用场景

某法律科技团队正在开发一款智能合同审查助手,需要让模型一次性读取并分析长达数万字的复杂并购协议及附属条款。

没有 Long-Context 时

  • 信息割裂严重:由于原生 Llama 模型仅支持 2048 上下文,必须将长文档强行切割成碎片,导致跨章节的条款关联(如定义部分与违约责任部分)无法被模型同时捕捉。
  • 关键细节丢失:在分段处理中,位于文档中间或末尾的关键限制性条款极易被忽略,造成“大海捞针”式的检索失败,遗漏重大法律风险。
  • 逻辑连贯性差:模型无法理解全文脉络,只能基于局部片段生成回答,导致输出的审查意见前后矛盾或缺乏整体视角。
  • 工程复杂度高:开发人员需编写复杂的滑动窗口算法和外部向量数据库检索逻辑来弥补模型短板,大幅增加了系统维护成本。

使用 Long-Context 后

  • 全篇完整洞察:借助 Long-Context 的线性扩展技术(如 Scale 16 模型),可直接输入长达 16k-24k 的完整合同,模型能精准定位并关联分散在文档首尾的定义与条款。
  • 检索精度飞跃:基于 RedPajama 和 Vicuna 数据集的微调显著提升了长文本下的信息检索能力,确保即使是在两万字后的细微免责条款也能被准确识别。
  • 推理逻辑严密:模型在保持全局视野的基础上进行分析,生成的审查报告逻辑连贯,能够综合全文信息判断潜在的法律冲突。
  • 架构极简高效:无需再构建繁琐的分段检索流水线,直接调用扩展后的模型即可处理超长任务,显著降低了开发难度和延迟。

Long-Context 通过突破原生位置编码限制,让大模型真正具备了“过目不忘”的长文档深度理解与分析能力。

运行环境要求

GPU

未说明

内存

未说明

依赖
notesREADME 主要介绍了扩展 LLM 上下文长度的实验方法、评估数据集(如 WikiQA)及结果,并未提供具体的安装指南或运行环境配置要求。文中提到的模型基于 Llama-13b,实际运行需参考 Llama 或 Vicuna 模型的通用硬件需求(通常需要高性能 NVIDIA GPU 和大显存)。
python未说明
Long-Context hero image

快速开始

扩展LLM上下文长度

如何为Transformer模型编码位置信息,一直是LLM架构中的关键组成部分之一。

近来,我们以及社区中的其他研究者都对这样一个问题颇感兴趣:能否将LLM的上下文长度扩展到更长?

我们针对Llama模型的不同上下文长度扩展方案进行了大量实验。Llama模型在预训练时采用RoPE(旋转位置嵌入)编码,其上下文长度限制为2048。在此,我们分享部分实验结果以及相应的训练和评估脚本,希望能对社区有所帮助。对于表现最佳的两个模型——分别以缩放因子4和16进行线性缩放并结合指令微调——我们也公开了模型权重,供有兴趣的研究者使用或进一步测试。我们认为,缩放因子16的模型在实际任务中能够较好地处理高达16k的上下文长度,甚至可能在约20–24k的上下文长度上也有不错的表现。

缩放因子16的模型

技术论文

概述

我们开展了多种实验,试图扩展模型的上下文长度。首先,我们直接以零样本方式使用基础Llama模型。正如预期,该模型在2048个token的上下文长度内表现良好,但超过此长度后性能迅速下降。

接下来,我们尝试了微调方法,在RedPajama数据集上以4096个token的上下文长度对模型进行训练。这使得模型在4096个token的上下文长度内性能有所提升,然而再往上调时效果便不再明显。

另一种扩展上下文长度的方法是修改RoPE编码。为此,我们尝试了多种思路:

  • 线性缩放,如kaiokendev.github.io所述。
  • 对RoPE的傅里叶基底按幂次缩放,使低频成分比高频成分被拉伸得更多。
  • 对傅里叶基底进行截断。我们的想法是让模型只关注那些足够快、在训练过程中至少能完成一个完整周期的频率;而更慢的频率则置为0(相当于完全不进行旋转,即在所有上下文长度上都同等重要)。
  • 随机化位置向量。

特别地,我们将上述方法与在RedPajama数据集上的微调以及基于Vicuna数据集的指令微调相结合,这一组合取得了最为显著的效果。

最后,我们实现了并尝试了xPos论文中提出的方法。该方法通过引入随距离衰减的幅度惩罚项,使得傅里叶基底中的高频成分在长距离下影响较小,而低频成分则影响较大(详见我们的博客文章中的相似度热图)。

重点结果

我们最重要的发现之一是:不同的评估方法或任务会导致对上述方法的排名有所不同。这一点将在下文中详细说明。

尽管如此,我们仍得出以下几点普遍观察:

  • 线性插值或缩放似乎是提升模型上下文长度最稳健的方法。
  • 使用线性缩放因子N并不一定意味着模型的上下文长度会相应地增加N倍。例如,我们的缩放因子16实验通常在上下文长度达到16000左右时性能便开始下降,而非32000(约2048×16)。我们已规划了一些改进这一现象的方案,将在后续工作中实现。
  • 截断和随机化虽然在困惑度指标上表现优异,但在检索任务中的表现却相对较差。
  • 基于Vicuna数据集的指令微调能够显著提升基础模型在自身可处理长度范围内的检索准确率,但对于超出其能力范围的长度,则无法“修复”模型的不足。

评估任务

在评估中,我们使用了两个不同的数据集:

  • LMSys 数据集(“lines”任务),用于在上下文中定位子字符串;
  • 我们的开源开放书问答数据集 WikiQA,该数据集基于其他开源的基础问答数据集构建。

此外,我们还观察了训练集和验证集在以下过程中的对数损失:

对于 LMSys 任务,我们生成了新的、更长的测试用例,上下文长度最长可达约 25000 个 token,超过了原始数据集中 16000 个 token 的上下文测试用例。

WikiQA 任务是根据维基百科文档中提供的信息回答问题。我们在 Google Natural Questions 中的短答案格式数据基础上构建了我们的问答任务。该任务以文档和问题的形式呈现。我们确保问题的答案是一个简短的答案,要么是一个单独的词,要么是从文档中直接摘录的一小句话。通过这种结构化的任务设计,我们可以精确地确定大语言模型本应在上下文中“查找”答案的具体位置,从而通过将答案放置在不同位置来有效评估扩展后的各种上下文长度。

我们选取了大型维基百科文档,并对其进行截断,得到同一文档的多个版本,其大小介于 2000 到 16000 个 token 之间。对于每个文档大小,我们还准备了多个版本,将问题和答案文本放置在文档的不同位置——例如,是在文档的前 10%、主体部分还是最后 10%。通过提供同一文档的多个版本,我们能够在不同模型规模之间以及在同一模型的不同上下文位置上进行全面而公平的评估,因为我们本质上始终在询问相同的信息。

基于维基百科的数据集可能存在一个问题:模型可能会从其预训练语料库中正确回答问题,而不是从给定的上下文中获取答案。为了解决这个问题,我们创建了一个“修改版”数据集。该数据集仅包含答案为数字的问题。在此,我们将答案以及文档中所有出现该答案的地方都替换为一个不同的数字。这样可以确保如果大语言模型仅仅依赖其预训练语料库进行回忆,它就会给出错误的答案。具体的修改方式如下:

  • 如果答案是年份(通常在 1000 到 2100 年之间),我们会将其改为原值上下浮动 10 年内的一个随机值。我们将年份视为特殊情况,以避免因打乱时间顺序而导致对文档的解读变得荒谬。
  • 如果答案是其他数字,则将其替换为具有相同位数的另一个随机数字。

我们将原始的问答任务称为 自由形式问答 (FFQA),而修改后的任务则称为 修改版数字问答 (AltQA)

我们通过测量“存在准确率”,即模型生成的答案中是否包含作为子字符串的答案,来评估这两个版本的问答任务中每个示例的成功情况。要对我们的模型在 WikiQA 上运行推理并计算指标,请参阅位于 此处run_inference_WikiQA.pycompute_metrics_WikiQA.ipynb

我们已在 HuggingFace 上发布了这些数据集,以便其他人也能用于开展自己的长上下文实验。

结果

LMSys 评估

关于以下结果的一个总体说明是:作者认为,在这项任务上微小的准确率差异并不能很好地反映模型排名的质量。因此,在解释结果时,我们主要关注整体趋势。

另外,作为基准,标准的 Llama-13b 模型只有在上下文长度不超过 2048 个 token 时才具有非零准确率(经过 Vicuna 指令微调的版本也是如此)。

不同缩放方法的比较

不同缩放方法的比较

上图比较了不同的缩放方法。“Scale”表示使用指定的缩放值进行线性插值。我们看到,缩放系数为 16 的线性插值是唯一一种在上下文长度超过 9000 个 token 时仍能获得非零准确率的方法。然而,这种方法似乎会牺牲一些较短上下文长度下的准确率。

缩放指数为 0.5 的方法在较短上下文长度下表现尤为出色,但随着上下文长度的增加,其准确率下降得非常快。

值得注意的是,缩放系数为 16 的方法并没有像预期那样广泛适用。直观来看,人们可能会认为,既然缩放系数为 4 的方法在上下文长度达到 8192 个 token 时仍有非零准确率(这也在情理之中,因为原始上下文长度为 2048 个 token,而 8192 等于 2048 乘以 4;超过这个长度后,模型会遇到前所未有的键与查询之间的相对距离),那么缩放系数为 16 的方法应该能在上下文长度达到 2048 乘以 16,即 32768 个 token 时仍然保持非零准确率。

IFT(指令微调)的影响

IFT 的影响

上图展示了通过 LoRA 使用 Vicuna 指令集进行微调所带来的 IFT 效果。我们看到,IFT 确实能够小幅但不可忽视地提升准确率。然而,这并不足以改变准确率曲线的整体形状,也无法扩大模型在该任务上能够达到非零准确率的上下文长度范围。

在不同于训练时的缩放系数下进行零样本评估

在不同于训练时的缩放系数下进行零样本评估

上图展示了在评估时尝试使用与模型训练时不同的缩放系数(用于线性插值)的各种实验。绿色曲线表示对一个基础模型(在 2048 个 token 的上下文上训练)应用某个缩放系数的情况。这种方法确实将非零准确率的范围从 2048 个 token 扩展到了 4096 个 token,但整个范围内的准确率都很低。不过,总体而言,一旦模型已经使用大于 0 的缩放系数进行训练,它似乎可以在评估时以零样本的方式很好地适应更大的缩放系数——从而大幅提高其能够处理的连贯上下文长度范围(例如,对比上方两张图中“训练=4,评估=8”在 16000 个 token 的上下文长度下仍为非零,而在任何超过 8000 个 token 的情况下均为零)。然而,这样做也会导致准确率下降,尤其是在“训练=16,评估=32”的情况下。

“训练=16,评估=12”的运行是我们所见过的非零准确率持续时间最长的案例。它在约 20000 个 token 的上下文长度下仍保持非零分数。

WikiQA 评估

在下表中,两个模型均以 scale=4 的尺度进行评估。然而,“无缩放”模型并未在 scale > 1 的情况下进行微调(即未经历任何训练)。而 scale=4 的模型则确实在该扩展尺度下接受了微调。

存在准确性:

上下文长度 在 FFQA 上使用 scale=4 进行 IFT 在 FFQA 上无缩放进行 IFT 在 AltQA 上使用 scale=4 进行 IFT 在 AltQA 上无缩放进行 IFT
2048 0.3233 0.2217 0.7281 0.2982
4096 0.3783 0.2467 0.7018 0.2829
8192 0.4434 0.2406 0.6582 0.2401
16384 0.3933 0.0 0.5363 0.0

注:对于 16k 的上下文长度,我们在推理时使用了 8 倍的缩放因子。这使得原始的 2k 上下文能够扩展到 2*8=16k。值得注意的是,尽管缩放后的模型是以 4 倍的缩放因子进行训练的,但它在推理时仍能零样本地插值到 16k(即 8 倍的缩放),且性能损失不大。然而,这一点在未缩放的模型中并不成立,从 16k 数据点上准确率降至 0 即可看出。这表明我们的缩放和上下文长度插值方法确实有效。

输入上下文长度统计

如前所述,我们对文档进行了截断和修改,以生成不同版本的 WikiQA 数据集。每个版本旨在充分测试模型在特定上下文长度下的表现,具体长度由版本名称指示。

FFQA
平均上下文长度 最大上下文长度
ffqa_2k.json 1936.71 3228
ffqa_4k.json 3805.06 5793
ffqa_8k.json 7598.98 9963
ffqa_16k.json 15000.54 16178
AltQA
平均上下文长度 最大上下文长度
altqa_2k.json 1953.73 2698
altqa_4k.json 3737.39 5172
altqa_8k.json 7481.37 9619
altqa_16k.json 15013.44 16173

性能对不断增加的上下文长度具有鲁棒性

性能对不断增加的上下文长度具有鲁棒性

如上所示,我们在 WikiQA 任务上采用的插值嵌入微调技术,似乎能够生成对输入上下文长度不断增加具有鲁棒性的优秀模型。我们在该任务的两个版本上都展示了这一点。由于我们是以 4 倍的上下文长度进行微调的,因此预计准确率不会在输入大小达到 4*2048=8192 之前下降。即便超过这个限制,我们仍然可以看到一些合理的性能。这似乎是 RoPE 嵌入的周期性特征所致,它使得某些特性可以外推到超出缩放上下文所设定的限制之外的位置。

缩放上下文的影响

缩放上下文对 FFQA 的影响

缩放上下文对 AltQA 的影响

我们对比了使用和不使用缩放上下文进行指令微调的模型,结果表明,使用缩放上下文进行 IFT 能显著提升模型性能。需要注意的是,对于这两个模型,我们在评估时仍然使用了缩放上下文(scale=4)。有趣的是,即使是在零样本情况下,缩放后的 RoPE 嵌入也能给出非平凡的准确率。然而,显式地对嵌入进行微调确实带来了可观的收益。我们看到,在 FFQA 上几乎实现了 2 倍的提升,而在 AltQA 上则实现了 2.5 倍的提升,且这一优势在所有由缩放上下文因子插值出的位置上都得以体现。

信息的位置

损失曲线

我们在概述中描述的所有实验中都训练了模型。但并非所有实验都显示出进行全面评估的前景。 部分实验因损失曲线表现不佳而被放弃。在某些情况下,我们还发现实验结果并不总是与训练过程中观察到的损失一致。

以下图片展示了我们运行的部分实验的曲线:

alt text

alt text

alt text

例如,XPOS 的损失从未收敛到与其他运行中观察到的损失水平。起初,我们怀疑是 fp16 的精度不足以处理 XPOS 系数。于是我们将实现调整为使用 fp32 来进行核心注意力点积计算。这确实改善了收敛性,但仍不足以使损失与其它模型持平。我们的假设是,XPOS 与基础位置嵌入差异过大,难以在其基础上进行微调。这有些令人意外,因为 XPOS 实际上只是带有相对差异函数缩放因子的 RoPE。我们曾启动过一项尚未完成的实验,即从缩放因子 1.0 开始,逐步通过多次迭代过渡到 XPOS 函数。

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|1周前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|1周前
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

154.3k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

108.3k|★★☆☆☆|3天前
开发框架图像Agent

gemini-cli

gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。

100.8k|★★☆☆☆|4天前
插件Agent图像

markitdown

MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器

93.4k|★★☆☆☆|1周前
插件开发框架