基于LSTM与规则融合的古诗词自动生成系统设计与实现
2026/9/22 1:26:27 网站建设 项目流程

简介:本资源是一套完整的基于LSTM的古诗词自动生成系统实现方案,面向人工智能初学者、自然语言处理实践者及传统文化数字化爱好者,解决传统RNN在长序列古诗生成中梯度消失、记忆衰减导致诗句连贯性差的问题。资源包共40个文件,含7个核心Python脚本(如train_model.py、WebApp.py、gene_head_poetry.py)、4组模型权重文件(.data/.index/.meta)、前端模板(HTML/JS)、训练语料(tangshi.txt)及依赖说明(requirements.txt),整体大小81.76MB,结构清晰,支持开箱即用与二次开发。已有1873人学习下载。用户可直接运行Flask服务,通过Web界面输入提示词生成五言律诗、七言绝句或藏头诗;代码中完整呈现LSTM模型构建、sparse_categorical_crossentropy损失函数配置、Adam优化器调参(lr=0.002)及模型持久化流程,附带README与模块化注释,便于理解诗歌生成的数据预处理、序列建模与文本解码全过程。

1. 项目缘起:当LSTM遇见平仄格律

几年前,我接手了一个文化科技类的项目,核心需求是让机器能“创作”出符合传统格律的古诗词。当时市面上已经有不少基于统计语言模型或简单RNN的生成工具,但出来的作品要么前言不搭后语,要么完全无视诗词的平仄、对仗和押韵规则,读起来总感觉少了点“魂”。这让我意识到,古诗词自动生成远不止是文本生成问题,它更像是一个在强约束(格律)下进行创造性表达的难题。传统的N-gram模型捕捉不到长距离的语义依赖,“床前明月光”的下一句它可能给你接个“红烧排骨香”;而基础的RNN又难以记住整首诗的宏观结构,经常写着写着就忘了开头定下的韵脚。

正是在这种背景下,长短期记忆网络进入了我的视野。LSTM特有的门控机制(输入门、遗忘门、输出门)让它能够有选择地记住或忘记信息,这对于处理像七律、五绝这种具有固定行数、字数和严格押韵规则的文本序列来说,简直是天作之合。模型需要记住第一句的韵脚,并在后续的奇数句(绝句的第三句除外)巧妙地避开它,在偶数句准确地呼应它,同时还要兼顾每句内部的平仄交替。这不仅仅是记忆问题,更是对信息流的精细控制。于是,一个结合了LSTM序列生成能力和古诗词先验知识约束的项目构想便成型了:我们不仅要一个能写诗的算法核心,还要一个能让用户交互、选择风格、看到生成过程的完整系统。这不仅仅是技术Demo,而是想探索一下,在算法的辅助下,传统文学形式能否碰撞出新的火花。

2. 核心架构设计:从语料处理到系统交互

整个项目可以清晰地划分为前后端两个核心部分:后端的算法模型流水线,以及前端的交互应用系统。后端的任务是“学会写诗”,前端的任务是“让人用好”。

2.1 后端算法流水线拆解

后端的核心是一个基于LSTM的序列到序列生成模型,但其特殊性在于强烈的“规则注入”。整个流程可以细分为四个阶段:

2.1.1 语料库的构建与清洗这是所有NLP项目的基石,对古诗词而言更是如此。我们需要的不是一个简单的文本文件,而是一个结构化、标注化的数据库。我们的数据源主要来自《全唐诗》、《全宋词》等公开的权威电子版本。清洗过程异常繁琐:

  1. 文本提取与分首:从原始数据中准确分离出每一首独立的诗词,并记录其标题、作者、朝代。
  2. 异常字符过滤:去除现代标点(如逗号、句号),但保留古籍中可能存在的句读符号。统一繁体字为简体字,或建立繁简映射表,这取决于模型的学习目标。
  3. 格律信息标注(核心难点):这是最耗人工但价值最高的步骤。我们需要为每一句诗标注其平仄格式。例如,“平平仄仄平平仄”。这涉及到古音到现代汉语拼音的映射,虽然不完全准确(入声字问题),但对于生成符合现代阅读习惯的诗句而言,是一个可行的折衷方案。我们构建了一个汉字到平仄的映射字典,并结合人工校对。
  4. 分词与向量化:古诗词通常以字为单位进行建模效果更好,因为词边界模糊且单字信息密度高。我们将每首诗处理成一个由字ID组成的序列。例如,“床前明月光” ->[ID(床), ID(前), ID(明), ID(月), ID(光)]。同时,我们生成了两个关键的字典:字到IDID到字

2.1.2 模型结构设计:LSTM + 规则约束我们采用了多层LSTM作为生成器。其输入是当前已生成的字序列(或一个起始符),输出是下一个字的概率分布。但关键点在于如何将“平仄规则”和“押韵规则”融入生成过程。

  • 嵌入层:将字ID转换为密集向量。这个向量空间会逐渐学习到字与字之间的语义和风格关联。
  • LSTM层:我们使用了2-3层堆叠的LSTM,以捕获诗句内和诗句间的复杂依赖关系。Dropout层被用于防止过拟合,这在数据量相对不大的情况下尤为重要。
  • 输出层:一个全连接层后接Softmax,产生在整个字表上的概率分布。

规则的融合发生在推理(生成)阶段,而非训练阶段。这是一个重要的设计选择。训练时,我们让模型纯粹地学习语料中的序列规律。但在生成每一个字时,我们会动态地修改这个概率分布:

  1. 平仄过滤:根据当前句子要满足的平仄格式(如第二字应为“平”),我们将所有不符合该平仄要求的字对应的概率置为零或一个极小的值。
  2. 押韵引导:在需要押韵的位置,我们提高训练语料中常见韵脚字的概率权重。
  3. 温度采样:为了避免生成过于保守、重复的句子,我们使用温度参数(Temperature)来调整Softmax输出的概率分布。温度越高,分布越平缓,生成结果越随机、有创意;温度越低,分布越尖锐,生成结果越确定、保守。

2.1.3 训练策略与损失函数我们使用标准的交叉熵损失函数,目标是让模型预测的下一个字与真实的下一个字尽可能一致。但由于我们引入了规则约束,在训练时我们采用了一种“课程学习”的思路:初期让模型自由学习,后期在训练数据中混入更多格律工整的样本,让模型隐式地感受到规则的重要性。优化器通常选择Adam,学习率需要仔细调整,因为LSTM对学习率比较敏感。

2.2 前端系统实现思路系统采用经典的B/S架构,目标是提供一个直观易用的Web界面。

  • 技术选型:前端使用Vue.js或React,用于构建动态的用户界面,包括风格选择(豪放、婉约、山水、边塞)、体裁选择(五绝、七律、词牌名)、生成参数调整(温度、采样方式)等。后端使用Python的Flask或Django框架,提供RESTful API,接收前端请求,调用后端的模型进行生成,并返回结果。
  • 核心交互流程
    1. 用户在前端选择体裁(如“七言绝句”)和主题关键词(如“明月”、“思乡”)。
    2. 前端将这些参数通过API发送给后端。
    3. 后端将主题关键词转换为起始向量或作为生成条件,加载对应的模型,结合规则约束,执行序列生成算法。
    4. 生成过程中,可以设计一个“逐字生成”的动画接口,将生成过程实时流式推回前端,增强体验感。
    5. 生成完成后,后端不仅返回诗句文本,还可以返回简单的“格律符合度评估”和“意象分析”(基于词向量计算与主题的相似度)。
    6. 前端优雅地展示最终诗句,并提供“重新生成”、“调整某句”、“收藏”、“分享”等功能。

3. 算法实现的关键细节与“炼丹”心得

理论设计清晰后,真正的挑战在于实现和调优。这里分享几个踩过坑才明白的关键细节。

3.1 输入输出表示的“陷阱”

最初,我尝试以整首诗(如28个字)作为一个序列输入LSTM。但很快发现,模型很难学会在固定位置换行和押韵。后来改为以“句”为基本单位进行训练和生成。具体做法是:

  • 在每句诗的结尾,加上一个特殊的[EOS](句结束)标记。
  • 在每首诗的结尾,加上一个特殊的[EOP](诗结束)标记。
  • 训练时,模型的任务是给定前面的所有字,预测下一个字。当它输出[EOS]时,意味着这一句结束,下一句开始。当它输出[EOP]时,意味着整首诗生成完毕。
  • 在生成时,我们强制模型在达到规定句数(如四句)后,必须生成[EOP],或者当生成[EOP]时停止。

这种方法让模型显式地学习了“句”和“篇”的结构概念,生成效果显著提升。

3.2 平仄规则注入的工程实践

规则注入不是简单的if-else判断。粗暴地将不符合平仄的字概率设为0,会导致在某些位置所有候选字都被过滤,生成失败。我们的策略是:

  1. 软约束与硬约束结合:对于韵脚等关键位置,使用硬约束(必须押韵)。对于句内非关键位置的平仄,使用软约束,即不符合规则的字概率会被乘以一个衰减系数(如0.1),而不是直接归零。这给了模型一定的灵活性。
  2. 回退机制:当经过规则过滤后,所有字的概率和低于一个阈值时,触发回退机制。例如,暂时放宽平仄要求,或者从历史生成的高概率字中重新选择一个。这保证了生成的鲁棒性。
  3. 使用外部知识库:我们维护了一个“同义平仄字表”。例如,当需要生成一个“平声字”但概率最高的几个字都是仄声时,系统会从这个表中查找与当前语义向量最接近的平声字进行替换。这需要结合词向量来计算相似度。

3.3 超参数调优的“玄学”与“科学”

LSTM的训练充满了“玄学”,但也有一些规律可循:

  • 隐藏层维度与层数:对于古诗词这种中等长度的序列,2层LSTM,隐藏单元数在256-512之间通常是个不错的起点。层数太多容易过拟合,且训练缓慢。
  • Dropout率:在LSTM层之间和全连接层之前使用Dropout,比率一般在0.2-0.5。这是防止过拟合的利器,尤其在数据量不是特别大的情况下。
  • 批次大小与序列长度:由于诗词长度不一,我们需要进行填充。但填充会引入噪声。更好的做法是,在每轮训练前,将语料库中长度相近的诗句分批,这样可以最小化填充,提高训练效率。这就是“桶”技巧。
  • 梯度裁剪:这是训练RNN/LSTM类模型的必备操作。由于序列数据的反向传播存在梯度爆炸的风险,必须设置一个梯度阈值(如5.0),当梯度范数超过此值时,将其缩放。不这样做的话,训练过程可能会突然出现NaN损失。

注意:损失函数(Loss)的下降曲线是重要的观察窗口。一个健康的训练过程,训练损失和验证损失都应该平稳下降,并最终趋于平缓。如果验证损失很早就开始上升而训练损失继续下降,那就是典型的过拟合,需要增加Dropout、减少模型复杂度或增加数据。如果两者都下降得很慢,可能是学习率太低或模型能力不足。

4. 从模型到系统:工程化部署的挑战

让一个在Jupyter Notebook里跑通的模型变成一个可供用户访问的稳定服务,是另一个维度的挑战。

4.1 模型服务化与性能优化

直接使用训练框架(如TensorFlow或PyTorch)加载模型响应HTTP请求,在并发量稍高时就会遇到性能瓶颈。我们采用了以下方案:

  1. 模型导出与固化:将训练好的模型导出为固定的计算图格式(如TensorFlow的SavedModel或PyTorch的TorchScript)。这消除了训练时特有的操作,提升了推理效率。
  2. 使用专用推理服务器:我们放弃了直接用Flask加载模型,转而使用TensorFlow ServingTorchServe。这些服务器专为模型推理优化,支持自动批处理、模型版本管理、并发请求处理,性能远超原生Web框架。
  3. API网关:后端(Flask/Django)现在只负责处理业务逻辑(接收参数、调用规则引擎、组装结果),它通过gRPC或REST API去调用TensorFlow Serving提供的模型服务。这样实现了业务逻辑与模型计算的高效解耦。

4.2 系统功能拓展与用户体验

一个基本的生成功能是核心,但要让系统有生命力,需要更多设计:

  • 风格控制:我们尝试在输入中引入“风格向量”。例如,在训练数据中,为李白、杜甫、王维的诗打上不同标签。在生成时,用户可以选择“李白风格”,系统就会将对应的风格标签向量与字向量拼接后输入模型。这能让生成的诗句带有不同的遣词造句倾向。
  • 交互式修改:用户对生成的某一句不满意,可以高亮这一句,点击“修改”。系统会固定其他句子的上下文,只重新生成这一句,同时满足原有的押韵和平仄约束。这需要模型支持“条件生成”。
  • 生成结果评估与解释:除了显示诗句,系统还可以提供一个简单的“报告”,比如:“平仄符合度:95%”、“押韵检测:成功(押‘ang’韵)”、“核心意象:秋月、孤舟”。这些信息并非来自复杂的AI模型,而是基于规则的快速检查,能极大增加用户对结果的信任感和趣味性。

4.3 遇到的实际问题与解决方案

  • 问题:生成结果有时会出现重复循环,比如“春风吹春风吹”。
    • 排查:检查了训练数据,没有发现问题。观察了生成时的概率分布,发现在某些情况下,模型会陷入一个局部最优状态,反复输出同一个或几个高概率字。
    • 解决:引入了“重复惩罚”机制。在生成过程中,动态降低那些在近期(如前5个位置)已经出现过的字的概率。同时,适当提高采样温度,增加随机性。两者结合后,问题基本解决。
  • 问题:系统在高并发请求下响应变慢,甚至超时。
    • 排查:使用性能分析工具(如Py-Spy)发现,主要时间消耗在模型加载和单个推理上。虽然用了TensorFlow Serving,但每个请求仍是独立处理。
    • 解决:在TensorFlow Serving中启用批处理。它会将短时间内收到的多个请求在服务器端组合成一个批次进行推理,充分利用GPU的并行计算能力,显著提高了吞吐量。同时,在前端增加了请求队列和加载动画,优化了用户体验。

5. 效果评估与项目反思

如何评价机器生成的诗词?这是一个兼具技术性和人文性的问题。

5.1 客观评估指标

我们可以定义一些可量化的指标:

  • 格律符合率:自动检查生成诗句的平仄和押韵是否符合选定体裁的规则。这是一个硬性指标,我们的系统通过规则注入,可以做到接近100%。
  • 困惑度:在留出的测试集上计算模型生成诗句的困惑度。较低的困惑度表明模型更好地学习了训练数据的分布。但这只能衡量“像不像古诗”,不能衡量“好不好”。
  • 新颖性:计算生成诗句与训练集中所有诗句的n-gram重复率。我们希望生成新颖的组合,而不是简单的抄袭。

5.2 主观评估与“图灵测试”

我们组织了小范围的“盲测”,将机器生成的诗、古人写的诗、以及现代人模仿的古诗混在一起,请中文系的学生和诗词爱好者进行辨别和打分。

  • 结果:在最简单的五绝上,机器诗的“被发现率”较高,常因用词生硬或意象组合稍显突兀而被识别。但在较为复杂的七律或特定词牌上,不少生成作品能成功“混入”其中,尤其是在不考虑作者生平背景的情况下。评委们普遍认为,机器诗在“格律工整”上甚至优于部分业余人类作者,但在“意境深远”、“情感真挚”和“用典精妙”上仍有明显差距。
  • 一个有趣的发现:当提供“边塞”、“豪放”等风格指引后,机器生成的诗句中“沙场”、“铁骑”、“孤烟”等词汇的出现频率显著上升,说明风格控制是有效的。

5.3 项目的价值与局限

这个项目的核心价值,不在于创造出一个能超越人类的“AI诗人”,而在于它作为一个强大的创作辅助工具和教学演示工具的潜力。

  • 辅助创作:写作者可以输入一个关键词和意境,让系统生成多个符合格律的草稿,从中获得灵感和词汇启发,再进行修改和深化。这解决了“带着镣铐跳舞”中“镣铐”部分的负担。
  • 文化科普:系统可以直观地展示不同诗体的格律规则,通过“逐字生成”功能,让人看到每个字是如何在规则约束下被选择出来的,让抽象的格律知识变得可视可感。
  • 技术验证:它成功验证了LSTM这类序列模型处理强约束文本生成任务的可行性,以及“深度学习+规则知识”混合架构的有效性。

当然,局限也很明显:模型本质上是在学习并重组训练数据中的模式,其“创作”缺乏真实的生活体验和情感驱动。生成的诗词可能形似而神不似,难以产生直击人心的力量。此外,对大量生僻字或复杂词牌的处理仍然比较吃力。

回顾整个项目,从语料清洗的琐碎,到模型调参的煎熬,再到系统集成的挑战,每一步都是对工程能力和问题解决能力的考验。最终看到系统生成出一首像模像样的七绝时,那种成就感是巨大的。它让我深刻理解到,将前沿算法落地到具体、有文化内涵的场景中,不仅需要扎实的技术,更需要跨领域的思考和精细的工程化打磨。这个项目留下的代码和模型或许会过时,但其中解决问题的思路——如何让算法理解并遵循人类复杂的文化规则——将会持续启发我未来的工作。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询