
简介面向中文自然语言处理开发者与研究者提供一套基于mT5架构并融合PEGASUS预训练思路的中文生成式预训练模型实现。资源重点展示了将分词器替换为BERT风格、重新排列5万中文token词表的方法以及利用文档句子构造伪摘要数据对的预训练任务设计适合需要开展中文摘要、文本生成任务微调或预训练研究的读者参考。压缩包内共5个文件包含2个Python脚本对应训练与微调流程、2张效果示意图和1份说明文档整体仅418KB轻量易用。已有2589人学习使用。通过脚本可快速搭建t5-pegasus基本版模型理解从语料构造、分词到模型训练的完整链路并借助示例图直观评估摘要效果为后续基于中文生成式预训练模型的二次开发提供清晰起点。 老有人问我同一个问题中文场景下想做摘要、标题生成、问题生成这类任务不想调动不动就上百B的大模型接口只想自己拉一个开源模型在本地微调到底该从哪个模型下手以前我总要列三四个备选来回对比现在我的答案基本固定下来如果只求能跑得动、调得快、效果还不丢人那就从 T5-Pegasus 开始。T5-Pegasus 是 IDEA-CCNL 开源的一套中文生成式预训练模型。名字看着像“缝合怪”其实就是把 Google 的 T5 架构和 PEGASUS 的预训练目标做了组合用大规模中文语料重新训练出来的生成模型。它在 HuggingFace 上有 Small、Base、Large 三个版本对个人开发者和中小团队特别友好。下面我按自己的实际踩坑经验把这个模型从原理到落地完整讲一遍。1. 从T5到PEGASUS“缝合”其实缝对了地方1.1 T5 的 text-to-text 思路把所有任务都变成了同一件事T5 的核心思想你肯定听过把所有 NLP 任务都当成“文本到文本”的翻译。分类任务是“输入句子 - 输出类别词”摘要任务是“输入长文 - 输出短文”翻译任务就是“中文 - 英文”。都是一进一出模型结构完全不用改换任务只需要换数据集。这个设计最大的好处是省心。你不需要为了某个任务去单独设计输出头也不用在分类和生成之间来回切换代码逻辑。文本进来文本出去训练和推理的接口完全统一。但它的短板也很明显原始 T5 主要在英文语料上做预训练中文生成能力只能算“能用”离“好用”差着一截。你要拿原版 T5 直接生成中文经常会遇到词表碎片化、用词生硬的问题。1.2 PEGASUS 的漏句生成目标让模型天生适合做摘要PEGASUS 的预训练方式和 T5、BERT 都不一样。它管自己叫 Gap Sentences Generation运作逻辑是从一篇文档里挑出几句关键句子把它们从正文里挖掉然后让模型根据剩下的上下文把这几句空掉的句子完整生成出来。这个目标跟摘要任务极度相似。摘要本来就是读完长文之后用几句人话把核心信息重写出来而 PEGASUS 在预训练阶段就在逼模型干这件事——反复练习“看懂上下文输出关键句”。所以用 PEGASUS 预训练出来的模型去做摘要、标题、要点提炼这类任务比其他预训练目标训出来的模型更容易出效果。打个比方T5 的预训练像是让模型学会各种语言的“翻译习惯”PEGASUS 则是专门练了“划重点、写总结”这一项科目。T5-Pegasus 做的就是把这两件事拼在一起沿用 T5 的 encoder-decoder 框架和中文词表用 PEGASUS 的 GSG 加上 MLM 目标在亿级中文语料上继续预训练。它的中文词表是原生构建的不像 mT5 那样一百多种语言共享一个词表所以对中文文本的切分效率更高生成出来的句子也更符合中文表达习惯。这也是我后来在很多项目里优先选它而不是 mT5 的直接原因。2. 三个版本怎么选看显存、看数据量、看任务2.1 参数规模和显存门槛的实际感受先放一张表数字是我实测时的粗略估算具体以下是载模型后 config 里的真实值为准。版本参数量约推理显存fp32粗略微调建议T5-Pegasus-Small6000万级2GB 左右8GB 显存也能跑T5-Pegasus-Base2.2亿左右4~5GB推荐 16GB小批量可降到更低T5-Pegasus-Large7亿以上10GB 以上建议 24GB 显存或开 fp16这里要提醒一下推理显存和微调显存是两码事。微调时除了模型参数本身还要存梯度和优化器状态再加上中间激活值同样的 batch size 下显存开销往往是推理的好几倍。我自己的经验是Base 模型在 16GB 显存上per_device_train_batch_size 开到 8 加上梯度累积基本是舒服的Small 模型在 8GB 的卡上也能撑住Large 就老实开 fp16不然 batch size 稍微大一点直接 OOM。2.2 不同任务场景下的版本选择逻辑版本选择不能光看显存。按我的经验判断依据是任务复杂度和数据量做短文本标题生成、电商评论摘要这种“输入输出都不长”的任务Small 就够出一个不错的 baseline。做新闻摘要、长文档要点提炼Base 是性价比最高的起点。参数量上去之后对长文语义的压缩能力明显更强。如果下游数据量很大比如有十万条以上的高质量标注数据再考虑上 Large。数据量不够时硬上 Large反而容易过拟合效果还不如老老实实微调一个 Base。还有一个容易被忽略的点预训练模型的选择要跟你下游任务的“风格”匹配。T5-Pegasus 的预训练目标偏向于“从长文中提炼关键句”所以摘要、标题生成、问题生成这类压缩型任务它几乎天然适配但你如果要做开放闲聊、创意故事续写它就不是最优解了。这个我在后面第 5 节会展开讲。3. 实战落地加载、推理、微调一套跑通3.1 先把推理跑通感受一下输出风格用 HuggingFace Transformers 加载非常直接from transformers import AutoTokenizer, AutoModelForSeq2SeqLM tokenizer AutoTokenizer.from_pretrained(IDEA-CCNL/T5-Pegasus-Base) model AutoModelForSeq2SeqLM.from_pretrained(IDEA-CCNL/T5-Pegasus-Base) text 这里是你要处理的新闻正文可以是一段几百字的中文长文。 inputs tokenizer(text, return_tensorspt, max_length512, truncationTrue) outputs model.generate( **inputs, max_new_tokens128, num_beams4, length_penalty2.0, no_repeat_ngram_size3, ) print(tokenizer.decode(outputs[0], skip_special_tokensTrue))这里有一个小细节我踩过坑生成参数我习惯用max_new_tokens而不是max_length。max_length控制的是输入加输出的总长度如果你输入已经接近 512生成空间会被挤掉一大截甚至可能出现输出为空的情况。max_new_tokens只限制新生成的部分语义更清晰不容易翻车。初次跑通后建议先拿几段不同风格的文本试一试看看模型在没经过微调时的输出。T5-Pegasus 直接推理也能给出一个大概能看的摘要但风格会比较“预训练味”句子有点书面化跟你任务想要的表达方式大概率有差距。这一步主要是建立手感接下来才是真正的微调。3.2 微调流程从原始文本到可用的摘要模型假设你要做一个新闻摘要模型训练数据是 JSON 格式每个样本包含text和summary两个字段。数据处理的部分可以这样写def preprocess(example): inputs tokenizer( example[text], max_length512, truncationTrue, ) with tokenizer.as_target_tokenizer(): labels tokenizer( example[summary], max_length128, truncationTrue, ) return { input_ids: inputs[input_ids], attention_mask: inputs[attention_mask], labels: labels[input_ids], }注意as_target_tokenizer()这个上下文管理器。T5 类模型在训练时输入和标签的 tokenize 方式理论上是一样的但养成用 target tokenizer 处理标签的习惯能避免一些特殊 token 处理的隐性差异。标签字段名必须是labelsTrainer 会自动拿它和模型的输出算交叉熵损失。训练部分直接用Seq2SeqTrainer就行from transformers import ( Seq2SeqTrainer, Seq2SeqTrainingArguments, DataCollatorForSeq2Seq, ) training_args Seq2SeqTrainingArguments( output_dir./t5pg-summary, per_device_train_batch_size8, per_device_eval_batch_size8, learning_rate5e-5, num_train_epochs3, evaluation_strategyepoch, save_strategyepoch, predict_with_generateTrue, fp16True, report_tonone, ) data_collator DataCollatorForSeq2Seq( tokenizer, modelmodel, label_pad_token_id-100, ) trainer Seq2SeqTrainer( modelmodel, argstraining_args, train_datasettrain_dataset, eval_dataseteval_dataset, data_collatordata_collator, ) trainer.train()这里最关键的一行是label_pad_token_id-100。数据拼接时短的标签会被 pad 到和 batch 里最长标签一样的长度如果不把 pad 位置的 loss 设为 -100模型会被一堆无意义的 pad token 拉低损失看起来 loss 很漂亮实际生成一团糟。这个坑我在早期调模型时踩得特别深。4. 最容易翻车的五个细节长度、标签、生成参数4.1 位置编码上限 512长文本别硬塞T5-Pegasus 的位置编码最大长度是 512。中文 tokenizer 平均一个字到一点五个字对应一个 token512 个 token 大概能装下六七百个汉字。新闻正文动辄上千字直接塞进去就会被无情截断摘要自然丢信息。我的处理办法是不强行扩长而是做朴素的局部截断。长文本先按段落切分取开头几段和结尾几段拼在一起再进模型。对新闻类文本来说导语和结尾往往包含了最重要的信息这个土办法实测效果比单纯截前 512 个 token 好不少。如果任务确实依赖全文信息那就得考虑分段生成再合并的方案但这已经超出单模型的范畴了。4.2 标签的 pad 位置一定记得屏蔽这块刚才在代码里提过但因为它太重要值得单独说一次。很多人微调 T5 类模型时loss 掉得很漂亮生成结果却全是复读机查来查去最后发现是标签里的 pad token 也参与计算了损失。DataCollatorForSeq2Seq默认不会自动帮你处理这个问题必须显式把label_pad_token_id设为 -100。设完之后pad 位置不会贡献梯度模型才真正只学习“有效输出”的部分。4.3 生成参数长度惩罚和重复惩罚要配合调生成摘要时我一般从num_beams4、length_penalty2.0、no_repeat_ngram_size3这三组参数起步。length_penalty大于 1 会让模型倾向于生成更长的句子用在摘要任务上输出的内容会更完整但换到短标题生成任务时这个值反而要调回 1.0 附近否则标题会变得啰嗦。如果发现输出里出现整句重复优先调大no_repeat_ngram_size一般设 3 到 4 就够。实在不行再加一点repetition_penalty但别加太高否则句子会变得非常奇怪甚至开始丢标点、语序错乱。4.4 生成用 max_new_tokens别用 max_length这个前面已经提过但我还是想再强调一次。max_length在 T5 这种架构里指的是“输入输出”的总长度很多人用了大半天发现生成的摘要越来越短其实就是输入把长度额度吃满了。换用max_new_tokens之后这个困扰直接消失。4.5 换行符和空格符的解码陷阱中文生成模型在解码时经常会在句子中间蹦出莫名其妙的换行符或者把换行符变成空格。这其实是训练语料清洗不彻底导致的。推理后处理时统一把\n和连续空格去掉再按标点做一次简单的段落切分输出会干净很多。别指望模型自己改掉这个毛病在解码阶段做规则清洗是最省事的。5. 实测横评它强在摘要弱在开放对话5.1 几个中文生成场景的真实表现我从摘要、标题生成、问题生成、文本改写、开放对话这几个方向都测过 T5-Pegasus感受如下新闻摘要和标题生成这是它的绝对强项。微调之后输出能抓住新闻里的核心实体和关键事件比 mT5 和中文 BART 更稳定语序也更顺。问题生成效果不错。给它一段上下文让它生成阅读理解题输出质量在线答案范围也比较准。文本改写和润色中等偏上。能改写句式但创新性不强适合做固定模板的改写不适合做创意文案。开放对话明显弱。多轮对话稍微深入一点就开始答非所问。这不是模型质量差而是预训练目标决定的——它被训练成“从上下文中提炼关键内容”而不是“自由发挥接话”。5.2 和几个常见中文生成模型的对比模型中文词表摘要/标题文本改写开放对话微调成本T5-Pegasus原生中文强中弱低mT5多语共享中中弱低中文 BART原生中文中中弱低中文 GPT 系列原生/通用中弱中强高这个对比其实揭示了选型的基本逻辑encoder-decoder 架构的模型输出是“受控生成”适合有标准答案倾向的任务比如摘要、标题、问题生成GPT 这类 decoder-only 模型输出是“自由续写”适合开放对话和创意生成。你不能指望 T5-Pegasus 去讲一个天马行空的故事也不能指望 GPT 系列在小样本下做新闻摘要能比 T5-Pegasus 更听话。最后说点个人体感。我现在接到新的中文生成需求默认流程永远是先拿 T5-Pegasus-Base 在标注数据上微调一个 baseline把效果下限摸清楚如果不够再考虑换更大参数或者上更重的方案。这个模型不是万能的开放对话、超长文生成、创意文案都轮不到它出头但在“输入一段结构化文本输出一段受控文本”这个范围里它是我验证过最省心、最不容易翻车的中文生成底座。如果你也在做选型建议先把它跑一遍再决定要不要上更复杂的方案。本文还有配套的精品资源点击获取