666 条数据训练 AI 写万字长文,模型数据集开源
仅需 600 多条数据,就能训练自己的长输出模型了?
虽然大模型的上下文(Context)支持越来越长,但包括 GPT-4o、Llama-3.1-70B、Claude 3.5 Sonnet 在内的业界领先模型,在用户指定所需输出长度的情况下,其最大输出长度仍无法满足要求。
例如,针对'写一篇关于罗马帝国历史的 10000 字文章'的要求,所有这些通用模型在输出长度上均无法超过 2000 字。
对此,基于 GLM4-9B,智谱通过构建长输出的训练数据得到了 LongWriter-GLM4-9B 模型,能够应对超长输出(10000+ words)场景。
与此同时,智谱开源了训练该模型所需的长输出文本数据集 LongWriter-6K。
现在,魔搭社区上基于 LongWriter-6K 过滤精选了 666 条数据(LongWriter-6K-Filtered),也一并开源了。
一句话,使用该数据集,你就能在自己的模型中集成长输出能力了。
LongWriter 数据生成与模型训练
通过分析训练 SFT 数据,团队发现对于'模型无法输出较长文本'的一个合理解释为:
模型所能生成的最大长度,会受限于其 SFT 数据中存在的输出长度上限。
以 GLM4-9B-Chat 模型为例,其 SFT 训练使用的 180K 条 chat 数据中,输出长度超过 500、1,000 和 2,000 字的数据,分别仅占 SFT 数据量的 28%、2% 和 0.1%。
可见,长输出长度的训练数据占比较小,而 2000 字长度以上的数据样本占比更是微乎其微。
有了这个分析,LongWriter-GLM-9B 是智谱基于 GLM4-9B 模型,通过构建长输出的训练数据而得到的模型,在输出长文方面表现突出。
在 LongWriter 工作的基础上,团队利用社区的 Swift 微调训练工具和 EvalScope 评估框架,进一步探索了在扩展模型输出长度这个任务上,高质量数据对于模型质量的重要性。
同时,将这个模型训练的经验,扩展到其他模型(例如 Qwen2)上。
在这个过程中,团队还分享了一些有趣的发现和实践经验:
a)少即是多:数据质量比数据数量更关键。
通过对数据的分析过滤,团队发现 LongWriter-6K 的 6000 条数据,依然存在优化空间。
他们从中选出了 10% 左右(666 条)的高质量数据并基于这些数据做微调训练。
在 Qwen2-7b-instruct 和 GLM4-9B-Chat 两个模型上,只需要 3.7% 训练计算消耗,就能获取和原论文中,LongWriter-GLM4-9B 类似的性能提升。
此外,随着基础模型的升级,支持长输出这个能力,在新迭代中本身也会有所增强。但 LongWriter 的技术方案,还是有其适用性。例如在新鲜出炉的 Qwen2.5 模型上,团队通过第一时间的测试和验证发现,一方面 Qwen2.5 模型本身在文本生成长度上,已经有了长足进步,但同样的训练微调方案,还是能进一步带来很好的任务能力提升。
b)对于提升输出文本长度这个具体任务,从 base 模型开始 SFT 似乎不是必须的。
以对齐版本(chat/instruct)模型为起点,在模型输出质量和输出长度两方面,也都能获取较好的效果。
下面来看团队对数据的处理。
LongWriter-6K 数据
LongWriter-6K 数据是通过 AgentWriter 生成,也就是将长文写作任务分解为多个子任务,每个子任务负责撰写一段。
实验发现,在 GPT-4o 上使用 AgentWriter 策略,能够得到近乎线性的 Output Length,且长度远超 2000 词,甚至可以达到 30000 词的量级。
LongWriter-6K 数据集由 6000 条'Required Length'超过 2000 字的用户指令构成,来自于 GLM-4 的 SFT 数据,其中大部分为中文。
另外,从 WildChat 中选择了 3000 条指令,主要为英文。
在这个基础上,使用 GPT-4o 过滤掉有毒数据并人工检查了自动选择的指令。
最后,利用 AgentWrite 生成与这些 instruction 对应的 response。
LongWriter 模型训练与评估
LongWriter-GLM4-9B 模型训练使用 GLM4-9B 作为基模,将 LongWriter-6k 与 180k 的 GLM-4 通用 chat SFT 数据结合,形成整个训练集。
LongWriter-6k 有效补充了输出长度超过 2k 字的通用 chat SFT 数据的稀缺性,且 LongWriter-6k 的输出长度在 2k-10k 之间的分布相对均匀。


