简介本资源是一套完整的基于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优化器调参lr0.002及模型持久化流程附带README与模块化注释便于理解诗歌生成的数据预处理、序列建模与文本解码全过程。1. 项目缘起当LSTM遇见平仄格律几年前我接手了一个文化科技类的项目核心需求是让机器能“创作”出符合传统格律的古诗词。当时市面上已经有不少基于统计语言模型或简单RNN的生成工具但出来的作品要么前言不搭后语要么完全无视诗词的平仄、对仗和押韵规则读起来总感觉少了点“魂”。这让我意识到古诗词自动生成远不止是文本生成问题它更像是一个在强约束格律下进行创造性表达的难题。传统的N-gram模型捕捉不到长距离的语义依赖“床前明月光”的下一句它可能给你接个“红烧排骨香”而基础的RNN又难以记住整首诗的宏观结构经常写着写着就忘了开头定下的韵脚。正是在这种背景下长短期记忆网络进入了我的视野。LSTM特有的门控机制输入门、遗忘门、输出门让它能够有选择地记住或忘记信息这对于处理像七律、五绝这种具有固定行数、字数和严格押韵规则的文本序列来说简直是天作之合。模型需要记住第一句的韵脚并在后续的奇数句绝句的第三句除外巧妙地避开它在偶数句准确地呼应它同时还要兼顾每句内部的平仄交替。这不仅仅是记忆问题更是对信息流的精细控制。于是一个结合了LSTM序列生成能力和古诗词先验知识约束的项目构想便成型了我们不仅要一个能写诗的算法核心还要一个能让用户交互、选择风格、看到生成过程的完整系统。这不仅仅是技术Demo而是想探索一下在算法的辅助下传统文学形式能否碰撞出新的火花。2. 核心架构设计从语料处理到系统交互整个项目可以清晰地划分为前后端两个核心部分后端的算法模型流水线以及前端的交互应用系统。后端的任务是“学会写诗”前端的任务是“让人用好”。2.1 后端算法流水线拆解后端的核心是一个基于LSTM的序列到序列生成模型但其特殊性在于强烈的“规则注入”。整个流程可以细分为四个阶段2.1.1 语料库的构建与清洗这是所有NLP项目的基石对古诗词而言更是如此。我们需要的不是一个简单的文本文件而是一个结构化、标注化的数据库。我们的数据源主要来自《全唐诗》、《全宋词》等公开的权威电子版本。清洗过程异常繁琐文本提取与分首从原始数据中准确分离出每一首独立的诗词并记录其标题、作者、朝代。异常字符过滤去除现代标点如逗号、句号但保留古籍中可能存在的句读符号。统一繁体字为简体字或建立繁简映射表这取决于模型的学习目标。格律信息标注核心难点这是最耗人工但价值最高的步骤。我们需要为每一句诗标注其平仄格式。例如“平平仄仄平平仄”。这涉及到古音到现代汉语拼音的映射虽然不完全准确入声字问题但对于生成符合现代阅读习惯的诗句而言是一个可行的折衷方案。我们构建了一个汉字到平仄的映射字典并结合人工校对。分词与向量化古诗词通常以字为单位进行建模效果更好因为词边界模糊且单字信息密度高。我们将每首诗处理成一个由字ID组成的序列。例如“床前明月光” -[ID(床), ID(前), ID(明), ID(月), ID(光)]。同时我们生成了两个关键的字典字到ID和ID到字。2.1.2 模型结构设计LSTM 规则约束我们采用了多层LSTM作为生成器。其输入是当前已生成的字序列或一个起始符输出是下一个字的概率分布。但关键点在于如何将“平仄规则”和“押韵规则”融入生成过程。嵌入层将字ID转换为密集向量。这个向量空间会逐渐学习到字与字之间的语义和风格关联。LSTM层我们使用了2-3层堆叠的LSTM以捕获诗句内和诗句间的复杂依赖关系。Dropout层被用于防止过拟合这在数据量相对不大的情况下尤为重要。输出层一个全连接层后接Softmax产生在整个字表上的概率分布。规则的融合发生在推理生成阶段而非训练阶段。这是一个重要的设计选择。训练时我们让模型纯粹地学习语料中的序列规律。但在生成每一个字时我们会动态地修改这个概率分布平仄过滤根据当前句子要满足的平仄格式如第二字应为“平”我们将所有不符合该平仄要求的字对应的概率置为零或一个极小的值。押韵引导在需要押韵的位置我们提高训练语料中常见韵脚字的概率权重。温度采样为了避免生成过于保守、重复的句子我们使用温度参数Temperature来调整Softmax输出的概率分布。温度越高分布越平缓生成结果越随机、有创意温度越低分布越尖锐生成结果越确定、保守。2.1.3 训练策略与损失函数我们使用标准的交叉熵损失函数目标是让模型预测的下一个字与真实的下一个字尽可能一致。但由于我们引入了规则约束在训练时我们采用了一种“课程学习”的思路初期让模型自由学习后期在训练数据中混入更多格律工整的样本让模型隐式地感受到规则的重要性。优化器通常选择Adam学习率需要仔细调整因为LSTM对学习率比较敏感。2.2 前端系统实现思路系统采用经典的B/S架构目标是提供一个直观易用的Web界面。技术选型前端使用Vue.js或React用于构建动态的用户界面包括风格选择豪放、婉约、山水、边塞、体裁选择五绝、七律、词牌名、生成参数调整温度、采样方式等。后端使用Python的Flask或Django框架提供RESTful API接收前端请求调用后端的模型进行生成并返回结果。核心交互流程用户在前端选择体裁如“七言绝句”和主题关键词如“明月”、“思乡”。前端将这些参数通过API发送给后端。后端将主题关键词转换为起始向量或作为生成条件加载对应的模型结合规则约束执行序列生成算法。生成过程中可以设计一个“逐字生成”的动画接口将生成过程实时流式推回前端增强体验感。生成完成后后端不仅返回诗句文本还可以返回简单的“格律符合度评估”和“意象分析”基于词向量计算与主题的相似度。前端优雅地展示最终诗句并提供“重新生成”、“调整某句”、“收藏”、“分享”等功能。3. 算法实现的关键细节与“炼丹”心得理论设计清晰后真正的挑战在于实现和调优。这里分享几个踩过坑才明白的关键细节。3.1 输入输出表示的“陷阱”最初我尝试以整首诗如28个字作为一个序列输入LSTM。但很快发现模型很难学会在固定位置换行和押韵。后来改为以“句”为基本单位进行训练和生成。具体做法是在每句诗的结尾加上一个特殊的[EOS]句结束标记。在每首诗的结尾加上一个特殊的[EOP]诗结束标记。训练时模型的任务是给定前面的所有字预测下一个字。当它输出[EOS]时意味着这一句结束下一句开始。当它输出[EOP]时意味着整首诗生成完毕。在生成时我们强制模型在达到规定句数如四句后必须生成[EOP]或者当生成[EOP]时停止。这种方法让模型显式地学习了“句”和“篇”的结构概念生成效果显著提升。3.2 平仄规则注入的工程实践规则注入不是简单的if-else判断。粗暴地将不符合平仄的字概率设为0会导致在某些位置所有候选字都被过滤生成失败。我们的策略是软约束与硬约束结合对于韵脚等关键位置使用硬约束必须押韵。对于句内非关键位置的平仄使用软约束即不符合规则的字概率会被乘以一个衰减系数如0.1而不是直接归零。这给了模型一定的灵活性。回退机制当经过规则过滤后所有字的概率和低于一个阈值时触发回退机制。例如暂时放宽平仄要求或者从历史生成的高概率字中重新选择一个。这保证了生成的鲁棒性。使用外部知识库我们维护了一个“同义平仄字表”。例如当需要生成一个“平声字”但概率最高的几个字都是仄声时系统会从这个表中查找与当前语义向量最接近的平声字进行替换。这需要结合词向量来计算相似度。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请求在并发量稍高时就会遇到性能瓶颈。我们采用了以下方案模型导出与固化将训练好的模型导出为固定的计算图格式如TensorFlow的SavedModel或PyTorch的TorchScript。这消除了训练时特有的操作提升了推理效率。使用专用推理服务器我们放弃了直接用Flask加载模型转而使用TensorFlow Serving或TorchServe。这些服务器专为模型推理优化支持自动批处理、模型版本管理、并发请求处理性能远超原生Web框架。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这类序列模型处理强约束文本生成任务的可行性以及“深度学习规则知识”混合架构的有效性。当然局限也很明显模型本质上是在学习并重组训练数据中的模式其“创作”缺乏真实的生活体验和情感驱动。生成的诗词可能形似而神不似难以产生直击人心的力量。此外对大量生僻字或复杂词牌的处理仍然比较吃力。回顾整个项目从语料清洗的琐碎到模型调参的煎熬再到系统集成的挑战每一步都是对工程能力和问题解决能力的考验。最终看到系统生成出一首像模像样的七绝时那种成就感是巨大的。它让我深刻理解到将前沿算法落地到具体、有文化内涵的场景中不仅需要扎实的技术更需要跨领域的思考和精细的工程化打磨。这个项目留下的代码和模型或许会过时但其中解决问题的思路——如何让算法理解并遵循人类复杂的文化规则——将会持续启发我未来的工作。本文还有配套的精品资源点击获取
