1. 项目概述
作为一名长期从事AI项目开发的工程师,最近完成了一个基于LSTM的古诗词自动生成系统。这个项目不仅实现了从零开始训练一个能够创作古诗词的深度学习模型,还构建了完整的Web应用系统,让用户可以通过浏览器直接体验AI作诗的乐趣。
在实际开发过程中,我发现很多同学在完成这类毕业设计项目时,常常会遇到模型训练效果不佳、前后端对接困难、系统部署复杂等问题。本文将详细分享整个项目的技术实现细节,包括模型架构设计、训练技巧、系统实现和部署方案,希望能为正在做类似项目的同学提供一些实用参考。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心算法设计
2.1 LSTM模型选型考量
在自然语言处理领域,LSTM(长短期记忆网络)因其出色的序列建模能力而被广泛使用。相比于传统RNN,LSTM通过精心设计的"门"机制(输入门、遗忘门、输出门),有效解决了长序列训练中的梯度消失问题。
对于古诗词生成任务,我选择LSTM主要基于以下几点考虑:
- 古诗词具有严格的格式要求(如五言绝句、七言律诗),需要模型能够记忆长期的依赖关系
- 诗歌语言具有高度凝练的特点,需要模型理解字词间的深层语义关联
- 相比Transformer,LSTM在中等规模数据集(10万首古诗)上表现更稳定,训练成本更低
2.2 模型架构详解
最终采用的模型架构如下:
python复制model = Sequential()
model.add(Embedding(vocab_size, 256, input_length=max_len-1))
model.add(LSTM(512, return_sequences=True))
model.add(Dropout(0.3))
model.add(LSTM(512))
model.add(Dense(256, activation='relu'))
model.add(Dense(vocab_size, activation='softmax'))
关键参数说明:
- Embedding层:将汉字映射到256维向量空间
- 双层LSTM:每层512个神经元,第一层返回完整序列供第二层使用
- Dropout:0.3的丢弃率防止过拟合
- 输出层:使用softmax计算每个字出现的概率
2.3 数据预处理流程
高质量的数据预处理对模型效果至关重要。我们采用了以下处理步骤:
- 数据收集:从公开古诗库中获取约12万首唐诗宋词
- 清洗过滤:
- 去除重复诗作
- 剔除含有生僻字(超出常用3500字范围)的诗句
- 统一全角标点为半角
- 文本标准化:
- 每首诗按"标题:诗句"格式整理
- 添加开始和结束标记
- 构建字典:
- 统计字频,保留前3500个常用字
- 建立字到ID的双向映射
实际处理中发现,合理的文本清洗能显著提升模型生成质量。特别是去除生僻字后,模型收敛速度明显加快。
3. 模型训练实践
3.1 训练参数配置
经过多次实验对比,最终确定的训练配置如下:
python复制model.compile(loss='categorical_crossentropy',
optimizer=Adam(learning_rate=0.001),
metrics=['accuracy'])
history = model.fit(X_train, y_train,
batch_size=128,
epochs=50,
validation_split=0.1,
callbacks=[EarlyStopping(patience=3)])
关键训练技巧:
- 使用学习率0.001的Adam优化器
- 批量大小设为128,在显存允许范围内尽可能增大
- 采用早停策略,验证集loss连续3轮不下降则终止训练
- 每轮训练后保存模型权重
3.2 训练过程监控
通过TensorBoard记录的训练曲线显示:
- 约15个epoch后训练loss开始稳定
- 验证集准确率最终达到68.2%
- 没有出现过拟合现象

图:训练过程中的loss变化曲线
3.3 生成算法实现
诗歌生成采用经典的"自回归"方式,核心代码如下:
python复制def generate_poem(model, start_words, max_len=24):
poem = start_words
for i in range(max_len):
x = tokenizer.texts_to_sequences([poem])
x = pad_sequences(x, maxlen=max_len-1)
preds = model.predict(x, verbose=0)[0]
next_char = sample_from_preds(preds, temperature=0.7)
poem += next_char
if next_char == '。' or next_char == '!':
break
return poem
其中关键参数temperature控制生成多样性:
- 较低值(0.2-0.5):生成保守,偏向高频词
- 中等值(0.6-0.8):平衡创造性和合理性
- 较高值(1.0以上):极具创造性但可能不合语法
4. 系统架构实现
4.1 技术栈选型
整个系统采用前后端分离架构:
后端服务:
- 框架:Spring Boot 2.7
- 数据库:MySQL 8.0
- ORM:MyBatis-Plus
- 模型服务:Flask(Python)
前端界面:
- 框架:Vue 3 + Element Plus
- 构建工具:Vite
- 可视化:ECharts
4.2 核心功能模块
系统主要包含以下功能模块:
-
用户管理
- 注册/登录(JWT认证)
- 作品收藏
- 生成历史
-
诗歌生成
- 自由生成(输入关键词)
- 指定格式(五言、七言等)
- 风格选择(豪放、婉约等)
-
社区互动
- 作品分享
- 点赞评论
- 热门排行
4.3 模型服务部署
将训练好的LSTM模型部署为RESTful API服务:
python复制@app.route('/generate', methods=['POST'])
def generate():
data = request.json
start_words = data.get('start', '')
style = data.get('style', 'normal')
# 加载对应风格的模型
model = load_model(f'models/{style}.h5')
poem = generate_poem(model, start_words)
return jsonify({
'status': 'success',
'poem': poem
})
部署方案:
- 使用Gunicorn作为WSGI服务器
- Nginx反向代理和负载均衡
- 通过Docker容器化部署
5. 关键问题与解决方案
5.1 模型生成重复内容
问题现象:
模型倾向于重复生成相同或相似的句子。
解决方案:
- 在采样函数中加入重复惩罚:
python复制def sample_from_preds(preds, temperature=1.0, penalty=1.2):
preds = np.log(preds) / temperature
exp_preds = np.exp(preds)
# 对已生成的字施加惩罚
for char in generated_chars:
if char in char_to_idx:
exp_preds[char_to_idx[char]] /= penalty
preds = exp_preds / np.sum(exp_preds)
return np.random.choice(len(preds), p=preds)
- 调整temperature参数增加多样性
- 在训练数据中加入更多风格多样的诗作
5.2 前后端对接问题
问题现象:
前端调用模型服务时出现跨域问题。
解决方案:
- 后端添加CORS支持:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowCredentials(true)
.maxAge(3600);
}
}
- 使用Nginx统一代理前后端请求
- 在前端axios配置中设置withCredentials
5.3 系统性能优化
问题现象:
生成请求响应时间过长(平均2-3秒)。
优化措施:
- 模型量化:将Keras模型转换为TensorFlow Lite格式
python复制converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
with open('model.tflite', 'wb') as f:
f.write(tflite_model)
- 使用Redis缓存热门风格的模型
- 实现异步生成机制,先返回接收响应,再通过WebSocket推送结果
6. 项目扩展方向
在实际开发过程中,我发现这个项目还有多个可以深入优化的方向:
- 多模态生成:结合CLIP等模型,实现"以图作诗"功能
- 风格迁移:让用户可以选择模仿特定诗人(如李白、杜甫)的风格
- 交互式创作:允许用户对生成结果进行局部修改,模型实时响应调整
- 格律检查:加入专门的校验模块确保生成诗歌符合平仄规则
从技术实现角度看,可以考虑:
- 将LSTM替换为GPT等更先进的架构
- 引入强化学习优化生成质量
- 使用知识图谱增强语义一致性
这个项目让我深刻体会到,将深度学习模型转化为实际可用的产品,需要综合考虑算法效果、系统性能和用户体验。特别是在处理像古诗词这样的传统文化形式时,如何在保持创造性的同时尊重既定规则,是一个极具挑战性又充满乐趣的问题。
