构建AI临床副驾驶:基于Go的电子病历智能助手与HIS对接实战(下)
5.4 接口契约:/v1/cds/suggestions
请求 POST /v1/cds/suggestions
{
"patientId": "p123",
"chiefComplaint": "发热、咳嗽3天",
"vitalSigns": {
"temperature": 38.5,
"heartRate": 90,
"respiratoryRate": 20,
"bloodPressure": "125/80"
},
"historyPresent": "患者3天前无明显诱因出现发热,体温最高38.5℃,伴咳嗽、咳黄痰,无胸闷气促。",
"pastMedicalHistory": "高血压病史5年,口服氨氯地平。",
"allergies": ["青霉素"],
"orderedTests": ["血常规"],
"orderedMeds": []
}
响应
{
"suggestions": [
{
"type": "test",
"title": "建议行C反应蛋白检测",
"detail": "发热伴咳嗽,CRP可辅助判断细菌感染可能性。",
"evidence": "中国成人社区获得性肺炎诊断和治疗指南(2016)"
},
{
"type": "test",
"title": "建议行流感病毒抗原检测",
"detail": "当前为流感高发季节,且患者有发热、咳嗽。",
"evidence": "流行性感冒诊疗方案(2025版)"
},
{
"type": "warning",
"title": "青霉素过敏史",
"detail": "患者自述青霉素过敏,避免使用青霉素类抗生素。若需抗感染,可考虑大环内酯类或喹诺酮类。",
"level": "critical"
}
]
}
6. 核心功能三:病历质控与术语规范
6.1 场景描述
医生写完一份入院记录,准备保存时,系统自动弹出质控提示:“诊断‘急性阑尾炎’但病程记录中未描述‘右下腹痛’;既往史提及‘糖尿病’但诊断列表中无相关ICD编码;术语‘冠心病’建议使用标准ICD-10 I25.103。”医生可根据提示修改,提升病历质量,减少返修率。
6.2 质控维度
- 完整性:必填项是否缺失(如主诉、现病史、既往史等)。
-
一致性:
- 诊断与既往史是否矛盾(如诊断新发糖尿病但既往史无糖尿病)。
- 诊断与体征描述是否一致(如阑尾炎应有右下腹痛)。
- 用药与诊断是否匹配(如糖尿病诊断无降糖药)。
- 术语规范性:非标准术语映射到标准ICD-10、ATC等编码。
- 逻辑合理性:如男性患者不应有“子宫”相关诊断。
6.3 规则引擎与AI结合
- 规则引擎:定义数百条一致性规则,如“if 诊断 contains ‘2型糖尿病’ and 既往史 not contains ‘糖尿病’ then 警告”。
- NLP模型:用于抽取非结构化文本中的关键信息(如症状、体征),与结构化诊断比对。
- 术语映射服务:将医生输入的诊断名称(如“冠心病”)映射到标准ICD-10编码,并给出置信度。
6.4 接口契约:/v1/qc/validate
请求 POST /v1/qc/validate
{
"encounterId": "e456",
"sections": {
"chiefComplaint": "腹痛半天",
"historyPresent": "患者半天前无明显诱因出现上腹痛,后转移至右下腹,伴恶心、无呕吐。",
"pastMedicalHistory": "既往体健,否认高血压、糖尿病。",
"diagnosis": "急性阑尾炎",
"plan": "急诊行阑尾切除术"
}
}
响应
{
"issues": [
{
"level": "error",
"title": "关键体征描述缺失",
"detail": "诊断为急性阑尾炎,但病程记录中未描述‘右下腹痛’。当前现病史中提到了‘转移至右下腹’,请明确表述‘右下腹痛’。",
"location": "historyPresent"
},
{
"level": "warn",
"title": "既往史与诊断不一致",
"detail": "既往史无糖尿病,但诊断‘2型糖尿病’出现在诊断列表中?实际上当前诊断仅为‘急性阑尾炎’,无此问题。示例需调整。"
}
]
}
7. 统一数据模型与核心结构
为了保证代码可维护,我们需要定义清晰的Go结构体,用于内部流转和API交互。以下为核心模型(已在前文中出现部分):
package model
import "time"
type Patient struct {
ID string `json:"id"`
Name string `json:"name"`
Gender string `json:"gender"` // M, F, O
BirthDate time.Time `json:"birthDate"`
}
type Encounter struct {
ID string `json:"id"`
PatientID string `json:"patientId"`
Type string `json:"type"` // outpatient, inpatient, emergency
StartTime time.Time `json:"startTime"`
EndTime *time.Time `json:"endTime,omitempty"`
Dept string `json:"dept"`
DoctorID string `json:"doctorId"`
}
type Observation struct {
Code string `json:"code"` // e.g., "BP", "HbA1c", "CREAT"
Value string `json:"value"` // "140/90", "7.2"
Unit string `json:"unit"` // "mmHg", "%", "mg/dL"
TakenAt time.Time `json:"takenAt"`
Source string `json:"source"` // LIS, PACS, etc.
}
type Medication struct {
Name string `json:"name"`
Dose string `json:"dose"`
Frequency string `json:"frequency"`
Route string `json:"route"`
StartDate string `json:"star
© 版权声明
文章版权归作者所有,未经允许请勿转载。