社区供稿 | 如何让大模型输出 10k+ 字长文?
随着大语言模型的发展,许多模型已经能够处理超过100k+ tokens的输入上下文。然而,这些模型在生成长文本时,普遍存在输出长度受限的问题。
在实际应用中,为了克服这个问题,人们普遍采用「分而治之」的方法,让模型一段一段地写。这种方法在一定程度上似乎能够解决长文本输出的问题,但往往会导致 1)消耗 tokens 量成倍甚至指数增加;2)前后内容不连贯。
如何才能让模型拥有更强的长文本输出能力呢?我们发现,模型输出长度受限的主要原因在于,监督微调(SFT)数据集缺乏足够长的输出样例。
针对这一问题,我们构建了一个 6000 多条2k-20k words 不等的长输出数据集 LongWriter-6k,并在此基础上,对 GLM-4-9B 进行 SFT微调和 DPO对齐。新的模型拥有了能够生成超过10,000字/词连贯文本的能力。
下面是我们用 LongWriter-9B 模型,以「黑神话 · 悟空」为题撰写的玄幻小说。
> prompt: 请帮我撰写一个主题为「黑神话·悟空」玄幻小说,小说以孙悟空为核心,讲述一个桀骜不驯,打怪升级,追逐梦想的玄幻故事,不少于 10000 字
完整视频可查看:https://mp.weixin.qq.com/s/mhhUWDP6fp9sTWNH9GeZnA
论文:https://arxiv.org/abs/2408.07055
代码:https://github.com/THUDM/LongWriter
模型:
Hugging Face:https://hf.co/THUDM/LongWriter-glm4-9b
魔搭:https://modelscope.cn/models/ZhipuAI/LongWriter-glm4-9b
数据:
Hugging Face:https://hf.co/datasets/THUDM/LongWriter-6k
魔搭:https://modelscope.cn/datasets/ZhipuAI/LongWriter-6k
生成长度限制的根源
我们对当前最先进的长上下文模型的最大输出长度做了测试,这些测试会明确要求模型生成不同长度的内容,例如:撰写一篇关于罗马帝国历史的10000字文章。
从上图可以看出,所有模型生成的内容,几乎都不超过 2000 字。
原因是什么呢?
我们做了一个初步的研究,用不同最大输出长度的数据对 GLM-4-9B-base 模型进行 SFT 微调。结果如下:
伴随着要求长度的增加,不同数据集 SFT 微调出来的模型,存在最大输出长度限制。
因此可以得出一个结论,尽管长文本模型在预训练阶段接触了更长的文本序列,但其最大生成长度实际上被 SFT 数据集中输出长度的上限所限制。换句话说,模型“读”到的内容决定了它能“写”多长。
这一发现可以解释当前模型普遍存在的 2000 字输出限制——因为现有的 SFT 数据集很少包含超过此长度的样例;而另一方面,很多数据集都是用现有 LLM 自动构建的,因此它们也继承了源模型的输出长度限制。
自动构建长输出数据集
为了解决 SFT 数据集中长输出文本数据缺失的问题,我们设计了一个名为「AgentWrite」的 pipeline,通过分解长生成任务,让现有模型来生成更长的具备连贯性的输出。
具体来说,AgentWrite
-
首先,会根据用户的输入生成一个详细的写作计划,包括每段内容的结构和目标字数
-
其次,模型依次完成每个子任务,并将生成的段落串联起来,最终形成完整的长文本输出。
通过这种方法,AgentWrite 能够生成超过 20,000 字的高质量文本。
教模型生成超长输出
有了一个利用 LLMs 自动生成的更长输出的数据集,我们不禁好奇:是否可以将这种生成超长输出的能力传授给LLMs,使它们能够在单次输出中完成长篇写作任务?
我们从 GLM-4 的 SFT 数据中筛选出了 3,000 条指令(主要是中文),另外从 WildChat-1M(一个包含用户与ChatGPT/GPT-4对话记录的公开日志)中选择了3,000条指令(主要是英文),通过 AgentWrite 并利用 GPT-4o 生成了6,000条长输出的SFT数据,即 LongWriter-6k。
在模型训练中,为了确保模型的通用能力,我们将LongWriter-6k与通用SFT数据(180k 条数据)结合,形成整个训练集。输出长度分布如下:
可以看到LongWriter-6k有效地补充了通用SFT数据中2,000字以上输出样例的不足,并且LongWriter-6k中的输出长度在2,000至10,000词之间分布相对均匀。
微调(SFT):我们分别针对 GLM-4-9B 和 Llama-3.1-8B 做了 SFT 微调,这两个模型都是基础模型,支持最多128k tokens的上下文窗口,非常适合用于长输出的训练。我们得到两个模型:LongWriter-9B(GLM-4-9B-LongWriter的缩写)和LongWriter-8B(Llama-3.1-8B-LongWriter的缩写)。
对齐(DPO): 为了进一步提高模型的输出质量,并增强其在指令中遵循长度约束的能力,我们在经过 SFT 微调的LongWriter-9B模型上进行了直接偏好优化。DPO数据来自GLM-4的 DPO 数据(大约50,000条),同时包含4k条我们标注的长输出正负样本对。
结果怎么样?
我们在LongBench-Write上对4个专有模型和5 个开源模型进行了评测,如下表所示:
其中 S_l 表示输出长度是否符合要求的得分。当输出长度符合要求时,得分为100;当输出长度超过要求的4倍或低于要求的1/3时,得分会线性下降至0。
S_q 则是从相关性、准确性、连贯性、清晰度、广度与深度以及阅读体验等六个维度,用 GPT-4o 进行的打分,并取平均,代表了生成内容的质量。
最终得分 \overline{S} 通过 S_l 和 S_q 的平均值计算得出。
1. 大多数当前的模型都无法满足超过2,000字的长度要求,而LongWriter模型在此类提示下始终提供更长且更丰富的响应。
更具体来说,在[2k, 4k)范围内当前的模型通常表现不佳,只有Claude 3.5 Sonnet得分尚可;而在[4k, 20k)范围里,几乎所有当前的模型都完全无法达到目标输出长度,甚至得分为0(意味着所有输出长度均小于要求长度的1/3)。
2. DPO(直接偏好优化)有效提升了模型的输出质量及其在长文本生成中遵循长度要求的能力。
通过比较LongWriter-9B和LongWriter-9B-DPO的得分,我们发现DPO显著提高了 S_l(+4%)和 S_q(+3%)的得分,并且这种提升在所有范围内都保持一致。这表明在长文本生成场景中,DPO依然能够帮助提升模型的输出质量,并能更好地使模型的输出长度与要求的长度对齐。
3. LongWriter模型的输出长度限制大概10k至20k字之间,如果想让模型拥有更长输出的能力,则需要更长输出的数据集。
在混合后的 SFT 数据集中可以看到,大部分数据都在 20k 以下,超出 20k 的数据不到 100 条。
我们相信,在未来构建更长的SFT训练数据,可以进一步突破模型输出长度的限制,达到100k甚至更长的输出长度。
本文由 Hugging Face 中文社区内容共建项目提供,稿件由社区成员投稿,经授权发布于 Hugging Face 公众号。文章内容不代表官方立场,文中介绍的产品和服务等均不构成投资建议。了解更多请关注公众号:
如果你有与开源 AI、Hugging Face 相关的技术和实践分享内容,以及最新的开源 AI 项目发布,希望通过我们分享给更多 AI 从业者和开发者们,请通过下面的链接投稿与我们取得联系:
https://hf.link/tougao
本文分享自微信公众号 - Hugging Face(gh_504339124f0f)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
FreeBSD 社区大讨论:基础系统中使用 Rust
FreeBSD 社区正在讨论是否将 Rust 语言纳入基础系统(base system),以改善系统的安全性和可维护性。 与 Linux 不同,FreeBSD 操作系统内核和用户空间是作为基础系统一起开发的,并在FreeBSD 源代码树(通常称为“src”)中维护。这意味着,为了讨论使用 Rust 作为 FreeBSD 内核或基础系统中其他程序/实用程序的语言,Rust 工具链也需要存在于基础中。 目前,FreeBSD 基础系统支持的语言包括汇编、C、C++、Lua 和为sh编写的 shell 脚本。在遥远的过去,Perl 也是基础系统的一部分,但在 2002 年FreeBSD 5.0之前被删除。 FreeBSD 还拥有一个第三方软件的ports 集合,这些软件并非由 FreeBSD 本身维护。包括 Apache HTTP Server、Xwayland 等等。Rust 已经存在于 ports 系统中,许多用 Rust 语言编写的应用程序也是如此。在FreshPorts上搜索,会列出 ports 集合中的新软件包,结果显示 ports 系统中有 500 多个用 Rust 编写的软件包。...
- 下一篇
别闹了,大模型真不好“开源”,还不如界定好它的开放程度
日前,Nature 杂志编辑 Elizabeth Gibney 刊文深入分析了大语言模型( LLM )的透明性和开放性,并揭露了所谓的“开源大模型”背后隐藏的一些问题。 Elizabeth 指出,许多声称“开源”的 AI 模型,其本质上并不开源,往往只公开了部分代码和权重模型,与之更为关键的训练数据、训练过程、核心算法均没有真正开放。 并提到,号称坚定开源的 Meta ,旗下产品 Llama 也只开放了权重( open weight ),源代码、训练数据、训练过程等参数均为闭源。 有关于这一点,荷兰奈梅亨拉德堡德大学的语言科学家 Mark Dingemanse 与他的同事 Andreas Liesenfeld 所整理的这个表单或许更为直观。(见下表) 开源(✔) 部分开源(~) 闭源(×) 我们不难发现:市面上绝大多数所谓的“开源大模型”,都只是“部分开源”,其核心代码、模型数据、预印本、应用接口均存在或多或少的闭源情况。 并且,资源相对较少的非营利性机构,例如 BigScience 、Allen Institute for AI ,较之 Meta 、Google 这样的巨头,其模型的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能