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_size=3避免重复短语
- 长度控制:五言诗限制在24token内,七言诗不超过32token
4.2 常见问题排查
问题1:生成的诗句不合平仄
- 检查训练数据是否包含正确的平仄标注
- 验证约束惩罚项的权重系数(建议0.5-1.0)
问题2:前后句意不连贯
- 增大上下文窗口(至少保留前两句)
- 在prompt中加入诗人风格提示,如"[李白风格]"
问题3:生僻字过多
- 在vocab.txt中过滤掉使用频率<100次的字
- 对生成结果进行字频检查
5. 效果展示与扩展应用
经过3轮调优后,模型生成的接龙示例:
用户输入:春眠不觉晓 模型输出:处处闻啼鸟(符合押韵、平仄正确) 用户输入:海上生明月 模型输出:天涯共此时(对仗工整)这个框架还可以扩展应用到:
- 对联生成(需加强平仄约束)
- 词牌填词(需按词谱约束句式)
- 现代诗创作(放松韵律约束)
我在实际部署中发现,配合用户画像数据(如年龄、地域)调整生成风格,能显著提升用户体验。比如给儿童生成时多用简单意象,为南方用户避免前后鼻音混淆的韵脚。