AI 病历行为数据记录与训练闭环方案¶
- 保存时间:2026-02-25
- 来源:与助手对话记录(用户要求保存)
核心结论¶
这个场景(AI 病历编辑 + 可回放 + 可用于训练)本质上不是“前端埋点”问题,而是系统级“行为事件 + 状态版本”数据架构问题。结论:用 Event Sourcing(事件溯源)+ 审计日志 + 状态快照(SCD2/版本表),前端埋点只做补充,不做主数据源。
1) 为什么前端埋点不够¶
- 只能看到页面行为,看不到后端真实落库结果
- 容易丢失(网络、SDK、拦截、离线)
- 无法保证修改前后状态完整一致
- 医疗审计要求高(谁在何时改了什么、为什么改)
因此:以后端写入链路为准,前端行为为辅。
2) 总体方案¶
三层数据¶
- 业务主表(当前态)
medical_record(仅最新状态,用于在线查询)- 事件表(行为事实)
record_events(append-only,不更新不删除)- 记录:谁、何时、对哪个实体、做了什么、前后差异、来源
- 版本快照表(历史态)
record_versions(关键变更落版本,支持回放/审计/训练抽取)
事件模型建议字段¶
event_id(UUID)entity_type/entity_idevent_type(created/updated/status_changed/ai_suggested/ai_accepted/ai_rejected)actor_type(doctor/patient/ai/system)actor_idtimestamprequest_id/trace_idsource(web/app/api/batch)before(JSON)after(JSON)diff(JSON Patch 或字段级差异)reasonmodel_info(模型版本、prompt 版本、置信度)phi_level/sensitivity_tagschema_version
关键:before/after 必须在后端事务内读取并写入,保证一致性。
3) 写入链路(强一致)¶
- API 收到更新请求
- 开事务
- 读当前记录作为
before - 计算
after和diff - 更新主表
medical_record - 插入
record_events - 插入
record_versions - 提交事务
有 Kafka 时可加 Outbox Pattern,先本地 outbox,再异步投递到流平台。
4) 训练闭环¶
从事件层构造训练样本:
- 输入:AI 初始建议、上下文、用户画像(脱敏)、病历上下文
- 标签:
accepted / edited / rejected、编辑距离、最终质控结果 - 产出:DPO/奖励模型、SFT 数据、离线评测集
补充: - 延迟标签(质量结果晚到) - 训练集版本化(按时间窗+规则版本固化)
5) 医疗治理要求¶
- PHI/PII 脱敏(训练前流水线)
- 最小权限(事件库与训练库隔离)
- 样本可追溯(可追到事件 ID)
- 保留期/可删除/审计导出策略
- 传输与存储加密(含字段级)
6) 技术选型¶
早期(先跑通)¶
- PostgreSQL(OLTP)
record_events用 JSONB + 索引(entity_id, timestamp, actor_id)- 每日 ETL 到 ClickHouse/BigQuery
中期(规模化)¶
- Kafka / Pulsar
- Debezium(CDC)
- S3 + Iceberg/Delta + Spark/Flink
- MLflow/DVC 做训练集版本管理
7) MVP 落地清单¶
- 新增
record_events(append-only) - 所有病历修改 API 统一事务内写
before/after/diff - 增加
status_changed专用事件 - 每日导出训练中间表(先脱敏)
- 先做三类标签:采纳/编辑/拒绝
- 做事件回放页(按病历 ID 看完整修改链)
如需继续:可补 PostgreSQL DDL、事件 JSON Schema、事务伪代码(Java/Node)、ETL SQL 模板。