feat: add streaming learning assistant and knowledge base scaffolding

This commit is contained in:
刘金宝
2026-06-10 09:32:36 +08:00
parent f0cdc454b3
commit 89258ab448
31 changed files with 2021 additions and 330 deletions
+82 -30
View File
@@ -1,10 +1,10 @@
# 医疗问诊 Agent FastAPI 后端
医疗问诊 Agent 是医疗教学平台中的训练服务。后端负责 Django 用户鉴权、病例读取、训练会话、流式问诊、练习提示、检查结果、诊断治疗提交、AI 评价、教学互动评价、训练记录和 PDF 下载
医疗问诊 Agent 是医疗教学平台中的 FastAPI 后端服务,负责 Django 用户鉴权、病例读取、问诊训练、教学互动、AI 评价、PDF 下载、AI 学习助手问答,以及后台预留的机构知识库构建能力
病例新增、病例解析、病例导入和病例删除不在本服务中实现。本服务只读取数据库中已经维护好的病例、检查项、教学题和评分规则
本服务不负责登录注册、病例 PDF 解析入库、病例增删改、多租户后台、HIS/LIS/PACS 对接。病例、检查项、教学题和评分规则由平台数据库维护,本服务只读取并使用
## 当前保留功能
## 当前功能
训练页面:
@@ -36,12 +36,27 @@
- 训练记录列表
- 训练记录详情
AI 学习助手:
- 普通用户通过流式接口提问
- 后端优先检索本机构知识库
- 未命中知识库或知识库暂不可用时,自动转为大模型通用学习回答
- 命中知识库时返回 PDF 标题、页码、chunk_uid 和引用片段
后台预留能力:
- 内容管理员上传 PDF 构建机构知识库
- PDF 解析、分片、Embedding、Milvus 写入和 Celery 异步任务已留出接口
- 当前阶段不要求真实 PDF 入库测试,优先保证 AI 学习助手问答可用
基础能力:
- Django access token 鉴权
- MySQL 数据读取和训练记录写入
- MySQL 业务数据读取和训练记录写入
- Redis 短期会话 memory
- OpenAI-compatible LLM 调用
- OpenAI-compatible Embedding 调用预留
- Milvus 向量检索预留
- Swagger / OpenAPI
- 健康检查
@@ -50,8 +65,16 @@
```text
fastapi/
├── app/ # FastAPI 应用、Agent、服务、模型和提示词
├── scripts/ # 数据库初始化和检查脚本
├── tests/ # 当前功能测试
│ ├── 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
@@ -75,7 +98,39 @@ uvicorn app.main:app --host 127.0.0.1 --port 9000
http://127.0.0.1:9000/docs
```
真实密码、LLM Key 和 access token 只写入本地 `.env` 或服务器环境变量,不提交到 Git。
真实密码、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
```
## 服务器部署
@@ -87,6 +142,8 @@ http://127.0.0.1:9000/docs
├── fastapi/
├── vueapp/
├── vuecms/
├── data/
├── logs/
└── docker-compose.yml
```
@@ -99,25 +156,7 @@ cp fastapi/.env.production.example fastapi/.env
vi fastapi/.env
```
服务器 `.env` 至少配置
```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
```
构建并启动:
FastAPI 构建和启动
```bash
cd /home/code/medical-ai
@@ -134,6 +173,7 @@ git pull origin main
cd ..
docker compose build fastapi
docker compose up -d fastapi
docker compose logs --tail=200 fastapi
```
## 验证
@@ -146,7 +186,7 @@ http://8.160.178.88/fastapi/openapi.json
http://8.160.178.88/fastapi/health/ready
```
Django 用户鉴权验证
Django 用户鉴权:
```bash
curl "http://8.160.178.88/fastapi/api/v1/auth/me" \
@@ -154,7 +194,17 @@ curl "http://8.160.178.88/fastapi/api/v1/auth/me" \
-H "X-Entry-Scene: production_vue"
```
PDF 下载验证
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" \
@@ -182,11 +232,13 @@ python tests\test_demo_flow.py
- 完成问诊、提交诊断、提交治疗、生成评价
- 教学互动列表和教学互动评价
- 训练记录列表、评价详情、PDF 下载
- 跨用户访问拦截
- AI 学习助手无知识库降级流式回答
- AI 学习助手命中知识库后的来源返回
- 跨用户访问拒绝
## API 文档
前端联调文档
前端联调文档:
```text
docs/03_api_design.md