基于DeepSeek的AI作文批改系统
一、项目背景
在教育信息化浪潮下,语文教师面临作文批改工作量大、反馈不及时的痛点。大语言模型的兴起为自动化作文批改提供了新的可能。本项目基于硅基流动平台的DeepSeek-R1模型,构建了一个集智能批改、对比分析、语音输入、报告导出于一体的全栈AI作文批改系统。
选题意义:
探索AI在教育教学中的实际应用场景
解决教师批改作文效率低下的现实问题
为学生提供即时、客观、多维度的写作反馈
二、技术选型
| 技术栈 | 选型 | 理由 |
|---|---|---|
| 后端框架 | Flask | 轻量灵活,适合快速原型开发 |
| 前端方案 | 原生HTML/CSS/JS | 无框架依赖,部署简单,展示直观 |
| AI模型 | DeepSeek-R1-0528-Qwen3-8B | 推理能力强,中文理解优秀,性价比高 |
| API平台 | 硅基流动(SiliconFlow) | 国内访问稳定,兼容OpenAI接口格式 |
| 文档解析 | python-docx | 支持Word文档读取与生成 |
| 图表可视化 | Canvas Confetti + CSS动画 | 轻量级特效,无需引入重型图表库 |
三、核心功能
3.1 智能作文批改
四维评分:从主旨、结构、语言、创意四个维度量化评分
错误标记:自动识别错别字、用词重复、病句,原文红色波浪线高亮
佳句赏析:识别精彩句子并单独展示,绿色下划线标记
修改建议:针对每个错误给出具体修改方案和理由
3.2 对比批改模式
支持上传修改前后的两篇作文,AI对比分析进步之处和仍需改进的地方,帮助学生直观看到自己的成长轨迹。
3.3 语音输入
基于浏览器Web Speech API,支持语音实时转文字输入作文,降低输入门槛。
3.4 对话追问
批改完成后可在聊天区继续追问AI老师,深入探讨写作技巧。
3.5 报告导出
一键生成Word格式的批改报告,包含评分、错误列表、佳句赏析和总体评价。
3.6 其他亮点
🌙 暗黑模式切换
📋 历史记录(本地存储最近10条)
🎉 高分彩带特效
⭐ 星级可视化评分
⌨️ 评语打字机效果
四、项目架构
text
essay-grader/ ├── app.py # Flask后端主程序 ├── config.py # API密钥配置 ├── grader.py # AI批改逻辑 ├── templates/ │ └── index.html # 前端完整页面 ├── requirements.txt # 依赖清单 └── README.md # 项目说明
数据流:
text
用户输入 → 前端JS → Flask API → 硅基流动DeepSeek-R1 → 返回JSON → 前端渲染展示
五、详细实现
5.1 环境准备
bash
# 创建虚拟环境 python -m venv venv venv\Scripts\activate # Windows source venv/bin/activate # Mac/Linux # 安装依赖 pip install flask requests python-docx
5.2 配置API密钥
python
# config.py SILICONFLOW_API_KEY = "sk-你的密钥" SILICONFLOW_API_URL = "https://api.siliconflow.cn/v1/chat/completions" MODEL_NAME = "deepseek-ai/DeepSeek-R1-0528-Qwen3-8B"
5.3 核心提示词设计
这是整个系统的灵魂。通过精心设计的System Prompt,让模型返回结构化JSON:
python
system_prompt = """你是一位资深的语文教师,请仔细批改学生作文,必须严格按照以下JSON格式返回: { "scores": {"主旨": 0, "结构": 0, "语言": 0, "创意": 0}, "errors": [{"original": "错误原文", "correct": "修改后", "reason": "错误原因"}], "highlights": [{"original": "优美句子", "comment": "点评理由"}], "overall_advice": "总体评价和建议" } 要求: - scores中每项满分10分 - errors中只列出语法错误、用词重复、错别字、病句 - highlights中列出写得精彩的句子 - errors和highlights分开,不要混在一起 """设计要点:
角色设定:"资深的语文教师"——让模型以专业视角批改
严格格式:明确JSON结构,避免模型自由发挥
分离错误与亮点:errors和highlights分开,便于前端独立展示
可定位性:要求original是原文真实片段,确保前端能准确高亮
5.4 错误高亮实现
前端收到AI返回的错误列表后,在原文中查找并包裹高亮标签:
javascript
// 标记错误(红色波浪线) errors.forEach(e => { const original = escapeHtml(e.original); const tooltip = escapeHtml(e.reason) + ' → ' + escapeHtml(e.correct); highlightedEssay = highlightedEssay.replace( original, `<span class="highlight-error">${original} <span class="tooltip-text">${tooltip}</span></span>` ); }); // 标记佳句(绿色下划线) highlights.forEach(h => { const original = escapeHtml(h.original); const tooltip = '✨ ' + escapeHtml(h.comment); // 使用正则避免重复标记 const regex = new RegExp(`(?<!<[^>]*)${escapeRegExp(original)}(?![^<]*>)`, 'g'); highlightedEssay = highlightedEssay.replace( regex, `<span class="highlight-good">${original} <span class="tooltip-text">${tooltip}</span></span>` ); });5.5 语音输入实现
利用浏览器原生Web Speech API,几行代码即可实现:
javascript
function toggleVoice() { const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; recognition = new SpeechRecognition(); recognition.lang = 'zh-CN'; // 中文识别 recognition.interimResults = true; // 实时显示 recognition.continuous = true; // 持续监听 recognition.onresult = function(event) { let transcript = ''; for (let i = event.resultIndex; i < event.results.length; i++) { transcript += event.results[i][0].transcript; } document.getElementById('essay').value += transcript; }; recognition.start(); }5.6 评分动画与彩带特效
javascript
// 数字跳动动画 keys.forEach((key, i) => { const targetScore = scores[key] || 0; let current = 0; const step = targetScore / 20; const timer = setInterval(() => { current += step; if (current >= targetScore) { current = targetScore; clearInterval(timer); el.style.transform = 'scale(1.4)'; // 到达时放大 el.style.color = '#2e7d32'; // 变绿 } el.textContent = Math.round(current); }, 40); }); // 均分≥9分触发彩带 if (avgScore >= 9) { confetti({ particleCount: 150, spread: 80, origin: { y: 0.6 } }); }六、效果展示
6.1 批改主界面
左侧:作文输入区(支持粘贴、上传TXT/Word、语音输入)
右侧:批改结果区(评分、错误标记、修改建议、佳句赏析、追问聊天)
6.2 错误标记展示
🔴红色波浪线:语法错误、错别字、用词重复
🟢绿色下划线:精彩句子
鼠标悬停可查看具体修改建议和点评。
6.3 评分可视化
数字从0跳动到目标分数
星级展示(满分5星)
高分触发彩带庆祝特效
6.4 暗黑模式
一键切换暗黑/明亮主题,偏好自动保存。
七、踩坑记录
7.1 DeepSeek-R1返回格式不稳定
问题:模型有时在JSON外包裹思考过程文字。
解决:增加容错处理,提取json...代码块:
python
try: return json.loads(ai_message) except json.JSONDecodeError: if "```json" in ai_message: json_str = ai_message.split("```json")[1].split("```")[0] return json.loads(json_str)7.2 前端高亮重复标记
问题:先用字符串替换标错误,再标佳句时可能误替换已标记的span内容。
解决:使用负向前瞻正则,只匹配未被HTML标签包裹的纯文本。
7.3 语音识别兼容性
问题:Web Speech API仅Chrome/Edge支持良好。
解决:增加浏览器检测,不支持时隐藏语音按钮并给出提示。
7.4 Word文档段落读取
问题:python-docx读取的段落可能为空。
解决:过滤空段落,paragraphs = [p.text for p in doc.paragraphs if p.text.strip()]
八、项目总结
8.1 技术收获
掌握了大模型API调用和提示词工程的实战技巧
深入理解了前后端分离的协作模式
学会了Web API(语音识别)和Canvas(粒子背景)的使用
积累了用户体验设计经验(动画、暗黑模式、骨架屏)
8.2 不足与展望
批量批改:目前仅支持单篇批改,可扩展为批量上传
更细粒度分析:可增加段落结构分析、论证逻辑检测
学生画像:积累批改数据后,可生成学生写作能力成长曲线
多模型对比:可接入多个模型对比批改效果
