1. 项目概述:当古典诗词遇上AI技术栈
去年帮某高校文学院搭建古诗词知识平台时,我尝试将Django框架与大模型技术结合,意外发现这种技术组合在传统文化数字化领域有着惊人的潜力。这个毕业设计项目本质上是一个多技术融合的智能文化系统,核心功能包括:
- 基于知识图谱的诗词关系可视化
- 结合大语言模型的智能问答交互
- 诗词多维度的数据分析看板
- 深度学习驱动的诗词情感识别
关键突破点在于:用Neo4j构建的诗词知识图谱作为结构化数据底座,配合微调后的古文专用大模型实现语义理解,最后通过Django+ECharts实现可视化呈现。这种架构既保证了学术严谨性,又具备工程落地价值。
2. 技术架构设计解析
2.1 整体技术栈选型
mermaid复制graph TD
A[数据层] --> B[Neo4j知识图谱]
A --> C[MySQL业务数据]
B --> D[处理层]
C --> D
D --> E[Django后端]
D --> F[大模型微调]
E --> G[展示层]
F --> G
G --> H[ECharts可视化]
G --> I[智能问答界面]
(注:实际开发中需用纯文字说明替代图示)
技术选型背后的考量:
- Django框架:自带Admin后台适合非技术用户管理内容,ORM简化数据库操作,模板系统快速构建前端页面
- Neo4j图数据库:完美呈现诗人-朝代-流派-意象间的复杂网络关系,Cypher查询语言特别适合路径查找
- 大模型底座:选用ChatGLM3-6B作为基座模型,因其在中文古典文本处理上有优势表现
- 可视化方案:ECharts的力导向图展示知识关联,Pyecharts库与Django无缝集成
2.2 核心模块交互设计
python复制# 典型请求处理流程示例
def poem_qa(request):
# 1. 接收用户自然语言问题
question = request.POST.get('q')
# 2. 知识图谱检索
cypher = generate_cypher(question) # 问题转Cypher查询
kg_results = neo4j_query(cypher)
# 3. 大模型答案生成
prompt = build_prompt(question, kg_results)
answer = llm.generate(prompt)
# 4. 情感分析附加
sentiment = sentiment_model.predict(answer)
return JsonResponse({
'answer': answer,
'sentiment': sentiment,
'kg_data': kg_results # 供前端可视化
})
3. 知识图谱构建实战
3.1 数据采集与清洗
古诗词数据处理有三大难点:
- 异体字处理(如"峯"与"峰")
- 标点符号规范化(古籍影印本符号不统一)
- 时空信息补全(诗人籍贯需映射现代地理坐标)
我的解决方案:
python复制# 使用OpenCC进行繁简转换
import opencc
converter = opencc.OpenCC('t2s.json')
# 正则处理特殊符号
import re
def clean_text(text):
text = re.sub(r'[〔〕〖〗]', '', text) # 去除古籍特殊符号
text = converter.convert(text)
return text
3.2 图谱schema设计
cypher复制// 节点类型定义
CREATE (:Dynasty {name: "唐代", start_year: 618})
CREATE (:Poet {name: "李白", style_name: "太白"})
CREATE (:Poem {title: "静夜思", content: "..."})
CREATE (:Image {name: "明月", type: "自然意象"})
// 关系定义
MATCH (t:Dynasty {name: "唐代"}), (p:Poet {name: "李白"})
CREATE (p)-[:BELONGS_TO]->(t)
MATCH (p:Poem {title: "静夜思"}), (i:Image {name: "明月"})
CREATE (p)-[r:CONTAINS_IMAGE {count: 3}]->(i)
特别注意:诗人间的"社交关系"需要考据验证,建议使用《全唐诗》作者小传作为可靠数据源,避免野史传说影响学术严谨性。
4. 大模型微调关键步骤
4.1 领域适配训练
使用LoRA进行高效微调:
python复制from peft import LoraConfig, get_peft_model
config = LoraConfig(
r=8,
target_modules=["query_key_value"],
lora_alpha=16,
lora_dropout=0.1,
task_type="CAUSAL_LM"
)
model = get_peft_model(base_model, config)
# 训练数据示例格式
{
"instruction": "解释《春望》的创作背景",
"input": "",
"output": "此诗作于唐肃宗至德二年..."
}
4.2 混合精度训练技巧
bash复制# 使用DeepSpeed加速训练
deepspeed --num_gpus=1 run_clm.py \
--deepspeed ds_config.json \
--model_name_or_path ChatGLM3-6B \
--train_file poetry_data.jsonl \
--fp16 \
--output_dir output
典型问题处理:
- 显存不足:启用梯度检查点(gradient_checkpointing)
- 古文过拟合:添加Dropout层(0.3-0.5)
- 长文本处理:采用FlashAttention优化
5. 可视化前端实现
5.1 知识图谱可视化
javascript复制// ECharts力导向图配置
option = {
series: [{
type: 'graph',
layout: 'force',
data: nodes.map(item => {
return {
id: item.id,
name: item.name,
category: item.type,
symbolSize: Math.sqrt(item.degree) * 5
};
}),
links: relations,
categories: ['诗人', '朝代', '意象'],
emphasis: {
focus: 'adjacency'
},
roam: true,
label: {
show: true,
position: 'right'
},
force: {
repulsion: 100,
edgeLength: [100, 300]
}
}]
};
5.2 情感分析仪表盘
python复制# 基于BERT的情感分析模型
class SentimentAnalysis(nn.Module):
def __init__(self, pretrained_path):
super().__init__()
self.bert = BertModel.from_pretrained(pretrained_path)
self.classifier = nn.Linear(768, 7) # 七种情感分类
def forward(self, input_ids, attention_mask):
outputs = self.bert(input_ids, attention_mask)
pooled = outputs.last_hidden_state.mean(1)
return self.classifier(pooled)
# 情感标签体系
LABELS = [
'豪放', '婉约', '哀伤',
'闲适', '愤懑', '思乡', '咏史'
]
6. 典型问题排查实录
6.1 大模型幻觉问题
现象:回答宋代诗人时会混入明清诗句
解决方案:
- 在prompt中添加明确约束:
"请仅基于以下可靠信息回答:{context}" - 设置logit_bias抑制无关朝代词汇
- 添加后处理校验规则
6.2 图谱查询性能优化
慢查询示例:
cypher复制MATCH (p:Poet)-[:WRITES]->(m:Poem)
WHERE p.name = "杜甫"
RETURN m
优化方案:
- 为name属性创建索引
cypher复制CREATE INDEX poet_name IF NOT EXISTS FOR (p:Poet) ON (p.name) - 使用APOC库的路径展开优化
- 添加缓存层(Redis)
7. 项目扩展方向
在实际部署后,我发现了几个有价值的改进点:
- 多模态扩展:接入故宫名画数据,建立"诗画互证"关系
- 时空地图:将诗人轨迹用GIS系统可视化
- 格律分析:添加平仄检测算法辅助诗词创作
- 跨语言检索:对接汉学翻译数据库实现中英对照查询
特别建议:如果用于教学场景,可以开发"诗词PK"互动功能,通过大模型自动评判学生的对诗作品,这个功能在某中学试点时获得了95%的学生好评率。