Files
fastapi/README.md
T

246 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 医疗问诊 Agent FastAPI 后端
医疗问诊 Agent 是医疗教学平台中的 FastAPI 后端服务,负责 Django 用户鉴权、病例读取、问诊训练、教学互动、AI 评价、PDF 下载、AI 学习助手问答,以及后台预留的机构知识库构建能力。
本服务不负责登录注册、病例 PDF 解析入库、病例增删改、多租户后台、HIS/LIS/PACS 对接。病例、检查项、教学题和评分规则由平台数据库维护,本服务只读取并使用。
## 当前功能
训练页面:
- 推荐配置信息
- 训练配置信息
- 新建会话
- 流式会话
- 王主任练习提示
- 体格检查列表获取
- 辅助检查列表获取
- 体格检查某项结果
- 辅助检查某项结果
- 完成问诊
- 提交诊断
- 提交治疗
- 生成评价
- 获取评价详情
- 下载 PDF
教学互动:
- 获取教学列表,包含题目、选项、答案、解析文本和视频
- 生成评价
- 获取评价详情
- 下载 PDF
个人中心:
- 训练记录列表
- 训练记录详情
AI 学习助手:
- 普通用户通过流式接口提问
- 后端优先检索本机构知识库
- 未命中知识库或知识库暂不可用时,自动转为大模型通用学习回答
- 命中知识库时返回 PDF 标题、页码、chunk_uid 和引用片段
后台预留能力:
- 内容管理员上传 PDF 构建机构知识库
- PDF 解析、分片、Embedding、Milvus 写入和 Celery 异步任务已留出接口
- 当前阶段不要求真实 PDF 入库测试,优先保证 AI 学习助手问答可用
基础能力:
- Django access token 鉴权
- MySQL 业务数据读取和训练记录写入
- Redis 短期会话 memory
- OpenAI-compatible LLM 调用
- OpenAI-compatible Embedding 调用预留
- Milvus 向量检索预留
- Swagger / OpenAPI
- 健康检查
## 项目结构
```text
fastapi/
├── app/ # FastAPI 应用、Agent、服务、模型和提示词
│ ├── api/ # API router
│ ├── agents/ # LLM Agent
│ ├── integrations/ # PDF、Embedding、Milvus 外部适配
│ ├── models/ # SQLAlchemy ORM
│ ├── repositories/ # 数据访问层
│ ├── schemas/ # Pydantic schema
│ ├── services/ # 业务服务
│ └── tasks/ # Celery 异步任务预留
├── scripts/ # 初始化和维护脚本
├── tests/ # 自动化测试
├── docs/03_api_design.md # 前端联调 API 文档
├── Dockerfile
├── requirements.txt
├── .env.example
└── .env.production.example
```
## 本地启动
```powershell
python -m venv .venv
.\.venv\Scripts\activate
pip install -r requirements.txt
copy .env.example .env
uvicorn app.main:app --host 127.0.0.1 --port 9000
```
本地 Swagger
```text
http://127.0.0.1:9000/docs
```
真实密码、LLM Key、Embedding Key 和 access token 只写入本地 `.env` 或服务器环境变量,不提交到 Git。
## 关键环境变量
```env
APP_ENV=local
APP_ROOT_PATH=
DATABASE_URL=mysql+pymysql://root:<password>@127.0.0.1:3306/medical?charset=utf8mb4
RUNTIME_MEMORY_BACKEND=redis
REDIS_URL=redis://127.0.0.1:6379/0
AUTH_VALIDATE_ENABLED=true
AUTH_USER_ME_URL=http://127.0.0.1:8000/api/user/users/me/
LLM_BASE_URL=https://api.deepseek.com/chat/completions
LLM_API_KEY=<llm_api_key>
LLM_MODEL=deepseek-chat
LLM_FAST_MODEL=deepseek-chat
LLM_REASON_MODEL=deepseek-reasoner
MILVUS_URI=http://127.0.0.1:19530
MILVUS_COLLECTION_PREFIX=kb_inst
MILVUS_DEFAULT_DB=default
EMBEDDING_PROVIDER=openai_compatible
EMBEDDING_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
EMBEDDING_API_KEY=<embedding_api_key>
EMBEDDING_MODEL=text-embedding-v4
EMBEDDING_DIM=1024
KNOWLEDGE_INGESTION_SYNC=true
KNOWLEDGE_STORAGE_DIR=./storage/knowledge
```
## 服务器部署
服务器目录示例:
```text
/home/code/medical-ai/
├── django/
├── fastapi/
├── vueapp/
├── vuecms/
├── data/
├── logs/
└── docker-compose.yml
```
首次拉取:
```bash
cd /home/code/medical-ai
git clone http://82.157.235.104:3000/Liu_JB/LiuJinbao.git fastapi
cp fastapi/.env.production.example fastapi/.env
vi fastapi/.env
```
FastAPI 构建和启动:
```bash
cd /home/code/medical-ai
docker compose build fastapi
docker compose up -d fastapi
docker compose logs --tail=200 fastapi
```
后续更新:
```bash
cd /home/code/medical-ai/fastapi
git pull origin main
cd ..
docker compose build fastapi
docker compose up -d fastapi
docker compose logs --tail=200 fastapi
```
## 验证
公网验证:
```text
http://8.160.178.88/fastapi/docs
http://8.160.178.88/fastapi/openapi.json
http://8.160.178.88/fastapi/health/ready
```
Django 用户鉴权:
```bash
curl "http://8.160.178.88/fastapi/api/v1/auth/me" \
-H "Authorization: Bearer <access_token>" \
-H "X-Entry-Scene: production_vue"
```
AI 学习助手流式问答:
```bash
curl -N -X POST "http://8.160.178.88/fastapi/api/v1/learning-assistant/chat/stream" \
-H "Authorization: Bearer <access_token>" \
-H "X-Entry-Scene: production_vue" \
-H "Content-Type: application/json" \
-d '{"question":"支气管肺炎有哪些典型临床表现?","top_k":5}'
```
PDF 评价报告下载:
```bash
curl -L "http://8.160.178.88/fastapi/api/v1/evaluations/<evaluation_id>/download-pdf" \
-H "Authorization: Bearer <access_token>" \
-H "X-Entry-Scene: production_vue" \
-o evaluation_report.pdf
```
## 测试
```powershell
python -m compileall app scripts tests
python tests\test_core_logic.py
python tests\test_api_contract.py
python tests\test_demo_flow.py
```
测试覆盖:
- Django token 鉴权和 user_id 隔离
- 推荐配置和训练配置
- 新建会话、流式问诊、王主任练习提示
- 体格检查和辅助检查列表
- 单项检查结果和重复申请幂等
- 完成问诊、提交诊断、提交治疗、生成评价
- 教学互动列表和教学互动评价
- 训练记录列表、评价详情、PDF 下载
- AI 学习助手无知识库降级流式回答
- AI 学习助手命中知识库后的来源返回
- 跨用户访问拒绝
## API 文档
前端联调文档:
```text
docs/03_api_design.md
```