古诗词知识图谱与AI大模型融合实践
1. 项目概述:当古诗词遇上知识图谱与AI大模型
这个毕业设计项目将中华古诗词这一传统文化瑰宝与现代计算机技术进行了深度融合。核心思路是通过构建古诗词知识图谱,结合情感分析、智能问答和AI写诗三大功能模块,打造一个全方位的古诗词数字化平台。我选择Python作为主要开发语言,不仅因为其丰富的NLP库和机器学习生态,更因为它在数据处理和可视化方面的天然优势。
整个系统包含四个核心模块:知识图谱构建模块负责从海量古诗词中提取结构化信息;可视化模块将抽象的知识关系转化为直观的图形展示;情感分析模块能自动识别诗词中的情感倾向;而最引人注目的AI写诗模块则基于大语言模型实现自动诗词创作。这四个模块相互支撑,形成了一个完整的古诗词智能处理闭环。
提示:项目开发建议采用PyTorch或TensorFlow作为深度学习框架,搭配Hugging Face的Transformers库来处理大模型相关任务,这些工具链在NLP领域已成为事实标准。
2. 知识图谱构建:从诗词文本到结构化知识
2.1 数据采集与清洗
古诗词数据主要来源于《全唐诗》、《全宋词》等权威电子版文献。我使用Scrapy框架编写爬虫时,特别注意处理了以下几个难点:
- 异体字和通假字的标准化处理(如"著"与"着")
- 作者别名的统一映射(如李白与李太白)
- 历史地名的时空映射(如"长安"对应现代西安)
清洗后的数据采用如下JSON结构存储:
{ "poem_id": "T1001", "title": "静夜思", "author": "李白", "dynasty": "唐", "content": "床前明月光...", "tags": ["思乡","月亮"], "translation": "..." }2.2 实体关系抽取
使用BiLSTM-CRF模型进行命名实体识别,主要抽取以下实体类型:
- 人物实体(诗人、历史人物)
- 地点实体(创作地、提及地)
- 时间实体(创作时间、历史时期)
- 意象实体(明月、杨柳等)
关系抽取采用基于规则与模型结合的方式:
- 简单关系(作者-作品)使用精确匹配
- 复杂关系(用典、化用)使用BERT关系分类模型
2.3 Neo4j图数据库设计
知识图谱的图模式设计如下:
(诗人)-[创作]->(诗作) (诗作)-[包含]->(意象) (意象)-[关联]->(情感) (诗作)-[用典]->(历史事件)在Neo4j中创建节点的Cypher示例:
CREATE (p:Poem {title:'静夜思', dynasty:'唐'}) CREATE (a:Author {name:'李白', era:'盛唐'}) CREATE (i:Image {name:'明月', type:'自然意象'}) CREATE (a)-[:CREATED]->(p) CREATE (p)-[:CONTAINS]->(i)3. 可视化系统实现
3.1 前端技术选型
采用Vue.js + ECharts的组合实现可视化界面:
- 知识图谱展示使用Force-Directed Graph
- 时空分布使用Mapbox GL JS地理可视化
- 情感分布使用Heatmap热力图
关键配置参数:
forceLayout: { repulsion: 200, edgeLength: 100, gravity: 0.1 }, heatmap: { radius: 20, blur: 15, gradient: ['#00f', '#0ff', '#0f0', '#ff0', '#f00'] }3.2 可视化交互设计
实现的核心交互功能包括:
- 节点聚焦:点击节点高亮关联路径
- 时空筛选:按朝代/地域过滤诗词
- 语义缩放:根据缩放级别动态加载细节
- 关联查询:右键节点查看相关诗词
注意:当节点数超过500时,建议启用WebGL渲染并添加LOD(Level of Detail)控制,否则可能出现浏览器卡顿。
4. 情感分析模块实现
4.1 数据集构建
手工标注了5000首诗词的情感标签,采用三维情感空间:
- 愉悦度(Valence):1-9分
- 唤醒度(Arousal):1-9分
- 主导情感:喜、怒、哀、乐、思、忧、惊、恐
数据分布示例:
| 情感类型 | 数量 | 占比 |
|---|---|---|
| 哀 | 1200 | 24% |
| 思 | 950 | 19% |
| 乐 | 800 | 16% |
4.2 模型架构
采用多任务学习框架:
class EmotionModel(nn.Module): def __init__(self): super().__init__() self.bert = BertModel.from_pretrained('bert-base-chinese') self.valence = nn.Linear(768, 1) self.arousal = nn.Linear(768, 1) self.emotion = nn.Linear(768, 8) def forward(self, x): outputs = self.bert(**x) pooled = outputs.pooler_output return { 'valence': self.valence(pooled), 'arousal': self.arousal(pooled), 'emotion': self.emotion(pooled) }4.3 训练技巧
- 对抗训练:添加FGM对抗扰动
- 分层学习率:bert层1e-5,新增层1e-4
- 损失加权:valence(0.3)+arousal(0.3)+emotion(0.4)
最终在测试集上达到:
- 情感分类准确率:82.4%
- 维度预测MSE:valence 1.2, arousal 1.5
5. 智能问答与AI写诗系统
5.1 问答系统架构
采用检索+生成的混合模式:
用户问题 → 意图识别 → ↓ ↓ 检索模块(ElasticSearch) 生成模块(GPT-2) ↓ ↓ 答案排序 → 响应生成关键实现代码:
def answer_question(question): intent = classify_intent(question) if intent == 'fact': docs = es.search(index='poems', query={ "match": {"content": question} }) return extract_answer(docs[0]) else: return generator.generate( prompt=question, max_length=100, temperature=0.7 )5.2 AI写诗模型
基于GPT-2进行领域适配训练:
- 数据准备:10万首古诗+平仄标注
- 特殊token:添加[平][仄][韵]等控制符
- 约束解码:使用CDG(Constrained Decoding)确保格律
生成示例:
输入:以"春"为题写七言绝句 输出: [春][七绝][平起] 东风拂面柳丝长, 燕子归来寻旧梁。 最是一年春好处, 桃花含笑映朝阳。6. 系统集成与部署
6.1 技术栈全景
前端:Vue3 + Element Plus + ECharts 后端:FastAPI + Neo4j + ElasticSearch AI服务:PyTorch + Transformers + Ray Serve 基础设施:Docker + Kubernetes + Redis6.2 性能优化
- 知识图谱查询:为高频查询添加Redis缓存
- 模型服务:使用ONNX Runtime加速推理
- 前端加载:实现按需加载和Web Worker计算
部署架构:
→ 前端CDN 用户 → Nginx → API网关 → → 模型服务集群 → 图数据库集群7. 踩坑实录与解决方案
- Neo4j连接池耗尽
- 现象:高并发时出现ConnectionTimeout
- 解决:调整连接池大小并添加重试机制
graph = Graph(host="neo4j", auth=("neo4j","pass"), max_connection_lifetime=3600, max_connection_pool_size=100)- BERT模型显存溢出
- 现象:长诗词处理时OOM
- 解决:启用梯度检查点和动态填充
model = BertModel.from_pretrained( 'bert-base-chinese', gradient_checkpointing=True, pad_to_max_length=False )- 跨域资源共享(CORS)问题
- 现象:前端请求被浏览器拦截
- 解决:正确配置FastAPI CORS中间件
app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"], )这个项目最让我惊喜的是AI写诗模块的进化过程。最初生成的诗词往往不合平仄,通过引入强化学习奖励机制,让模型在保持创意的同时遵守格律规则。实测发现,加入人工反馈循环后,合格率从32%提升到了78%。这提醒我们,在传统文化与AI结合的场景中,规则约束与创造力需要巧妙平衡。
