前段时间,一位在教育行业做教研的朋友愁眉苦脸。他们需要从几百份试题文件中把上万个数学题录入到题库中。

作为一个程序员,每次听到这种重复、机械的工作内容,我简直不能忍受。如果让我去干这样的工作,我会感觉很痛苦。

但作为朋友,我能让他这么痛苦吗?于是我决定帮他的团队搭建一套“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 提取出的知识点是自由文本,比如"一元二次方程的解法"。但系统里的标准知识点可能叫"一元二次方程——求根公式法"。直接做文本匹配,对不上。

我的方案是两步走:

  1. 向量检索:把所有标准知识点存入 ChromaDB(向量数据库),用语义相似度找到最接近的候选项
  2. 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 |