跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言AI算法

基于 SFT 微调提升大模型长文本生成能力

大语言模型在生成长文本时普遍存在长度受限问题,主要源于监督微调(SFT)数据集中缺乏长输出样例。通过构建包含 6000 多条长输出样本的 LongWriter-6k 数据集,结合 AgentWrite 流水线自动生成长文本来解决此问题。研究对 GLM-4-9B 和 Llama-3.1-8B 进行了 SFT 微调和直接偏好优化(DPO)。实验表明,新模型能够生成超过一万字的连贯文本,且在长度约束遵循和内容质量上优于现有主流模型。未来构建更长训练数据可进一步突破输出限制。

PentesterX发布于 2025/2/7更新于 2026/8/2157 浏览
基于 SFT 微调提升大模型长文本生成能力

LongWriter 模型效果展示

随着大语言模型的发展,许多模型已经能够处理超过 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 微调。结果如下:

SFT 微调结果

伴随着要求长度的增加,不同数据集 SFT 微调出来的模型,存在最大输出长度限制。

因此可以得出一个结论,尽管长文本模型在预训练阶段接触了更长的文本序列,但其最大生成长度实际上被 SFT 数据集中输出长度的上限所限制。换句话说,模型'读'到的内容决定了它能'写'多长。

这一发现可以解释当前模型普遍存在的 2000 字输出限制——因为现有的 SFT 数据集很少包含超过此长度的样例;而另一方面,很多数据集都是用现有 LLM 自动构建的,因此它们也继承了源模型的输出长度限制。

自动构建长输出数据集

为了解决 SFT 数据集中长输出文本数据缺失的问题,我们设计了一个名为**「AgentWrite」**的 pipeline,通过分解长生成任务,让现有模型来生成更长的具备连贯性的输出。

具体来说,AgentWrite

首先,会根据用户的输入生成一个详细的写作计划,包括每段内容的结构和目标字数

其次,模型依次完成每个子任务,并将生成的段落串联起来,最终形成完整的长文本输出。

AgentWrite Pipeline

通过这种方法,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 甚至更长的输出长度。

目录

  1. 生成长度限制的根源
  2. 自动构建长输出数据集
  3. 教模型生成超长输出
  4. 结果怎么样?
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Python 三角洲行动:战术小队模拟器
  • 开源模型后缀含义快速入门
  • AI Agent 架构:基础组成模块深度解析
  • Python Tkinter 集成 DocsGPT API 实现代码编辑器
  • 基于 Python 的知乎用户行为分析与数据挖掘实践
  • Stable Diffusion 完整训练与推理流程详解(附伪代码)
  • Linux 进程管理进阶:会话、进程组与守护进程的底层逻辑与实践
  • C++ 异常机制详解:从原理到工程实践
  • 网络安全行业现状分析与科学学习路径指南
  • Hugging Face 访问令牌申请指南(以 Meta-Llama-3.1-8B-Instruct 为例)
  • 深入分析:RAG 技术的演进与 Agent 架构解析
  • DIY 无人机:电源升压降压电路设计详解
  • CyberStrike AI 与 HexStrike AI 联动部署指南
  • 大型语言模型(LLMs)架构与现状解析
  • Java 核心:char、String、StringBuilder 与 StringBuffer 详解
  • Java文件操作实战:NIO.2与传统IO的常见用法与避坑
  • 前端微前端实践:如何避免应用沦为巨石单体
  • C++ 常用输出流操作符详解:基础、格式与数值控制
  • OmniInsert:借助扩散变换器实现任意对象无掩码视频插入
  • STL 转 STEP 格式转换工具 stltostp 使用指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online