# AISP
**Repository Path**: Meridian_pole/aisp
## Basic Information
- **Project Name**: AISP
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-06-05
- **Last Updated**: 2026-08-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# AISP - AI 标准化病人
> 中医辨证论治训练系统 | Traditional Chinese Medicine Syndrome Differentiation Training System
[](https://www.python.org/)
[](https://react.dev/)
[](https://fastapi.tiangolo.com/)
[](LICENSE)
## 项目概述
**AISP (AI Standardized Patient)** 是一个基于**纯 LLM 驱动多智能体架构**的中医辨证论治训练系统。系统通过模拟真实患者问诊场景,让中医学生在交互式对话中练习四诊合参、辨证论治,并获得实时、个性化的反馈。
当前版本已接入完整角色体系:
- **学生端**:病例选择、问诊实训、辨证提交、评估报告、历史记录
- **教师端**:学生成绩查看、训练详情复盘、病案新增/编辑/归档
- **管理员端**:用户创建、角色调整、账号启停、系统运营概览
### 核心理念
- **LLM-First 架构**:所有智能决策由 LLM 完成,无规则引擎
- **流式优先设计**:所有 LLM 调用采用 SSE 流式传输
- **多智能体协作**:六大专业智能体协同完成训练流程
- **渐进式信息披露**:模拟真实患者的"问了才说"特性
### 核心训练流程
```
病例选择 → 四诊采集(十问歌) → 症状确认 → 证候分析 → 诊断提交 → 评估报告 → 历史回顾
```
## 运行截图
### 1. 登录界面

### 2. 案例选择界面

### 3. 病人信息展示

### 4. 操作提示面板

### 5. 问诊对话界面

### 6. 实时进度监控
#### 侧边栏问诊进度 + 顶部患者情绪变化

#### 多维信息收集完整度监控

左侧:问诊对话,右侧:多维信息收集完整度监控
#### 十问歌覆盖率监控

右侧:十问歌覆盖率监控
### 7. 辨证提交流程
#### 四诊摘要

#### 辨证构建

#### 治法输入

#### 开方选药

### 8. 辨证评估

### 9. 辨证实训报告

---
## 系统架构
### 整体架构图
```
┌─────────────────────────────────────────────────────────────────────────────────────┐
│ 前端层 (React 19 + TypeScript + SSE) │
├─────────────────────────────────────────────────────────────────────────────────────┤
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 十问歌面板 │ │ 进度追踪面板 │ │ 证候构建器 │ │ 评估视图 │ │
│ │ TenQuestions │ │ Progress │ │ SyndromeBldr │ │ Evaluation │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ │
│ ┌──────────────────────────────────────────────────────────────────────────────┐ │
│ │ 问诊室 (多流式 SSE 通信) │ │
│ │ ConsultationRoom (Multi-Stream) │ │
│ └──────────────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────────────┘
↓ 多路 SSE 流
┌─────────────────────────────────────────────────────────────────────────────────────┐
│ API 层 (FastAPI + Pipeline Layer) │
├─────────────────────────────────────────────────────────────────────────────────────┤
│ PipelineCoordinator.execute_pipeline() → Agent.stream_xxx() │
│ POST /api/v1/streaming/pipeline/execute │
└─────────────────────────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────────────────────────┐
│ 隔离 SSE 流层 (v2.1) │
├─────────────────────────────────────────────────────────────────────────────────────┤
│ GET /api/v1/streaming/agent/progress/stream (ProgressTracker) │
│ GET /api/v1/streaming/agent/guide/stream (InquiryGuide) │
│ GET /api/v1/streaming/agent/patient/stream (PatientReAct) │
│ GET /api/v1/streaming/agent/syndrome/stream (SyndromeGuide) │
│ GET /api/v1/streaming/agent/evaluate/stream (EvaluationLLM) │
│ GET /api/v1/streaming/agent/tutor/stream (TutorLLM) │
└─────────────────────────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────────────────────────┐
│ 智能体层 (纯 LLM 驱动) │
├─────────────────────────────────────────────────────────────────────────────────────┤
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Patient │ │Progress │ │ Inquiry │ │Syndrome │ │Evaluation│ │ Tutor │ │
│ │ (ReAct) │ │(Tracker) │ │ Guide │ │ Guide │ │ (CoT) │ │ (CoT) │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ ↓ ↓ ↓ ↓ ↓ ↓ │
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
│ │ 共享 LLM 客户端 (StreamingLLMClient) │ │
│ │ 状态持久化于 PipelineSession (每会话) │ │
│ └─────────────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────────────────────────┐
│ DeepSeek API (流式调用) │
└─────────────────────────────────────────────────────────────────────────────────────┘
```
### 六大智能体说明
| 智能体 | 位置 | 模式 | 职责 |
|--------|------|------|------|
| **Patient** | `agents/patient_react_agent.py` | ReAct | 模拟患者对话、控制信息披露、情绪状态管理 |
| **ProgressTracker** | `agents/progress_tracker_agent.py` | 多维度 | 实时完整性评分(4维度)、可推进检测 |
| **InquiryGuide** | `agents/inquiry_guide_agent.py` | 十问歌 | 覆盖度检测、建议问题、优先级排序 |
| **SyndromeGuide** | `agents/syndrome_guide_agent.py` | TCM 模式 | 治法推荐、证据链构建 |
| **Evaluation** | `agents/evaluation_llm_agent.py` | CoT | 诊断评估(可见推理过程) |
| **Tutor** | `agents/tutor_llm_agent.py` | CoT | 基于学生历史的个性化反馈 |
### SSE 流式事件类型
| 事件类型 | 来源 | 用途 |
|----------|------|------|
| `token` | Patient | 文本令牌(打字机效果) |
| `metadata` | 全部 | 响应元数据 |
| `thinking` | Evaluation/Tutor | LLM 推理过程可视化 |
| `result` | Evaluation | 最终评估数据 |
| `coverage_update` | InquiryGuide | 十问歌覆盖度变化 |
| `suggestion` | InquiryGuide | 建议问题 |
| `completeness_update` | ProgressTracker | 进度分数更新 |
| `phase_suggestion` | ProgressTracker | 阶段转换建议 |
| `emotion_update` | Patient | 情绪状态变化 |
| `proactive_info` | Patient | 主动信息披露 |
| `done` | 全部 | 流完成信号 |
| `error` | 全部 | 错误信息 |
---
## 技术栈
### 后端
| 组件 | 技术 | 版本 |
|------|------|------|
| Web 框架 | FastAPI | 0.104+ |
| ORM | SQLAlchemy | 2.0+ |
| 数据库 | PostgreSQL | 16+ |
| 缓存 | Redis | 7+ |
| AI 编排 | LangChain + LangGraph | 0.1.0+ |
| LLM 提供商 | DeepSeek API | - |
| 数据迁移 | Alembic | 1.13+ |
| 测试 | pytest | - |
### 前端
| 组件 | 技术 | 版本 |
|------|------|------|
| 框架 | React | 19.2+ |
| 构建工具 | Vite | 6.2+ |
| 语言 | TypeScript | 5.8+ |
| 测试 | Vitest + Playwright | - |
---
## 项目结构
```
AISP/
├── backend/
│ ├── app/
│ │ ├── agents/ # 六大 LLM 智能体
│ │ │ ├── patient_react_agent.py # 患者 (ReAct)
│ │ │ ├── evaluation_llm_agent.py # 评估 (CoT)
│ │ │ ├── tutor_llm_agent.py # 导师 (CoT)
│ │ │ ├── inquiry_guide_agent.py # 问诊引导 (十问歌)
│ │ │ ├── syndrome_guide_agent.py # 证候引导 (TCM模式)
│ │ │ └── progress_tracker_agent.py # 进度追踪
│ │ ├── api/v1/endpoints/
│ │ │ ├── streaming.py # SSE 流式端点
│ │ │ ├── student.py # 学生训练端点
│ │ │ ├── teacher.py # 教师端点
│ │ │ └── admin.py # 管理员端点
│ │ ├── services/
│ │ │ ├── llm_streaming.py # 流式 LLM 客户端
│ │ │ ├── state_extractor.py # 状态提取
│ │ │ └── symptom_extractor.py # 症状提取
│ │ ├── core/
│ │ │ └── config.py # 配置管理
│ │ ├── models/ # SQLAlchemy 模型
│ │ ├── schemas/ # Pydantic 模式
│ │ └── main.py # FastAPI 应用入口
│ ├── tests/ # 测试套件
│ ├── alembic/ # 数据库迁移
│ ├── Dockerfile # 容器定义
│ ├── docker-compose.yml # 完整服务编排
│ ├── requirements.txt # Python 依赖
│ ├── Makefile # 构建自动化
│ └── README.md # 后端文档
├── frontendv9.0/
│ ├── components/
│ │ └── ReasoningStepsPanel.tsx # 推理链组件
│ ├── services/
│ │ └── apiClient.ts # 认证、角色、训练 API 客户端
│ ├── App.tsx # 三端工作台入口
│ ├── types.ts # 类型定义
│ ├── package.json # 依赖配置
│ └── README.md # 前端文档
├── docs/
│ ├── API.md # 完整 API 文档
│ ├── AISP开发文档.md # 开发指南
│ ├── AISP运行流程手册_v2.0.md # 运行流程
│ └── 中医诊疗的规范过程.md # 业务规范
├── scripts/
│ └── demo-setup.sh # 快速部署脚本
├── CLAUDE.md # 开发原则与架构指南
└── README.md # 本文件
```
---
## 快速开始
### 前置要求
- **Python**: 3.11+
- **Node.js**: 18+
- **PostgreSQL**: 16+
- **Redis**: 7+
- **Docker & Docker Compose** (可选)
### Docker 部署 (推荐)
1. **克隆项目**
```bash
git clone
cd AISP
```
2. **配置环境变量**
```bash
cp backend/.env.example backend/.env
# 编辑 backend/.env,配置 DEEPSEEK_API_KEY
```
3. **启动所有服务**
```bash
docker-compose up -d
```
4. **运行数据库迁移**
```bash
docker-compose --profile migration up migration
```
5. **访问应用**
- 前端: http://localhost:5173
- 后端 API: http://localhost:8086
- API 文档: http://localhost:8086/docs
### 本地开发
**后端:**
```powershell
cd D:\AISP\backend
# 创建虚拟环境
python -m venv .venv
.\.venv\Scripts\Activate.ps1
# 安装依赖
python -m pip install -r requirements.txt
# 本地开发必需环境变量
$env:SECRET_KEY="dev-secret-key-change-before-production"
$env:DEBUG="true"
# 启动开发服务器
python -m uvicorn app.main:app --host 0.0.0.0 --port 8086 --reload
```
> Windows PowerShell 中如果提示 `uvicorn` 不是可识别命令,使用 `python -m uvicorn ...`。这会直接调用当前 Python 环境中已安装的 Uvicorn,不依赖脚本目录是否加入 PATH。
**前端:**
```powershell
cd D:\AISP\frontendv9.0
# 安装依赖
npm install
# 启动开发服务器
npm run dev -- --host 127.0.0.1 --port 5173
```
本地访问:
- 前端: http://127.0.0.1:5173
- 后端 API: http://localhost:8086
- API 文档: http://localhost:8086/docs
默认开发账号需要先写入数据库:
```powershell
cd D:\AISP\backend
python scripts\dev.py seed
```
执行完成后可使用以下账号登录前端:
| 角色 | 用户名 | 密码 |
| --- | --- | --- |
| 管理员 | `admin` | `admin123` |
| 教师 | `teacher1` | `password123` |
| 学生 | `student1` | `password123` |
| 学生 | `student2` | `password123` |
数据库连接账号见 `backend/.env`:`aisp` / `password`,这是 PostgreSQL 账号,不是网页登录账号。
---
## 核心特性
### 0. 完整角色体系
系统使用 JWT 登录态和后端 RBAC 校验。公开注册强制创建学生账号;教师和管理员账号由管理员创建。前端登录后根据 `/auth/me` 返回角色自动进入学生端、教师端或管理员端。
角色边界:
- 学生只能访问学生训练、个人历史和已发布病案
- 教师可查看学生训练记录、管理病案资源
- 管理员可管理用户、角色、账号状态和系统概览
- 学生训练流式接口只允许学生角色访问
### 1. 多智能体流水线
六大专业智能体通过 PipelineCoordinator 协同工作,每个智能体拥有独立的 SSE 流,互不阻塞。
### 2. SSE 流式响应
所有 AI 交互采用 Server-Sent Events 实时流式传输,提供流畅的用户体验。
### 3. 十问歌问诊框架
InquiryGuide 基于 16 维度框架(寒热、汗、头身、二便、饮食口渴、胸腹、听力感官、既往史、病因诱因、服药、睡眠、情志、职业环境、妇女经期等)进行问诊覆盖度追踪。
### 4. LLM 驱动的评估
完全基于 LLM 的多维度评估,包括:
- 信息采集完整度
- 辨证准确性
- 证据链质量
- 治法匹配度
### 5. 教师病案闭环
教师端创建或编辑的数据库病案会同步进入病案列表,并可被学生端用于患者模拟、问诊进度评估、辨证评估和训练记录保存。教师删除病案采用归档方式,避免误删历史训练数据。
---
## 开发进度
> 详细开发计划参见 [AISP运行流程手册_v2.0.md](./docs/AISP运行流程手册_v2.0.md)
### 已完成阶段
| 阶段 | 状态 | 完成时间 | 主要成果 |
|------|------|----------|----------|
| **Phase 1** | ✅ 完成 | 2026-01-26 | 测试框架、Agent Coordinator、Inquiry Guide Agent、TenQuestionsPanel、SSE 事件集成 |
| **Phase 2** | ✅ 完成 | 2026-01-26 | Progress Tracker Agent、Patient Agent 优化(主动性披露、情绪状态管理) |
| **Phase 3** | ✅ 完成 | 2026-01-26 | Syndrome Guide Agent(辨证方法推荐、证据链构建) |
| **Phase 4** | ✅ 完成 | 2026-01-26 | E2E 测试、性能优化、文档完善 |
### 测试覆盖
| 模块 | 后端测试 | 前端测试 |
|------|---------|---------|
| Inquiry Guide Agent | 17 tests ✅ | 14 tests ✅ |
| Progress Tracker Agent | 14 tests ✅ | 13 tests ✅ |
| Patient Agent | 16 tests ✅ | - |
| Syndrome Guide Agent | 15 tests ✅ | - |
| **总计** | **52+ tests** | **45+ tests** |
### 新增文件 (Phase 1-4)
**后端:**
- `backend/app/agents/inquiry_guide_agent.py` - 问诊向导智能体
- `backend/app/agents/syndrome_guide_agent.py` - 辨证向导智能体
- `backend/app/agents/progress_tracker_agent.py` - 进度追踪智能体
- `backend/app/core/pipeline_coordinator.py` - Pipeline 核心协调器(v2.1 隔离流)
- `backend/app/core/coordination.py` - 智能体协调层
- `backend/app/api/v1/endpoints/agent_streams.py` - 独立 SSE 端点
**前端:**
- `frontend/components/TenQuestionsPanel.tsx` - 十问歌面板
- `frontend/components/ProgressPanel.tsx` - 进度评分面板
- `frontend/components/EmotionalStateIndicator.tsx` - 情绪状态指示器
- `frontend/components/SyndromeBuilder.tsx` - 辨证构建界面
- `frontend/services/multiAgentStreamingClient.ts` - 多 Agent 流式客户端
---
## 系统运行流程
### 完整训练流程图
```
┌─────────────────────────────────────────────────────────────────────────────────┐
│ 用户登录 │
└─────────────────────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────────────────────┐
│ 病例选择 │
│ • 浏览可用病例列表 │
│ • 查看病例基本信息(姓名、年龄、主诉) │
│ • 选择病例开始训练 │
└─────────────────────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────────────────────┐
│ Phase 1: INQUIRY_PREPARED │
│ • 展示病例详细背景 │
│ • 生成初始问诊框架 │
│ • 初始化各智能体状态 │
└─────────────────────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────────────────────┐
│ Phase 2: COLLECTING (四诊采集) │
│ ╔═════════════════════════════════════════════════════════════════════════════╗ │
│ ║ 用户发送问题 → Patient 智能体 ║ │
│ ║ ↓ ║ │
│ ║ ┌────────────────────────────────────────────────────────────────────────┐ ║ │
│ ║ │ Patient.stream_chat() - ReAct 推理 │ ║ │
│ ║ │ 1. 分析用户意图 (LLM) │ ║ │
│ ║ │ 2. 检查已披露信息 (state.disclosed_facts) │ ║ │
│ ║ │ 3. 决定披露内容 (LLM) │ ║ │
│ ║ │ 4. 生成回复 (LLM streaming) │ ║ │
│ ║ │ 5. 更新情绪状态 (LLM) │ ║ │
│ ║ └────────────────────────────────────────────────────────────────────────┘ ║ │
│ ║ ↓ ║ │
│ ║ SSE 流式返回患者响应 ║ │
│ ╚═════════════════════════════════════════════════════════════════════════════╝ │
│ ╔═════════════════════════════════════════════════════════════════════════════╗ │
│ ║ 同时触发后台智能体(非阻塞) ║ │
│ ║ ┌─────────────────────┐ ┌─────────────────────┐ ║ │
│ ║ │ ProgressTracker │ │ InquiryGuide │ ║ │
│ ║ │ • 四诊覆盖度分析 │ │ • 十问歌维度检测 │ ║ │
│ ║ │ • 完整性评分 │ │ • 生成建议问题 │ ║ │
│ ║ │ • can_advance 检测 │ │ • 优先级排序 │ ║ │
│ ║ └─────────────────────┘ └─────────────────────┘ ║ │
│ ║ ↓ ↓ ║ │
│ ║ SSE 推送进度更新 SSE 推送问诊建议 ║ │
│ ╚═════════════════════════════════════════════════════════════════════════════╝ │
│ • 循环直到学生完成信息采集 │
│ • 完整性 >= 80% 时可进入下一阶段 │
└─────────────────────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────────────────────┐
│ Phase 3: CONFIRMING_SYMPTOMS (症状确认) │
│ • LLM 提取四诊信息点 │
│ • 学生确认/补充/修正 │
│ • 生成最终采集证据清单 │
└─────────────────────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────────────────────┐
│ Phase 4: SYNDROME_ANALYSIS (证候分析) │
│ ╔═════════════════════════════════════════════════════════════════════════════╗ │
│ ║ SyndromeGuide 智能体 ║ │
│ ║ • 基于已采集信息进行证候分析 (LLM) ║ │
│ ║ • 推荐可能的证候类型 (TCM 知识库 + LLM) ║ │
│ ║ • 构建证据链:信息 → 症状 → 证候 ║ │
│ ║ • 提供治法建议 ║ │
│ ╚═════════════════════════════════════════════════════════════════════════════╝ │
│ • 学生选择/输入证候诊断 │
│ • 学生选择/输入治法 │
└─────────────────────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────────────────────┐
│ Phase 5: EVALUATING (诊断评估) │
│ ╔═════════════════════════════════════════════════════════════════════════════╗ │
│ ║ Evaluation 智能体 (CoT) ║ │
│ ║ ┌────────────────────────────────────────────────────────────────────────┐ ║ │
│ ║ │ 思考链 (可见) │ ║ │
│ ║ │ 1. 对比学生诊断与金标准 (LLM) │ ║ │
│ ║ │ 2. 分析信息采集完整度 (LLM) │ ║ │
│ ║ │ 3. 评估辨证逻辑合理性 (LLM) │ ║ │
│ ║ │ 4. 计算多维度得分 │ ║ │
│ ║ └────────────────────────────────────────────────────────────────────────┘ ║ │
│ ║ ↓ ║ │
│ ║ SSE 流式推送思考过程 ║ │
│ ║ ↓ ║ │
│ ║ ┌────────────────────────────────────────────────────────────────────────┐ ║ │
│ ║ │ 评估报告 │ ║ │
│ ║ │ • 证候准确性得分 │ ║ │
│ ║ │ • 治法匹配度得分 │ ║ │
│ ║ │ • 信息采集完整度 │ ║ │
│ ║ │ • 证据链质量分析 │ ║ │
│ ║ │ • 改进建议 │ ║ │
│ ║ └────────────────────────────────────────────────────────────────────────┘ ║ │
│ ╚═════════════════════════════════════════════════════════════════════════════╝ │
└─────────────────────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────────────────────┐
│ Phase 6: TUTORING (导师反馈) │
│ ╔═════════════════════════════════════════════════════════════════════════════╗ │
│ ║ Tutor 智能体 (CoT) ║ │
│ ║ • 分析学生当前表现 (LLM) ║ │
│ ║ • 查阅学生历史表现记录 ║ │
│ ║ • 生成个性化反馈 (LLM) ║ │
│ ║ • 识别能力短板,给出针对性建议 ║ │
│ ╚═════════════════════════════════════════════════════════════════════════════╝ │
└─────────────────────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────────────────────┐
│ Phase 7: COMPLETED (完成) │
│ • 生成最终综合报告 │
│ • 可视化展示评估结果 │
│ • 展示完整证据链 │
└─────────────────────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────────────────────┐
│ Phase 8: HISTORY (历史回顾) │
│ • 查看历史训练记录 │
│ • 能力成长追踪 │
│ • 薄弱环节分析 │
└─────────────────────────────────────────────────────────────────────────────────┘
```
#### 阶段详解

**Phase 1: 问诊准备 (INQUIRY_PREPARED)**
学生选择病例后,系统进入问诊准备阶段。Inquiry Guide Agent 分析病例主诉和患者基本信息,生成初始问诊框架。前端展示病例详细背景(姓名、年龄、性别、职业、主诉等),并在侧边栏初始化十问歌框架(所有维度显示为"未覆盖"状态)。此阶段各智能体的内部状态被初始化,包括 Patient Agent 的情绪状态(通常为"平静"或"配合")和 disclosed_facts 空集。
**Phase 2: 四诊采集 (COLLECTING)**
这是核心的对话交互阶段,学生通过自然语言向患者提问。Patient Agent 采用 ReAct 推理模式:
1. **分析意图**:理解学生问题的核心关注点
2. **检查披露状态**:查询已披露信息集合,避免重复回答
3. **决定披露内容**:基于问题相关性决定透露哪些信息
4. **生成回复**:通过 LLM 流式生成自然语言回复
5. **更新情绪**:根据对话上下文调整患者情绪状态
同时,后台智能体并行工作:
- **ProgressTracker**:分析四诊覆盖度,计算完整性评分(0-100%),当达到 80% 时提示可进入下一阶段
- **InquiryGuide**:逐项检测十问歌维度覆盖情况,高亮未覆盖项,生成优先级排序的建议问题
此阶段循环进行,直到学生完成信息采集或主动进入下一阶段。
**Phase 3: 症状确认 (CONFIRMING_SYMPTOMS)**
系统通过 LLM 从完整对话历史中提取结构化的四诊信息点,按"望、闻、问、切"分类展示。学生可以确认、补充或修正这些信息。ProgressTracker 重新评估完整性,如果低于 80% 则建议返回继续问诊。此阶段确保学生和系统对采集到的信息有一致的理解。
**Phase 4: 证候分析 (SYNDROME_ANALYSIS)**
Syndrome Guide Agent 基于已采集信息进行证候分析:
1. **辨证方法推荐**:根据疾病类别(外感/内伤、温病等)推荐最合适的辨证方法(八纲、脏腑、六经、卫气营血等),并说明推荐理由
2. **证据链构建**:将已采集的症状关联到证候结论,形成可追溯的证据链
3. **治法建议**:基于证候给出相应的治法建议
学生根据系统引导,选择或输入自己的证候诊断和治法。
**Phase 5: 诊断评估 (EVALUATING)**
Evaluation Agent 采用链式思考(CoT)模式,其推理过程对学生可见:
1. **信息采集分析**:评估四诊信息的完整性和质量
2. **诊断对比**:将学生诊断与金标准对比,分析差异
3. **辨证逻辑评估**:检查从症状到证候的推理链条是否合理
4. **多维度评分**:计算准确性、完整性、证据质量等得分
思考过程通过 SSE 流式输出,让学生看到评估的推理过程,最终生成结构化评估报告。
**Phase 6: 导师反馈 (TUTORING)**
Tutor Agent 基于学生历史表现和本次训练结果,生成个性化反馈:
1. **表现分析**:对比学生历史水平,识别进步和退步
2. **短板识别**:找出学生薄弱的知识点或技能
3. **反馈生成**:肯定做得好的地方,指出不足,解释原因
4. **改进建议**:提供针对性的学习建议(如经典条文、相关病例等)
**Phase 7: 完成 (COMPLETED)**
生成最终综合报告,包含:
- 多维度评分(准确性 40% + 完整性 30% + 证据质量 30%)
- 缺失项清单(十问歌/四诊哪些没问到)
- 辨证结论对比(学生 vs 标准)
- 可视化证据链
- 导师反馈总结
**Phase 8: 历史回顾 (HISTORY)**
学生可查看历史训练记录,包括对话回放(带知识点标注)、多次训练数据对比、能力雷达图等,帮助追踪学习进度。
### 智能体协作流程
```
用户发送消息
↓
POST /api/v1/streaming/pipeline/execute
↓
PipelineCoordinator.execute_pipeline()
↓
┌────────────────────────────────────────────────────────────────────────┐
│ 智能体执行编排 │
├────────────────────────────────────────────────────────────────────────┤
│ │
│ 1. ProgressTracker.stream_track() [后台非阻塞] │
│ └── 分析对话历史 → 计算完整性 → 推送进度更新 │
│ │
│ 2. InquiryGuide.stream_guide() [后台非阻塞] │
│ └── 检测十问歌覆盖 → 生成建议问题 → 推送问诊建议 │
│ │
│ 3. Patient.stream_chat() [阻塞,等待完成] │
│ └── ReAct 推理 → 生成回复 → 更新状态 → SSE 流式输出 │
│ │
│ 4. SyndromeGuide.stream_analyze() [当进入证候分析阶段] │
│ └── 分析症状 → 推荐证候 → 构建证据链 → 推送分析结果 │
│ │
│ 5. Evaluation.stream_evaluate() [当提交诊断时] │
│ └── CoT 推理 → 多维评分 → 推送思考过程和最终结果 │
│ │
│ 6. Tutor.stream_feedback() [评估完成后] │
│ └── 分析表现 → 查阅历史 → 生成个性化反馈 → 推送建议 │
│ │
└────────────────────────────────────────────────────────────────────────┘
↓
PipelineSession 持久化状态
↓
返回各智能体的 SSE 端点 URL
↓
前端连接多个 SSE 流
```
#### 协作机制详解

**1. Pipeline 触发**
当用户发送消息时,前端调用 `POST /api/v1/streaming/pipeline/execute`,携带会话 ID、病例 ID、用户消息和历史对话记录。后端 PipelineCoordinator 接收请求,创建或恢复 PipelineSession,然后按预定义顺序依次执行智能体。
**2. 串行执行,并行推送**
虽然智能体按固定顺序串行执行(Progress → Guide → Patient),但它们通过独立的 SSE 队列推送结果。这意味着:
- ProgressTracker 和 InquiryGuide 作为"后台分析型"智能体,执行较快且不阻塞
- Patient Agent 作为"对话型"智能体,需要等待 LLM 流式生成完成
- 前端同时连接多个 SSE 端点,按接收到的事件顺序更新 UI
**3. 状态隔离与共享**
每个智能体维护自己的状态(如 Patient 的 disclosed_facts、InquiryGuide 的 coverage_map),通过 PipelineSession 的 context 字段共享必要信息。这种设计确保:
- 智能体之间相互独立,一个崩溃不影响其他
- 共享上下文(如对话历史)在智能体间传递
- 状态可持久化到 Redis,支持会话恢复
**4. SSE 事件路由**
每个智能体有独立的 SSE 端点 URL:
- `/api/v1/streaming/agent/progress/stream` → ProgressTracker 事件
- `/api/v1/streaming/agent/guide/stream` → InquiryGuide 事件
- `/api/v1/streaming/agent/patient/stream` → Patient 事件
- `/api/v1/streaming/agent/syndrome/stream` → SyndromeGuide 事件
- `/api/v1/streaming/agent/evaluate/stream` → Evaluation 事件
- `/api/v1/streaming/agent/tutor/stream` → Tutor 事件
前端通过 EventSource API 连接这些端点,根据事件类型(token、coverage_update、suggestion、completeness_update 等)分发到不同的 UI 组件。
**5. 阶段感知的智能体激活**
并非所有智能体在每轮对话中都会激活:
- **COLLECTING 阶段**:ProgressTracker + InquiryGuide + Patient 活跃
- **CONFIRMING_SYMPTOMS 阶段**:ProgressTracker 活跃(重新评估完整性)
- **SYNDROME_ANALYSIS 阶段**:SyndromeGuide 活跃
- **EVALUATING 阶段**:Evaluation 活跃
- **TUTORING 阶段**:Tutor 活跃
这种按需激活机制减少了不必要的 LLM 调用,提高系统效率。
### 状态持久化机制
每个会话的状态通过 `PipelineSession` 持久化:
```python
# 每个智能体的独立状态
{
"session_id": "uuid",
"patient_agent_state": {
"disclosed_facts": set(),
"dialogue_history": [],
"emotion_state": "neutral"
},
"progress_tracker_state": {
"coverage": {...},
"completeness": 0.65,
"can_advance": false
},
"inquiry_guide_state": {
"十问歌_coverage": {...},
"suggested_questions": []
},
"syndrome_guide_state": {
"evidence_chain": [],
"recommended_syndromes": []
}
}
```
### 会话恢复机制
- 每次交互后持久化状态到 Redis
- 下次请求时自动恢复智能体状态
- 支持断点续训
---
## 开发指南
### 核心开发原则
详见 [CLAUDE.md](./CLAUDE.md):
1. **LLM-First**: 所有智能决策由 LLM 完成,禁止规则引擎
2. **Streaming-First**: 所有 LLM 调用使用流式传输
3. **No Fallback**: 单一代码路径,无降级策略
4. **Single Source**: 每个功能只有一个实现
### 相关文档
- **[后端开发指南](./backend/README.md)** - FastAPI 后端详细说明
- **[前端集成指南](./frontendv9.0/README.md)** - React 前端 API 集成
- **[开发原则](./CLAUDE.md)** - 架构与编码规范
- **[API 文档](./docs/API.md)** - 完整 API 接口文档
- **[开发文档](./docs/AISP开发文档.md)** - 中文开发指南
- **[运行流程手册](./docs/AISP运行流程手册_v2.0.md)** - 详细业务流程
---
## 测试
### 后端测试
```powershell
cd D:\AISP\backend
$env:SECRET_KEY="test-secret-key-for-local-tests"
$env:DEBUG="true"
# 运行所有测试
python -m pytest
# 运行特定测试文件
python -m pytest tests/test_patient_agent_enhancements.py
# 运行角色体系与三端权限回归测试
python -m pytest tests/test_role_management.py -q -rs
# 运行特定测试
python -m pytest -k "test_proactive_disclosure"
# 带覆盖率报告
python -m pytest --cov=app
```
### 前端验证
```powershell
cd D:\AISP\frontendv9.0
# 生产构建验证
npm run build
# 本地开发服务
npm run dev -- --host 127.0.0.1 --port 5173
```
> 当前 `frontendv9.0/package.json` 暂未配置 Vitest/Playwright 脚本,前端交付前以 `npm run build` 作为基础构建验证。
---
## 部署
### 环境配置
**后端 `.env`**:
```bash
# 数据库
DATABASE_URL=postgresql+asyncpg://aisp:password@localhost:5432/aisp
# DeepSeek API (必需)
DEEPSEEK_API_KEY=sk-...
DEEPSEEK_API_BASE=https://api.deepseek.com/v1
# Redis
REDIS_URL=redis://localhost:6379/0
# JWT 密钥
SECRET_KEY=your-secret-key-change-in-production
# 本地开发可开启 docs 与宽松 CORS
DEBUG=true
```
**前端 `frontendv9.0/.env.local`**:
```bash
VITE_API_BASE_URL=http://localhost:8086
```
### Docker 部署
```bash
# 构建并启动所有服务
docker-compose up -d
# 查看日志
docker-compose logs -f backend
# 停止服务
docker-compose down
# 重新构建
docker-compose up -d --build
```
---
## 贡献指南
欢迎贡献!请遵循以下原则:
1. 遵循项目的开发原则 ([CLAUDE.md](./CLAUDE.md))
2. 为新功能编写测试
3. 更新相关文档
4. 使用规范的 commit message
---
## 许可证
本项目为专有软件,版权所有。
---
## 联系方式
如有问题或建议,请通过以下方式联系:
- 提交 Issue
- 发起 Pull Request