BrunoGao bd9b03baab Fix dependencies and add mock services for testing
- Add mock OCR service for testing without PaddleOCR dependency
- Fix pydantic settings import issues
- Create minimal requirements files for easier installation
- Add test HTML page and sample report image
- System now runs successfully with core functionality
- API endpoints working: upload, status, health check
- Rule engine and template interpretation working properly
2025-09-18 22:39:34 +08:00

AI EMR Report Analysis System

一个基于AI的电子病历/体检报告智能解读系统,集成OCR识别、结构化解析、规则引擎分析和LLM智能解读功能。

✨ 功能特点

  • 📄 多格式支持: 支持PDF、图片格式的体检报告上传
  • 🔍 智能识别: 基于PaddleOCR的高精度文字识别和表格解析
  • 📊 数据标准化: 自动识别和标准化医学指标,建立结构化数据
  • ⚖️ 规则引擎: 基于权威医学指南的专业规则评估系统
  • 🤖 AI解读: 支持患者版和医生版双模式智能解读
  • 📋 随访计划: 个性化健康管理和随访建议
  • 🔒 数据安全: 本地部署,数据安全可控

🏗️ 系统架构

┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│   前端界面      │    │   后端API       │    │   AI服务        │
│                 │    │                 │    │                 │
│ • Vue3 + TS     │◄──►│ • FastAPI       │◄──►│ • Ollama LLM    │
│ • Element Plus  │    │ • SQLAlchemy    │    │ • PaddleOCR     │
│ • ECharts       │    │ • Pydantic      │    │ • 规则引擎      │
└─────────────────┘    └─────────────────┘    └─────────────────┘

核心模块

  1. 采集与解析层

    • 文档上传和OCR识别
    • 表格结构化解析
    • 指标名称标准化
  2. 规则引擎

    • 医学指标阈值判断
    • 组合规则评估
    • 风险等级评定
  3. LLM解读服务

    • 患者友好的通俗解读
    • 医生专业的诊断建议
    • 个性化随访计划

🚀 快速开始

环境要求

  • Python 3.8+
  • Node.js 16+
  • Ollama (可选,用于LLM解读)

安装步骤

  1. 克隆项目
git clone <repository-url>
cd EMR
  1. 安装Python依赖
pip install -r requirements.txt
  1. 配置环境
cp .env.example .env
# 编辑 .env 文件配置数据库和服务地址
  1. 启动系统
python run.py

选择运行模式:

  • 1: 仅后端 (开发模式) - http://localhost:8000
  • 2: 构建前端 + 启动后端 (生产模式)
  • 3: 仅构建前端

可选:配置Ollama LLM

# 安装Ollama
curl -fsSL https://ollama.ai/install.sh | sh

# 拉取模型 (推荐Qwen)
ollama pull qwen:7b

# 启动Ollama服务
ollama serve

📖 使用指南

1. 上传报告

  • 支持PDF、JPG、PNG格式
  • 文件大小限制:10MB
  • 拖拽或点击上传

2. 处理流程

graph LR
    A[文件上传] --> B[OCR识别]
    B --> C[数据解析]
    C --> D[规则分析]
    D --> E[AI解读]
    E --> F[结果展示]

3. 解读结果

  • 患者版: 通俗易懂,包含生活建议
  • 医生版: 专业术语,诊断建议
  • 随访计划: 个性化复查提醒

🛠️ 开发说明

项目结构

EMR/
├── app/                    # 后端应用
│   ├── main.py            # FastAPI入口
│   ├── models.py          # 数据模型
│   ├── config.py          # 配置管理
│   ├── database.py        # 数据库连接
│   └── services/          # 业务服务
│       ├── ocr_service.py     # OCR服务
│       ├── parser_service.py  # 解析服务
│       ├── rule_engine.py     # 规则引擎
│       └── llm_service.py     # LLM服务
├── frontend/              # 前端应用
│   ├── src/
│   │   ├── views/         # 页面组件
│   │   ├── components/    # 公共组件
│   │   ├── stores/        # 状态管理
│   │   ├── api/           # API调用
│   │   └── types/         # TypeScript类型
│   └── package.json
├── config/                # 配置文件
│   ├── metrics_dict.yaml  # 指标字典
│   └── rules.yaml         # 规则配置
├── requirements.txt       # Python依赖
├── run.py                # 启动脚本
└── README.md

API接口

核心接口

  • POST /api/report/upload - 上传报告
  • GET /api/report/status?task_id= - 获取处理状态
  • GET /api/report/{id}/struct - 获取结构化数据
  • GET /api/report/{id}/interpretation - 获取AI解读

响应示例

{
  "report_id": "RPT-20250918-001",
  "person": {
    "name": "张三",
    "gender": "M",
    "age": 45
  },
  "metrics": [
    {
      "code": "BP_SYS",
      "name": "收缩压",
      "value": 138,
      "unit": "mmHg",
      "ref": "<120",
      "flag": "H"
    }
  ]
}

规则配置

# config/rules.yaml
rules:
  - id: HTN-01
    name: 高血压可疑
    when:
      any:
        - condition: "BP_SYS.value >= 140"
        - condition: "BP_DIA.value >= 90"
    severity: "moderate"
    actions:
      - advice: "建议家庭血压监测,记录1-2周"
      - followup_days: 14

指标字典

# config/metrics_dict.yaml
metrics:
  BP_SYS:
    canonical_name: "收缩压"
    aliases: ["收缩压", "高压", "SBP"]
    unit_default: "mmHg"
    reference_ranges:
      normal: "<120"

🔧 配置说明

环境变量

# 数据库配置
DATABASE_URL=sqlite:///./emr.db

# LLM配置
OLLAMA_BASE_URL=http://localhost:11434
OLLAMA_MODEL=qwen:7b

# 文件上传配置
MAX_FILE_SIZE=10485760
UPLOAD_FOLDER=uploads

系统配置

  • OCR语言: 支持中英文混合识别
  • 数据存储: SQLite/PostgreSQL
  • 缓存: Redis (可选)
  • 日志: 结构化日志记录

📊 数据流程

解析流程

  1. 文档上传 → 保存文件,生成任务ID
  2. OCR识别 → PaddleOCR提取文字和表格
  3. 数据解析 → 正则+NER提取指标数据
  4. 标准化 → 指标映射和单位转换
  5. 规则分析 → 应用医学规则评估
  6. LLM解读 → 生成双模式解读文本

数据库设计

-- 报告原始数据
CREATE TABLE t_report_raw (
    id INTEGER PRIMARY KEY,
    report_id VARCHAR(50) UNIQUE,
    person_id VARCHAR(50),
    file_path VARCHAR(500),
    status VARCHAR(20),
    created_at TIMESTAMP
);

-- 结构化指标数据
CREATE TABLE t_metric_value (
    id INTEGER PRIMARY KEY,
    report_id VARCHAR(50),
    metric_code VARCHAR(50),
    value FLOAT,
    unit VARCHAR(20),
    flag VARCHAR(5)
);

🔐 安全考虑

  • 数据加密: 传输和存储加密
  • 访问控制: 分级权限管理
  • 审计日志: 操作轨迹记录
  • 数据脱敏: 敏感信息保护
  • 本地部署: 数据不出本地网络

📈 性能优化

  • 异步处理: 后台任务队列
  • 缓存机制: Redis缓存热点数据
  • 批量处理: 支持批量上传解析
  • 资源管理: OCR模型按需加载

🚩 已知限制

  1. OCR识别准确率依赖图像质量
  2. 规则引擎基于预设规则,需要持续维护
  3. LLM解读质量依赖模型能力
  4. 首次启动需要下载OCR模型(约150MB)

🛡️ 故障排除

常见问题

Q: OCR识别失败

# 检查PaddleOCR安装
python -c "from paddleocr import PaddleOCR; print('OK')"

Q: LLM解读返回模板内容

# 检查Ollama服务
curl http://localhost:11434/api/tags

Q: 前端页面空白

# 重新构建前端
cd frontend && npm run build

📄 许可证

本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情

🤝 贡献指南

  1. Fork本项目
  2. 创建功能分支 (git checkout -b feature/AmazingFeature)
  3. 提交更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 打开 Pull Request

📞 支持

如有问题或建议,请:


Built with ❤️ for better healthcare

S
Description
No description provided
Readme
82 KiB
Languages
Python 58.8%
Vue 33.4%
TypeScript 7.4%
HTML 0.4%