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

相关文章

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O