| # TeachAgent - 智能教育助手平台 |
|
|
| AI 驱动的个性化学习平台,支持教师创建 AI Agent、管理知识库,学生通过对话式交互进行学习。 |
|
|
| ## 功能特性 |
|
|
| - **教师端**:创建/管理 AI Agent、知识库管理、学生管理、分发链接、工作流编辑 |
| - **学生端**:与 AI Agent 对话、代码执行、3D 可视化、思维导图 |
| - **RAG 系统**:基于 Elasticsearch 的向量检索 + 重排序 |
| - **流式对话**:SSE 实时流式输出 |
| - **插件系统**:代码执行(CodeMirror)、3D 可视化(Plotly)、思维导图(markmap) |
|
|
| ## 项目结构 |
|
|
| ``` |
| teachagent/ |
| ├── ELASTIC/ # Elasticsearch 容器(独立部署) |
| │ └── Dockerfile |
| ├── teachagent-app/ # 主应用 |
| │ ├── app.py # Flask 入口 |
| │ ├── config.py # 配置 |
| │ ├── requirements.txt # Python 依赖 |
| │ ├── Dockerfile # 应用容器 |
| │ ├── .env # 环境变量 |
| │ ├── modules/ # 后端模块 |
| │ │ ├── auth/ # 认证(JWT + 密码/邮箱/手机登录) |
| │ │ ├── agent_builder/ # Agent 构建 |
| │ │ ├── code_executor/ # Python 代码执行 |
| │ │ ├── knowledge_base/ # RAG 知识库(检索/重排/生成) |
| │ │ └── visualization/ # 3D 可视化 + 思维导图 |
| │ ├── frontend/ # React 源码(开发用) |
| │ │ ├── src/ |
| │ │ ├── package.json |
| │ │ └── vite.config.js |
| │ ├── static/dist/ # React 构建产物(生产环境前端) |
| │ ├── agents/ # Agent JSON 配置存储 |
| │ ├── uploads/ # 用户上传文件 |
| │ └── _archive/ # 旧版 Flask 模板归档 |
| └── docker-compose.yml # 两容器编排 |
| ``` |
|
|
| ## 部署方式 |
|
|
| ### 方式一:本地开发 |
|
|
| 适合开发调试,前后端分离运行。 |
|
|
| ```bash |
| # 1. 启动 Elasticsearch(Docker 或本地安装) |
| docker run -d --name es -p 9200:9200 \ |
| -e discovery.type=single-node \ |
| -e xpack.security.enabled=false \ |
| elasticsearch:9.3.3 |
| |
| # 2. 启动 Flask 后端 |
| cd teachagent-app |
| pip install -r requirements.txt |
| FLASK_ENV=development python app.py |
| # 后端运行在 http://localhost:7860 |
| |
| # 3. 启动 React 前端(开发模式,带热更新) |
| cd frontend |
| npm install |
| npm run dev |
| # 前端运行在 http://localhost:3000,API 请求代理到 7860 |
| ``` |
|
|
| **本地开发特点**: |
| - 前端 `localhost:3000`,后端 `localhost:7860`,通过 Vite 代理转发 API |
| - SSE 流式输出需要直连后端(绕过 Vite 代理) |
| - `FLASK_ENV=development` 开启 debug 模式和热重载 |
| - 修改前端代码即时生效(HMR) |
|
|
| ### 方式二:云端容器部署(生产环境) |
|
|
| 两个容器,一个端口。 |
|
|
| ```bash |
| # 在项目根目录(包含 docker-compose.yml 的目录) |
| docker-compose up -d |
| |
| # 或分别构建 |
| docker-compose build |
| docker-compose up -d |
| ``` |
|
|
| **生产环境特点**: |
| - 单端口 `7860`:Flask 同时托管 API 和 React 静态文件 |
| - 无跨域问题:前端和 API 同源 |
| - SSE 流式直连:不经过代理,实时输出 |
| - gunicorn 多 worker 运行,性能更好 |
| - ES 通过 Docker 网络互通(`http://elasticsearch:9200`) |
|
|
| ### 方式三:HuggingFace Spaces 部署 |
|
|
| 适用于 HuggingFace Spaces 平台。 |
|
|
| 1. 将 `teachagent-app/` 作为 Space 仓库 |
| 2. ES 单独部署为另一个 Space(`ELASTIC/`) |
| 3. `.env` 中配置 `ELASTICSEARCH_URL=https://your-es-space.hf.space` |
|
|
| ## 环境变量说明 |
|
|
| | 变量 | 说明 | 示例 | |
| |------|------|------| |
| | `ELASTICSEARCH_URL` | Elasticsearch 地址 | `http://localhost:9200` 或 `https://xxx.hf.space` | |
| | `API_KEY` | SiliconFlow API Key(Embedding/Rerank) | `sk-xxx` | |
| | `BASE_URL` | SiliconFlow API 地址 | `https://api.siliconflow.cn/v1` | |
| | `STREAM_API_KEY` | DeepSeek API Key(对话生成) | `sk-xxx` | |
| | `STREAM_BASE_URL` | DeepSeek API 地址 | `https://api.deepseek.com/v1` | |
| | `STREAM_MODEL` | 对话模型 | `deepseek-chat` | |
| | `SECRET_KEY` | Flask Session 密钥 | 随机字符串 | |
| | `JWT_SECRET` | JWT 签名密钥 | 随机字符串 | |
| | `FLASK_ENV` | 运行环境 | `development` 或 `production` | |
|
|
| ## 跨域与 HTTPS |
|
|
| ### 生产环境(推荐) |
|
|
| - **无跨域问题**:前端构建产物由 Flask 直接托管,前端和 API 同源(同一个端口 7860) |
| - **HTTPS**:由反向代理(Nginx/Cloudflare/HuggingFace Spaces)统一处理 SSL 终止,Flask 本身只需 HTTP |
| - **SSE 流式**:同源直连,无需代理,数据实时到达 |
|
|
| ### 本地开发 |
|
|
| - **跨域**:Vite 代理 (`localhost:3000` → `localhost:7860`) 处理 API 请求,SSE 直连后端 |
| - **HTTPS**:本地开发无需 HTTPS,全部 HTTP |
| - **注意**:HTML 中不要加 `upgrade-insecure-requests` meta 标签(已移除) |
|
|
| ### 带 HTTPS 反向代理部署 |
|
|
| 如果在自有服务器上通过 Nginx 反向代理: |
|
|
| ```nginx |
| server { |
| listen 443 ssl; |
| server_name your-domain.com; |
| |
| ssl_certificate /path/to/cert.pem; |
| ssl_certificate_key /path/to/key.pem; |
| |
| location / { |
| proxy_pass http://127.0.0.1:7860; |
| proxy_http_version 1.1; |
| proxy_set_header Host $host; |
| proxy_set_header X-Real-IP $remote_addr; |
| |
| # SSE 流式输出必须的配置 |
| proxy_buffering off; |
| proxy_cache off; |
| proxy_set_header Connection ''; |
| chunked_transfer_encoding on; |
| } |
| } |
| ``` |
|
|
| 关键配置:`proxy_buffering off` 确保 SSE 数据不被 Nginx 缓冲。 |
|
|
| ## 演示账号 |
|
|
| | 角色 | 用户名 | 密码 | |
| |------|--------|------| |
| | 教师 | teacher | 123456 | |
| | 学生 | student1 | 123456 | |
|
|
| 也可通过注册页面创建新账号。 |
|
|
| ## 技术栈 |
|
|
| | 层 | 技术 | |
| |----|------| |
| | 前端 | React 19 + Vite + Ant Design 5 + TailwindCSS + Redux Toolkit | |
| | 后端 | Flask + gunicorn | |
| | 数据库 | Elasticsearch 9.x(向量检索) + SQLite(用户管理) | |
| | AI | DeepSeek(对话) + SiliconFlow(Embedding/Rerank) | |
| | 部署 | Docker + docker-compose | |
|
|