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

2024-08-23 08:36

本文主要是介绍LongWriter——从长文本语言模型中释放出10,000+字的生成能力,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

当前的长上下文大型语言模型 (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/

这篇关于LongWriter——从长文本语言模型中释放出10,000+字的生成能力的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1098885

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Go语言中json操作的实现

《Go语言中json操作的实现》本文主要介绍了Go语言中的json操作的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 一、jsOChina编程N 与 Go 类型对应关系️ 二、基本操作:编码与解码 三、结构体标签(Struc

k8s admin用户生成token方式

《k8sadmin用户生成token方式》用户使用Kubernetes1.28创建admin命名空间并部署,通过ClusterRoleBinding为jenkins用户授权集群级权限,生成并获取其t... 目录k8s admin用户生成token创建一个admin的命名空间查看k8s namespace 的

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

Linux五种IO模型的使用解读

《Linux五种IO模型的使用解读》文章系统解析了Linux的五种IO模型(阻塞、非阻塞、IO复用、信号驱动、异步),重点区分同步与异步IO的本质差异,强调同步由用户发起,异步由内核触发,通过对比各模... 目录1.IO模型简介2.五种IO模型2.1 IO模型分析方法2.2 阻塞IO2.3 非阻塞IO2.4

python语言中的常用容器(集合)示例详解

《python语言中的常用容器(集合)示例详解》Python集合是一种无序且不重复的数据容器,它可以存储任意类型的对象,包括数字、字符串、元组等,下面:本文主要介绍python语言中常用容器(集合... 目录1.核心内置容器1. 列表2. 元组3. 集合4. 冻结集合5. 字典2.collections模块

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

Vue3 如何通过json配置生成查询表单

《Vue3如何通过json配置生成查询表单》本文给大家介绍Vue3如何通过json配置生成查询表单,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录功能实现背景项目代码案例功能实现背景通过vue3实现后台管理项目一定含有表格功能,通常离不开表单

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo