5 个 Skill 里领域知识最硬的一个:门诊病历智能结构化与安全辅助
为什么选这个写
上一篇写了「电商销售日报生成与异常归因」,选它是因为工程完成度最高——有 Python 脚本兜底、流程一次跑通、代码和 Agent 分工清晰。这篇写另一个方向的极致:「门诊病历智能结构化与安全辅助」,选它不是因为工程上多完善,而是因为领域知识最扎实、安全约束最严格。
如果说电商那个 Skill 的核心是"代码驱动",那这个的核心是"知识驱动"——没有 Python 脚本,全靠 Agent 语义理解 + 结构化的领域规则来兜底。两种思路,两种坑,都值得写。
这个 Skill 是干什么的
目标用户
全科医生/门诊医生。门诊场景下,医生一边问诊一边口述病历,旁边设备把语音转成文字。但这些文字是一坨非结构化的口语,要整理成标准电子病历格式(主诉、现病史、既往史、体格检查、诊断、处方),同时还要检查处方里的药有没有禁忌问题。
痛点
我在做需求采访的时候设定了三轮,把自己代入了一个社区医院全科医生的角色:
- 每天门诊量 40-60 人,平均每人就诊时间 8-10 分钟
- 病历手敲或口述转文字后手动整理,每份花 3-5 分钟
- 最怕的不是打字累,是开错药——忘记查禁忌、剂量写错、儿童孕妇用药没注意
- 现有的 HIS 系统不带智能校验,只有最基础的药物相互作用提示
这个场景的核心矛盾是:时间紧、容错率低、领域知识依赖重。跟电商日报那种"错了改改就行"的场景完全不同,医疗场景里一个处方错误可能出事。
Skill 做的事
输入:医生口述的语音转文字(一段非结构化文本)
输出:标准结构化电子病历 + 处方安全校验报告
Skill 包结构
skill-medical-record/ ├── SKILL.md # 核心定义文件 ├── references/ │ ├── drug-contraindication-rules.md # 用药禁忌规则 │ ├── record-format-spec.md # 病历格式规范 │ └── safety-redlines.md # 医疗安全红线 └── samples/ ├── sample-input-voice.md # 语音转文字输入样本 ├── sample-exam-report.md # 体检报告样本 └── sample-output-record.md # 期望输出病历样本跟电商那个比,最明显的区别是没有 scripts 目录。整个 Skill 没有一行代码,全靠 SKILL.md 的流程定义和 references 里的领域知识来指导 Agent。
这不是偷懒,是这个场景的特性决定的——语音转病历的核心是语义理解,不是数据处理。你没法用 pandas 把"患者主诉三天前开始咳嗽,伴有低烧"拆成结构化字段,这活只能交给 Agent。
但这也带来了一个问题:输出稳定性全靠 references 的规则定义够不够清晰。规则写得模糊,Agent 就会自由发挥。
核心设计:三道安全防线
这个 Skill 最值得写的不是流程,是安全设计。医疗场景跟其他场景最大的区别就是出错有后果,所以我在设计的时候放了三道防线。
第一道:结构化输出约束
SKILL.md 里明确定义了病历的输出结构,Agent 不能自由编排:
## 输出格式(严格遵循) ### 电子病历 - **主诉**:一句话,包含主要症状 + 持续时间 - **现病史**:按时间线描述,包含发病时间、症状变化、已做处理 - **既往史**:慢性病、手术史、过敏史、用药史 - **体格检查**:体温/血压/心率/呼吸 + 阳性体征 - **诊断**:ICD-10 编码 + 诊断名称 - **处方**:药品名 + 剂量 + 用法用量 + 疗程 ### 安全校验报告 - **禁忌检查**:处方药品与既往史中的过敏/疾病是否冲突 - **剂量检查**:处方剂量是否在常规范围内 - **特殊人群**:儿童/孕妇/哺乳期/老年人用药提示 - **交互检查**:处方内药品之间的相互作用每个字段都给了明确的格式要求。这不是建议,是硬约束——SKILL.md 里用了"严格遵循"这个措辞,并且在 samples 里给了完整的期望输出示例,让 Agent 有参照物。
这跟写 API 文档是一个道理:接口定义越清晰,实现越不容易跑偏。
第二道:用药禁忌规则
references/drug-contraindication-rules.md是整个 Skill 信息量最大的文件。我把禁忌规则分了四类:
# 用药禁忌规则 ## 一、过敏禁忌 | 过敏药物 | 禁忌药品 | 原因 | |---------|---------|------| | 青霉素 | 阿莫西林、氨苄西林等 | 交叉过敏 | | 磺胺类 | 复方磺胺甲噁唑 | 同类过敏 | | 阿司匹林 | 布洛芬、萘普生 | 交叉反应 | ## 二、疾病禁忌 | 基础疾病 | 禁忌药品 | 风险 | |---------|---------|------| | 消化性溃疡 | 阿司匹林、NSAIDs | 出血风险 | | 哮喘 | 普萘洛尔等β受体阻滞剂 | 支气管痉挛 | | G6PD缺乏症 | 磺胺类、伯氨喹 | 溶血风险 | | 严重肝功能不全 | 对乙酰氨基酚(大剂量) | 肝毒性 | ## 三、特殊人群禁忌 | 人群 | 禁忌药品 | 替代方案 | |------|---------|---------| | 孕妇(前3月) | 甲硝唑、左氧氟沙星 | 阿莫西林(B类) | | 哺乳期 | 四环素、氯霉素 | 阿莫西林、头孢类 | | 儿童(<8岁) | 四环素类、喹诺酮类 | 阿莫西林(按体重计) | | 老年人(>65岁) | 长效苯二氮卓类 | 短效类,减半剂量 | ## 四、药物交互禁忌 | 药品A | 药品B | 交互类型 | 严重程度 | |------|------|---------|---------| | 华法林 | 阿司匹林 | 出血风险叠加 | 高 | | ACEI类 | 保钾利尿剂 | 高钾血症 | 中 | | SSRI类 | MAOI类 | 5-HT综合征 | 高 |这个表不是我自己编的,查了《中国国家处方集》和几篇临床用药指南,挑了门诊最常碰到的禁忌组合。覆盖面不算全,但都是全科门诊高频场景。
写这个文件的时候我有一个感触:这种领域知识表才是 Skill 的真正壁垒。SKILL.md 的流程结构谁都能写,但用药禁忌规则需要查文献、需要临床经验判断哪些组合最危险。AI 能帮你搭框架,但框架里填什么内容,得人来定。
第三道:医疗安全红线
references/safety-redlines.md定义了 5 条不可逾越的安全规则。这个文件的定位不是"建议",是"硬拦截"——Agent 在输出处方之前必须逐条检查:
# 医疗安全红线(必须逐条验证) ## 红线一:过敏史冲突 处方中任何药品不得与患者既往史中记录的过敏药物存在交叉过敏。 触发时:移除该药品,提示替代方案,标注"过敏冲突"。 ## 红线二:孕妇用药分级 若患者为孕妇,处方中所有药品必须为 FDA 妊娠分级 B 类及以上。 C 类需标注"需评估风险收益",D 类和 X 类直接禁止。 ## 红线三:儿童剂量 12 岁以下儿童处方必须按体重计算剂量,不得直接使用成人剂量。 公式:剂量 = 体重(kg) × 每日mg/kg ÷ 每日次数 ## 红线四:肝肾功能调整 患者有肝肾功能不全时,处方药品需标注是否需要剂量调整。 需要调整的药品在处方中注明调整后剂量和监测建议。 ## 红线五:高危药品双签 以下药品出现在处方中时,必须额外标注"需复核": - 胰岛素(低血糖风险) - 华法林(出血风险) - 地高辛(中毒窗口窄) - 氯化钾注射液(致死风险)这五条红线的写法有讲究:
每条都有明确的触发条件和处理动作。不是写"注意用药安全"这种废话,而是写"触发时:移除该药品,提示替代方案"。Agent 读完就知道碰到这种情况该干什么。
红线之间有优先级。过敏冲突 > 孕妇分级 > 儿童剂量 > 肝肾调整 > 高危药品。如果多个红线同时触发,按优先级处理,先解决最危险的。
这种写法借鉴了编程里的异常处理思路——每个异常有明确的 catch 逻辑,不是笼统的 try-catch 然后随便处理。
14 项验证检查:最严的自检流程
这个 Skill 是 5 个里唯一跑了完整 14 项验证的。其他几个要么没跑到 14 项,要么部分跳过了。验证清单长这样:
1. SKILL.md frontmatter 格式正确 2. title 字段非空且与目录名一致 3. summary 字段不超过 50 字 4. read_when 至少包含 2 个触发条件 5. 触发条件无歧义(动词+宾语结构) 6. 输入格式有明确定义 7. 输出格式有结构化约束 8. references 目录文件均可被 SKILL.md 引用 9. samples 目录包含至少 1 组输入+输出 10. 无硬编码敏感信息(患者姓名、身份证等) 11. Markdown 表格管道符已转义 12. 动态内容无未转义的换行符 13. CSV/Excel 导出有注入防护 14. 安全约束段落存在且可执行14 项全过。但说实话,第 11 和 12 项是后来补的——第一次提交的时候没转义,被打回来了。SKILL.md 的第 38 到 129 行是用药禁忌规则的大表格,管道符|满屏都是,不做转义平台直接拒收。
修复的时候学到一个细节:表格里的药品名如果本身包含括号或特殊字符,转义后容易破坏表格结构。比如"阿莫西林(胶囊)"里的中文括号不影响 Markdown 渲染,但如果药品名里带了英文|或者半角括号(),就得小心处理。
跟电商 Skill 的对比:两种设计哲学
做完这两个 Skill 之后,我对 Skill 的设计思路有了两种截然不同的认知:
| 维度 | 电商日报 | 门诊病历 |
|---|---|---|
| 核心驱动 | 代码驱动 | 知识驱动 |
| 确定性逻辑 | Python 脚本处理 | 无代码,靠 Agent 理解 |
| 安全约束 | CSV 注入防护 | 5 条医疗安全红线 |
| 领域知识载体 | anomaly_rules.md + 脚本逻辑 | drug-contraindication-rules.md(纯表格) |
| 输出稳定性 | 高(脚本保证) | 中(依赖 Agent 理解一致性) |
| 领域知识深度 | 中(规则较通用) | 高(需查医学文献) |
| 出错代价 | 日报数据不准,改改就行 | 处方错误可能出事 |
两种思路各有适用场景:
能用代码解决的,用代码。数据清洗、数值计算、格式转换这些确定性的活,代码比 Agent 靠谱。电商日报走这条路是对的。
只能靠语义理解的,靠知识约束。语音转病历、归因分析这些非结构化的活,代码帮不上忙,只能在 references 里把规则写得足够细,让 Agent 有据可查。门诊病历走这条路也是对的——你没法用 Python 把一段口述病历拆成结构化字段。
最理想的情况是两者结合:关键路径上用代码兜底,非结构化部分用知识约束 Agent。但不是每个场景都适合这么做,得分情况。
这个 Skill 的问题和局限
说完优点,也得说说不足,不然就不是学习笔记了。
1. 输出稳定性不够
没有代码兜底意味着同一个输入,Agent 两次跑出来的病历可能在措辞上有差异。虽然结构是固定的(主诉、现病史那些字段都在),但字段内的文字描述不保证完全一致。
这在医疗场景下是个真问题——医生需要病历是确定性的,不能今天生成的和明天生成的不一样。后续如果要改进,可以考虑在 Agent 输出后加一层校验脚本,检查字段完整性和格式合规性。
2. 用药禁忌规则覆盖面有限
现在的禁忌表只覆盖了全科门诊最常见的几十种药品组合。真到三甲医院专科门诊,药品数量翻几倍,靠手工维护这个表不现实。
理想方案是接入专业的药品数据库 API(比如用药参考、合理用药系统),实时查询禁忌信息。但这超出了 Skill 的范围——Skill 是给 Agent 用的知识包,不是完整系统。
3. 语音转文字的准确性没考虑
这个 Skill 的输入是"语音转文字后的文本",默认转写是准确的。实际场景中,医学术语的语音识别错误率不低——“心尖部收缩期杂音"可能被转成"新尖部收整车杂音”。Skill 层面没法解决这个问题,得靠前端的语音识别引擎。
但在 SKILL.md 里加一段"若输入包含明显的语音识别错误特征(如同音字错误、不通顺的语句),提示医生确认"的规则,能降低一些风险。
写在最后
这个 Skill 做完之后最大的感受是:领域知识这个东西,AI 替代不了。
写电商日报的时候,异常判定规则我查几篇文章就能总结出来。但写用药禁忌规则的时候,我查了《中国国家处方集》、查了临床指南、还想找医学专业的同学帮忙审一遍——因为我不确定自己查的资料是不是最新的、有没有遗漏高危组合。
AI 能帮我把这些知识组织成结构化的表格和规则,但"哪些知识该放进去"这个判断,得靠有专业背景的人来做。
这可能是 Skill 开发里最重要的一个认知:技术架构是骨架,领域知识是血肉。骨架搭得再好,血肉是空的也站不住。