1. 项目概述:AI健康问诊小程序的设计初衷
去年团队接了个医疗健康领域的项目需求,甲方希望做一个能解决基础问诊问题的轻量级工具。经过市场调研发现,80%的普通健康咨询其实不需要面对面诊疗,特别是疫情后用户对线上问诊接受度明显提升。但现有医疗App普遍存在两个痛点:要么功能太重(预约挂号、电子病历全堆砌),要么AI诊断准确率太低。
我们最终决定基于微信小程序开发这个AI健康问诊系统,主要考虑三点:
- 微信生态的天然流量优势,用户无需下载额外App
- 小程序开发周期短,适合快速验证核心功能
- 结合AI能力可以实现7×24小时即时响应
系统核心定位是"健康自查+专业兜底":
- 前端通过智能问卷收集症状
- 中台用NLP引擎解析用户描述
- 后端基于知识图谱做疾病概率匹配
- 最终输出建议分级(自我观察/药店购药/急诊就医)
关键设计原则:所有AI诊断结果必须标注"仅供参考",且强制跳转人工咨询入口。这是医疗类产品的红线,后面会详细说明合规设计。
2. 技术架构设计解析
2.1 整体架构分层
采用经典的三层架构,但针对医疗场景做了特殊优化:
code复制[微信小程序]
↓ HTTPS加密
[API网关] → [鉴权服务]
↓
[业务中台]
├── 问诊引擎
├── 健康档案
├── 消息服务
└── 支付服务
↓
[数据层]
├── MySQL(结构化数据)
├── MongoDB(非结构化日志)
└── Redis(会话缓存)
2.2 关键技术选型
前端方案对比
| 方案 | 优点 | 缺点 | 最终选择 |
|---|---|---|---|
| 原生小程序 | 性能最优 | 多端需重复开发 | √ 主选 |
| Taro | 跨端支持 | 调试成本高 | 备选 |
| uni-app | 生态丰富 | 包体积较大 | 未采用 |
最终选用原生小程序开发,主要考虑:
- 微信官方组件持续更新(如2023年新增的医疗问卷组件)
- 可直接调用微信云开发能力
- 避免跨端框架的兼容性问题
后端技术栈
- 语言:Python 3.8(Flask框架)
- 医疗NLP领域Python生态更成熟(spaCy、Med7等库)
- Flask轻量适合快速迭代
- 数据库:
- MySQL 8.0:存储用户基础信息、问诊记录
- MongoDB:存储症状描述文本、AI分析日志
- 缓存:Redis 6.2
- 症状关键词缓存(TTL 15分钟)
- 问诊会话状态保持
AI服务部署
- 模型训练:PyTorch + Transformers
- 基于BERT微调医疗文本分类
- 训练数据:公开的MIMIC-III数据集(脱敏处理)
- 推理服务:FastAPI + ONNX Runtime
- 将模型转为ONNX格式提升推理速度
- 单次推理耗时控制在300ms内
3. 核心功能实现细节
3.1 智能问卷系统
动态问题生成算法流程:
python复制def generate_questions(symptom):
# 知识图谱查询
related = KnowledgeGraph.query(symptom)
# 权重计算
weights = calculate_weights(related)
# 问题排序
sorted_questions = sort_by_entropy(weights)
return sorted_questions[:5] # 返回前5个最相关问题
实际开发中遇到的坑:
- 直接问"是否头痛"可能引导用户误答 → 改为"头部有什么不适感?"
- 儿童问卷需要调整术语(如用"肚肚痛"代替"腹痛")
- 必须设置"不清楚"选项避免用户随意选择
3.2 症状分析引擎
文本处理流程:
- 医疗实体识别(使用训练好的Med7模型)
- 症状-部位关联(如"灼烧感"+"上腹部"→"胃灼热")
- 时序分析(持续时长、发作频率)
重要经验:必须处理否定表述(如"不头痛"),早期版本因忽略否定词导致30%误判
3.3 AI诊断模块
疾病预测算法:
python复制def predict_disease(symptoms):
# 获取基础概率
base_probs = get_icd_probs(symptoms)
# 应用用户特征修正
adjusted = apply_user_factors(base_probs, age, gender)
# 返回TOP3可能疾病
return adjusted.topk(3)
关键改进点:
- 引入贝叶斯网络处理症状组合(单纯用准确率下降15%)
- 对罕见病设置概率上限(不超过5%)
- 女性生育年龄自动加入妊娠相关鉴别诊断
4. 医疗合规专项设计
4.1 数据安全措施
- 字段级加密:健康数据使用AES-256加密
- 匿名化处理:诊断记录去标识化后存储
- 权限控制:RBAC模型细化到API接口级别
4.2 法律风险规避
- 诊断结果必须包含免责声明
- 紧急症状(如胸痛)直接跳转120呼叫
- 问诊记录保存至用户删除后6个月(符合医疗数据留存要求)
4.3 资质备案要点
- 小程序类目选择"健康医疗->互联网医院"
- 服务器必须部署在大陆境内
- 合作医疗机构资质上传至微信审核
5. 性能优化实战记录
5.1 首屏加载优化
- 小程序分包:核心问诊模块独立分包(从2.1MB降至800KB)
- 图片压缩:使用微信自带的CDN压缩服务
- 接口缓存:症状列表接口设置max-age=3600
5.2 高并发处理
压力测试数据(阿里云2核4G实例):
| 并发数 | 平均响应时间 | 错误率 |
|---|---|---|
| 500 | 320ms | 0.1% |
| 1000 | 680ms | 2.3% |
| 1500 | 1200ms | 8.7% |
优化措施:
- 引入消息队列削峰(RabbitMQ)
- AI推理服务实现动态扩容
- 高频查询结果缓存5分钟
6. 踩坑与经验总结
6.1 医疗文本处理难点
- 同义词问题:"心梗"="心肌梗死"="AMI"
- 口语化表达:"拉肚子"="腹泻"="大便次数增多"
- 地域差异:"感冒"="伤风"="着凉"
解决方案:构建医疗同义词库,目前收录12万条术语
6.2 用户行为洞察
- 70%用户会在晚间20-23点使用
- 输入症状平均字数为18.7个汉字
- 45岁以上用户更倾向使用语音输入
对应优化:
- 夜间模式界面调整
- 语音输入按钮前置
- 增加典型症状快捷选项
6.3 持续改进方向
- 接入可穿戴设备数据(需用户授权)
- 增加用药相互作用检查
- 开发家庭健康档案功能
这个项目给我的最大启示是:医疗AI产品必须在技术创新和风险控制之间找到平衡点。我们团队现在对所有诊断结果都实施"双保险"机制——AI建议必须由合作医院的医生团队做月度抽样复核。