精简后端功能模块并补充教学互动

This commit is contained in:
刘金宝
2026-06-08 16:49:45 +08:00
parent 11b1712b01
commit f0cdc454b3
18 changed files with 1120 additions and 1194 deletions
+86 -87
View File
@@ -1,34 +1,64 @@
# 医疗问诊 Agent FastAPI 后端
医疗问诊 Agent 是医疗教学平台中的问诊训练服务。后端负责 Django 用户身份校验、病例读取、多轮问诊、检查申请、诊断治疗提交、AI 评价、评分明细、PDF 报告和历史训练记录
医疗问诊 Agent 是医疗教学平台中的训练服务。后端负责 Django 用户鉴权、病例读取、训练会话、流式问诊、练习提示、检查结果、诊断治疗提交、AI 评价、教学互动评价、训练记录和 PDF 下载
病例库在本服务中为只读数据源。病例新增、解析、修改和删除由外部病例管理系统负责;本服务只读取已发布病例及其训练扩展、检查项和评分规则。
病例新增、病例解析、病例导入和病例删除不在本服务中实现。本服务只读取数据库中已经维护好的病例、检查项、教学题和评分规则。
## 当前保留功能
训练页面:
- 推荐配置信息
- 训练配置信息
- 新建会话
- 流式会话
- 王主任练习提示
- 体格检查列表获取
- 辅助检查列表获取
- 体格检查某项结果
- 辅助检查某项结果
- 完成问诊
- 提交诊断
- 提交治疗
- 生成评价
- 获取评价详情
- 下载 PDF
教学互动:
- 获取教学列表,包含题目、选项、答案、解析文本和视频
- 生成评价
- 获取评价详情
- 下载 PDF
个人中心:
- 训练记录列表
- 训练记录详情
基础能力:
- Django access token 鉴权
- MySQL 数据读取和训练记录写入
- Redis 短期会话 memory
- OpenAI-compatible LLM 调用
- Swagger / OpenAPI
- 健康检查
## 项目结构
仓库根目录可以直接部署为服务器的 `fastapi/` 目录:
```text
fastapi/
├── app/ # FastAPI 应用、Agent、服务、模型提示词
├── scripts/ # 数据库迁移、结构检查与运维脚本
├── tests/ # 核心逻辑与接口测试
├── app/ # FastAPI 应用、Agent、服务、模型提示词
├── scripts/ # 数据库初始化和检查脚本
├── tests/ # 当前功能测试
├── docs/03_api_design.md # 前端联调 API 文档
├── Dockerfile
├── requirements.txt
├── .env.example
└── .env.production.example
```
## 核心依赖
- Python 3.11
- FastAPI
- SQLAlchemy 2.x
- MySQL 8
- Redis 7
- OpenAI-compatible LLM API
- Django 用户中心 `/api/user/users/me/`
## 本地启动
```powershell
@@ -47,14 +77,14 @@ http://127.0.0.1:9000/docs
真实密码、LLM Key 和 access token 只写入本地 `.env` 或服务器环境变量,不提交到 Git。
## Docker Compose 部署
## 服务器部署
服务器目录:
服务器目录示例
```text
/home/code/medical-ai/
├── django/
├── fastapi/ # 本仓库
├── fastapi/
├── vueapp/
├── vuecms/
└── docker-compose.yml
@@ -69,41 +99,28 @@ cp fastapi/.env.production.example fastapi/.env
vi fastapi/.env
```
必须在服务器 `.env` 中填写
服务器 `.env` 至少配置
- MySQL 密码和数据库名
- `LLM_API_KEY`
- 实际前端来源 `CORS_ALLOW_ORIGINS`
- Nginx 使用 `/fastapi/` 前缀时保留 `APP_ROOT_PATH=/fastapi`
父目录 `docker-compose.yml` 的 FastAPI 服务需要包含:
```yaml
fastapi:
build:
context: ./fastapi
container_name: fastapi
restart: always
ports:
- "9000:9000"
env_file:
- ./fastapi/.env
volumes:
- ./logs/fastapi:/app/logs
- ./data/fastapi-reports:/app/storage/reports
depends_on:
- mysql
- redis
- django
networks:
- medical
```env
APP_ENV=production
APP_ROOT_PATH=/fastapi
DATABASE_URL=mysql+pymysql://root:1822..@mysql:3306/medical?charset=utf8mb4
REDIS_URL=redis://redis:6379/0
RUNTIME_MEMORY_BACKEND=redis
AUTH_VALIDATE_ENABLED=true
AUTH_USER_ME_URL=http://django:8000/api/user/users/me/
LLM_BASE_URL=<模型服务地址>
LLM_API_KEY=<模型密钥>
LLM_MODEL=<模型名称>
LLM_FAST_MODEL=<模型名称>
LLM_REASON_MODEL=<模型名称>
CORS_ALLOW_ORIGINS=http://8.160.178.88
```
构建并启动:
```bash
cd /home/code/medical-ai
docker compose config
docker compose build fastapi
docker compose up -d fastapi
docker compose logs --tail=200 fastapi
@@ -119,35 +136,9 @@ docker compose build fastapi
docker compose up -d fastapi
```
## 数据库初始化与检查
## 验证
服务启动后先进行只读结构检查
```bash
cd /home/code/medical-ai
docker compose exec fastapi python scripts/check_final_schema.py
docker compose exec fastapi python scripts/check_final_demo_readiness.py
```
以下迁移脚本只用于独立本地开发库或旧环境升级,不得用于共享生产病例库:
```bash
docker compose exec fastapi python scripts/migrate_to_new_schema.py
docker compose exec fastapi python scripts/migrate_user_department_score_detail.py
```
迁移脚本使用 `create_all` 补齐 Agent 所需表,不删除 Django 或现有业务表;`migrate_to_new_schema.py` 会写入 Demo 病例和基础数据。共享环境中的病例数据由外部病例管理系统维护。
## 部署验证
容器内部端口验证:
```bash
curl http://127.0.0.1:9000/health/live
curl http://127.0.0.1:9000/health/ready
```
使用 Nginx `/fastapi/` 代理后的公网验证:
公网验证
```text
http://8.160.178.88/fastapi/docs
@@ -155,9 +146,7 @@ http://8.160.178.88/fastapi/openapi.json
http://8.160.178.88/fastapi/health/ready
```
`/health/live` 返回 200 表示 FastAPI 进程正常。`/health/ready` 返回 200 表示 MySQL、Redis 和关键配置已经就绪;返回 503 时查看响应中的检查项和容器日志。
验证 Django 用户中心联调:
Django 用户鉴权验证:
```bash
curl "http://8.160.178.88/fastapi/api/v1/auth/me" \
@@ -165,7 +154,7 @@ curl "http://8.160.178.88/fastapi/api/v1/auth/me" \
-H "X-Entry-Scene: production_vue"
```
验证 PDF 文件流下载:
PDF 下载验证
```bash
curl -L "http://8.160.178.88/fastapi/api/v1/evaluations/<evaluation_id>/download-pdf" \
@@ -183,12 +172,22 @@ python tests\test_api_contract.py
python tests\test_demo_flow.py
```
当前测试覆盖训练页主要链路
测试覆盖:
- Django token 鉴权 user_id 隔离
- 新建会话、流式问诊、练习提示。
- 体格检查列表、辅助检查列表、单项检查结果和重复申请幂等。
- 完成问诊、提交诊断、提交治疗、生成评价。
- 评价详情、历史评价、PDF 路径导出、PDF 文件流下载和跨用户访问拒绝。
- Django token 鉴权 user_id 隔离
- 推荐配置和训练配置
- 新建会话、流式问诊、王主任练习提示
- 体格检查和辅助检查列表
- 单项检查结果和重复申请幂等
- 完成问诊、提交诊断、提交治疗、生成评价
- 教学互动列表和教学互动评价
- 训练记录列表、评价详情、PDF 下载
- 跨用户访问拦截
病例新增、解析、导入、删除不在本 FastAPI 服务中实现;本服务只读取数据库中已发布病例、检查项和评分规则。
## API 文档
前端联调文档见:
```text
docs/03_api_design.md
```