
随着大语言模型的发展,许多模型已经能够处理超过 100k+ tokens 的输入上下文。然而,这些模型在生成长文本时,普遍存在输出长度受限的问题。
在实际应用中,为了克服这个问题,人们普遍采用「分而治之」的方法,让模型一段一段地写。这种方法在一定程度上似乎能够解决长文本输出的问题,但往往会导致 1)消耗 tokens 量成倍甚至指数增加;2)前后内容不连贯。
如何才能让模型拥有更强的长文本输出能力呢?我们发现,模型输出长度受限的主要原因在于,监督微调(SFT)数据集缺乏足够长的输出样例。
针对这一问题,我们构建了一个 6000 多条 2k-20k words 不等的长输出数据集 LongWriter-6k,并在此基础上,对 GLM-4-9B 进行 SFT 微调和 DPO 对齐。新的模型拥有了能够生成超过 10,000 字/词连贯文本的能力。
下面是我们用 LongWriter-9B 模型,以「黑神话 · 悟空」为题撰写的玄幻小说。
prompt: 请帮我撰写一个主题为「黑神话·悟空」玄幻小说,小说以孙悟空为核心,讲述一个桀骜不驯,打怪升级,追逐梦想的玄幻故事,不少于 10000 字
论文: https://arxiv.org/abs/2408.07055
代码: https://github.com/THUDM/LongWriter
模型:
Huggingface:https://huggingface.co/THUDM/LongWriter-glm4-9b
魔搭:https://modelscope.cn/models/ZhipuAI/LongWriter-glm4-9b
数据:
Huggingface:https://huggingface.co/datasets/THUDM/LongWriter-6k
魔搭:https://modelscope.cn/datasets/ZhipuAI/LongWriter-6k
生成长度限制的根源
我们对当前最先进的长上下文模型的最大输出长度做了测试,这些测试会明确要求模型生成不同长度的内容,例如:撰写一篇关于罗马帝国历史的 10000 字文章。

从上图可以看出,所有模型生成的内容,几乎都不超过 2000 字。
原因是什么呢?
我们做了一个初步的研究,用不同最大输出长度的数据对 GLM-4-9B-base 模型进行 SFT 微调。结果如下:







