# 应急指挥 AI 系统 (Emergency Prj)

基于大语言模型的应急指挥、日常值班与续报生成智能处理系统，包含三个子模块：应急指挥、日常值班处理来电事件并输出结构化研判，续报生成基于 HIS 收治数据产出救援进程报告。

## 当前发布基线

- **业务接口版本**：v3.0（三大业务：应急指挥 / 日常值班 / 续报生成）。
- **当前评测/优化版本**：V8.2，Git标签 `v8.2`。
- **客户侧部署候选**：`Qwen2.5-32B-Instruct`；`GLM-5.1-FP8` 仅作为大模型效果参照。
- **第9批全量数据**：Emergency 285例；Duty 470例（普通接报292例、自然续报178例），围绕真实用户需求模拟构建，覆盖常规、边界和易混淆场景。
- **续报评测**：118 例冻结集回归通过（最近一次真实模型运行 97 例保留模型润色 / 安全回退 21，自建 Qwen3-30B 资源模型），mutation 检出 297 个有效篡改；这是运行分布而非泛化率。GLM judge 单字符协议全量复测 1401 轮无效 0，冻结集自动评审均分 0.9841；尚未经过人工盲评校准，不作为外部泛化或质量 KPI。2026-10 新增思维链（`reasoning_mode`）与正文分步流式（`delta{channel:"content"}`，拼接逐字节 == report.markdown；lead/basic 守门定论后才入流），旧客户端仅消费 `report` 事件零改动。详见[评测状态](projects/supplement_report/docs/evaluation_status.md)。
- **直驱结论**：Qwen Emergency综合73%、Duty综合90%，两类平均约26秒，755例正式接口失败0，初步验证可用于客户环境部署。
- **统一入口**：`http://<服务器IP>:8080/` —— 主页聚合服务体验 / 评测结果 / 续报演示 / 文档导航；评测面板 `http://<服务器IP>:8080/eval/dashboard_eval.html`（默认第9批V8.2）。

详细变更见 [CHANGELOG.md](CHANGELOG.md)，V8.2口径见 [第9批V8.2双模型全量复测设计](docs/superpowers/specs/2026-07-25-batch9-v82-dual-model-full-rerun-design.md)。

## 系统架构

```
┌─────────────────────────────────────────────────────────────────────┐
│                      Emergency Prj (母项目)                          │
├─────────────────────┬──────────────────────────┬────────────────────┤
│                     │                          │                    │
│   duty_processor    │   emergency_command      │   supplement_report    │
│   日常值班事件处理   │   应急指挥事件处理         │   续报(进程报告)    │
│   (被叫: 值班室)     │   (被叫: 指挥中心)         │   (HIS 收治数据)    │
│   :8001             │   :8000                  │   :8003            │
│                     │                          │                    │
└─────────────────────┴──────────────────────────┴────────────────────┘
        ↑                                    ↑
        └────────── demo:8080 一站式体验 / 评测 / 文档导航 ──────────┘
```

- **emergency_command / duty_processor**：语音转写 → 智能体研判 → 结构化输出 → 源标准溯源
- **supplement_report**：HIS 伤患数据 → 确定性统计 → 受控大模型润色（可选思维链流式） → 事实守门/安全回退 → 进程报告（下一步留空）
- **demo:8080**：聚合主页 + 服务体验 + 评测结果 + 续报演示 + 文档导航

## 子模块

| 模块 | 说明 | 端口 | 文档 |
|------|------|------|------|
| [duty_processor](projects/duty_processor/) | 日常值班事件处理流水线 | 8001 | [README](projects/duty_processor/README.md) |
| [emergency_command](projects/emergency_command/) | 应急指挥事件处理流水线 | 8000 | [README](projects/emergency_command/README.md) |
| [supplement_report](projects/supplement_report/) | 续报（救援进程报告）生成 · 独立自包含 | 8003 | [README](projects/supplement_report/README.md) |

## 辅助工具

| 工具 | 说明 | 端口 | 访问地址 |
|------|------|------|----------|
| [值班记录校对](refs/值班记录/duty_check.html) | OCR校对工具 | 8083 | `http://<服务器IP>:8083/duty_check.html` |

### 功能对比

| 特性 | duty_processor | emergency_command |
|------|----------------|-------------------|
| **触发条件** | 值班室来电 | 指挥中心来电 |
| **事件分类** | 日常咨询/事件/急救 | 事故灾难/公共卫生等 |
| **响应等级** | - | I-IV 级评估 |
| **敏感判定** | - | 4 维关键词匹配 |
| **接续判断** | 规则召回候选(四维+电话加分)→LLM主决策 | - |

## 参考资料 (refs)

原始业务规则和标准文档：

| 文件 | 说明 |
|------|------|
| [doc1-emergency-command-full.md](refs/doc1-emergency-command-full.md) | 应急指挥完整流程说明 |
| [feishu-Lvunw5.md](refs/feishu-Lvunw5.md) | 飞书文档导出 |
| [hospital-api.md](refs/hospital-api.md) | 医院基础支撑平台接口文档（非AI流水线接口） |
| [resources/](refs/resources/) | 资源文件（模型、向量库等） |
| [值班记录/](refs/值班记录/) | 历史值班记录数据与处理脚本 |

## 文档库 (library)

全仓库文档统一导航入口：[`docs/index.html`](docs/index.html)（技术设计 / 接口 / 模块说明 / 参考资料）。

> 推荐经 demo 访问（demo:8080 在跑时）：`http://<服务器IP>:8080/docs-lib/index.html`
> 也可本地起静态服务：`python -m http.server 8082`，打开 `http://<服务器IP>:8082/docs/index.html`

按版本迭代的接口文档和研发方案：

### 在线访问（固定端口 8082）

```bash
# 启动文档库服务（cd 到项目根目录后执行）
cd /path/to/emergency-prj  # 替换为你的实际项目路径
python -m http.server 8082
```

然后访问：
- **全仓库文档导航**（推荐入口）: `http://<服务器IP>:8082/docs/index.html` —— 技术设计 / 接口 / 模块说明 / 参考资料 一站式索引
- **业务文档库门户**（仅 library，按版本切换）: `http://<服务器IP>:8082/docs/library/`
- **经 demo 访问**（demo:8080 在跑时，无需另起 8082）: `http://<服务器IP>:8080/docs-lib/index.html`

| 版本 | 接口文档 | 研发方案 |
|------|----------|----------|
| v3.0 | [应急指挥](http://localhost:8082/docs/library/v3.0/接口文档-应急指挥事件处理-3.0.html) · [日常值班](http://localhost:8082/docs/library/v3.0/接口文档-日常应急值班处理-3.0.html) · [续报生成](http://localhost:8082/docs/library/v3.0/接口文档-续报生成v2-3.0.html) | [应急指挥](http://localhost:8082/docs/library/v3.0/研发方案-应急指挥事件处理-3.0.html) · [日常值班](http://localhost:8082/docs/library/v3.0/研发方案-日常应急值班处理-3.0.html) |
| v2.0 | [应急指挥](http://localhost:8082/docs/library/v2.0/接口文档-应急指挥事件处理-2.0.html) · [日常值班](http://localhost:8082/docs/library/v2.0/接口文档-日常应急值班处理-2.0.html) | [应急指挥](http://localhost:8082/docs/library/v2.0/研发方案-应急指挥事件处理-2.0.html) · [日常值班](http://localhost:8082/docs/library/v2.0/研发方案-日常应急值班处理-2.0.html) |
| v1.0 | [应急指挥](http://localhost:8082/docs/library/v1.0/接口文档-应急指挥事件处理.html) · [日常值班](http://localhost:8082/docs/library/v1.0/接口文档-日常应急值班处理.html) | [应急指挥](http://localhost:8082/docs/library/v1.0/研发方案-应急指挥事件处理.html) · [日常值班](http://localhost:8082/docs/library/v1.0/研发方案-日常应急值班处理.html) |

### 本地 Markdown 版本

<details>
<summary>展开查看 Markdown 文件链接</summary>

**v3.0（当前业务接口版本；实现与评测基线已同步至V8.2）**
- [接口文档-应急指挥事件处理](docs/library/v3.0/接口文档-应急指挥事件处理-3.0.md)
- [接口文档-日常应急值班处理](docs/library/v3.0/接口文档-日常应急值班处理-3.0.md)
- [接口文档-续报生成](docs/library/v3.0/接口文档-续报生成v2-3.0.md)
- [研发方案-应急指挥事件处理](docs/library/v3.0/研发方案-应急指挥事件处理-3.0.md)
- [研发方案-日常应急值班处理](docs/library/v3.0/研发方案-日常应急值班处理-3.0.md)

**v2.0**
- [接口文档-应急指挥事件处理](docs/library/v2.0/接口文档-应急指挥事件处理-2.0.md)
- [接口文档-日常应急值班处理](docs/library/v2.0/接口文档-日常应急值班处理-2.0.md)
- [研发方案-应急指挥事件处理](docs/library/v2.0/研发方案-应急指挥事件处理-2.0.md)
- [研发方案-日常应急值班处理](docs/library/v2.0/研发方案-日常应急值班处理-2.0.md)

**v1.0**
- [接口文档-应急指挥事件处理](docs/library/v1.0/接口文档-应急指挥事件处理.md)
- [接口文档-日常应急值班处理](docs/library/v1.0/接口文档-日常应急值班处理.md)
- [研发方案-应急指挥事件处理](docs/library/v1.0/研发方案-应急指挥事件处理.md)
- [研发方案-日常应急值班处理](docs/library/v1.0/研发方案-日常应急值班处理.md)

</details>

## 快速开始

每个子项目有独立的 Python 环境（`.venv`），需分别进入目录操作：

### 1. 启动日常值班服务 (duty_processor)

```bash
cd projects/duty_processor
source .venv/bin/activate
pip install -e .

# 启动服务
duty-processor serve --host 0.0.0.0 --port 8001

# 测试调用
curl -X POST http://localhost:8001/api/v3/duty/pipeline_direct \
  -H "Content-Type: application/json" \
  -d '{"asr_text":"8A病区医生来电，高钙血症患者病情危重，需请肾内科急会诊"}'
```

### 2. 启动应急指挥服务 (emergency_command)

```bash
cd projects/emergency_command
source .venv/bin/activate
pip install -e .

# 启动服务（main.py 实例化 EmergencyCommandApp 并起 uvicorn:8000）
python main.py        # 若未 pip install -e .，则用 PYTHONPATH=src python main.py

# 测试调用
curl -X POST http://localhost:8000/api/v3/emergency/pipeline_direct \
  -H "Content-Type: application/json" \
  -d '{"asr_text":"化工厂毒气泄漏，2人重伤30人轻伤，需支援，联系人张主任13892076554"}'
```

### 3. 启动续报服务 (supplement_report)

```bash
cd <yingji>            # 项目根目录
source .venv/bin/activate
# 润色模型三项原子 profile + 思维链声明（当前默认：自建资源模型 Qwen3-30B-Instruct）
export SUPPLEMENT_LLM_BASE_URL=http://192.168.68.107:8987/v1
export SUPPLEMENT_LLM_API_KEY=EMPTY
export SUPPLEMENT_LLM_MODEL=Qwen3-30B-A3B-Instruct-2507
export SUPPLEMENT_LLM_SUPPORTS_THINKING=0   # 1=原生慢思考通道；0=Instruct 无思考通道(协议模拟)
PYTHONPATH=projects/supplement_report/src \
  python -m uvicorn supplement_report.app:app --host 0.0.0.0 --port 8003

# 调 SSE 接口生成一份续报（可选 "reasoning_mode":true 开启思维链逐字流）
curl -N -X POST http://localhost:8003/api/supplement_report/generate \
  -H "Content-Type: application/json" \
  -d @projects/supplement_report/testset/cases/tongzhou_collapse.json
```

> 续报模块独立自包含，零依赖主项目；profile 与 `SUPPLEMENT_LLM_SUPPORTS_THINKING` 从仓库根 `.env` 读取。
> 2026-10 起支持思维链（`reasoning_mode`）与正文分步流式（`delta{channel:"content"}`：标题随统计完成即出、lead/basic 守门定论后出、明细逐行出；拼接逐字节 == report.markdown），旧客户端不传/只消费 report 即行为不变。
> 详细配置见 [续报 README](projects/supplement_report/README.md)、接口契约见 [v3.0 接口文档](docs/library/v3.0/接口文档-续报生成v2-3.0.md) §2.2。

### 4. 启动 Demo 服务

```bash
bash demo/run.sh
# 浏览器打开 http://127.0.0.1:8080
```

`run.sh` 一键拉起 emergency(8000) + duty(8001) + supplement_report(8003) + demo(8080)，
设 `SUPPLEMENT_REPORT_ENABLED=0` 可跳过续报服务。Demo 集成三大模块的服务体验页、
评测结果展示页、续报演示与文档导航，启动后直接访问（无需另起 Dashboard 服务）：
- **主页 / 服务体验 / 续报演示 / 文档导航**: `http://<服务器IP>:8080/`
- **评测结果页**: `http://<服务器IP>:8080/eval/dashboard_eval.html`（默认第9批V8.2，支持逐事件展开）

> **注意**: 体验页需要调用 8000/8001/8003 端口的 API 服务，请先启动（或直接用 `run.sh` 一键拉起）。

### 5. 启动 OCR 校对服务（数据集构建用途）

> 用于把原始值班记录图片 OCR 后人工校对，反向构造评测数据集（非线上服务）。

```bash
cd refs
python3 启动校对服务.py

# 或直接启动HTTP服务
python -m http.server 8083 --bind 0.0.0.0 --directory refs
```

访问：`http://<服务器IP>:8083/duty_check.html`

## 大模型配置

应急与值班工具模型默认使用同一个 OpenAI 兼容 profile：

```bash
export EXP_TOOL_BASE_URL=http://192.168.68.92:8986/v1
export EXP_TOOL_API_KEY=Empty
export EXP_TOOL_MODEL=Qwen2.5-32B-Instruct
```

模型名称、Base URL 和 Key 必须三项同时配置；后续接入新模型时替换这三项并重启
Emergency、Duty 服务即可。显式环境变量优先于仓库默认 profile，不会自动降级到
GLM 或其他模型。

Demo 使用 SSE 流式接口，评测使用非流式接口，其余模型 profile 和业务处理链一致。
页面展示服务实际启动的模型，不支持请求级伪切换。编排模型独立使用
`AGENTLOOP_BASE_URL / AGENTLOOP_API_KEY / AGENTLOOP_MODEL`。

续报润色模型同样走 OpenAI 兼容 profile，三项原子配置：

```bash
export SUPPLEMENT_LLM_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
export SUPPLEMENT_LLM_API_KEY=<key>
export SUPPLEMENT_LLM_MODEL=qwen-plus
```

三项必须同时配置（缺一即抛错，不静默回退，与 `EXP_TOOL_*` 一致）。
切换自建 Qwen / GLM 端点时替换这三项并重启续报服务（:8003）即可，详见
[续报 README · 模型配置](projects/supplement_report/README.md#模型配置)。配置模板见
[`.env.example`](.env.example)。

Emergency 事件类型召回默认使用本地 `BAAI/bge-m3`。需要改为远程部署的
OpenAI 兼容 Embedding 接口时，配置完整 profile：

```bash
export EMBEDDING_BASE_URL=http://embedding-host:port/v1
export EMBEDDING_API_KEY=your-key
export EMBEDDING_MODEL=BAAI/bge-m3
```

三个变量必须同时提供；全部不配置时继续加载本地 BGE-M3。切换模型、Base URL、
向量维度或事件类型目录后，服务会拒绝不匹配的旧缓存并自动重建本地 FAISS 索引。
服务预先保存的仅是 255 条稳定事件类型目录向量；每次用户上报的当前事件只在请求时
实时向量化，不写入向量库，也不需要单独部署 Milvus、Qdrant 或 pgvector。

ASR 配置与工具大模型配置独立；`DASHSCOPE_API_KEY` 仅用于启用百炼 ASR 等
DashScope 能力，不作为 Qwen2.5 自建工具端点的默认 Key。仅使用 `asr_text` 的
直驱部署不会初始化 Nanobot 或 ASR 客户端，因此只配置完整 `EXP_TOOL_*` 即可启动；
首次编排请求才校验 `AGENTLOOP_*`，首次音频请求才校验所选 ASR provider。

## 环境变量

| 变量 | 说明 | 必需 |
|------|------|------|
| `EXP_TOOL_BASE_URL` / `EXP_TOOL_API_KEY` / `EXP_TOOL_MODEL` | 工具模型完整 profile；三项必须同时设置 | 可选（未设置时使用上述默认值） |
| `AGENTLOOP_BASE_URL` / `AGENTLOOP_API_KEY` / `AGENTLOOP_MODEL` | 编排模型完整 profile | 可选 |
| `SUPPLEMENT_LLM_BASE_URL` / `SUPPLEMENT_LLM_API_KEY` / `SUPPLEMENT_LLM_MODEL` | 续报润色完整 profile；三项必须同时设置 | 必需（续报服务） |
| `EMBEDDING_BASE_URL` / `EMBEDDING_API_KEY` / `EMBEDDING_MODEL` | Emergency 远程 Embedding 完整 profile；三项必须同时设置 | 可选（未设置时使用本地 BGE-M3） |
| `DASHSCOPE_API_KEY` | 百炼 ASR 等 DashScope 能力的 API 密钥（续报润色请改用 `SUPPLEMENT_LLM_API_KEY`） | 按 ASR provider |

## 对比评测 (experiments)

自动化评测框架，用于验证各模块的准确率和性能：

| 文件 | 说明 |
|------|------|
| [REPORT.md](experiments/REPORT.md) | 综合评测报告 |
| [EXPERIMENT_LOG.md](experiments/EXPERIMENT_LOG.md) | 实验日志 |
| [cases_emergency_v2.json](experiments/cases_emergency_v2.json) | 第9批Emergency全量集：285例，覆盖判断/类型/敏感/抽取/等级 |
| [cases_duty_v2.json](experiments/cases_duty_v2.json) | 第9批Duty全量集：普通292例 + 自然续报178例 |
| [eval_matrix_v2_batch9_v82.json](experiments/data/eval_matrix_v2_batch9_v82.json) | 第9批V8.2冻结评测矩阵 |
| [eval_duty.py](experiments/eval_duty.py) | 日常值班评测脚本 |
| [eval_duty_records.py](experiments/eval_duty_records.py) | 真实记录评测：单例分类/摘要消融 + 续报按模型跑 rules_only/rules_llm 双条件（误并/漏并/命中目标/P/R/F1） |
| [eval_emergency.py](experiments/eval_emergency.py) | 应急指挥评测脚本 |
| [dashboard_eval.html](experiments/dashboard_eval.html) | 评测结果可视化面板（含第四批次续报 4 模型对比 + 逐事件可展开详情） |

```bash
# 运行评测
cd experiments
python eval_duty.py
python eval_emergency.py

# V8.2冻结矩阵身份与完整性校验
../projects/duty_processor/.venv/bin/python build_batch9_v82_matrix.py
```

## 技术栈

- **Agent Loop**: Nanobot (Skill-Tool-Hook 架构)
- **LLM**: OpenAI兼容模型端点；默认 `Qwen2.5-32B-Instruct`，参照模型为 `GLM-5.1-FP8`，思考模式关闭
- **ASR**: 百炼 qwen3-asr-flash / 火山引擎
- **语义匹配**: FAISS + BGE-M3
- **Web**: FastAPI + Uvicorn
- **Python**: 3.11

## 项目结构

```
emergency-prj/
├── projects/                    # 核心业务模块（各有独立 .venv）
│   ├── duty_processor/          # 日常值班事件处理（:8001）
│   │   ├── src/                 # 源码
│   │   ├── .venv/               # 独立 Python 环境
│   │   ├── config.yaml          # LLM 配置
│   │   └── README.md            # 详细文档
│   ├── emergency_command/       # 应急指挥事件处理（:8000）
│   │   ├── src/                 # 源码
│   │   ├── .venv/               # 独立 Python 环境
│   │   ├── config.yaml          # LLM 配置
│   │   └── README.md            # 详细文档
│   └── supplement_report/           # 续报（救援进程报告）生成（:8003，独立自包含）
│       ├── src/supplement_report/   # 源码：facts(确定性统计) generator(组装+润色) llm app store cli
│       ├── testset/             # 118 例冻结测试集 + 金标准（9 内部 + 100 客户脱敏 cust_* + 9 对抗 adv_*）
│       ├── eval/                # 13 维回归 + mutation + judge 可靠性门槛 + 17 项版本快照校验
│       ├── docs/                # 技术设计母版 design.md
│       ├── reports/             # 工作汇报 / 一页 PPT
│       └── README.md            # 详细文档
├── demo/                        # Demo 服务（:8080，体验页 + 评测展示 + 文档导航）
│   ├── server.py                # FastAPI 应用（挂 /eval /docs-lib /projects-lib /refs-lib）
│   ├── run.sh                   # 一键启动 8000+8001+8003+8080
│   └── static/                  # 前端静态资源（主页/体验/续报/评测页）
├── experiments/                 # 对比评测框架
│   ├── cases_*.json             # 测试用例
│   ├── eval_*.py                # 评测脚本
│   ├── REPORT.md / .html        # 综合评测报告（含续报章节）
│   ├── REPORT_supplement_report.md  # 续报评测报告（冻结回归 + 泛化边界 + judge 状态）
│   ├── REPORT_duty_records.html # 日常值班真实记录评测
│   ├── EXPERIMENT_LOG.md / .html# 实验日志
│   └── dashboard_eval.html      # 评测可视化面板（默认第9批 V8.2）
├── refs/                        # 参考资料（原始业务文档）
│   ├── *.md                     # 流程说明、飞书导出、续报 PRD、HIS 接口
│   ├── resources/               # 模型、向量库、续报 HIS 接口源材料
│   └── 值班记录/                 # 历史数据与处理脚本
├── docs/                        # 项目文档
│   ├── index.html               # 全仓库文档导航（设计/接口/模块/参考）
│   ├── library/                 # 接口、研发与部署文档（按版本 v1.0/v2.0/v3.0）
│   └── superpowers/             # 设计规格 specs（25）与实施计划 plans（25）
├── scripts/                     # 脚本工具
│   ├── push_gitlab.sh           # GitLab 推送（一键）
│   ├── git_askpass.sh           # Git 凭证辅助
│   ├── md_to_html.py            # Markdown → HTML（mermaid + GFM 表格）
│   └── gen_dir_indexes.py       # 目录索引页生成（plans/specs/refs-resources）
├── CHANGELOG.md                 # 变更日志
├── AGENTS.md                    # AI Agent 工作指引
└── README.md
```
