docs(wiki): 更新 erp-ai 模块 — Ollama 对接 + bug 修复记录
Some checks failed
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / frontend-build (push) Has been cancelled
CI / security-audit (push) Has been cancelled

- index.md: 迁移 123 个, 提交 577 次, 新增 AI 分析症状导航 4 条
- erp-ai.md: 新增 §4 Ollama 本地模型对接、已知限制、已修复 bug
- erp-ai.md: 更新 SSE 流程图(预校验 + 缓存回放修复)
- erp-ai.md: 3 个管理前端页面已实现
This commit is contained in:
iven
2026-05-05 20:07:24 +08:00
parent a62332f1c4
commit 049d230bae
2 changed files with 58 additions and 14 deletions

View File

@@ -1,8 +1,8 @@
---
title: erp-ai AI 分析模块
updated: 2026-05-03
updated: 2026-05-05
status: in-development
tags: [ai, llm, sse, health-analysis, claude]
tags: [ai, llm, sse, health-analysis, ollama]
---
# erp-ai AI 分析模块
@@ -22,8 +22,10 @@ tags: [ai, llm, sse, health-analysis, claude]
- **原生 Rust crate** — 与 erp-health 同级,直接调用数据库和事件总线
- **ErpModule trait 实现** — `AiModule` 在 erp-server 注册,路由挂载到 `/api/v1/ai`
- **SSE 流式响应** — 所有分析端点使用 Server-Sent Events 实时推送
- **多提供商支持** — AiProvider trait 抽象,当前实现 Claude (Anthropic)
- **多提供商支持** — AiProvider trait 抽象,实现 Claude (Anthropic)、Ollama (本地)、OpenAI
- **数据脱敏** — 发送前自动移除患者 PII姓名、身份证、手机号
- **分析预校验** — 触发分析前校验数据完整性items/sections 为空时直接返回 400
- **非对话化 Prompt** — 迁移 000123 更新所有 prompt 为结构化输出格式
## 2. 关键文件 + 数据流
@@ -99,13 +101,15 @@ crates/erp-ai/
```
客户端 POST → handler::stream_*()
→ 预校验: items/sections 为空 → 400 直接拒绝
→ sanitization: 移除 PII (姓名→患者, 身份证→***)
→ PromptService: 加载激活模板 + 渲染变量
→ AnalysisService: 编排分析流程
AiProvider::stream(): 调用 LLM API
检查缓存: 相同输入 + prompt 版本 → 复用已有结果(直接回放纯文本)
→ AiProvider::stream(): 调用 LLM APIOllama/Claude/OpenAI
→ 逐 chunk SSE 推送: data: { "content": "..." }
→ AnalysisService: 保存结果到 ai_analysis
UsageService: 记录 token 用量
→ AnalysisService: 保存结果到 ai_analysis(已完成的跳过)
后处理: 解析建议、发布事件
→ SSE done
```
@@ -124,23 +128,60 @@ crates/erp-ai/
**不变量**: SSE 连接超时必须设置,避免挂起
**不变量**: 用量追踪必须记录,用于计费和审计
## 4. 活跃问题 + 陷阱
## 4. Ollama 本地模型对接
### 配置方式
`crates/erp-server/config/default.toml`:
```toml
[ai]
default_provider = "ollama"
model = "qwen3:4b"
[ai.providers.ollama]
provider_type = "ollama"
base_url = "http://localhost:11434"
default_model = "qwen3:4b"
max_tokens = 2048
temperature = 0.3
is_enabled = true
```
### 已知限制
| 问题 | 说明 |
|------|------|
| qwen3-vl:4b 无法运行 | Ollama 已知 bug#13101VL 模型内存估算异常3.3GB 模型要求 38.3 GiB |
| qwen3:4b 思考模式 | 模型内置 `<think/>` 标签,首次响应可能延迟 |
| 无图像识别能力 | 当前所有分析使用结构化数据库数据,不需要 VL 模型 |
| Prompt 模板 model_config | DB 中 `ai_prompt.model_config.model` 优先级高于全局配置,需同步更新 |
### 已修复的 bug
| Bug | 修复 |
|-----|------|
| 缓存回放 JSON 嵌套 | `replay_cached` 直接回放纯文本;`complete_analysis` 跳过已完成记录 |
| 分析返回对话式回复 | 迁移 000123 更新 prompt 为非对话、结构化输出 |
| 空数据触发无效分析 | handler 层预校验 items/sections 非空 |
## 5. 活跃问题 + 陷阱
### 当前状态: 🔧 开发中
6 个 API 端点已实现SSE 流式分析可用。当前为 Phase 1 MVP。
6 个 API 端点已实现SSE 流式分析可用,已对接本地 Ollama。前端 3 个管理页面已实现Prompt 管理、分析历史、用量统计)。当前为 Phase 1 MVP。
### 待完善
| 问题 | 级别 | 说明 |
|------|------|------|
| 管理端前端页面 | P1 | Prompt 管理、分析历史、用量统计页面 |
| 小程序端集成 | P2 | 患者端查看 AI 分析结果 |
| 更多提供商 | P2 | 接入 OpenAI、本地模型等 |
| 用量配额限制 | P1 | 按租户设置用量上限 |
| 化验报告必填项 | P1 | 后端校验已加,前端录入表单也应对应设置必填 |
## 5. 变更记录
## 6. 变更记录
| 日期 | 变更 |
|------|------|
| 2026-05-05 | 对接本地 Ollama qwen3:4b修复缓存回放 JSON 嵌套 bug预校验 + prompt 非对话化 |
| 2026-04-25 | 创建 erp-ai wiki 页面 |