1. 为什么要研究 LongWriter
随着大语言模型的发展,越来越多的大语言模型都具备了长上下文能力,甚至有的达到了100万token。但是,相较于大家关注的海量输入,大模型的生成长篇幅的内容时就显得力不从心了。
比如,如上图,作者在各种模型上要求生成超过2000字的内容时,基本上都没有成功。随着提示词中要求输出的内容长度的增加,输出的最终长度始终停留在2K左右。但是,在对WildChat的用户日志分析时发现,有 1% 的用户明确要求生成的内容长度要超过2K,这证明生成长篇幅内容也是大家迫切需要的能力之一。
2. 为什么大多数模型只能生成2K左右的内容?
为了探究为什么几乎所有的模型都只能生成2K左右的数据这一问题,作者进行了一系列实验。
首先,创建了LongWrite-Ruler评估工具,来探索大语言模型(LLMs)的生成长度上限。
接着,分析了生成长度受限的根本原因:通过调整模型在监督微调(SFT)阶段数据的最大输出长度,发现训练后的模型在LongWrite-Ruler测试中的最大输出长度与其SFT数据的最大输出长度存在显著的正相关性。
在此论文中,统一以单词(或中文文本的字符)来衡量输出长度,而不是token,因为不同模型的token化方法可能会有所不同。
LongWrite-Ruler 测试方案
制定了8条不同指令,中英文各半,并在指令中调整输出长度要求“L”。
例如,“撰写一篇关于罗马帝国历史的L词文章”。测试时,选取L值包括{1000, 2000, 5000, 10000, 20000, 30000},共产生了48个测试案例。
测评过程
在LongWrite-Ruler上对4个开源模型和4个专有模型进行了最大输出长度的测量(评估模型的详细信息如上表)。
• 温度参数设为0.5
• 对于专有模型,根据各自模型API支持的最大输出长度设置了max tokens参数。
• 对于开源模型,将其设为32k。确保了没有模型因max tokens限制而产生截断输出,这可能会低估它们的最大输出能力。
测试结果在上图中进行了可视化展示:对于每个长度要求(x轴),在8条相应指令下的平均输出长度(y轴),并使用了对数刻度。
从图中可以看出,所有模型的最大输出长度大约为2k词。专有模型的有效输出窗口通常未能达到它们宣称的最大token生成长度。而且,随着所需长度超过10k,由于拒绝响应的案例增多,平均输出长度甚至出现了下降趋势。
控制变量实验
由上述实验推测,普遍存在的2000字输出长度限制可能源于SFT数据本身固有的输出长度约束(简单的说,就是模型没见过这么长的输出长度)。为检验这一假设,通过调整SFT数据,开展了一系列控制性实验。
选用GLM-4-9B作为基准模型,并选取GLM-4的聊天SFT数据(总计180k条,为GLM-4全部SFT数据的一个子集)作为完整的训练数据集。为控制训练数据的最大输出长度,分别剔除了输出长度超过500、1000和2000字的数据,形成了三个不同的训练集,分别保留了原始数据的72%、98%和99.9%。
基于这些训练集,对GLM-4-9B模型进行了训练,并在LongWriter-Ruler上测试了模型的最大输出长度(测试L值包括{500, 1000, 2000, 0})。
如上图,模型的最大输出长度与SFT数据中的最大输出长度成正比,分别提升至约600、900和1800字。这种最大输出长度的增长同样反映在模型对各指定长度要求的指令的平均输出长度的提高上。
这一发现揭示了模型输出限制的根源在于SFT数据中输出长度的不足。此外,这种限制无法通过LLM合成的训练数据或迭代SFT来克服,因为 现有模型生成的数据依旧无法超越这一长度限制 。
为了解除这个限制,作者推出了 AgentWriter,一种新的基于 Agent 的流程,能够利用大语言模型自动构建、扩展连贯的长文本输出。
3. AgentWrite 设计思路
AgentWrite分两步执行任务:
• 首先,根据用户输入制定详尽的写作计划,明确每段的结构和目标字数。
• 接着,按照计划,引导模型顺序生成每个段落的内容。
AgentWrite首先将长篇写作任务拆解为多个小任务,每个小任务仅需模型撰写一个段落。模型随后按顺序完成这些小任务,再将这些段落的输出合并,形成最终的长篇大作。
3.1 内容规划
如同人类作家在着手长篇写作前会制定一个全局性的策划,包括构思文章结构、规划各部分内容及其篇幅长度,借鉴了这一思路。利用大型语言模型(LLMs)的策划功能,根据写作指令生成写作大纲,明确每个段落的核心内容和所需字数。以下是作者采用的提示词:
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., 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.
3.2 分步撰写
在第一步规划完毕后,依次调用大语言模型(LLM)来逐一完成子任务,逐段构建写作内容。为保障文本的连贯性,每当请求模型撰写第n段时,也会一并提供前n-1段的内容,使模型能够在已有写作的基础上续写。
虽然这种串行处理方式无法让模型同时并行处理多个子任务,但这种方式生成的文本在整体连贯性和质量上,远远超过了并行生成的结果。
以下是使用的提示词:
You are an excellent writing assistant. I will give you an original writing instruction and my planned writing steps. I will also provide you with the text I have already written. Please help me continue writing the next paragraph based on the writing instruction, writing steps, and the already written text.
Writing instruction:
{User Instruction}
Writing steps:
{The writing plan generated in Step I}
Already written text:
{Previous generated (n-1) paragraphs}
Please integrate the original writing instruction, writing steps, and the already written text, and now continue writing {The plan for the n-th paragraph, i.e., the n-th line in the writing plan}
3.3 验证测试
对提出的AgentWrite方法在两个长篇写作数据集上进行了生成长度和质量的测试:
• LongWrite-Ruler:用于准确测量该方法能够生成的文本长度。
• LongBenchWrite:用以评价模型生成文本在长度和写作品质上与用户指令的契合度。
LongBench-Write
为了更全面地评估模型在多种长篇写作指令上的表现,搜集了120条多样化的用户写作指令,其中中文和英文各占一半。确保所有指令均明确指出了字数要求。
根据 字数 要求被划分为四组:0-500字、500-2000字、2000-0字和0字以上。
根据 输出类型 ,将指令分为七大类:文学与创意写作、学术与专著、科普、实用写作、新闻报道、社区论坛以及教育与培训。
评估时,采用了两项衡量标准:
• 评估输出长度:当文本输出恰好满足长度要求时,得分达到满分100分。若输出长度超过要求的四倍或低于三分之一,则得分将线性递减至零。鉴于篇幅过短的文本通常比过长的文本问题更大,为篇幅不足的文本设置了更高的扣分率。
• 评估输出品质。期望模型生成的文本长度尽可能贴近指令中的要求。有鉴于此,通过一个分段线性函数来计算输出长度得分Sl(其中l代表预期长度,l'代表实际生成长度):从六个维度对文本进行评分:相关性、准确性、连贯性、清晰度、内容广度与深度以及阅读体验,以下是作者用GPT-4o打分的提示词:
You are an expert in evaluating text quality. Please evaluate the quality of an AI assistant’s response to a user’s writing request. Be as strict as possible.
You need to evaluate across the following six dimensions, with scores ranging from 1 to 5. The scoring criteria from 5 to 1 for each dimension are as follows:
1. Relevance: From content highly relevant and fully applicable to the user’s request to completely irrelevant or inapplicable.
2. Accuracy: From content completely accurate with no factual errors or misleading information to content with numerous errors and highly misleading.
3. Coherence: From clear structure with smooth logical connections to disorganized structure with no coherence.
4. Clarity: From clear language, rich in detail, and easy to understand to confusing expression with minimal details.
5. Breadth and Depth: From both broad and deep content with a lot of information to seriously lacking breadth and depth with minimal information.
6. Reading Experience: From excellent reading experience, engaging and easy to understand content to very poor reading experience, boring and hard to understand content.
Please evaluate the quality of the following response to a user’s request according to the above requirements.
⟨User Request⟩
{User request}
⟨/User Request⟩
上图展示了LongWrite-Ruler的输出长度的对比结果。AgentWrite显著提升了GPT-4o的输出能力,将其从最高2000词延长至约20000词。
还在LongBench-Write上对输出品质及其对所需长度的契合度进行了评估。鉴于GPT-4o在AgentWrite性能测试中能轻松应对2000词以内的任务,仅对要求2000词以上输出的指令采用AgentWrite。还考察了AgentWrite的一个变种“+Parallel”,它在第二步中采用并行方式调用模型,为每个段落生成输出。
上表展示了LongBench-Write的测试结果。融入AgentWrite后,GPT-4o能创作长达20000词的内容,显著优化了其长度符合度得分(Sl),特别是在[4k, 20k)词的输出范围内。
AgentWrite在拓展输出长度的同时,并未降低输出品质。通过对比六个维度的质量得分,AgentWrite显著提升了内容的广度与深度得分(提升5%),而在连贯性和清晰度上略有下降(下降2%)。在审视输出数据时,偶尔发现 使用AgentWrite生成的文本中存在轻微的重复现象 ,如模型可能会重述前文内容, 或在输出中频繁进行总结 。此外,+Parallel虽然在一定程度上提升了模型的输出长度得分,却 牺牲了AgentWrite的输出品质,尤其是在连贯性上(下降6%) 。这表明在AgentWrite的第二步中,向模型提供已生成的上下文是至关重要的。
4. 如何训练一个超长文本生成模型
能否进一步教会这些模型生成超长文本的能力,让它们能够一次性完成长篇写作任务?
4.1 数据构建
从现有数据集中精选了6000条需要超长输出的用户指令(字数超过2000)。即:从GLM-4的SFT数据中筛选了3000条,多以中文为主。同时也从WildChat1M中筛选了3000条指令,这个数据集收录了用户与ChatGPT/GPT-4的公开对话日志,以英文为主。
自动筛选过程中,调用了GPT-4o。还利用基于规则的匹配技术剔除了包含毒性的指令以及那些用于数据抓取的指令。
经过自动筛选后,对这些指令进行了人工审核,确认超过95%的指令确实需要长篇回复,字数达到数千。针对这些指令,采用了AgentWrite流水线,并搭配GPT4o来生成回答。
还对收集到的数据进行了后期处理,包括剔除过短的输出以及因AgentWrite第一步中规划步骤过多导致模型输出失败的案例。大约0.2%的数据因此被排除。同时,也清除了模型可能在每个输出段的开头添加的诸如“第一段”、“第二段”等不相关的标识符。将最终得到的长篇输出数据集命名为“longwriter-6k”。
在模型训练阶段,为保证模型的通用性,将“longwriter-6k”与常规SFT数据结合起来,构成了完整的训练集。
使用了180k条来自GLM-4的聊天SFT数据作为常规SFT数据。
所获数据的输出长度分布如上图。从图中可以明显看出,“longwriter-6k”有效地弥补了常规SFT数据在2k字以上输出长度的不足,且在2k至10k字的范围内,输出长度分布相对均匀。
4.2 模型训练
监督式微调
选用了两个最新的开源模型作为基础,分别为GLM-4-9B和Llama-3.1-8B,均支持高达128k tokens的上下文窗口,非常适合进行长文本输出的训练。
经过训练,得到了两个新模型:LongWriter-9B和LongWriter-8B。
所有模型均在 8xH800 80G GPU的节点上,利用DeepSpeed和ZeRO-3以及CPU offloading进行训练。训练参数包括批量大小为8,学习率为1e-5,经过4个周期的训练,大约需要2500至3000步。
对齐优化(DPO)
为了进一步提升模型输出质量,增强其遵循指令中长度限制的能力,在经过监督式微调的LongWriter-9B模型上实施了直接偏好优化。
还结合了长度符合度得分,选取得分最高的输出作为正面样本,随机选择剩余三个输出中的一个作为负面样本。经过上述数据混合训练250步后,得到的LongWriter-9B-DPO模型。
4.3 评估结果
4.3.1 主要成果
在LongBench-Write基准上评估了4种专有模型和5种开源模型,以及训练的LongWriter系列模型。
与LongWrite-Ruler的评估配置相同,将输出温度设定为0.5,并根据模型API允许的最大值设置生成的最大token数。对于开源模型,此值设定为32,768。
主要的评估结果如上表。
上图展示了LongBench-Write中120条指令要求长度与模型响应长度之间的关系。
相较于先前模型难以达到2000字以上长度的要求,LongWriter系列模型能够一贯地提供更长、更详尽的回答。
从各长度区间内提示的输出长度得分Sl来看,现有模型在2000至0字的区间内普遍得分较低(低于70分),仅有Claude 3.5 Sonnet模型得分尚可。在0至20000字的区间内,几乎所有现有模型都无法达到目标输出长度,得分甚至为零(即所有输出长度都不到要求长度的三分之一)。
通过融入LongWriter-6k的训练数据,训练的模型不仅能有效满足长度要求,还能保持输出质量,这一点从2000至20000字区间的Sl和Sq得分以及上面散点图可以看出。
DPO有效地提升了模型在长文本生成中的输出品质及其遵循长度要求的能力。
对比LongWriter-9B与经过DPO训练的LongWriter-9B-DPO的评分,发现DPO在Sl(提升了4%)和Sq(提升了3%)上都有显著提升,且这种优化效果在各个长度区间内都保持一致。这证明了在长文本生成任务中,DPO不仅能增强模型的输出品质,还能更精准地控制输出长度以满足要求。类似地,在短文本生成任务中也能得出了这一结论。
此外,还对GPT-4o及三款Longwriter模型在LongBench-Write上的输出进行了人工成对比较,并在上图展示了结果。数据显示,在58%的情况下,人们更倾向于选择经过DPO训练的模型而非LongWriter-9B。值得注意的是,尽管模型规模较小,LongWriter-9B-DPO的表现却能与GPT-4o持平。
LongWriter模型的输出限制已扩展至1万至2万字,但为了支持更长文本的输出,仍需更多长文本数据的支撑。
在上图中同样展示了LongWriter模型的测试成果。
模型的最大生成长度能够达到1万至2万字。缺乏长输出的SFT数据很可能是限制模型实现更长输出长度的主要因素。
输出长度达到或超过2万字的数据点不足100个。
未来构建更长的训练SFT数据将进一步突破模型输出长度的限制,有望实现10万甚至更长的文本输出。
4.3.2 消融分析
去除LongWriter-6k数据集
对LongWriter-6k数据集的消融分析。数据显示,在融入LongWriter-6k数据集之后,LongWriter-9B模型能够轻松应对2000字以上的输出任务,这一点从输出长度指标Sl中得到了体现。
在输出质量方面,该模型在加入LongWriter-6k数据集后的质量评分提升了5%,特别是在处理需要输出长度在2000至0字范围内的任务时表现尤为突出。
模型在“广度和深度”这一维度上的质量提升最为显著,与基线模型相比有18%的绝对增长。LongWriter-6k数据集的加入并没有导致模型趋向于生成更长篇幅的响应,显示出数据集对模型输出长度没有引入偏差。
写作计划增强数据
对加入写作计划的输出数据进行消融分析。
通过思维链或思维树,能有效提升处理复杂任务的性能。这启发探究一个问题:在生成写作内容之前,先让模型输出写作计划,是否能够为长篇写作任务带来好处?
为了解答这一疑问,创建了一份加入了计划的LongWriter-6k数据集。
具体做法是,将通过AgentWrite第一步得到的写作计划与写作内容的起始部分合并,并用两个换行符作为分隔,将合并后的文本作为SFT数据的输出。
在评估时,会从模型生成的文本开头移除写作计划的输出。
上表中的结果显示,使用这份加入了计划的数据训练的模型,在输出长度指标Sl上有所提升,但在输出质量上却有所下降。总体来看,与直接生成写作内容相比,先让模型输出其推理过程(即写作计划),再生成写作内容,并 没有显著提升任务执行的效率 。这可能是因为模型在学习直接生成写作内容的过程中,已经内化了思维链(CoT)的步骤,因此不再需要显性地输出推理过程。
与传统的合成数据相比较
探究了利用指令来创建长篇输出的SFT数据,这一方法在以往的大型语言模型(LLM)长篇生成研究中颇为常见。
基于指令数据训练出的模型在生成更长文本方面未能达到用户期望。其输出长度得分Sl并未超越仅使用通用SFT数据训练的模型,且输出质量Sq亦有所下降。
这种方法之所以不利于模型学习,主要有两个原因:
• 其次,回译的指令与真实用户的指令在分布上存在差异,这限制了模型学习到更广泛的应用能力。
本文转载自,作者: