前段时间,一位在教育行业做教研的朋友愁眉苦脸。他们需要从几百份试题文件中把上万个数学题录入到题库中。
作为一个程序员,每次听到这种重复、机械的工作内容,我简直不能忍受。如果让我去干这样的工作,我会感觉很痛苦。
但作为朋友,我能让他这么痛苦吗?于是我决定帮他的团队搭建一套“AI 原生”的题库系统。
什么叫"AI 原生"?
在我理解中,AI 原生不只是“用 AI”这么简单,而是在做系统架构设计时就将 AI 作为核心要素,在系统的主要流程中起到重要的作用。具体到这个题库系统:
- 题目不是人手动一个个敲进去的,而是由 AI 从文档中批量提取出来的
- 知识点不是人手动一个个勾选的,而是由 AI 自动匹配上去的
- 自带 AI 对话框,AI 不只是"辅助工具",经过管理员授权,它在系统中可以搜索题库、查询知识点、生成题目和智能组卷
整体架构一览
graph TB
subgraph 用户端
Teacher[教师/教研员]
Admin[管理员]
end
subgraph 前端["前端"]
Import[智能导入]
QBank[题库管理]
Chat[AI 对话]
Paper[组卷]
end
subgraph 后端["后端"]
API[API 网关]
DocProc[文档处理引擎]
AIService[AI 服务层]
CRUD[数据层]
end
subgraph AI["AI 引擎"]
Gemini[Gemini]
OpenAI[OpenAI]
end
subgraph 存储
MySQL[(MySQL)]
ChromaDB[(ChromaDB<br/>向量数据库)]
FileStore[(文件存储)]
end
subgraph 后台
Worker[后台 Worker<br/>批量异步任务处理]
end
Teacher --> Import & QBank & Chat & Paper
Admin --> QBank
Import & QBank & Chat & Paper --> API
API --> DocProc & AIService & CRUD
Worker --> DocProc
DocProc --> AIService
AIService --> Gemini & OpenAI
CRUD --> MySQL
AIService --> ChromaDB
DocProc --> FileStore
下面聊聊设计过程中的几个关键决策和核心功能。
重要决策:用 Markdown 作为题目的存储格式
这个决策影响了整个系统的数据流。
题目的题干、解析、解题思路,在数据库里全部以 Markdown 格式存储。为什么不用富文本 HTML?因为 Markdown 是万能转换器(如果想了解更多,可以参考我的另一篇:《Markdown》):
- AI 友好:大模型天然理解 Markdown,输入输出都不需要额外转换
- 公式支持:LaTeX 数学公式直接内嵌(
$...$行内,$$...$$块级),这对数学题库来说是刚需 - 图表支持:Mermaid 流程图、几何图形描述都可以直接写在题干里
- 格式转换的万能中间层:Word/PDF 可以转成 Markdown,AI 生成的内容本身就是 Markdown,渲染到网页上也很方便
- 人类可读可编辑:Markdown 源码本身就是清晰易懂的,老师打开就能直接改,不需要任何技术背景
核心功能
文档智能导入流水线
从试题文件中提取每个题目,变成数据库里结构化数据,中间要经过多个环节。我把它设计成了一条流水线:
flowchart TD
A[上传文件<br/>Word/PDF/图片/Markdown] --> B[格式转换<br/>统一为 Markdown]
B --> C[AI 提取<br/>识别每道题目]
C --> D[结构校验<br/>字段格式检查]
D --> E[知识点匹配<br/>向量检索 + AI 复核]
E --> F[人工确认<br/>查漏补缺]
F --> G[批量入库]
智能做题
不是所有试题资料都自带答案。很多课外教辅、教材习题只有题干,没有标准答案和解析。
系统支持两种导入模式:
- 录入原题:只提取文档中的题目,保留原始答案和解析,原样入库
- AI 做题:只要有题干,AI 就能自动计算、解题,生成完整的标准答案和解题步骤
老师在上传时选择模式即可,底层共用同一条流水线。
向量检索 + AI 复核的双保险
录入题目时,需要自动匹配知识点,这看起来简单,但做起来遇到很多坑。
AI 提取出的知识点是自由文本,比如"一元二次方程的解法"。但系统里的标准知识点可能叫"一元二次方程——求根公式法"。直接做文本匹配,对不上。
我的方案是两步走:
- 向量检索:把所有标准知识点存入 ChromaDB(向量数据库),用语义相似度找到最接近的候选项
- AI 复核:把题目原文和候选知识点一起交给 AI,让它判断哪些是真正相关的
向量检索能找到语义相近的,但单靠这个,不够精准;单靠 AI 判断又太慢且不稳定。两步组合下来,准确率比单独用任何一种都高不少。
AI 助手
系统里有一个 AI 对话功能,但它不只是会聊天,还能干活。
AI 在对话中可以按需调用一组工具:
| 工具 | 能力 |
|---|
| 搜索知识点 | 在向量数据库中检索相关知识点 | | 搜索题库 | 按关键词、难度、题型查找现有题目 | | 查询标签体系 | 获取当前系统的标签分类 | | 提交题目草稿 | 将 AI 生成的题目提交为待审核状态 |
举个例子:老师在对话框里说"帮我出 3 道关于勾股定理的选择题,难度中等",AI 会先搜索知识点库确认"勾股定理"的标准名称,再搜索现有题库,看是否已经存在相似题目,然后生成题目并提交为草稿。
AI 提交的是"草稿",不是"发布"。最终这道题能不能进入题库,决定权在审核人的手里,因为 AI 不能做到 100% 可靠。
技术栈总览
| 层 | 选型 | 理由 |
|—|—|—|
| 后端框架 | FastAPI (Python) | 异步原生、类型提示友好、生态好 | | 数据库 | MySQL + SQLAlchemy 2.0 (async) + Alembic | 成熟稳定,异步驱动,自动化迁移 | | 向量数据库 | ChromaDB | 轻量、独立部署、Python 原生 | | AI 服务 | Gemini / OpenAI(可切换) | 多供应商避免锁定 | | 前端 | Nuxt 4 + Vue 3 + Shadcn UI | 组件生态好,Tailwind 效率高 | | 部署 | Docker Compose (4 个容器) | 后端 + Worker + 前端 + ChromaDB |