Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Rookiecoder-jsjs/TutorBot

Repository files navigation

🎓 智能教学助手

一款基于多模型路由的 AI 教学助手,支持 9 大学科 的题目识别与智能解答!

✨ 功能亮点

  • 📸 图片上传 — 拍照上传题目,AI 自动识别
  • 🧠 智能路由 — 理科题目交给 DeepSeek,文科题目交给 Qwen
  • 🎬 分步动画 — 数学/物理/化学/生物配有 SVG 分步推导动画
  • 🔊 语音讲解 — 各学科配备专属语音风格,边听边学
  • 💬 解答助手 — 追问互动,深入理解解题思路
  • 🎨 精致 UI — 响应式设计,支持浅色/深色模式

🛠 环境要求

  • Python 3.10+
  • 依赖包:httpx, pyyaml, fastapi, uvicorn, python-multipart, jinja2, python-dotenv

🚀 快速开始

1️⃣ 安装依赖

pip install -r requirements.txt

2️⃣ 配置 API 密钥

复制 .env.example.env,然后编辑:

cp .env.example .env

编辑 .env 文件:

# DeepSeek API Key(理科求解 🧮)
DEEPSEEK_API_KEY=sk-xxx
# DashScope API Key(文科求解 + OCR 📸 + 学科分类 🔍)
DASHSCOPE_API_KEY=sk-xxx
# MiniMax API Key(TTS 语音合成 🔊,可选)
MINIMAX_API_KEY=eyJxxx
# MiniMax Group ID(可选)
MINIMAX_GROUP_ID=17xxx

3️⃣ 启动服务

Web 模式(推荐 👍):

python -m uvicorn app:app --reload --port 8000

然后浏览器访问 http://localhost:8000

CLI 模式 💻:

# 文本题目
python main.py question.txt
# 图片题目(自动 OCR)
python main.py question.png

演示模式 🎭(不调用 LLM):

python demo_voice_board.py "求解方程 x^2-4=0"
python demo_voice_board.py "请赏析李白《静夜思》的艺术特色"

📚 支持的 9 大学科

学科 求解模型 语音风格 动画效果
🧮 数学 DeepSeek 男声(青涩) SVG 分步推导
⚡ 物理 DeepSeek 男声(青涩) SVG 分步推导
🧪 化学 DeepSeek 男声(青涩) SVG 分步推导
🧬 生物 DeepSeek 男声(青涩) SVG 分步推导
📝 语文 Qwen 女声(少女) 文字高亮动画
📖 英语 Qwen 女声(少女) 文字高亮动画
🏛 历史 Qwen 女声(少女) 文字高亮动画
📋 政治 Qwen 女声(少女) 文字高亮动画
🌍 地理 Qwen 女声(少女) 文字高亮动画

分类机制

  1. 🤖 LLM 分类(优先) — 使用 Qwen 模型进行 9 学科智能分类
  2. 🔑 关键词 fallback — LLM 不可用时,按关键词评分兜底
  3. 📌 默认值 — 无法判定时归为「语文」

📁 项目结构

├── app.py # 🌐 FastAPI Web 入口
├── main.py # 💻 CLI 入口
├── demo_voice_board.py # 🎭 语音+板书演示
├── .env.example # 🔐 API 密钥模板
├── requirements.txt # 📦 Python 依赖
├── templates/
│ └── index.html # 🎨 Web 前端页面
├── src/
│ ├── core/
│ │ ├── simple_classifier.py # 🔍 学科分类器
│ │ ├── model_router.py # 🚦 模型路由器
│ │ └── narrator.py # 🎬 旁白脚本 + 动画生成
│ └── services/
│ ├── deepseek_client.py # 🧠 DeepSeek API(理科求解)
│ ├── qwen_client.py # 📚 Qwen API(文科求解 + OCR)
│ ├── minimax_tts.py # 🔊 MiniMax TTS 语音合成
│ └── dashscope_tts.py # 🔊 DashScope TTS 语音合成
└── output/ # 📂 运行时输出目录

🎨 前端标签样式

9 个学科各有独特的颜色标签 🎨

  • 🧮 数学 — 🔵 蓝色
  • ⚡ 物理 — 🔷 青色
  • 🧪 化学 — 🟣 紫色
  • 🧬 生物 — 🟢 绿色
  • 📝 语文 — 🔴 红色
  • 📖 英语 — 🟠 橙色
  • 🏛 历史 — 🟤 棕色
  • 📋 政治 — 🟣 品红
  • 🌍 地理 — 🔵 天蓝

⚙️ 核心配置

所有学科属性集中在 src/core/simple_classifier.pySUBJECT_CONFIG 字典中管理:

from src.core.simple_classifier import SubjectType, SUBJECT_CONFIG, get_category
# 获取学科标签
label = SUBJECT_CONFIG[SubjectType.MATH]["label"] # "数学"
# 获取学科大类
category = get_category(SubjectType.MATH) # SubjectCategory.SCIENCE
# 获取 TTS 语音
voice = SUBJECT_CONFIG[SubjectType.MATH]["voice"] # "male-qn-qingse"
# 获取动画类型
anim_type = SUBJECT_CONFIG[SubjectType.MATH]["anim_type"] # "svg"
# 获取前端标签 CSS class
tag_class = SUBJECT_CONFIG[SubjectType.MATH]["tag_class"] # "tag-math"

🔌 API 接口

POST /api/solve

提交题目进行解答 📥

请求参数(FormData):

参数 类型 说明
text string 题目文本(与 image 二选一)
image file 题目图片(与 text 二选一)

响应示例:

{
 "question": "求函数 f(x)=x2+1 的导数",
 "subject": "数学",
 "solution": "解题思路:...\n解题答案:...",
 "thinking": "识别为求导问题...",
 "answer": "f'(x) = 2x",
 "animation": "<svg>...</svg>",
 "anim_type": "svg",
 "audio_url": "/output/abc123/audio.mp3",
 "tag_class": "tag-math"
}

POST /api/ask

解答助手追问接口 💬

请求参数(FormData):

参数 类型 说明
question string 追问内容
subject string 学科名称
original_question string 原题目
solution string 详细解答
thinking string 解题思路
answer string 最终答案

GET /

Web 前端页面 🖥️

⚡ 处理流程

📥 输入(文本/图片)
 │
 ▼
📸 OCR 识别(图片时调用 Qwen-VL-Max)
 │
 ▼
🔍 学科智能分类(LLM 优先 + 关键词兜底)
 │
 ▼
🚦 模型路由
 ├── 理科(数/理/化/生)→ 🧠 DeepSeek
 └── 文科(语/英/历/政/地)→ 📚 Qwen
 │
 ▼
📝 各学科专属解题 Prompt
 │
 ▼
🎬 动画生成
 ├── 理科 → SVG 分步推导动画
 └── 文科 → 文字高亮动画
 │
 ▼
🔊 TTS 语音合成(学科专属语音风格)
 │
 ▼
📤 输出(解答 + 动画 + 语音)

🧪 验证测试

启动服务后,用 curl 测试不同学科:

# 🧮 数学 - 求导数
curl -X POST http://localhost:8000/api/solve -F "text=求函数f(x)=x2+1的导数"
# ⚡ 物理 - 自由落体
curl -X POST http://localhost:8000/api/solve -F "text=一个物体从10m高处自由落体,求落地速度"
# 🧪 化学 - 电离方程式
curl -X POST http://localhost:8000/api/solve -F "text=写出NaCl溶液的电离方程式"
# 📝 语文 - 人物形象分析
curl -X POST http://localhost:8000/api/solve -F "text=分析《红楼梦》中林黛玉的人物形象"
# 📖 英语 - 翻译
curl -X POST http://localhost:8000/api/solve -F "text=将下列句子翻译成英文:今天天气很好"
# 🏛 历史 - 历史事件分析
curl -X POST http://localhost:8000/api/solve -F "text=分析辛亥革命的历史意义"
# 🌍 地理 - 气候成因分析
curl -X POST http://localhost:8000/api/solve -F "text=分析季风气候的成因"

检查返回的 subject 字段和 tag_class 是否与预期学科匹配 ✅

About

一款基于多模型路由的 AI 教学助手,支持 9 大学科 的题目识别与智能解答!

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

Contributors

AltStyle によって変換されたページ (->オリジナル) /