LongWriter——从长文本语言模型中释放出10,000+字的生成能力

embedded/2024/9/24 4:14:31/

概述

当前的长上下文大型语言模型 (LLM) 可以处理多达 100,000 个词的输入,但它们很难生成超过 2,000 个词的输出。受控实验表明,该模型的有效生成长度本质上受到监督微调(SFT) 期间看到的示例的限制。换句话说,这种输出限制源于现有 SFT 数据集中长输出示例的稀缺性。

长上下文LLM 的最新进展推动了内存容量显着扩展的模型的开发,能够处理长度超过100,000 个标记的历史记录。然而,尽管它们能够处理大量输入,但当前的长上下文LLM 很难生成同样长的输出。

为了探索这一限制,LongWriter使用多个需要不同长度响应的查询来探测最先进的长上下文模型的最大输出长度,例如“写一篇关于罗马帝国历史的 10,000 字的文章”。结果表明,所有模型始终无法产生超过 2,000 字的输出。同时,对用户交互日志的分析显示,超过 1% 的用户提示明确要求输出超过此限制,这凸显了当前研究迫切需要克服这一限制。

为了解决这个问题,LongWriter 引入了AgentWrite,这是一种基于代理的管道,可将超长生成任务分解为子任务,使现成的 LLM 能够生成超过 20,000 个单词的连贯输出。利用 AgentWrite,LongWriter 构建了 LongWriter-6k,这是一个包含 6,000 个 SFT 数据样本的数据集,输出长度从 2k 到 32k 个单词不等。通过将此数据集纳入模型训练,LongWriter 成功地将现有模型的输出长度扩展到 10,000 个单词以上,同时保持了输出质量。

LongWriter 还开发了 LongBench-Write,这是一个用于评估超长生成能力的综合基准。通过 DPO 进一步改进的 9B 参数模型在此基准上实现了最先进的性能,甚至超越了更大的专有模型。

在这里插入图片描述

LongWriter:10,000+ 单词生成框架

长上下文大型语言模型(LLM) 的最新进展导致了内存容量显着增加的模型的创建,这些模型能够处理超过100,000 个标记的历史记录。尽管能够处理大量输入,但当前的长上下文模型仍难以生成相当长度的输出。为了研究这一限制,LongWriter 通过各种需要不同响应长度的查询来检查最先进的长上下文模型的最大输出长度,例如“写一篇10,000 字的关于罗马帝国历史的文章”。根据调查结果,LongWriter 观察到所有模型都无法生成超过2,000 字的输出。此外,对用户交互日志的分析表明,超过1% 的用户提示特别要求超出此限制的输出,凸显了当前研究迫切需要解决这一问题。
在这里插入图片描述
LongWriter 的研究揭示了一个关键见解:输出长度的限制主要源于监督微调 (SFT) 数据集的特性。具体而言,LongWriter 发现,尽管模型在预训练阶段接触了更长的序列,但其最大生成长度实际上受到其 SFT 数据集中存在的输出长度上限的限制。这一发现解释了当前模型中普遍存在的 2,000 字生成限制,因为现有的 SFT 数据集很少包含超过此长度的示例。此外,由于许多数据集都是从最先进的 LLM 中提炼出来的,因此它们也从其源模型继承了输出长度限制。

为了解决这一限制,LongWriter 引入了 AgentWrite,这是一种基于代理的新型管道,旨在利用现成的 LLM 自动构建扩展的连贯输出。AgentWrite 分为两个阶段:首先,它根据用户的输入制定详细的写作计划,概述每个段落的结构和目标字数。然后,按照这个计划,它会提示模型按顺序生成每个段落的内容。LongWriter 的实验证实,AgentWrite 可以生成多达 20,000 个单词的高质量连贯输出。

在 AgentWrite 管道的基础上,LongWriter 利用 GPT-4o 生成了 6,000 个长输出 SFT 数据,命名为 LongWriter-6k,并将这些数据添加到训练现有模型中。值得注意的是,LongWriter-6k 成功释放了模型生成长度超过 10,000 字的结构良好的输出的能力。为了严格评估这种方法的有效性,LongWriter 开发了 LongBench-Write 基准,其中包含一组多样化的用户写作指令,输出长度规格范围从 0-500 字、500-2,000 字、2,000-4,000 字和超过 4,000 字。在 LongBench-Write 上的评估表明,LongWriter 的 9B 大小模型达到了最先进的性能,甚至与更大的专有模型相比也是如此。LongWriter 进一步构建偏好数据并使用 DPO 帮助模型更好地遵循长写作指令并生成更高质量的书面内容,这也已通过实验证明是有效的。

总而言之,LongWriter 的工作做出了以下新颖的贡献:

  • **生成长度限制分析:**LongWriter 确定了限制当前长上下文 LLM 输出长度的主要因素,即 SFT 数据中对输出长度的限制。
  • **AgentWrite:**为了克服这一限制,LongWriter 提出了 AgentWrite,它使用分而治之的方法,利用现成的 LLM 自动构建具有超长输出的 SFT 数据。使用此方法,LongWriter 构建了 LongWriter-6k 数据集。
  • **扩展当前 LLM 的输出窗口大小:**LongWriter 将 LongWriter-6k 数据集整合到其 SFT 数据中,成功将现有模型的输出窗口大小扩展至 10,000 多个字,且不影响输出质量。LongWriter 表明 DPO 进一步增强了模型的长文本写作能力。

AgentWrite:自动数据构建

为了利用现成的 LLM 自动生成输出较长的 SFT 数据,LongWriter 设计了 ​​AgentWrite,一种分而治之式的代理管道。AgentWrite 首先将长篇写作任务分解为多个子任务,每个子任务仅要求模型写一段话。然后模型按顺序执行这些子任务,LongWriter 将子任务的输出连接起来以获得最终的长篇输出。这种使用 LLM 代理将复杂任务分解为多个子任务的方法已经应用于问题解决、软件开发和模型评估等各个领域。LongWriter 的工作首次探索了集成规划以使模型能够完成复杂的长篇写作任务。下面详细介绍了 AgentWrite 的每个步骤。

在这里插入图片描述

第一步:计划

LongWriter 受到人类作家思维过程的启发,人类作家通常首先为长篇写作任务制定一个总体计划,LongWriter 利用 LLM 的规划功能,在给定写作指示的情况下输出这样的写作大纲。该计划包括每个段落的主要内容和字数要求。LongWriter 使用的提示如下:

“I need you to help me break down the following long-form writing instruction into multiple subtasks. Each subtask will guide the writing of one paragraph in the essay and should include the main points and word count requirements for that paragraph. The writing instruction is as follows: {User Instruction}. Please break it down in the following format, with each subtask taking up one line:

Paragraph 1 – Main Point: [Describe the main point of the paragraph, in detail] – Word Count: [Word count requirement, e.g., 400 words]
Paragraph 2 – Main Point: [Describe the main point of the paragraph, in detail] – Word Count: [Word count requirement, e.g. 1000 words].

Make sure that each subtask is clear and specific, and that all subtasks cover the entire content of the writing instruction. Do not split the subtasks too finely; each subtask’s paragraph should be no less than 200 words and no more than 1000 words. Do not output any other content.”

第二步:书写

在获得步骤 I 中的写作计划后,LongWriter 串行调用 LLM 完成每个子任务,逐段生成写作内容。为了保证输出的连贯性,在 LongWriter 调用模型生成第 n 段时,会将之前生成的 n-1 段也一并输入,让模型根据已有的写作历史继续写下一段。虽然这种串行方式无法并行调用模型同时完成多个子任务,输入长度也会变长,但 LongWriter 在验证中表明,这种方式得到的写作整体连贯性和质量远优于并行生成的输出。LongWriter 使用的提示为:

Writing instruction:
{User Instruction}
Writing steps:
{The writing plan generated in Step I}
Already written text:
{Previous generated (n-1) paragraphs}

验证

LongWriter 在两个长篇写作数据集上测试了所提出的 AgentWrite 方法的生成长度和质量。第一个数据集 LongWrite-Ruler 用于精确测量该方法可以提供的输出长度。第二个数据集 LongBench-Write 主要用于评估模型生成的内容在长度和写作质量方面与用户指示的匹配程度。

LongBench-Write :为了评估模型在更多元的长篇写作指令上的表现,LongWriter 收集了 120 条不同的用户写作提示,其中 60 条为中文,60 条为英文。为了更好地评估模型的输出长度是否符合用户要求,LongWriter 确保这些指令都包含明确的字数要求。这些指令根据字数要求分为 0-500 字、500-2,000 字、2,000-4,000 字和 4,000 字以上四个子集。此外,指令根据输出类型分为文学与创意写作、学术与专著、科普、实用写作、新闻报道、社区论坛和教育培训七大类。

在评估过程中,LongWriter 采用两个指标:一个用于对输出长度进行评分,另一个用于对输出质量进行评分。模型的输出长度根据其与说明中指定的要求的接近程度进行评分。对于输出质量,LongWriter 使用 LLM-as-a-judge 方法,选择最先进的GPT-4o模型从六个维度对输出进行评分:相关性、准确性、连贯性、清晰度、广度和深度以及阅读体验。最终得分是通过对长度得分和质量得分取平均值来计算的。

验证结果:LongWriter 在 LongWrite-Ruler 上展示了输出长度测量结果,发现 AgentWrite 成功将 GPT-4o 的输出长度从最大 2k 字扩展到大约 20k 字。LongWriter 还在 LongBench-Write 上评估了输出质量和对所需输出长度的遵守情况,表明在评估 AgentWrite 的性能时,GPT-4o 可以成功完成长度在 2,000 字以下的输出任务。
在这里插入图片描述

监督微调

LongWriter 基于最新的两个开源模型 GLM-4-9B 和 Llama-3.1-8B 进行训练。这两个模型都是基础模型,支持最大 128k token 的上下文窗口,天然适合在长输出上进行训练。为了提高训练效率,LongWriter 采用了带损失权重的打包训练。在这两个模型上训练后,得到了两个模型:LongWriter-9B(简称 GLM-4-9B-LongWriter)和 LongWriter-8B(简称 Llama-3.1-8B-LongWriter)。

同时,LongWriter 注意到,如果按序列平均损失,即取批次内每个序列的平均损失的平均值,则长输出数据中每个目标 token 对损失的贡献将明显小于短输出数据。在 LongWriter 的实验中,还发现这会导致模型在长输出任务上的表现不佳。因此,LongWriter 选择了一种按 token 平均损失的损失加权策略,其中损失被计算为该批次内所有目标 token 损失的平均值。

所有模型均使用具有 8xH800 80G GPU 和 DeepSpeed+ZeRO3+CPU 卸载的节点进行训练。LongWriter 使用批大小为 8、学习率为 1e-5 和打包长度为 32k。模型训练了 4 个 epoch,大约需要 2,500-3,000 步。

对齐(DPO)

为了进一步提高模型的输出质量并增强其遵循指令长度约束的能力,LongWriter 在监督微调的 LongWriter-9B 模型上执行直接偏好优化 (DPO)。DPO 数据来自 GLM-4 的聊天 DPO 数据(约 50k 个条目)。此外,LongWriter 构建了 4k 对专门针对长格式写作指令的数据。对于每个写作指令,LongWriter 从 LongWriter-9B 中抽取 4 个输出,并按照特定方法对这些输出进行评分。长度遵循分数也会在计算时合并。然后选择得分最高的输出作为正样本,并从其余三个输出中随机选择一个作为负样本。

最终的模型 LongWriter-9B-DPO 在上述数据混合上进行了 250 步训练。LongWriter 遵循 DPO 训练的特定配方。

LongWriter:实验和结果

LongWriter 在 LongBench-Writer 上评估了 4 个专有模型和 5 个开源模型,以及经过训练的 LongWriter 模型。据 LongWriter 所知,Suri-IORPO 是唯一一个也适用于长文本生成的先前模型。它基于 Mistral-7B-Instruct-v0.2 使用 LoRA 进行训练。与 LongWrite-Ruler 上的评估设置一致,LongWriter 将输出温度设置为 0.5,并将模型的生成最大令牌参数配置为其 API 调用允许的最大值。对于开源模型,它设置为 32,768。
在这里插入图片描述

大多数先前的模型无法满足超过 2,000 字的长度要求,而 LongWriter 模型始终能够对此类提示提供更长、更丰富的响应。

观察各个要求长度范围内提示的输出长度得分 SlS_lSl​,LongWriter 发现之前的模型在 [2k, 4k) 范围内的提示上普遍表现不佳(得分低于 70),只有 Claude 3.5 Sonnet 取得了不错的分数。对于 [4k, 20k) 范围内的提示,几乎所有之前的模型都完全无法达到目标输出长度,甚至得分为 0(即所有输出长度均小于要求长度的三分之一)。通过添加来自 LongWriter-6k 的训练数据,LongWriter 训练后的模型可以有效达到要求的输出长度,同时保持良好的质量,正如 [2k, 20k) 范围内的得分和散点图所表明的那样。
在这里插入图片描述

DPO有效地提高了模型的输出质量和满足长生成中长度要求的能力。

通过对比 LongWriter-9B 和 LongWriter9B-DPO 的得分,我们发现 DPO 显著提升了 Sl (+4%) 和 Sq (+3%) 的得分,并且这种提升在所有范围内都是一致的。这表明在长代场景下,DPO 仍然有助于提升模型的输出质量,能够更好地将模型的输出长度与请求的长度对齐。后一个结论最近也在 Yuan 等人 (2024) 的较短代中观察到。我们还手动注释了 GPT-4o 和三个 longwriter 模型在 LongBench-Write 中的输出结果的成对胜负,并在图 9 中将结果可视化。我们可以看到,在 58% 的情况下,人类更喜欢 DPO 训练的模型而不是 LongWriter-9B。此外,尽管参数较少,但 LongWriter-9B-DPO 与 GPT-4o 打成平手。
在这里插入图片描述

LongWriter 模型的输出长度限制扩展到 10k 到 20k 字之间,而需要更多具有长输出的数据来支持更长的输出。

继 LongWrite-Ruler 测试之后,我们还展示了 LongWriter 模型的 LongWrite-Ruler 测试结果。结果表明,它们的最大生成长度在 10k-20k 字之间。缺乏具有更长输出的 SFT 数据可能是阻止模型实现更长输出长度的主要原因。

总结

在本文中,我们讨论了 LongWriter,这是一个基于代理的管道,它将超长生成任务分解为子任务,确定了当前 LLM 的 2,000 字生成限制,并建议通过在对齐期间添加长输出数据来增加其输出窗口大小。为了自动构建长输出数据,LongWriter 开发了 AgentWrite,这是一个基于代理的管道,它使用现成的 LLM 创建扩展的、连贯的输出。LongWriter 使用构建的 LongWriter-6k 成功地将当前 LLM 的输出窗口大小扩展到 10,000 字以上。对训练数据的广泛消融研究证明了这种方法的有效性。对于未来的工作,LongWriter 建议以下三个方向:1. 扩展 AgentWrite 框架以构建具有更长输出的数据,以进一步扩展 LLM 的输出窗口大小。2. 改进 AgentWrite 框架以获得更高质量的长输出数据。3. 更长的模型输出给推理效率带来了挑战。已经提出了几种方法来提高推理效率。值得研究这些方法如何在不影响生成质量的情况下确保提高模型效率。

原文地址:https://www.unite.ai/longwriter-unleashing-10000-word-generation-from-long-context-llms/


http://www.ppmy.cn/embedded/101817.html

相关文章

【网络编程】第十一章 数据链路层 - 以太网(MAC+MTU+ARP+MSS+RARP)

文章目录 重点链路层以太网MAC帧格式碰撞域MAC地址MAC地址和IP地址 MTU-最大传输单元MTU 对 IP 的影响MTU 对 UDP 的影响MTU 对 TCP 的影响-MSS ARP协议ARP协议的工作流程ARP请求的过程ARP应答的过程 ARP 缓存中间人攻击 RARP协议 重点 数据链路层的作用:两个设备 …

【ORACLE】decode() 函数

在Oracle数据库中,DECODE 函数是一个非常有用的条件表达式,它类似于其他编程语言中的 switch-case 或 if-else 语句。DECODE 函数可以简化查询中的条件逻辑,使得SQL语句更加简洁和易于理解。 基本语法 DECODE 函数的基本语法如下&#xff1…

Java将数据导出为Excel文件

使用Apache POI生成基本Excel Apache POI是一个强大的Java库,用来处理Microsoft Office文件。对于Excel文件(.xls和.xlsx)处理,提供有HSSF(.xls)和XSSF(.xlsx)等API。 import org.…

一起搭WPF之列表数据绑定

一起搭WPF之列表数据绑定 1 前言2 数据绑定2.1 前端2.2 后端实现2.2.1 界面后台2.2.2 模型与逻辑 3 问题3.2 解决 总结 1 前言 之前已经简单介绍了列表的大致设计,在设计完列表界面后,我们可以开展列表的数据绑定,在前端显示我们的数据&…

基于x86 平台opencv的图像采集和seetaface6的静默活体功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.3 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的静默活体功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的静默活体模块从而实现…

xss-labs靶场通关详解(11-15关)

第11关 referer 进行抓包 添加referer:click me!" type"button" οnmοuseοver"alert(/xss/)进行放包 第12关 进行抓包 修改User Agent:click me!" type"button" οnmοuseοver"alert(/xss/)进行放包 第13关 抓包 修改C…

Shader 透明相关

1、设置深度写入与渲染队列 深度写入 深度写入默认是开启,需要通过渲染状态中的 ZWrite off 指令主动关闭深度写入 当我们把它写在Pass渲染通道中时,它只会影响该Pass 若我们把它写在SubShader语句块中,它将影响其中的所有Pass …

Redis中的缓存穿透、缓存击穿、缓存雪崩(面试版)

缓存穿透 缓存穿透:查询一个不存在的数据,在mysql数据库中查询不到数据也不会写入缓存,导致每次请求都查询数据库,增加数据库负载。 解决办法: 1、缓存空值:将数据库中不存在的结果(例如空值)也缓存起来&#xff0c…