master
- 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
AI EMR Report Analysis System
一个基于AI的电子病历/体检报告智能解读系统,集成OCR识别、结构化解析、规则引擎分析和LLM智能解读功能。
✨ 功能特点
- 📄 多格式支持: 支持PDF、图片格式的体检报告上传
- 🔍 智能识别: 基于PaddleOCR的高精度文字识别和表格解析
- 📊 数据标准化: 自动识别和标准化医学指标,建立结构化数据
- ⚖️ 规则引擎: 基于权威医学指南的专业规则评估系统
- 🤖 AI解读: 支持患者版和医生版双模式智能解读
- 📋 随访计划: 个性化健康管理和随访建议
- 🔒 数据安全: 本地部署,数据安全可控
🏗️ 系统架构
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 前端界面 │ │ 后端API │ │ AI服务 │
│ │ │ │ │ │
│ • Vue3 + TS │◄──►│ • FastAPI │◄──►│ • Ollama LLM │
│ • Element Plus │ │ • SQLAlchemy │ │ • PaddleOCR │
│ • ECharts │ │ • Pydantic │ │ • 规则引擎 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
核心模块
-
采集与解析层
- 文档上传和OCR识别
- 表格结构化解析
- 指标名称标准化
-
规则引擎
- 医学指标阈值判断
- 组合规则评估
- 风险等级评定
-
LLM解读服务
- 患者友好的通俗解读
- 医生专业的诊断建议
- 个性化随访计划
🚀 快速开始
环境要求
- Python 3.8+
- Node.js 16+
- Ollama (可选,用于LLM解读)
安装步骤
- 克隆项目
git clone <repository-url>
cd EMR
- 安装Python依赖
pip install -r requirements.txt
- 配置环境
cp .env.example .env
# 编辑 .env 文件配置数据库和服务地址
- 启动系统
python run.py
选择运行模式:
1: 仅后端 (开发模式) - http://localhost:80002: 构建前端 + 启动后端 (生产模式)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 (可选)
- 日志: 结构化日志记录
📊 数据流程
解析流程
- 文档上传 → 保存文件,生成任务ID
- OCR识别 → PaddleOCR提取文字和表格
- 数据解析 → 正则+NER提取指标数据
- 标准化 → 指标映射和单位转换
- 规则分析 → 应用医学规则评估
- 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模型按需加载
🚩 已知限制
- OCR识别准确率依赖图像质量
- 规则引擎基于预设规则,需要持续维护
- LLM解读质量依赖模型能力
- 首次启动需要下载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 文件了解详情
🤝 贡献指南
- Fork本项目
- 创建功能分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 打开 Pull Request
📞 支持
如有问题或建议,请:
- 提交 Issue
- 发送邮件至 [email protected]
- 查看 文档
Built with ❤️ for better healthcare
Languages
Python
58.8%
Vue
33.4%
TypeScript
7.4%
HTML
0.4%