1. 项目概述
这个基于GRU神经网络的英文诗歌生成系统是一个结合了深度学习和自然语言处理技术的创意应用项目。作为一名长期从事AI项目开发的工程师,我发现这类系统不仅能帮助文学爱好者进行创作,还能为计算机专业的学生提供一个绝佳的实践平台。
系统核心在于使用GRU(门控循环单元)神经网络来学习和模仿英文诗歌的创作风格。相比传统的RNN,GRU在处理长序列数据时表现更优,特别适合诗歌这种具有特定韵律和结构的文本生成任务。我在实际开发中发现,GRU在保持诗歌连贯性的同时,还能产生令人惊喜的创意表达。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术栈选型
在技术选型上,我们采用了前后端分离的架构模式:
后端技术栈:
- Spring Boot 2.7.x:简化配置,快速构建RESTful API
- MyBatis-Plus 3.5.x:增强型ORM框架,提高数据库操作效率
- Python 3.8 + TensorFlow 2.6:用于GRU模型的训练和推理
前端技术栈:
- Vue.js 3.x:组件化开发,提升用户体验
- Element Plus:UI组件库,加速界面开发
- Axios:处理HTTP请求
数据库:
- MySQL 8.0:存储用户数据和生成的诗歌
- Redis 6.x:缓存热门诗歌和用户会话
技术选型心得:Spring Boot的自动配置特性大大简化了后端开发,而Vue 3的组合式API让前端逻辑组织更加清晰。选择MyBatis-Plus而非JPA是考虑到项目中有较多复杂查询需求。
2.2 系统架构图
系统采用标准的MVC分层架构:
code复制┌───────────────────────────────────────┐
│ 客户端 │
└───────────────────────────────────────┘
│
▼
┌───────────────────────────────────────┐
│ API网关 │
│ (认证、限流、请求路由) │
└───────────────────────────────────────┘
│
▼
┌─────────────┐ ┌─────────────┐ ┌─────┐
│ 用户服务 │ │ 诗歌服务 │ │ ... │
│ (Spring Boot)│ │ (Python) │ │ │
└─────────────┘ └─────────────┘ └─────┘
│
▼
┌───────────────────────────────────────┐
│ 数据存储 │
│ (MySQL + Redis + 文件存储) │
└───────────────────────────────────────┘
3. GRU模型实现细节
3.1 数据准备与预处理
诗歌生成的质量很大程度上取决于训练数据的质量。我们采用了以下数据集:
- Poetry Foundation的英文诗歌集(约10,000首)
- Project Gutenberg的经典诗歌集
- 用户贡献的现代诗歌(经过审核)
数据预处理步骤:
- 文本清洗:去除特殊字符、统一大小写
- 分词:使用NLTK的word_tokenize
- 构建词汇表:保留前20,000个高频词
- 序列化:将诗歌转换为数字序列
- 填充/截断:统一长度为100个词
python复制# 示例预处理代码
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
tokenizer = Tokenizer(num_words=20000, oov_token="<OOV>")
tokenizer.fit_on_texts(poems)
sequences = tokenizer.texts_to_sequences(poems)
padded_sequences = pad_sequences(sequences, maxlen=100, padding='post', truncating='post')
3.2 GRU模型构建
我们采用了两层GRU的结构,中间加入了Dropout层防止过拟合:
python复制from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, GRU, Dense, Dropout
model = Sequential([
Embedding(20000, 256, input_length=100),
GRU(512, return_sequences=True),
Dropout(0.3),
GRU(512),
Dropout(0.3),
Dense(20000, activation='softmax')
])
model.compile(loss='sparse_categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
模型设计要点:
- Embedding维度设为256,平衡了表达能力和计算成本
- 使用两层GRU捕捉更复杂的语言模式
- Dropout率设为0.3,在多次实验中表现最佳
- 输出层使用softmax激活,预测下一个词的概率分布
3.3 模型训练技巧
训练这类文本生成模型有几个关键点需要注意:
- 学习率调度:使用ReduceLROnPlateau动态调整学习率
python复制from tensorflow.keras.callbacks import ReduceLROnPlateau
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2,
patience=3, min_lr=1e-6)
- 早停机制:防止过拟合
python复制from tensorflow.keras.callbacks import EarlyStopping
early_stopping = EarlyStopping(monitor='val_loss', patience=5)
- 温度参数:在生成时调整softmax温度可以控制创造性
python复制def generate_text(model, start_seq, temp=1.0, length=50):
for _ in range(length):
preds = model.predict(start_seq)[0]
preds = np.log(preds) / temp
exp_preds = np.exp(preds)
preds = exp_preds / np.sum(exp_preds)
next_idx = np.random.choice(len(preds), p=preds)
# ... 添加到序列中 ...
4. 系统功能实现
4.1 诗歌生成API设计
后端提供了以下主要API端点:
-
POST /api/poems/generate- 生成新诗歌- 请求参数:seed_text(可选起始句),temperature(创造性控制)
- 响应:生成的诗歌文本
-
GET /api/poems/history- 获取用户生成历史- 分页参数:page, size
- 响应:诗歌列表(带分页元数据)
-
POST /api/poems/rate- 评价生成的诗歌- 请求参数:poem_id, rating(1-5)
- 响应:更新后的平均评分
4.2 前端交互设计
前端主要界面包括:
-
生成界面:
- 输入起始句(可选)
- 创造性滑块(控制temperature参数)
- 生成按钮和结果展示区
-
历史记录:
- 按时间排序的生成记录
- 每首诗的评分功能
- 搜索和过滤功能
-
用户收藏:
- 收藏喜欢的生成结果
- 创建自定义诗集
vue复制<template>
<div class="generator-container">
<el-input v-model="seedText" placeholder="输入起始句..."></el-input>
<el-slider v-model="temperature" :min="0.5" :max="1.5" :step="0.1"></el-slider>
<el-button @click="generatePoem">生成诗歌</el-button>
<div class="result-area">{{ generatedPoem }}</div>
</div>
</template>
<script>
export default {
data() {
return {
seedText: '',
temperature: 1.0,
generatedPoem: ''
}
},
methods: {
async generatePoem() {
const res = await axios.post('/api/poems/generate', {
seed_text: this.seedText,
temperature: this.temperature
})
this.generatedPoem = res.data.poem
}
}
}
</script>
5. 部署与优化
5.1 系统部署方案
我们采用Docker容器化部署,主要包含以下服务:
- Web服务:Spring Boot应用(2CPU/4GB)
- 模型服务:Python Flask服务(4CPU/8GB,GPU可选)
- 数据库:MySQL(主从配置)
- 缓存:Redis集群
- 文件存储:MinIO对象存储
使用docker-compose编排:
yaml复制version: '3'
services:
web:
image: poetry-web:latest
ports:
- "8080:8080"
depends_on:
- redis
- mysql
model:
image: poetry-model:latest
ports:
- "5000:5000"
deploy:
resources:
limits:
cpus: '4'
memory: 8G
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
volumes:
- mysql_data:/var/lib/mysql
redis:
image: redis:6.0
ports:
- "6379:6379"
volumes:
mysql_data:
5.2 性能优化技巧
在实际部署中,我们发现以下几个优化点特别重要:
- 模型缓存:将最近生成的诗歌缓存到Redis,减少模型调用
- 批量生成:支持一次生成多首诗歌,减少HTTP往返
- 异步处理:长时间生成任务使用消息队列处理
- 模型量化:将训练好的模型转换为TF Lite格式,减少内存占用
java复制// Spring Boot中的缓存示例
@Cacheable(value = "poems", key = "#seedText.concat('-').concat(#temperature)")
public String generatePoem(String seedText, double temperature) {
// 调用Python模型服务
}
6. 常见问题与解决方案
6.1 模型训练问题
问题1:生成的诗歌缺乏连贯性
- 原因:通常是由于训练数据不足或模型容量不够
- 解决:增加训练数据量,尝试更大的GRU单元(如768维)
问题2:模型总是生成相似的诗歌
- 原因:可能是温度参数设置过低
- 解决:调整temperature参数(推荐0.7-1.2之间)
6.2 系统性能问题
问题:高并发时生成速度慢
- 解决方案:
- 实现请求队列,限制并发模型调用
- 使用GPU加速推理
- 预加载模型到内存
python复制# Flask中实现简单队列
from flask import Flask
from threading import Semaphore
app = Flask(__name__)
model_semaphore = Semaphore(4) # 限制4个并发
@app.route('/generate', methods=['POST'])
def generate():
with model_semaphore:
# 调用模型...
return result
7. 项目扩展方向
在实际开发过程中,我们发现这个系统还有很大的扩展空间:
- 多风格支持:训练不同风格的诗歌模型(浪漫主义、现代诗等)
- 交互式创作:允许用户逐步引导生成过程
- 韵律控制:在生成时加入韵律约束
- 多语言支持:扩展到其他语言的诗歌生成
实现多风格生成的示例代码:
python复制# 在模型中加入风格向量
style_vector = get_style_vector(style_name) # 预先定义好的风格嵌入
combined_input = concatenate([text_embedding, style_vector])
# 在生成时指定风格
generated_poem = model.generate(start_text, style='romantic')
这个项目从技术角度涵盖了深度学习、Web开发和系统部署等多个领域,非常适合作为课程设计或毕业设计课题。我在实现过程中最大的体会是:平衡创造性和可控性是这类生成系统的关键挑战。通过调整模型结构和生成参数,我们能够获得既富有诗意又符合语法规范的作品。
