Python PaddleNLP 实现自动生成虎年藏头诗
利用 Python PaddleNLP 库结合 Transformer 架构实现藏头诗的自动生成。通过编码器处理首字信息,解码器生成后续诗句,确保韵律与连贯性。涵盖环境搭建、数据预处理、模型加载及推理生成的完整流程,提供可运行的示例代码与参数调优建议。
利用 Python PaddleNLP 库结合 Transformer 架构实现藏头诗的自动生成。通过编码器处理首字信息,解码器生成后续诗句,确保韵律与连贯性。涵盖环境搭建、数据预处理、模型加载及推理生成的完整流程,提供可运行的示例代码与参数调优建议。
利用自然语言处理技术自动生成诗歌,是生成式人工智能(AIGC)在文化领域的典型应用。本项目基于百度飞桨(PaddlePaddle)的 NLP 工具包 PaddleNLP,构建一个编码器 - 解码器(Encoder-Decoder)架构模型。
藏头诗要求每句诗的开头字组成特定含义。模型通过编码器接收首字信息,并结合上下文语境,由解码器逐步生成后续诗句。为了保持诗句之间的连贯性和韵律感,编码器在输入时不仅包含当前首字,还会结合前序诗句的信息。
例如:
'白日依山尽,黄河入海流,欲穷千里目,更上一层楼。'
可拆解为训练样本:
这种序列到序列(Seq2Seq)的学习方式,使模型能够理解古诗的格律和语义关联。
在开始之前,需要确保开发环境已安装必要的依赖库。推荐使用 Python 3.7 及以上版本。
使用 pip 升级或安装 PaddleNLP 库:
pip install -U paddlenlp
若遇到依赖冲突,建议创建独立的虚拟环境进行隔离。
运行以下代码检查版本及 GPU 可用性:
import paddle
from paddlenlp import __version__
print(f"PaddleNLP Version: {__version__}")
print(f"Device: {paddle.device.get_device()}")
高质量的古诗数据集是模型效果的关键。通常使用公开的古诗词语料库,如《全唐诗》。
原始数据需去除标点符号、特殊字符,并统一格式。每首诗应被拆分为单行文本,便于序列化。
中文古诗词无需像英文那样进行空格分词,但需进行字符级或子词级切分。PaddleNLP 内置了多种 tokenizer,可根据模型需求选择。
from paddlenlp.transformers import AutoTokenizer
model_name = "gpt2-chinese"
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 示例编码
text = "白日依山尽"
encoded_ids = tokenizer.encode(text, add_special_tokens=True)
print(encoded_ids)
对于初学者,直接使用预训练模型进行推理是最快捷的方式。PaddleNLP 提供了丰富的预训练模型,支持零样本或少样本生成。
from paddlenlp.transformers import AutoModelForCausalLM
model_name = "gpt2-chinese"
model = AutoModelForCausalLM.from_pretrained(model_name)
控制生成质量的关键参数包括温度(temperature)、Top-K 采样和 Top-P 采样。
import torch
# 设置生成参数
temperature = 0.8
top_k = 50
top_p = 0.9
max_length = 100
# 执行生成
outputs = model.generate(
input_ids=input_ids,
max_length=max_length,
temperature=temperature,
top_k=top_k,
top_p=top_p,
do_sample=True
)
以下是一个完整的脚本示例,演示如何加载模型并生成指定首字的诗句。
import paddle
from paddlenlp.transformers import AutoModelForCausalLM, AutoTokenizer
def generate_poem(head_char):
# 初始化模型和分词器
model_name = "gpt2-chinese"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# 构造输入
prompt = head_char + "\n"
input_ids = tokenizer.encode(prompt, return_tensors="pd")
# 生成配置
outputs = model.generate(
input_ids=input_ids,
max_length=60,
temperature=0.8,
top_k=50,
top_p=0.9,
do_sample=True,
pad_token_id=tokenizer.pad_token_id,
eos_token_id=tokenizer.eos_token_id
)
# 解码输出
result = tokenizer.decode(outputs[0], skip_special_tokens=True)
return result
if __name__ == "__main__":
# 尝试生成以'虎'开头的诗句
poem = generate_poem("虎")
print(poem)
如果在使用 GPU 时出现 OOM(Out Of Memory)错误,可以尝试减小 batch size 或使用更小的模型版本。同时确保关闭不必要的后台进程。
调整 Temperature 参数至 0.5-0.7 之间通常能提升连贯性。若仍不理想,可考虑对模型进行微调(Fine-tuning),使用特定风格的古诗数据进行训练。
PaddleNLP 依赖较多,建议在纯净环境中安装。如遇 numpy 或 scipy 版本问题,可参考官方文档指定的兼容版本。
通过 PaddleNLP,开发者可以快速搭建古诗生成系统。本文介绍了从环境搭建、数据处理到模型推理的全流程。虽然本示例使用了通用预训练模型,但在实际应用中,针对特定风格(如五言、七言)的微调将显著提升生成质量。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online