# Medical-triage-assistant
**Repository Path**: BLOGSFan/Medical-triage-assistant
## Basic Information
- **Project Name**: Medical-triage-assistant
- **Description**: 医疗导诊助手是一个面向互联网医院的智能导诊 Agent 系统,实现 「主诉采集 → 科室建议 → 号源查询 → 就诊须知」 全流程自动化。
系统采用 主 Agent + 导诊子 Agent 的双层架构:主 Agent 负责多轮问诊编排与状态管理,导诊子 Agent 基于 LLM 进行分诊推理并输出科室建议与注意事项。所有分诊结果均为辅助建议,非诊断结论。
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-09-05
- **Last Updated**: 2026-09-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 医疗导诊助手
**基于 LangGraph + MCP 的智能导诊 Agent 系统**
[](https://www.python.org/)
[](https://www.langchain.com/)
[](https://langchain-ai.github.io/langgraph/)
[](https://vuejs.org/)
[](https://fastapi.tiangolo.com/)
[](https://www.mysql.com/)
[](https://www.docker.com/)
[](./LICENSE)
---
## 项目简介
医疗导诊助手是一个面向互联网医院的智能导诊 Agent 系统,实现 **「主诉采集 → 科室建议 → 号源查询 → 就诊须知」** 全流程自动化。
系统采用 **主 Agent + 导诊子 Agent** 的双层架构:主 Agent 负责多轮问诊编排与状态管理,导诊子 Agent 基于 LLM 进行分诊推理并输出科室建议与注意事项。所有分诊结果均为辅助建议,非诊断结论。
### 核心流程
```
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ 开场白 │───▶│ 主诉采集 │───▶│ 追问补充 │───▶│ 分诊推理 │───▶│ 结果推荐 │
│ greet │ │ collect │ │ follow_up│ │ triage │ │ recommend│
└──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘
│
┌──────────┐ ┌──────────┐ │
│ 完 成 │◀───│ 号源查询 │◀─┘
│ complete │ │query_slots│
└──────────┘ └──────────┘
```
> **免责声明**:本系统仅提供导诊辅助建议,不构成任何医疗诊断或治疗方案。如有紧急情况,请立即拨打 120 或前往最近医疗机构。
## 功能特性
- **多轮智能问诊** — 基于 LangGraph 状态机,实现主诉采集、追问补充、分诊推理的全流程编排
- **智能分诊建议** — 导诊子 Agent 基于 LLM 进行症状分析,推荐最合适的科室
- **急诊识别** — 自动识别危重症状关键词,触发急诊通道提醒
- **禁忌提示** — 根据症状自动输出就诊前禁忌注意事项
- **号源查询** — 通过 MCP 协议对接号源服务,实时查询可预约号源
- **院内导航** — 提供科室位置与院内路线指引
- **Vue 聊天界面** — 实时聊天交互,侧边栏展示分诊状态与科室信息
- **Docker 部署** — 一键启动 MySQL + API + 前端完整环境
- **多 LLM 支持** — 默认 DeepSeek,兼容 OpenAI / Ollama(本地部署)
## 技术栈
| 层级 | 技术 | 说明 |
|------|------|------|
| **Agent 框架** | LangChain + LangGraph | 多轮对话编排、状态机管理 |
| **MCP 协议** | FastMCP | 号源查询、院内导航工具服务 |
| **后端 API** | FastAPI + Uvicorn | RESTful API、异步高性能 |
| **前端** | Vue 3 + Vite | 聊天界面、响应式布局 |
| **数据库** | MySQL 8.0 + SQLAlchemy | 科室、号源、预约数据持久化 |
| **LLM** | DeepSeek / OpenAI / Ollama | 分诊推理、症状分析 |
| **部署** | Docker Compose + Nginx | 容器化部署 |
## 项目结构
```
medical-triage-assistant/
├── backend/ # 后端服务
│ ├── main.py # 统一启动入口
│ ├── Dockerfile # 后端 Docker 镜像
│ ├── requirements.txt # Python 依赖
│ ├── .env.example # 环境变量模板
│ ├── src/
│ │ ├── agents/ # Agent 模块
│ │ │ ├── state.py # LangGraph 状态定义
│ │ │ ├── main_agent.py # 主 Agent - 多轮问诊编排
│ │ │ └── triage_agent.py # 导诊子 Agent - 分诊推理
│ │ ├── mcp_server/
│ │ │ ├── server.py # MCP Server - 号源/导航工具
│ │ │ └── his_adapter.py # HIS 系统适配器
│ │ ├── models/ # 数据模型
│ │ │ ├── base.py # SQLAlchemy ORM 基类
│ │ │ ├── department.py # 科室 & 症状模型
│ │ │ ├── appointment.py # 号源 & 预约模型
│ │ │ ├── consultation.py # 问诊会话模型
│ │ │ └── patient.py # 患者信息模型
│ │ ├── skills/ # 技能模块
│ │ │ ├── triage_dialogue.py # 分诊话术 & 追问策略
│ │ │ ├── contraindication.py # 禁忌提示 & 急诊识别
│ │ │ ├── evaluation.py # 分诊评估模块
│ │ │ └── knowledge_base.py # RAG 知识库
│ │ ├── utils/ # 工具层
│ │ │ ├── config.py # 全局配置 (Pydantic Settings)
│ │ │ ├── database.py # 异步数据库引擎
│ │ │ ├── llm.py # LLM 模型工厂
│ │ │ ├── logger.py # 日志配置 (Loguru)
│ │ │ ├── auth.py # JWT 认证模块
│ │ │ └── i18n.py # 多语言支持
│ │ └── web/
│ │ ├── app.py # FastAPI 应用主入口
│ │ ├── schemas.py # API 请求/响应 Schema
│ │ └── websocket.py # WebSocket 流式推送
│ ├── scripts/
│ │ └── init_db.sql # 数据库初始化脚本
│ └── tests/
│ └── test_api.py # 基础测试
├── frontend/ # 前端服务
│ ├── Dockerfile # 前端 Docker 镜像
│ ├── nginx.conf # 生产 Nginx 配置
│ ├── package.json # Node 依赖
│ ├── vite.config.js # Vite 配置
│ ├── index.html # 入口 HTML
│ └── src/
│ ├── App.vue # 聊天界面组件
│ └── main.js # Vue 入口
├── docker-compose.yml # Docker 编排配置
├── .gitignore # Git 忽略规则
└── README.md # 项目说明
```
## 快速开始
### 环境要求
- Python 3.11+
- Node.js 18+ (前端开发)
- MySQL 8.0+ (或使用 Docker)
- Docker & Docker Compose (可选)
### 方式一:本地开发
#### 1. 克隆项目
```bash
git clone https://gitee.com/your-username/medical-triage-assistant.git
cd medical-triage-assistant
```
#### 2. 创建虚拟环境
```bash
python -m venv venv
# Windows
venv\Scripts\activate
# Linux / macOS
source venv/bin/activate
```
#### 3. 安装依赖
```bash
cd backend
pip install -r requirements.txt
```
#### 4. 配置环境变量
```bash
cp .env.example .env
```
编辑 `.env` 文件,填入你的配置:
```ini
# LLM 配置 (DeepSeek)
LLM_PROVIDER=deepseek
DEEPSEEK_API_KEY=sk-your-deepseek-api-key
DEEPSEEK_API_BASE=https://api.deepseek.com
DEEPSEEK_MODEL=deepseek-chat
# 数据库配置
MYSQL_HOST=localhost
MYSQL_PORT=3306
MYSQL_USER=triage_user
MYSQL_PASSWORD=your_password
MYSQL_DATABASE=medical_triage
```
#### 5. 初始化数据库
```bash
mysql -u root -p < scripts/init_db.sql
```
#### 6. 启动后端
```bash
# 统一入口:同时启动 API + MCP Server
python main.py
# 或单独启动
python main.py --api-only # 仅 FastAPI
python main.py --mcp-only # 仅 MCP Server
```
API 文档访问:http://localhost:8000/docs
#### 7. 启动前端 (开发模式)
```bash
cd frontend
npm install
npm run dev
```
前端访问:http://localhost:3000
### 方式二:Docker 一键部署
```bash
# 克隆项目
git clone https://gitee.com/your-username/medical-triage-assistant.git
cd medical-triage-assistant
# 配置环境变量
cd backend
cp .env.example .env
# 编辑 .env 填入 DEEPSEEK_API_KEY 等配置
cd ..
# 启动所有服务
docker-compose up -d
```
| 服务 | 地址 |
|------|------|
| 前端界面 | http://localhost:3000 |
| API 服务 | http://localhost:8000 |
| API 文档 | http://localhost:8000/docs |
| MySQL | localhost:3306 |
```bash
# 查看日志
docker-compose logs -f api
# 停止服务
docker-compose down
```
## API 接口文档
启动服务后访问 http://localhost:8000/docs 查看完整的 Swagger 文档。
### 核心接口
| 方法 | 路径 | 说明 |
|:----:|------|------|
| `POST` | `/api/consultation/start` | 开始新的问诊会话 |
| `POST` | `/api/consultation/chat` | 发送聊天消息 |
| `GET` | `/api/consultation/{id}/status` | 查询会话状态 |
| `DELETE` | `/api/consultation/{id}` | 结束并清理会话 |
| `GET` | `/api/departments` | 获取所有科室列表 |
| `GET` | `/api/departments/{id}` | 获取科室详情 |
| `POST` | `/api/slots/query` | 查询可预约号源 |
| `GET` | `/api/navigation/{dest}` | 院内导航 |
| `GET` | `/health` | 健康检查 |
### 请求示例
**开始问诊:**
```bash
curl -X POST http://localhost:8000/api/consultation/start \
-H "Content-Type: application/json" \
-d '{"patient_name": "张三", "patient_gender": "男", "patient_age": 35}'
```
**发送消息:**
```bash
curl -X POST http://localhost:8000/api/consultation/chat \
-H "Content-Type: application/json" \
-d '{"session_id": "abc12345", "message": "我头疼两天了,还有点恶心"}'
```
**查询号源:**
```bash
curl -X POST http://localhost:8000/api/slots/query \
-H "Content-Type: application/json" \
-d '{"department_id": 10}'
```
## 架构设计
### Agent 架构
```
+-------------------------------------------------+
| 用户 (Vue 前端) |
+---------------------------+---------------------+
| HTTP API
+---------------------------v---------------------+
| FastAPI 后端服务 |
| |
| +-------------------------------------------+ |
| | 主 Agent (LangGraph) | |
| | | |
| | greet -> collect -> follow_up -> triage | |
| | -> recommend -> query_slots | |
| | | |
| | +---------------------------------+ | |
| | | 导诊子 Agent | | |
| | | - LLM 分诊推理 | | |
| | | - 科室推荐 | | |
| | | - 急诊识别 | | |
| | +---------------------------------+ | |
| +-------------------------------------------+ |
| |
| +--------------+ +-------------------------+ |
| | Skills | | MCP Server | |
| | - 分诊话术 | | - 号源查询 | |
| | - 禁忌提示 | | - 科室信息 | |
| | - 急诊识别 | | - 院内导航 | |
| +--------------+ +-------------------------+ |
| |
| +-------------------------------------------+ |
| | MySQL 数据库 | |
| | departments | doctors | appointments | |
| +-------------------------------------------+ |
+-------------------------------------------------+
```
### LangGraph 状态流转
| 阶段 | 说明 | 触发条件 |
|------|------|----------|
| `greet` | 开场白,引导患者描述症状 | 会话创建 |
| `collect` | 主诉采集,LLM 提取关键信息 | 患者输入描述 |
| `follow_up` | 针对性追问(部位、性质、时间等) | 信息不足时循环 |
| `triage` | 调用导诊子 Agent 进行分诊推理 | 信息充足或追问 >= 5 轮 |
| `recommend` | 生成分诊建议 + 禁忌提示 | 分诊完成 |
| `query_slots` | 查询推荐科室的可预约号源 | 推荐完成 |
| `complete` | 流程结束 | 号源查询完成 |
## 配置说明
### LLM 供应商切换
项目默认使用 **DeepSeek**,在 `.env` 中配置:
```ini
# DeepSeek (默认)
LLM_PROVIDER=deepseek
DEEPSEEK_API_KEY=sk-xxx
DEEPSEEK_API_BASE=https://api.deepseek.com
DEEPSEEK_MODEL=deepseek-chat
```
也支持切换到其他供应商:
```ini
# OpenAI
LLM_PROVIDER=openai
OPENAI_API_KEY=sk-xxx
OPENAI_MODEL=gpt-4o-mini
# 本地 Ollama
LLM_PROVIDER=ollama
OLLAMA_BASE_URL=http://localhost:11434
OLLAMA_MODEL=qwen2.5:7b
```
### MCP 工具扩展
MCP Server 位于 `backend/src/mcp_server/server.py`,使用 `@mcp.tool()` 装饰器即可添加新工具:
```python
@mcp.tool()
def your_new_tool(param: str) -> str:
"""工具描述"""
return "result"
```
## 测试
```bash
# 运行测试
pytest tests/ -v
# 带覆盖率
pytest tests/ --cov=src --cov-report=html
```
## 待办事项
- [x] 接入真实 HIS 系统号源数据 — `backend/src/mcp_server/his_adapter.py` 适配器模式
- [x] 添加用户认证与就诊卡绑定 — `backend/src/utils/auth.py` JWT + 就诊卡绑定
- [x] 支持 WebSocket 实时推送 — `backend/src/web/websocket.py` 流式聊天 + 状态推送
- [x] 添加分诊准确率评估模块 — `backend/src/skills/evaluation.py` 评分/统计/标注
- [x] 向量数据库集成 (RAG 增强分诊知识) — `backend/src/skills/knowledge_base.py` 向量检索
- [x] 多语言支持 — `backend/src/utils/i18n.py` 中/英双语切换
- [x] 移动端适配 — Vue 前端响应式 CSS (@media)
## 贡献指南
欢迎提交 Issue 和 Pull Request!
1. Fork 本仓库
2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)
3. 提交更改 (git commit -m 'Add some AmazingFeature')
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 提交 Pull Request
## 开源许可
本项目基于 [MIT License](./LICENSE) 开源。
## 联系方式
如有问题或建议,请通过以下方式联系:
- 提交 [Issue](https://gitee.com/your-username/medical-triage-assistant/issues)
- 邮箱:2318745133@qq.com
---
**如果本项目对你有帮助,请给一个 Star 支持一下!**