- Wiki 7 文件关键数字刷新:迁移 96→103、实体 45→46、前端 163→225、测试 5→36 - 修复 architecture.md PostgreSQL 版本不一致(18→16) - 修复 erp-ai.md 实体数 3→6、erp-health.md 实体数 45→46 - 更新 index.md 文档索引:specs 41、plans 38、discussions 18 - 新增事件注册表/方法论/分析报告引用 - 新增页面/组件测试设计规格(模式化工厂方案) - 新增 Q2 路线图规格(技术债 + 新功能并行 8 周)
5.4 KiB
5.4 KiB
title, updated, status, tags
| title | updated | status | tags | |||||
|---|---|---|---|---|---|---|---|---|
| erp-ai AI 分析模块 | 2026-05-03 | in-development |
|
erp-ai AI 分析模块
从 index 导航。关联: erp-health erp-core erp-server
设计规格:
docs/superpowers/specs/2026-04-25-erp-ai-module-design.md
1. 设计决策
为什么需要 AI 模块?
健康管理平台需要为医护人员提供智能辅助分析能力:化验单解读、健康趋势分析、体检方案推荐、报告摘要生成。这些能力需要一个独立的模块来管理 AI 提供商、Prompt 模板和用量追踪。
核心架构选择
- 原生 Rust crate — 与 erp-health 同级,直接调用数据库和事件总线
- ErpModule trait 实现 —
AiModule在 erp-server 注册,路由挂载到/api/v1/ai - SSE 流式响应 — 所有分析端点使用 Server-Sent Events 实时推送
- 多提供商支持 — AiProvider trait 抽象,当前实现 Claude (Anthropic)
- 数据脱敏 — 发送前自动移除患者 PII(姓名、身份证、手机号)
2. 关键文件 + 数据流
目录结构
crates/erp-ai/
├── src/
│ ├── lib.rs ← 模块导出 (AiModule, AiState, AiError)
│ ├── module.rs ← ErpModule trait 实现, 6 权限码, 路由定义
│ ├── error.rs ← AiError → AppError (59 行)
│ ├── state.rs ← AiState { db, event_bus, provider }
│ ├── dto.rs ← 请求/响应 DTO (102 行)
│ ├── provider/
│ │ ├── mod.rs ← AiProvider trait 定义
│ │ └── claude.rs ← Claude SSE 流式实现 (227 行)
│ ├── service/
│ │ ├── analysis.rs ← AnalysisService 核心编排 (183 行)
│ │ ├── prompt.rs ← PromptService 模板渲染 (67 行)
│ │ └── usage.rs ← UsageService 用量追踪 (45 行)
│ ├── handler/
│ │ └── mod.rs ← 6 个 SSE + REST 端点 (340 行)
│ ├── prompt/
│ │ └── mod.rs ← Prompt 模板引擎 (25 行)
│ └── entity/
│ ├── ai_prompt.rs ← Prompt 模板 Entity
│ ├── ai_analysis.rs ← 分析结果 Entity
│ └── ai_usage.rs ← 用量日志 Entity
实体模型(6 个实体)
| 实体 | 用途 |
|---|---|
| ai_prompt | Prompt 模板(版本管理、激活/回滚) |
| ai_analysis | 分析结果记录(输入参数、输出摘要、token 用量) |
| ai_usage | 用量追踪(按租户/用户聚合) |
| ai_suggestion | AI 建议记录(风险分级、建议内容、状态跟踪) |
| ai_risk_threshold | 风险阈值配置(按指标定义临界值) |
| ai_action | AI 行动分发(从建议到行动的闭环跟踪) |
权限码(6 个)
| 权限码 | 说明 |
|---|---|
ai.analysis.list / ai.analysis.manage |
查看分析历史 / 发起分析 |
ai.prompt.list / ai.prompt.manage |
查看 Prompt / 管理 Prompt |
ai.usage.list |
查看用量统计 |
ai.provider.manage |
管理提供商配置 |
API 端点: /api/v1/ai/
| 端点 | 方法 | 说明 |
|---|---|---|
/ai/analyze/lab-report |
POST | 化验单智能解读(SSE) |
/ai/analyze/trends |
POST | 健康趋势分析(SSE) |
/ai/analyze/checkup-plan |
POST | 体检方案推荐(SSE) |
/ai/analyze/report-summary |
POST | 报告摘要生成(SSE) |
/ai/analysis/history |
GET | 分析历史列表 |
/ai/analysis/{id} |
GET | 分析结果详情 |
集成契约
| 方向 | 模块 | 接口 | 触发时机 |
|---|---|---|---|
| 依赖 → | erp-health | 健康数据查询 | 分析时读取患者数据 |
| 依赖 → | erp-core | EventBus, AppError | 模块注册 |
| 注册 → | erp-server | AiModule |
启动时注册 |
3. 代码逻辑
SSE 流式分析流程
客户端 POST → handler::stream_*()
→ sanitization: 移除 PII (姓名→患者, 身份证→***)
→ PromptService: 加载激活模板 + 渲染变量
→ AnalysisService: 编排分析流程
→ AiProvider::stream(): 调用 LLM API
→ 逐 chunk SSE 推送: data: { "content": "..." }
→ AnalysisService: 保存结果到 ai_analysis
→ UsageService: 记录 token 用量
→ SSE done
数据脱敏
发送给 LLM 的数据经过脱敏处理:
- 患者姓名 → "患者"
- 身份证号 → 全掩码
- 手机号 →
138****1234格式
模块依赖
AiModule 声明依赖 ["health"],确保健康模块先于 AI 模块初始化。
⚡ 不变量: 所有发送到外部 LLM 的数据必须经过 PII 脱敏 ⚡ 不变量: SSE 连接超时必须设置,避免挂起 ⚡ 不变量: 用量追踪必须记录,用于计费和审计
4. 活跃问题 + 陷阱
当前状态: 🔧 开发中
6 个 API 端点已实现,SSE 流式分析可用。当前为 Phase 1 MVP。
待完善
| 问题 | 级别 | 说明 |
|---|---|---|
| 管理端前端页面 | P1 | Prompt 管理、分析历史、用量统计页面 |
| 小程序端集成 | P2 | 患者端查看 AI 分析结果 |
| 更多提供商 | P2 | 接入 OpenAI、本地模型等 |
| 用量配额限制 | P1 | 按租户设置用量上限 |
5. 变更记录
| 日期 | 变更 |
|---|---|
| 2026-04-25 | 创建 erp-ai wiki 页面 |