# 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 |