在当今数字化飞速发展的时代,"人工智能+教育"正以前所未有的速度改变着传统的教学模式。作为开发者,如何利用 Python 强大的生态来解决实际场景中的痛点?
今天我将深入剖析我的最新 Python 全栈项目------"智能教学辅助系统"。本系统旨在将教师从繁重的重复性劳动中解放出来,同时为学生提供更加个性化的学习体验。本文将重点展示项目的技术架构与核心功能代码。
项目技术栈说明
为了保证系统的高并发处理能力、易维护性以及与 AI 模型的无缝对接,本项目采用了现代化的前后端分离架构。
后端架构
-
Web 框架:FastAPI。原生支持异步编程,响应速度极快,且基于 Pydantic 自动生成 OpenAPI 交互式文档,极大提升前后端联调效率。
-
数据库:PostgreSQL (关系型数据持久化) + SQLAlchemy (ORM 框架) + Alembic (数据库迁移)。
-
缓存与消息队列:Redis。用于维护 JWT 状态缓存以及作为 Celery 的消息代理 (Broker)。
-
异步任务调度:Celery。专门处理耗时较长的 AI 批改、OCR 识别等任务,防止阻塞 Web 主线程。
前端架构
-
核心框架:Vue 3 + Composition API。
-
构建工具:Vite。
-
UI 组件库:Element Plus。
-
数据可视化:ECharts。用于渲染教师端的学情分析看板。
AI 与算法组件
-
大语言模型驱动:LangChain + GPT-4/智谱 GLM API。
-
向量数据库:FAISS / ChromaDB。用于存储课程知识库的向量嵌入 (Embeddings)。
-
光学字符识别:PaddleOCR。用于精准提取手写作业的文本内容。
核心功能与关键代码解析
1. 全天候智能答疑助手 (RAG 技术)
传统的问答系统往往存在"AI 幻觉"。本系统通过检索增强生成 (RAG) 技术,先在教师上传的专属课程知识库中检索相关内容,再交由 LLM 生成答案。
核心后端代码示例 (FastAPI + LangChain):
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from langchain.chat_models import ChatOpenAI
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import RetrievalQA
router = APIRouter(prefix="/api/v1", tags=["Intelligent Q&A"])
class QueryRequest(BaseModel):
student_id: int
course_id: str
question: str
# 假设系统启动时已加载本地向量知识库
embeddings = OpenAIEmbeddings()
# 针对不同课程加载对应的向量库索引
def get_vector_store(course_id: str):
try:
return FAISS.load_local(f"vector_data/{course_id}", embeddings)
except Exception:
return None
@router.post("/qa")
async def intelligent_qa(request: QueryRequest):
vector_store = get_vector_store(request.course_id)
if not vector_store:
raise HTTPException(status_code=404, detail="Course knowledge base not found.")
llm = ChatOpenAI(temperature=0.1, model_name="gpt-3.5-turbo")
# 构建检索问答链
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=vector_store.as_retriever(search_kwargs={"k": 3})
)
# 运行问答链获取基于课程内容的回答
answer = qa_chain.run(request.question)
return {
"status": "success",
"data": {
"question": request.question,
"answer": answer
}
}
2. 主观题智能批改与异步处理
对于学生拍照上传的作文或主观题,系统需要先进行图像预处理,使用 PaddleOCR 提取文本,再调用 LLM 进行语法纠错和评分。由于这套流程耗时较长(可能需要 5-10 秒以上),如果采用同步请求会导致前端超时。因此,这里采用了 FastAPI 结合 Celery 的异步任务方案。
FastAPI 接口层代码:
from fastapi import APIRouter, UploadFile, File
from tasks import grade_essay_task # 引入自定义的 Celery 任务
router = APIRouter(prefix="/api/v1", tags=["Assignment Grading"])
@router.post("/grade/essay")
async def submit_essay_grading(student_id: int, file: UploadFile = File(...)):
# 读取图片字节流
image_bytes = await file.read()
# 将任务提交给 Celery 后台工作进程
# 传递必要参数,如学生ID和图片数据
task = grade_essay_task.delay(student_id, image_bytes)
# 立即向前端返回任务 ID,前端可通过轮询或 WebSocket 检查任务状态
return {
"status": "processing",
"message": "The essay is being graded in the background.",
"task_id": task.id
}
Celery 任务处理层代码 (tasks.py):
from celery import Celery
from paddleocr import PaddleOCR
from ai_grader import LLMGrader # 自定义的 LLM 评分封装模块
import json
# 初始化 Celery
celery_app = Celery('grading_tasks', broker='redis://localhost:6379/0', backend='redis://localhost:6379/1')
# 初始化 OCR 模型 (全局加载,避免每次任务重复加载)
ocr_model = PaddleOCR(use_angle_cls=True, lang="ch")
@celery_app.task(bind=True)
def grade_essay_task(self, student_id: int, image_bytes: bytes):
try:
# 1. 提取文字 (OCR)
# 注意:实际生产中需要将 image_bytes 保存为临时文件或转换为 numpy 数组供 OCR 读取
ocr_result = ocr_model.ocr(image_bytes, cls=True)
extracted_text = "\n".join([line[1][0] for line in ocr_result[0]])
# 2. 调用 LLM 进行多维度批改
grader = LLMGrader()
grading_result = grader.evaluate(extracted_text)
# 3. 将结果写入数据库 (略过具体 ORM 代码)
# db.save_grading_result(student_id, grading_result)
return {
"status": "completed",
"score": grading_result.get("score"),
"feedback": grading_result.get("feedback")
}
except Exception as e:
self.update_state(state='FAILURE', meta={'exc': str(e)})
raise Exception(f"Grading failed: {str(e)}")
总结
全栈项目不仅仅是前后端代码的拼接,更是对数据流转、性能瓶颈以及系统稳定性的综合考量。在"智能教学辅助系统"中,Python 发挥了其在后端 API 构建与 AI 生态整合上的双重优势。
FastAPI 保障了系统的高并发与轻量级,Celery 完美解决了大模型调用的超时问题,而 LangChain 与各类底层 AI 模型的结合,赋予了应用真正的"灵魂"。
项目代码: