Skip to content

Repository files navigation

TrainAnswer|新人培训答题系统

CI License React FastAPI

一个面向新人培训、岗位测评与知识复盘的全栈系统。它把“学习题库、场景练习、正式考试、AI 批改、错题复盘、团队管理”放进同一条闭环,既可独立运行,也可以通过可信代理 Header 接入已有企业平台。

本仓库是可公开运行的作品版。内置的 60 道题全部是为开源演示重新编写的合成内容,不包含任何企业手册、客户资料、生产题库或原仓库历史。

考试首页

能做什么

  • 训练模式:逐题练习,提交后立即查看关键点、示例答案与纠正建议。
  • 考试模式:支持 10 / 20 / 30 题,按分类和难度均衡抽题,整卷提交后统一批改。
  • 双演示题库:通用能力、客户服务,各 30 道原创合成题。
  • 两级批改方案:默认使用无需密钥的本地规则;配置兼容 OpenAI API 的模型后可启用 AI 语义批改。
  • 学习闭环:错题列表、错题恢复、考试历史、个人最佳成绩与排行榜。
  • 管理后台:查看用户快照、题目状态、考试明细,支持题目增删改与上下线。
  • 音频能力:可保存语音回答、转写状态和音频元数据。
  • 平台接入:支持员工、组长、管理员、超级管理员四种角色,以及请求标识透传和操作审计。

界面预览

场景练习 管理后台
场景练习 管理后台

五分钟运行

需要 Python 3.11+、Node.js 20.19+ 或 22+。

git clone https://github.com/k4ubx7/TrainAnswer.git
cd TrainAnswer

python -m pip install -r backend/requirements.txt
cd frontend
npm ci
cd ..

python start_dev.py

启动脚本会自动完成三件事:创建隔离的 SQLite 数据库、导入公开演示题库、同时启动前后端。

本地演示默认使用管理员身份,不需要账号、数据库服务或 AI 密钥。按 Ctrl+C 可同时结束前后端进程。

使用 Docker

docker compose up --build

然后打开 http://localhost:5190/tools-runtime/train-answer/。Docker 版本同样使用独立的演示数据库和合成题库。

工作方式

flowchart LR
    U["学员 / 管理员"] --> W["React 前端"]
    W --> A["FastAPI API"]
    A --> D[("SQLite / PostgreSQL")]
    A --> G{"批改 Provider"}
    G --> M["本地 Mock 规则"]
    G --> L["兼容 OpenAI API 的模型"]
    A --> S["音频存储"]
    P["可选:企业平台代理"] -->|"身份与角色 Header"| A
Loading

关键设计

  1. 题库与系统解耦:题目以结构化 JSON 导入,包含关键点、权重、常见错误和评分提示。
  2. 抽题可解释:考试按题库、分类和难度采样,避免连续抽到单一类型题目。
  3. 批改可替换:业务流程只依赖统一 Provider 接口,本地演示与真实 AI 使用相同输出协议。
  4. 结果可追溯:保存逐题回答、命中点、漏答点、纠正建议和批改运行记录。
  5. 身份边界清晰:开发模式提供本地身份;生产模式要求可信代理注入身份、角色和请求标识。

公开演示题库

公开题库位于 backend/demo_questions.json,生成源位于 backend/scripts/generate_demo_questions.py。你可以检查每一道题是如何构造的,也可以重新生成:

python backend/scripts/generate_demo_questions.py
python backend/scripts/validate_question_bank.py backend/demo_questions.json

当前分布:

题库 简单 中等 困难 合计
通用能力 10 10 10 30
客户服务 10 10 10 30

每道题满分 10 分,三个关键评分点的权重之和必须等于题目分值。验证脚本会检查题号唯一性、题库范围、答案完整性和权重一致性。

换成你自己的题库

  1. 复制 demo_questions.json 并替换为自己的题目内容。
  2. 保持字段结构,运行验证脚本。
  3. 设置独立的 DATABASE_URL,运行 backend/scripts/import_questions.py 导入。
  4. 真实资料不要提交到公共仓库;建议放在被 .gitignore 排除的私有文件中。

AI 批改

默认 AI_PROVIDER=mock_local,只要回答非空就给出占位结果,适合界面演示和流程测试。

若要启用兼容 OpenAI API 的模型,在项目根目录创建 .env

AI_PROVIDER=aliyun_qwen
AI_MODEL=your-model-name
AI_API_BASE_URL=https://your-provider.example.com/compatible-mode/v1
AI_API_KEY=your-key

后端会要求模型返回结构化 JSON,并再次校验题目 ID、题目数量和分数范围,防止异常结果直接写入业务数据。

配置

常用环境变量:

变量 默认值 用途
DATABASE_URL sqlite:///./demo.db(启动脚本) 数据库连接
AI_PROVIDER mock_local 批改 Provider
AI_MODEL qwen3.6-plus 模型名称
AI_API_BASE_URL 阿里云兼容端点 模型服务地址
AI_API_KEY 模型密钥
AUDIO_STORAGE_PATH backend/uploads 音频目录
AUDIO_MAX_UPLOAD_BYTES 26214400 单个音频上限
CORS_ALLOWED_ORIGINS 生产环境允许的来源

完整示例见 .env.example。不要提交真实密钥或含个人信息的数据库。

开发与验证

# 后端
python -m pip install -r backend/requirements.txt pytest
python -m pytest backend/tests -q

# 前端
cd frontend
npm ci
npm test
npm run build

GitHub Actions 会运行题库验证、后端测试、前端测试与构建,并对 Docker 独立演示环境做启动冒烟测试。

目录结构

TrainAnswer/
├─ backend/
│  ├─ app/                 # FastAPI API、领域模型与服务
│  ├─ alembic/             # 数据库迁移
│  ├─ scripts/             # 题库生成、验证、导入和演示初始化
│  ├─ tests/               # 后端测试
│  └─ demo_questions.json  # 公开合成题库
├─ frontend/
│  └─ src/                 # React 页面、组件、API 客户端与测试
├─ docs/images/            # README 截图
├─ docker-compose.yml      # 独立演示环境
└─ start_dev.py            # 本地一键启动

开源边界

这个仓库有意不包含:

  • 企业真实题库、培训手册、客户资料和内部文档;
  • 原私有仓库的 Git 历史、生成中间产物和审查报告;
  • 本地数据库、上传音频、日志、密钥和个人身份信息。

如果你基于本项目部署自己的培训系统,请自行确认题库内容的著作权、个人信息保护要求和所使用模型服务的条款。

致谢

本项目建立在 FastAPISQLAlchemyAlembicReactTanStack QueryViteLucide 等开源项目之上,感谢这些项目的维护者与贡献者。

第三方依赖继续适用其各自的许可证。

贡献与安全

提交改进前请阅读 CONTRIBUTING.md。安全问题请按 SECURITY.md 私下报告,不要在 Issue 中提交密钥、真实题库或个人信息。

许可证

本项目采用 Apache License 2.0 开源。

About

AI-assisted onboarding training, assessment, grading and review platform with a fully synthetic public demo bank.

Topics

Resources

Contributing

Security policy

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages