欢迎光临
我们一直在努力

医疗场景的 AI UI 生成:患者端与医生端的信息架构差异设计

医疗场景的 AI UI 生成:患者端与医生端的信息架构差异设计

一、引言:同一个病例,患者只想看"严重吗",医生需要看"全部的 27 项指标"

医疗场景的 UI 设计有一个独特的挑战:同一个核心数据(患者的健康信息),需要在两个完全不同的信息架构下呈现。

患者端需要的信息是"降维"的:检查结果是否正常?看哪个指标就行?严重吗?需要做什么?患者不需要也不应该看到那 27 个生化指标——太详细的信息只会制造焦虑。

医生端需要的信息是"升维"的:全部指标、历史对比、异常标记、诊断依据、用药记录、禁忌提示。医生需要在一屏内看到尽可能多的、有临床意义的信息。

AI UI 在医疗场景的核心价值,就是为这两种截然不同的信息架构需求,自动生成各自最优的布局方案。

二、底层机制与原理深度剖析

双端信息优先级矩阵

信息类别患者端优先级医生端优先级
核心诊断结论 P0(必须简化为通俗语言) P0
异常指标 P0(仅 3-5 个关键指标) P0(全部异常标注)
正常指标 P2(隐藏) P1(需要查看)
历史趋势 P1(仅总体趋势) P0(每个指标详细趋势)
诊断依据 P2(不需要) P0(必须关联)
药物交互 P3(不显示) P0(自动检查)

三、生产级代码实现

/**
* 医疗双端 UI 生成引擎
*
* 从同一份患者数据,生成患者端和医生端两种 UI Schema
*/

/** 患者医疗数据 */
interface PatientRecord {
patientId: string;
/** 检查项目列表 */
labResults: LabResult[];
/** 医嘱 */
prescriptions: Prescription[];
/** 诊断 */
diagnoses: Diagnosis[];
}

interface LabResult {
name: string;
value: number;
unit: string;
normalRange: [number, number]; // [下限, 上限]
isAbnormal: boolean;
severity: 'normal' | 'borderline' | 'abnormal' | 'critical';
/** 历史值(用于趋势图) */
history: Array<{ date: string; value: number }>;
}

/**
* 患者端 UI 生成器
*
* 核心原则:降维 + 通俗化 + 消除焦虑
*/
class PatientViewGenerator {
generate(record: PatientRecord): PatientViewUI {
// 第一步:只筛选异常或有临床意义的指标
const keyResults = record.labResults.filter(
r => r.isAbnormal || r.severity === 'borderline'
).slice(0, 5); // 限制最多展示 5 项

// 第二步:生成通俗语言描述
const summary = this.generatePlainLanguageSummary(keyResults);

// 第三步:构建简化的 UI schema
return {
summary,
keyIndicators: keyResults.map(r => ({
name: this.translateToPlainName(r.name),
value: r.value,
unit: r.unit,
status: r.isAbnormal ? 'attention' : 'normal',
statusText: this.getStatusText(r)
})),
suggestions: this.generateSuggestions(record),
// 不展示:详细历史趋势、所有正常指标、诊断依据
hideHistoryCharts: true,
hideNormalResults: true
};
}

/** 把医学术语翻译成通俗语言 */
private translateToPlainName(medicalName: string): string {
const translations: Record<string, string> = {
'GLU': '血糖',
'ALT': '肝功能(转氨酶)',
'CREA': '肾功能(肌酐)',
'WBC': '白细胞',
'HGB': '血红蛋白',
'TC': '总胆固醇',
'TG': '甘油三酯'
};
return translations[medicalName] || medicalName;
}

/** 生成通俗状态文字 */
private getStatusText(result: LabResult): string {
if (result.severity === 'critical') return '需要关注';
if (result.severity === 'abnormal') return '略微偏高';
if (result.severity === 'borderline') return '接近上限';
return '正常';
}

/** 生成通俗摘要 */
private generatePlainLanguageSummary(results: LabResult[]): string {
const criticalOnes = results.filter(r => r.severity === 'critical');
const abnormalOnes = results.filter(r => r.severity === 'abnormal');

if (criticalOnes.length > 0) {
return `您有 ${criticalOnes.length} 项指标需要特别关注,建议尽快咨询医生`;
}
if (abnormalOnes.length > 0) {
return `您有 ${abnormalOnes.length} 项指标略有异常,建议定期复查`;
}
return '您的各项指标基本正常,请继续保持';
}

private generateSuggestions(record: PatientRecord): string[] {
// AI 根据异常指标自动生成生活建议
const suggestions: string[] = [];
const results = record.labResults;

if (results.find(r => r.name === 'TC' && r.isAbnormal)) {
suggestions.push('建议减少高脂食物摄入,增加蔬菜比例');
}
if (results.find(r => r.name === 'GLU' && r.isAbnormal)) {
suggestions.push('建议控制甜食和碳水化合物的摄入量');
}

return suggestions;
}
}

/**
* 医生端 UI 生成器
*
* 核心原则:全量 + 分析增强 + 效率优化
*/
class DoctorViewGenerator {
generate(record: PatientRecord): DoctorViewUI {
return {
// 所有指标(含异常标注)
allResults: record.labResults.map(r => ({
…r,
// 异常值用红色标记
highlight: r.isAbnormal,
// 严重程度
priority: r.severity
})),
// 历史趋势图(每个指标都有)
trendCharts: record.labResults.map(r => ({
name: r.name,
data: r.history,
chartType: 'line',
// 标注正常范围
normalBand: r.normalRange
})),
// 异常值汇总区
abnormalSummary: record.labResults
.filter(r => r.isAbnormal)
.sort((a, b) => {
const order = { critical: 0, abnormal: 1, borderline: 2 };
return order[a.severity] – order[b.severity];
}),
// 药物禁忌检查
drugInteractions: this.checkDrugInteractions(record),
// 完整信息展示
hideHistoryCharts: false,
hideNormalResults: false
};
}

private checkDrugInteractions(record: PatientRecord): DrugInteraction[] {
// AI 检查药物间的相互作用
// 简化示例
return [];
}
}

interface PatientViewUI {
summary: string;
keyIndicators: any[];
suggestions: string[];
hideHistoryCharts: boolean;
hideNormalResults: boolean;
}

interface DoctorViewUI {
allResults: any[];
trendCharts: any[];
abnormalSummary: LabResult[];
drugInteractions: DrugInteraction[];
hideHistoryCharts: boolean;
hideNormalResults: boolean;
}

interface DrugInteraction {
drug1: string;
drug2: string;
severity: 'contraindicated' | 'caution' | 'monitor';
description: string;
}

四、边界分析与架构权衡

关键缺点:

  • 患者端过度简化可能导致信息缺失——某个"不关键"的指标可能对某些患者很关键
  • "通俗化翻译"可能引入语义偏差——医学上"偏高"和"异常增高"是不同的
  • 法律风险——生成UI的建议被患者理解为医疗建议
  • 患者端和医生端的UI必须同步更新——医生修改了诊断,患者端要立即更新
  • 五、总结

    医疗场景的双端 UI 设计,本质上是一次"信息的精准投递"。同一份数据,给患者时要做减法——筛掉噪音、消除焦虑、给出行动指引;给医生时要做加法——关联历史、标注异常、自动分析。AI UI 的真正价值是让这个"加减"过程自动化,根据不同角色的信息需求生成各自最优的界面。


    作者:李慕杰(Leo / 8limujie)一个在患者焦虑和医生需求之间架桥的前端匠人

    赞(0)
    未经允许不得转载:171主机测评 » 医疗场景的 AI UI 生成:患者端与医生端的信息架构差异设计
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址