← 返回首页
Python 3.12 LangChain / LangGraph ChromaDB sentence-transformers Streamlit Flask REST API NLP · LLM 应用落地

📝 AI 智能试卷审校系统

海云天 AI 智能试卷审校系统 — 基于 LLM + 向量检索的全自动试卷错误检测与三维度查重平台

项目概览

面向教育机构命题场景,对试卷文档(DOC/DOCX/XLS/PDF)进行全自动解析与 AI 审校,涵盖 10 类错误检测与三维度向量查重, 最终输出结构化 Word / Excel 审校报告。系统同时提供 Streamlit 交互界面和 Flask REST API, 可独立使用也可作为批处理平台(exam_checker_agent)的底层能力。

应用场景教育机构命题审核 · 出版社试卷校对 · 在线考试平台质量把关 · 多语言试题质检(中/日/德/法)

技术栈

Python 3.12 Streamlit(交互 UI) Flask(REST API Server) LangChain + LangGraph ChromaDB(向量检索) MySQL(题库持久化) sentence-transformers paraphrase-multilingual-MiniLM-L12-v2 PyMuPDF / pdfplumber Qwen3 / dashscope OpenAI-compatible API Ollama(本地推理) ChineseErrorCorrector3-4B

整体架构

┌──────────────────────────────────────────────────────────────┐ │ 前端入口层 │ │ Streamlit (app.py) ←────→ Flask API Server (api_server.py)│ │ 交互式审校 UI REST /api/v1/* 供批处理调用 │ └──────────────────────────┬───────────────────────────────────┘ │ ┌──────────────────────────▼───────────────────────────────────┐ │ 核心检测层 smart_checker/services/ │ │ │ │ ┌──────────────────┐ ┌────────────────────┐ │ │ │ 文档解析 │ │ 路由 + 检测引擎 │ │ │ │ extractor/ │ │ detector/checkers/ │ │ │ │ paper_parser.py │ │ content.py │ │ │ │ │ │ ┌──────────────┐ │ │ │ │ 骨架提取 (LLM) │ │ │ LangGraph │ │ │ │ │ + 并发内容填充 │ │ │ 按题型路由 │ │ │ │ └──────────────────┘ │ └──────────────┘ │ │ │ └────────────────────┘ │ │ ┌──────────────────────────────────────────┐ │ │ │ 向量查重层 detector/checkers/duplicate.py │ │ │ │ 内部查重 │ 跨题库查重 │ 历史题库查重 │ │ │ └──────────────────────────────────────────┘ │ └──────────────────────────┬───────────────────────────────────┘ │ ┌──────────────────────────▼───────────────────────────────────┐ │ 基础设施层 │ │ LLM 适配 (Qwen3 / OpenAI / Ollama) │ │ 纠错模型 (ChineseErrorCorrector3-4B, 本地) │ │ 向量存储 ChromaDB 关系存储 MySQL │ └──────────────────────────────────────────────────────────────┘

核心技术详解

① 骨架提取 + 并发内容填充(解析加速)

文档解析分两步:第一步 LLM 提取"骨架"(题号、大题标题、结构层级),生成嵌套 JSON 树; 第二步多线程(默认 5 workers)并发填充每个节点的正文内容,最终扁平化为带有 major_number / middle_number / minor_number / numbering_path 的 Question 列表。 相比单线程串行解析,对 100 题试卷的处理耗时下降约 60%。

核心实现:smart_checker/services/extractor/paper_parser.pyPaperTextExtractor.convert_paper_to_questions()

② LangGraph 题型路由(减少误报)

路由阶段通过 LLM 分析题目类型、科目、格式,生成 detection_flags 字典, 决定当前题目需要运行哪些检测任务(如选择题不需要跑"答案泄露"检测,数学题需要额外的"无解性"检测)。 若路由返回为空则回退到全量检测。这一机制将无效检测调用减少约 40%,同时降低误报率。

核心实现:smart_checker/services/detector/checkers/content.py_label_question_for_routing() / _build_detection_tasks()

③ 双模型解耦:main_model + corrector_model

主检测模型(main_model,如 qwen3.6-max-preview 云端)负责全量错误检测与路由分析; 纠错模型(corrector_model,如本地 ChineseErrorCorrector3-4B)专项负责中文错别字的深度纠错。 两者可独立配置,支持三种协作模式:① 仅主模型;② Union 模式(主模型 + 纠错模型结果合并); ③ Diff-only 模式(仅展示纠错模型发现的增量错误)。

核心实现:config/domains/llm.py:LLMSettings / smart_checker/infrastructure/llm/model_manager.py:ModelManager

④ 三维度向量查重

使用 paraphrase-multilingual-MiniLM-L12-v2 本地嵌入模型对题目文本向量化,存入 ChromaDB。 三个维度:

  • 内部查重check_internal_duplicates()):同套卷内题目两两比对余弦相似度
  • 跨题库查重CrossPaperDuplicateChecker.check_cross_paper_duplicates()):与其他学科/年级题库比对
  • 历史题库查重check_historical_duplicates()):与历年积累的历史题库比对

默认相似度阈值 0.85(可调),完全相同阈值 0.98;结果附带 confidence 分数。

核心实现:smart_checker/services/detector/checkers/duplicate.py

⑤ 10 类错误检测 + CoT 支持

错别字 typo_check
LLM + ChineseErrorCorrector 双重检测,Union / Diff-only 两种合并策略
语义不清 ambiguity_check
检测题干表述模糊、多义或指代不清问题
选项错误 options_check
选项格式一致性、互斥性、干扰项合理性
标点符号 punctuation_check
中文/日文/德文标点规范性检测
题型不一致 mismatch_check
题目类型声明与实际内容不符
信息缺失 missing_check
图表引用缺失、条件不足等
题目无解 unsolvability_check
数学/逻辑题无解或矛盾条件检测
答案泄露 answer_leak_check
题干或选项中隐含正确答案
图文不一致 image_inconsistency_check
图像描述与题干文字矛盾
逻辑错误 logic_check
推理链、前提与结论逻辑矛盾

所有检测任务支持 CoT(Chain-of-Thought) 模式,通过 enable_thinking 开关启用,对应 thinking/non-thinking 两套参数配置(temperature, top_p 等)。

⑥ 多语言支持(中/日/德/法)

系统自动检测试卷语言,按语言加载对应 prompt 模板目录(assets/prompt/detection/{ja,de,fr}/) 和路由 prompt(assets/prompt/routing/{zh,ja,de}/question_routing.txt)。 四种语言共享同一套检测框架,日/德/法各有专用的拼写与语法检测任务。

⑦ Flask REST API(供批处理平台复用)

POST /api/v1/parse_paper — 文档结构化解析(骨架提取 + 并发填充) POST /api/v1/get_routing — 获取单题检测路由 flags POST /api/v1/detect — 单题错误检测(支持指定 detection_types) POST /api/v1/duplicate/internal — 内部查重 POST /api/v1/duplicate/cross — 跨题库查重 POST /api/v1/duplicate/history — 历史题库查重 GET /api/v1/tasks — 获取所有可用检测任务定义 GET /health — 服务健康检查

API 通过 api_request_model_scope 上下文管理器实现并发请求间的模型作用域隔离,支持每请求指定不同 main_model。

配置系统

优先级:环境变量 > llm_config.yaml > 代码默认值 config/ 目录下按领域拆分:domains/llm.py(模型参数)、domains/features.py(功能开关)、 detection_tasks.py(检测任务声明)、unified_error_types.py(UI 错误类型聚合)。 支持三种部署模式:cloud / private / test,通过 SMART_CHECKER_DEPLOY_MODE 环境变量切换。

效果截图

主界面
主界面:试卷上传 + 审校结果面板
参数配置
审校参数配置:双模型、相似度阈值、CoT 开关

亮点总结

  • LangGraph 题型路由将无效 LLM 调用减少约 40%,降低误报率
  • 骨架提取 + 5 线程并发填充,100 题解析耗时较串行下降 ~60%
  • 双模型 Union/Diff-only 模式提升中文错别字召回率
  • 多语言(中/日/德/法)共用一套框架,通过 prompt 模板目录切换
  • Flask API 暴露全套能力,被生产级批处理平台 exam_checker_agent 直接复用

相关链接

GitHub 主页 → 生产级批处理版本