十五、基于 GPT2 中文模型实现歌词自动续写

在自然语言生成(NLG)领域,GPT2 凭借轻量化、易部署的特性,成为中文场景下文本创作的优选模型之一。本文将以 "GPT2 中文歌词生成模型" 为例,从代码解析、核心原理到实战优化,手把手教你实现歌词自动续写功能,让机器也能写出有 "氛围感" 的中文歌词。

一、技术背景:GPT2 与中文文本生成

GPT2 是 OpenAI 推出的基于 Transformer 架构的因果语言模型,核心能力是 "根据前文预测下文",非常适合文本续写、创作类场景。而针对中文优化的 GPT2 模型(如本次使用的 gpt2-chinese-lyric),在中文歌词、诗歌等创作场景中做了针对性微调,能更好地贴合中文韵律和语义习惯。

本次实战的核心目标是:基于本地部署的 GPT2 中文歌词模型,输入一句经典歌词前缀(如周杰伦《不能说的秘密》中的 "最美的不是下雨天,是曾与你躲过雨的屋檐"),让模型自动续写完整的歌词内容。

二、环境准备

1. 依赖安装

首先需安装核心依赖库,PyTorch 为模型运行提供底层张量计算支持,transformers 库封装了 GPT2 模型的加载、推理全流程:

复制代码
# 安装PyTorch(适配CPU/GPU,根据硬件选择对应版本)
pip install torch==2.4.1 torchvision==0.18.1 torchaudio==2.4.1
# 安装Hugging Face Transformers库(模型加载/推理核心)
pip install transformers

2. 模型准备

本次使用的 "gpt2-chinese-lyric" 模型可从 ModelScope、Hugging Face 等平台下载,下载后存放至本地指定路径(本文路径为D:\pyproject\flaskProject\langchainstudy\modelscope\gpt2-chinese-lyric,需根据实际路径调整)。

三、核心代码解析

接下来逐行拆解核心代码,理解 GPT2 文本生成的完整流程:

1. 库导入:加载核心依赖

复制代码
import torch
from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM, BertTokenizer, GPT2LMHeadModel, TextGenerationPipeline
  • torch:PyTorch 核心库,提供张量计算和设备管理能力;
  • BertTokenizer:中文 GPT2 模型常兼容 BERT 分词器,用于将文本转换为模型可识别的 token 索引;
  • GPT2LMHeadModel:GPT2 的核心模型类(带语言建模头),专门用于文本生成任务;
  • TextGenerationPipeline:transformers 封装的文本生成管道,简化 "编码 - 推理 - 解码" 全流程。

2. 模型与分词器加载

复制代码
# 本地模型路径(注意修正路径笔误:pyprojecgt→pyproject)
model_dir = r'D:\pyproject\flaskProject\langchainstudy\modelscope\gpt2-chinese-lyric'
# 加载分词器:与本地GPT2模型配套
tokenizer = BertTokenizer.from_pretrained(model_dir)
# 加载GPT2模型:weights_only=False允许加载完整权重(适配中文模型)
model = GPT2LMHeadModel.from_pretrained(model_dir,weights_only=False)
  • 分词器是 "文本→模型输入" 的桥梁:将中文文本拆分为一个个 token,并映射为数字索引;
  • GPT2LMHeadModel.from_pretrained():从本地路径加载预训练模型权重,无需重新训练即可直接推理。

3. 创建文本生成管道

复制代码
# 封装模型和分词器,创建推理对象
text_generator = TextGenerationPipeline(model,tokenizer)

TextGenerationPipeline是 transformers 的 "懒人神器"------ 无需手动处理文本编码、张量转换、结果解码,只需传入文本即可直接生成续写内容,大幅降低推理门槛。

4. 执行文本生成

复制代码
# 输入歌词前缀,调用生成管道
out = text_generator(
    "最美的不是下雨天,是曾与你躲过雨的屋檐", 
    truncation=True,
    max_new_tokens=None,
    max_length=100, 
    do_sample=True
)
# 打印生成结果
print(out)

这是核心推理步骤,关键参数解读:

  • truncation=True:若输入文本长度超过模型最大限制,自动截断,避免报错;
  • max_length=100:生成文本的总长度(输入前缀 + 续写内容)不超过 100 个 token;
  • max_new_tokens=None:不单独限制续写的 token 数,由max_length控制总长度;
  • do_sample=True:启用 "采样生成" 策略(而非贪心搜索),让生成结果更多样化(贪心搜索会选概率最高的 token,结果单调)。

5. 结果输出

执行代码后,输出结果格式如下(核心是generated_text字段):

复制代码
[{'generated_text': '最美的不是下雨天,是曾与你躲过雨的屋檐\n回忆的画面,荡着秋千,梦开始不甜\n你说把爱渐渐放下会走更远\n或许命运的签,只让我们遇见\n只让我们相恋,这一季的秋天\n飘落后才发现,这幸福的碎片,要我怎么捡'}]

结果是一个列表,每个元素是字典,generated_text对应完整的续写文本。

四、优化技巧:让生成效果更优

原始代码能实现基础功能,但在生成质量、性能、稳定性上还有优化空间:

1. 设备加速:利用 GPU 提升推理速度

默认情况下模型运行在 CPU 上,若有 NVIDIA GPU,可添加设备配置代码:

复制代码
# 优先使用CUDA(GPU),无则用CPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)  # 模型移至GPU
# 创建管道时指定设备
text_generator = TextGenerationPipeline(model, tokenizer, device=device.index if device.type == "cuda" else -1)

2. 参数调优:提升生成文本的自然度

参数 作用 推荐值
temperature 控制生成随机性:值越低越保守(贴近原文),越高越随机 0.7~0.9
top_k 仅从概率前 k 个 token 中采样,减少无意义内容 50~100
no_repeat_ngram_size 禁止 n 元语法重复,避免 "的的""啊啊" 等冗余内容 2
max_new_tokens 单独限制续写的 token 数(替代 max_length,更直观) 50~80

优化后的生成代码:

复制代码
out = text_generator(
    "最美的不是下雨天,是曾与你躲过雨的屋檐",
    truncation=True,
    max_new_tokens=50,  # 仅续写50个token
    temperature=0.8,
    top_k=50,
    no_repeat_ngram_size=2,
    do_sample=True
)

3. 结果解析:提取核心文本

原始输出是字典列表,可添加解析逻辑,直接输出可读文本:

复制代码
generated_text = out[0]["generated_text"]
print("续写结果:\n", generated_text)

五、扩展应用场景

  1. Web 化部署:结合 Flask/FastAPI 将功能封装为接口,实现网页端歌词生成;
  2. 批量生成:读取歌词前缀列表,批量生成多版歌词,供创作参考;
  3. 风格定制:基于特定歌手的歌词语料微调 GPT2 模型,生成更贴合该歌手风格的歌词;
  4. 多场景适配:替换模型为 gpt2-chinese-poetry,实现古诗续写;替换为 gpt2-chatbot,实现聊天机器人。

六、总结

本文基于 GPT2 中文歌词模型,完成了从环境准备、代码解析到效果优化的全流程实战,核心要点如下:

  1. GPT2 的因果语言模型特性天然适配文本续写任务,中文微调模型可贴合歌词、诗歌等场景;
  2. TextGenerationPipeline大幅简化了文本生成的推理流程,无需手动处理编码 / 解码;
  3. 通过调整temperaturetop_k等参数,可平衡生成文本的 "多样性" 和 "合理性";
  4. 结合 GPU 加速和参数调优,能显著提升生成效率和文本质量。

本次实战的代码仅需少量修改,即可适配各类中文文本生成场景,无论是歌词创作、文案生成还是对话机器人,GPT2 都能成为轻量化、易部署的优选方案。

完整代码

复制代码
# 导入PyTorch核心库:提供张量计算、设备管理等基础能力,是模型运行的底层支撑
import torch
# 导入Transformers库中GPT2文本生成所需组件:
# pipeline/AutoTokenizer/AutoModelForCausalLM:备用组件(本文未直接使用)
# BertTokenizer:中文GPT2模型适配的分词器(将文本转为模型可识别的token索引)
# GPT2LMHeadModel:GPT2核心模型类(带语言建模头,专为文本生成设计)
# TextGenerationPipeline:封装好的文本生成管道,简化"编码-推理-解码"全流程
from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM, BertTokenizer, GPT2LMHeadModel, \
    TextGenerationPipeline

# 可选:若环境中PyTorch版本不兼容,执行此命令安装指定版本(根据硬件选择CPU/GPU版本)
# pip install torch==2.4.1 torchvision==0.18.1 torchaudio==2.4.1

# ===================== 模型路径配置 =====================
# 本地GPT2中文歌词模型的存放路径(注意:路径中"pyprojecgt"为笔误,实际需修正为"pyproject")
model_dir = r'D:\pyprojecgt\flaskProject\langchainstudy\modelscope\gpt2-chinese-lyric'

# ===================== 加载分词器 =====================
# 加载与本地GPT2模型配套的BERT分词器:
# 作用是将中文文本拆分为一个个token(最小语义单元),并映射为数字索引(模型仅能识别数字)
tokenizer = BertTokenizer.from_pretrained(model_dir)

# ===================== 加载GPT2模型 =====================
# 加载本地GPT2中文歌词模型:
# from_pretrained:从指定路径加载预训练权重,无需重新训练即可直接推理
# weights_only=False:允许加载完整的模型权重(中文微调模型需此配置,避免权重加载失败)
model = GPT2LMHeadModel.from_pretrained(model_dir,weights_only=False)

# ===================== 创建文本生成推理管道 =====================
# 封装模型和分词器为文本生成管道:
# 无需手动处理"文本编码→张量转换→模型推理→结果解码"流程,直接输入文本即可生成内容
# 是Transformers库简化推理的核心工具,大幅降低新手使用门槛
text_generator = TextGenerationPipeline(model,tokenizer)

# ===================== 执行歌词续写推理 =====================
# 调用生成管道,基于输入的歌词前缀生成续写内容
# 输入参数:歌词前缀 + 生成策略参数
out = text_generator(
    "最美的不是下雨天,是曾与你躲过雨的屋檐",  # 输入的歌词前缀(上下文)
    truncation=True,                          # 若输入文本过长,自动截断至模型最大长度,避免报错
    max_new_tokens=None,                      # 不单独限制新生成的token数(由max_length控制总长度)
    max_length=100,                           # 生成文本的总长度(前缀+续写)不超过100个token
    do_sample=True                            # 启用采样生成(而非贪心搜索):
                                              # 贪心搜索会选概率最高的token,结果单调;采样生成结果更多样
)

# ===================== 打印生成结果 =====================
# 输出生成的完整结果(格式为列表字典,核心内容在"generated_text"字段)
print(out)
相关推荐
新缸中之脑3 小时前
在OpenClaw中构建专业AI角色
大数据·人工智能
好奇龙猫3 小时前
【人工智能学习-AI入试相关题目练习-第十五次】
人工智能·学习
卢锡荣3 小时前
Type-c小家电性价比方案讲解LDR系列
网络·人工智能·计算机外设·电脑
ws2019073 小时前
从“面子”到“里子”的变革——AUTO TECH China 2026 广州展,引领汽车内外饰新纪元
人工智能·科技·汽车
大江东去浪淘尽千古风流人物4 小时前
【LingBot-Depth】Masked Depth Modeling for Spatial Perception
人工智能·算法·机器学习·概率论
softshow10264 小时前
Ubuntu20.04 安装声卡驱动
人工智能
桂花饼4 小时前
小镜 AI —— 一站式全球顶级大模型聚合平台
人工智能·sora2·gemini 3·gpt-5.2·codex-max
(; ̄ェ ̄)。4 小时前
机器学习入门(十七)朴素贝叶斯
人工智能·机器学习
yuanlulu4 小时前
Agent_Skills_完全教程「AI生成」
人工智能·大语言模型·agent·智能体·skill·claude code·opencode