unlimiformer

GitHub
1.1k 77 较难 1 次阅读 1周前MIT语言模型开发框架
AI 解读 由 AI 自动生成,仅供参考

Unlimiformer 是一款专为突破大模型输入长度限制而设计的开源工具,源自 NeurIPS 2023 的研究成果。它巧妙地为预训练的编码器 - 解码器模型(如 Llama-2 及其衍生版本)引入了基于检索的注意力机制,让模型能够处理无限长度的输入文本,例如整本书籍或超长文档,而无需修改原有的注意力数学定义或重新训练整个架构。

传统 Transformer 模型受限于固定的上下文窗口,难以处理长序列数据,往往导致信息丢失或需要复杂的截断策略。Unlimiformer 通过动态检索机制解决了这一痛点,允许模型在推理阶段直接关注完整的历史输入。其独特之处在于支持“即插即用”,既能直接提升已有模型的性能,也支持结合特定训练策略以获得最佳效果。此外,它还提供了灵活的层级控制参数,让用户可以指定从哪一层开始启用长程注意力,从而在计算效率与生成质量之间找到平衡。

这款工具非常适合 AI 研究人员、大模型开发者以及需要处理长文本任务的技术团队使用。无论是希望探索长上下文应用场景的研究者,还是试图让现有模型胜任长篇摘要、法律文档分析等任务的工程师,Unlimiformer 都提供了一个高效且低成本的解决方案。

使用场景

某法律科技团队需要让大模型基于数百页的完整案件卷宗(如《哈利·波特》全书量级的文本)生成精准的法律摘要,但受限于显存和架构瓶颈。

没有 unlimiformer 时

  • 输入长度被强制截断:模型只能读取卷宗的前几千字,导致关键证据或后续判决依据丢失,分析结果片面甚至错误。
  • 硬件成本高昂:为了强行容纳长文本,必须使用多卡并行或昂贵的超大显存 GPU,推理门槛极高。
  • 上下文连贯性差:采用滑动窗口或分段处理会切断段落间的逻辑联系,模型无法理解跨章节的复杂因果关系。
  • 需重新训练模型:若要支持长文本,通常需要对预训练模型进行耗时耗力的微调或架构修改。

使用 unlimiformer 后

  • 实现无限长度输入:直接加载整本卷宗文件,unlimiformer 通过检索机制让模型关注全文任意位置,不再遗漏任何细节。
  • 复用现有预训练模型:无需改变注意力数学定义或重新训练,即可为 Llama-2 等现有模型赋予长文本处理能力。
  • 显著降低显存占用:将索引和数据存储卸载到指定设备,基础模型仅需常规显存即可运行超长序列推理。
  • 灵活控制计算层级:通过调整 layer_begin 参数,让模型底层处理局部语境、高层关注全局信息,大幅提升摘要质量。

unlimiformer 的核心价值在于打破了 Transformer 的长度枷锁,让开发者能以低成本直接利用现有模型处理“全书级”的超长上下文任务。

运行环境要求

操作系统
  • 未说明
GPU
  • 必需 NVIDIA GPU
  • 支持多卡配置:基础模型存储在 GPU #0,Unlimiformer 的数据存储 (datastore) 和索引 (index) 可通过 `--datastore_device` 和 `--index_devices` 参数指定在其他 GPU 上
  • 显存需求取决于输入长度,处理超长输入(如整本书)或遇到 CUDA 内存不足时,建议启用 `use_datastore=True` 使用 Faiss 存储隐藏状态,或将其卸载到 CPU (`gpu_datastore=False`)
内存

未说明(但在 GPU 显存不足时可将索引/数据存储卸载至系统内存,暗示对系统 RAM 有潜在高需求)

依赖
notes1. 该工具主要用于增强预训练的 Encoder-Decoder 模型(如 BART, Llama-2),使其支持无限长度输入。 2. 推理时必须设置 `test_unlimiformer=True` 并将模型置于评估模式 (`model.eval()`)。 3. 支持 Llama-2 及其衍生模型,处理整书等超长文本时需调整 `--layer_begin` 参数(通常设为总层数的一半以上)以平衡性能和质量。 4. 训练时可选多种策略:标准微调后早停、随机编码训练、检索训练或交替训练,不同策略计算成本差异较大。 5. 若直接从 Hugging Face 下载作者提供的模型,默认可能未启用 Unlimiformer,需手动集成源码并开启相关标志。
python未说明
transformers
faiss
torch
unlimiformer hero image

快速开始

Unlimiformer:支持无限长度输入的长距离Transformer(NeurIPS 2023)

unlimiformer_diagram3_with_overlaps

这是论文的官方实现:

Amanda BertschUri AlonGraham NeubigMatthew R. GormleyUnlimiformer:支持无限长度输入的长距离Transformer(即将发表于 NeurIPS 2023

Unlimiformer 是一种在不改变注意力机制数学定义的情况下,通过检索式注意力增强预训练编码器-解码器模型的方法。 这使得任何预训练的编码器-解码器模型都能处理无限长度的输入! 另请参阅我们的 推文

Unlimiformer 可用于提升已训练模型的性能。为了获得最佳效果,可以使用 Unlimiformer 训练方法对模型进行训练。

如果您对这项工作有任何疑问,请在 GitHub 问题 中提出,或发送邮件至 abertsch@cs.cmu.edu, ualon@cs.cmu.edu

2023年10月 - Unlimiformer 将在 NeurIPS 2023 上亮相!

2023年8月 - Unlimiformer 现在支持 Llama-2(及其所有衍生模型)!

例如,要使用 Llama-2 处理极长的输入,比如一本 整本书 的内容,可以使用以下命令:

python src/run_generation.py --model_type llama --model_name_or_path meta-llama/Llama-2-13b-chat-hf \
    --prefix "<s>[INST] <<SYS>>\n 您是一位乐于助人的助手。请根据完整的指令或问题提供详细的回答。\n<</SYS>>\n\n 请总结以下书籍:" \
    --prompt example_inputs/harry_potter_full.txt \
    --suffix " [/INST]" --test_unlimiformer --fp16 --length 200 --layer_begin 16 \
    --index_devices 1 --datastore_device 1 
  • 最终的提示将是 --prefix--prompt--suffix 这三个标志内容的拼接。
  • --prompt 标志既可以是文本文件的路径(如 example_inputs/harry_potter_full.txt),也可以直接指定提示字符串。
  • 必须使用 --test_unlimiformer 标志才能启用 Unlimiformer。
  • --length 标志决定了期望的输出长度。
  • --layer_begin 标志决定了从哪一层开始应用 Unlimiformer。例如,如果设置为 --layer_begin 20,模型的前 20 层将像往常一样仅对提示中的最后 context_window_size 个标记执行标准注意力操作,而第 21 层及以后的层则会关注整个长输入。根据我们的初步实验,--layer_begin 的值应超过模型总层数的一半,且调整该值会显著影响输出质量。
  • --datastore_device N--index_devices N1 N2 N3 ... 标志指定了在哪些 GPU 上存储 Unlimiformer 的数据存储和索引(基础模型将存储在 GPU #0 上)。
  • 添加 --stream_output 标志可以使生成的标记在生成时逐个显示。

开始使用

一般说明

src 目录下的文件复制到您的源代码文件夹中。

您需要为 usage.py 中列出的 Unlimiformer 特定参数设置值——您可以将这些参数添加到平时处理超参数的地方。要使用该模型,必须设置 test_unlimiformer=True。对于数据存储的使用,模型必须处于评估模式(例如,在推理之前调用 model.eval())。

inference-example.py 提供了一个使用默认参数运行序列到 Unlimiformer 模型的最小示例。

run.py 是一个整合了 Unlimiformer 的完整训练设置示例,改编自 SLED。完整的命令行如下所示。

复现论文中的实验——命令行

要对 GovReport 数据集上的 BART-base 模型进行标准微调和评估(作为示例),可以使用以下命令:

python src/run.py \
    src/configs/training/base_training_args.json \
    src/configs/data/gov_report.json \
    --output_dir output_train_bart_base_local/ \
    --learning_rate 1e-5 \
    --model_name_or_path facebook/bart-base \
    --max_source_length 1024 \
    --eval_max_source_length 1024 --do_eval=True \
    --eval_steps 1000 --save_steps 1000 \
    --per_device_eval_batch_size 1 --per_device_train_batch_size 2 \
    --extra_metrics bertscore
  • 要在 训练 时使用 Unlimiformer(论文中称为“检索训练”),请使用:--unlimiformer_training --max_source_length 16384
    • 在这种情况下,您可能还希望在 测试/验证时使用 Unlimiformer,并同时使用:--test_unlimiformer --eval_max_source_length 999999
  • 或者,要在 训练 时使用计算成本更低的“随机编码”方法,可以使用 --random_unlimiformer_training --max_source_length 16384
  • 若要在“检索训练”和“随机编码训练”之间交替使用,可以同时使用两个标志:--unlimiformer_training --random_unlimiformer_training --max_source_length 16384

有关其他标志和选项,请参阅 usage.py

推荐设置

使用 Unlimiformer 进行评估

在评估时,我们建议使用每个设置的默认值。

使用 Unlimiformer 进行训练

对于低成本的方法,我们建议按常规方式训练,并在早停时使用 Unlimiformer。为此,设置 knn=True 并将其他所有值保持默认。

为了获得最佳性能,有三种高成本的训练设置。哪种设置最好取决于具体的数据集。

  1. 设置 random_unlimiformer_training=True:这是论文中的“随机编码训练”设置。
  2. 设置 unlimiformer_training=True:这是论文中的“检索训练”设置。
  3. 同时设置 random_unlimiformer_training=Trueunlimiformer_training=True:这是论文中的“交替训练”设置。

有关相对训练成本的更详细分解,请参阅论文中的表 5。

处理超大输入的技巧

对于训练

  • 您可能需要在训练时截断输入,例如将其限制为 8k 或 16k 个标记。而在评估时则可以使用完整的输入。
  • 您还可以尝试将输入分割成 16k 标记的块,并将每一块作为单独的示例进行训练。

用于评估(包括早停)

  • 如果您经常遇到 CUDA 显存不足的问题,请设置 use_datastore=True,以使用 Faiss 数据存储来保存隐藏状态。
  • 如果问题仍然存在,请将 gpu_datastore=Falsegpu_index=False,但请注意,这会降低性能。

训练好的模型

论文中提到的以下模型已在 Hugging Face 上发布。请注意,您必须将 Unlimiformer 特有的文件添加到您的仓库,并通过 test_unlimiformer=True 来加载这些模型。如果您从 Hugging Face 下载这些模型,默认情况下它们可能不会使用 Unlimiformer!

表3:低成本训练方法

数据集 方法 Hugging Face 链接
GovReport 基线:BART-base abertsch/bart-base-govreport
GovReport BART-base + Unlimiformer 早停 abertsch/unlimiformer-bart-govreport-earlyk
SummScreen 基线:BART-base abertsch/bart-base-summscreen
SummScreen BART-base + Unlimiformer 早停 abertsch/unlimiformer-bart-summscreen-earlyk

表4:长距离训练方法

数据集 方法 Hugging Face 链接
GovReport BART + Unlimiformer(交替训练) abertsch/unlimiformer-bart-govreport-alternating
SummScreen BART + Unlimiformer(检索训练) abertsch/unlimiformer-bart-summscreen-retrieval

表5:BookSum

数据集 方法 Hugging Face 链接
BookSum 基线:BART-base abertsch/bart-base-booksum
BookSum BART-base + Unlimiformer 早停 abertsch/unlimiformer-bart-booksum-earlyk
BookSum BART-base + Unlimiformer(随机编码训练) abertsch/unlimiformer-bart-booksum-random-encoding
BookSum BART-base + Unlimiformer(交替训练) abertsch/unlimiformer-bart-booksum-alternating

结果

image image image

引用

如果您使用了我们的方法或模型,请引用我们的论文

@article{bertsch2023unlimiformer,
  title={Unlimiformer: Long-Range Transformers with Unlimited Length Input},
  author={Bertsch, Amanda and Alon, Uri and Neubig, Graham and Gormley, Matthew R},
  journal={arXiv preprint arXiv:2305.01625},
  year={2023}
}

常见问题

相似工具推荐

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 真正成长为懂上

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

ComfyUI

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

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

gemini-cli

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

100.8k|★★☆☆☆|1周前
插件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周前
插件开发框架