基于GPT-2的古诗接龙模型构建与实践

基于GPT-2的古诗接龙模型构建与实践
1. 项目概述古诗接龙小模型的构建思路去年在开发一个传统文化类App时我遇到了一个有趣的需求如何让AI理解古诗的韵律规则并进行创作。这个古诗接龙项目就是从那时开始孵化的本质上是一个基于深度学习的小型文本生成模型专门针对中文古诗的接龙场景设计。与传统聊天机器人不同古诗接龙需要严格遵守平仄、押韵和对仗规则。比如当用户输入床前明月光时模型不仅要理解这是李白的《静夜思》首句还要知道下一句应该接疑是地上霜——不仅内容要连贯更关键的是光和霜在平水韵中同属七阳韵部。这就是我们构建这个模型的核心挑战。2. 核心技术架构设计2.1 模型选型与数据准备经过多次实验最终选择了GPT-2的轻量级变体作为基础架构。相比原始GPT-2的1.5亿参数我们裁剪到只有3100万参数的小模型在Colab的T4 GPU上就能完成训练。这个规模的模型既能捕捉古诗的语言特征又不会过度消耗计算资源。训练数据采用《全唐诗》4.8万首《宋词精选》1.2万首的混合语料。关键是对原始文本进行了特殊预处理[诗题]《送元二使安西》 [作者]王维 [正文]渭城朝雨浥轻尘客舍青青柳色新。劝君更尽一杯酒西出阳关无故人。 [韵部]十一真 [格律]仄平平仄仄平平仄仄平平仄仄平。仄平平仄仄平仄平仄平平平仄平。2.2 韵律约束的实现方案为了让模型输出符合格律的诗句我们在解码阶段加入了三个关键约束平仄校验器基于《平水韵》数据库实时检查每个字的声调韵脚检测器确保偶数句末尾字押同一韵部对仗评分器对颔联/颈联的词性结构进行相似度评估具体实现时这些约束被转化为Beam Search中的惩罚项。例如当模型生成一个不押韵的字时该候选序列的得分会被大幅降低。实测表明这种硬约束比纯数据驱动的方式更可靠。3. 关键实现步骤详解3.1 数据预处理流水线原始古诗文本需要经过多步清洗def preprocess_poem(text): # 移除注释和标点 text re.sub(r[【】〈〉《》「」『』], , text) # 拆分诗句 lines [line for line in text.split(\n) if len(line.strip()) 0] # 标注平仄 marked [mark_tone(line) for line in lines] # 提取韵脚 rhymes [get_rhyme(line[-1]) for line in lines[1::2]] return {text: text, tones: marked, rhymes: rhymes}3.2 模型微调技巧在HuggingFace Transformers库基础上的关键修改class PoetryModel(GPT2LMHeadModel): def generate(self, input_ids, **kwargs): # 重写生成方法加入韵律约束 kwargs[bad_words_ids] self.get_invalid_words(input_ids) kwargs[prefix_allowed_tokens_fn] self.check_rhyme return super().generate(input_ids, **kwargs) def get_invalid_words(self, input_ids): # 返回不符合平仄的字ID列表 ...3.3 前后端交互设计采用流式API返回结果前端实现逐字打印效果// 前端调用示例 const response await fetch(/api/generate, { method: POST, body: JSON.stringify({ prompt: 白日依山尽, max_length: 7, temperature: 0.7 }) }); const reader response.body.getReader(); while(true) { const {done, value} await reader.read(); if(done) break; console.log(new TextDecoder().decode(value)); }4. 实战中的经验与优化4.1 提升生成质量的技巧温度参数调节古诗生成需要较低的温度(0.6-0.8)太高会导致用词随意太低则缺乏创意重复惩罚设置no_repeat_ngram_size3避免重复短语长度控制五言诗限制在24token内七言诗不超过32token4.2 常见问题排查问题1生成的诗句不合平仄检查训练数据是否包含正确的平仄标注验证约束惩罚项的权重系数建议0.5-1.0问题2前后句意不连贯增大上下文窗口至少保留前两句在prompt中加入诗人风格提示如[李白风格]问题3生僻字过多在vocab.txt中过滤掉使用频率100次的字对生成结果进行字频检查5. 效果展示与扩展应用经过3轮调优后模型生成的接龙示例用户输入春眠不觉晓 模型输出处处闻啼鸟符合押韵、平仄正确 用户输入海上生明月 模型输出天涯共此时对仗工整这个框架还可以扩展应用到对联生成需加强平仄约束词牌填词需按词谱约束句式现代诗创作放松韵律约束我在实际部署中发现配合用户画像数据如年龄、地域调整生成风格能显著提升用户体验。比如给儿童生成时多用简单意象为南方用户避免前后鼻音混淆的韵脚。