在上一课中,我们讨论了几个关键的提示技巧,并看到了如何单独使用每个技巧的示例。现在让我们尝试编写一个更大的提示,其中包含我们刚刚介绍的许多技巧
我们的提示目标 #
本课将重点介绍如何编写医疗记录摘要提示,该提示会接收长篇医疗记录并生成包含重要信息的摘要,以帮助医生为即将到来的预约做准备。
每个患者的医疗记录大致如下:
- 患者姓名:Evelyn Thompson
年龄:78
医疗记录: - 1985 年:诊断为 2 型糖尿病,开始服用二甲双胍
1992 年:出现高血压,处方为赖诺普利
1998 年:因骨关节炎进行全髋关节置换术(右侧)
2000 年:诊断为甲状腺功能减退症,开始服用左旋甲状腺素
2003 年:白内障手术(双眼)
2005 年:因心房颤动入院,开始服用华法林
2008 年:诊断为维生素 B12 缺乏症,开始每月注射
2010 年:由于 A1C 水平升高,增加二甲双胍剂量
2011 年:因短暂性脑缺血发作 (TIA) 入院,在治疗方案中添加阿司匹林
2013 年:诊断为 2 期乳腺癌,接受乳房肿瘤切除术和放射治疗
2014 年:开始服用阿那曲唑预防乳腺癌复发
2015 年:发展为 3 期慢性肾病 (CKD),调整二甲双胍
2017 年:因骨关节炎进行全膝关节置换术(左)
2018 年:因肺炎住院,接受静脉注射抗生素治疗
2019 年:出现轻度认知障碍,开始服用多奈哌齐
2020 年:因难治性高血压增加赖诺普利剂量
2021 年:复发性尿路感染,处方低剂量预防性抗生素
2022 年:年度乳房 X 线检查未见异常,但 eGFR 显示肾功能恶化
2023 年:活动能力下降,开始物理治疗和家庭健康助理访问
我们的最终目标是生成一致的记录摘要,以帮助提供者为即将到来的预约做好准备。每个摘要都应包含关键信息,包括:
- 患者姓名
- 患者年龄
- 关键诊断
- 患者处方药物清单
- 近期关注事项
- 提供者的行动项目
上述医疗记录的示例输出可能如下所示:
- 姓名:Evelyn Thompson
- 年龄:78
关键诊断:
- 2 型糖尿病 (1985)
- 高血压 (1992)
- 骨关节炎(1998 年和 2017 年髋关节和膝关节置换术)
- 甲状腺功能减退症 (2000)
- 心房颤动 (2005)
- 维生素 B12 缺乏症 (2008)
- 短暂性脑缺血发作 (TIA) (2011)
- 乳腺癌 (2013)
- 慢性肾病 (CKD) 第 3 期 (2015)
- 肺炎 (2018)
- 轻度认知障碍 (2019)
- 复发性尿路感染 (UTI) (2021)
药物:
- 二甲双胍 (糖尿病)
- 赖诺普利 (高血压)
- 左旋甲状腺素 (甲状腺功能减退症)
- 华法林 (心房颤动)
- 阿司匹林 (抗血小板)
- 阿那曲唑 (乳腺癌复发预防)
- 多奈哌齐 (认知障碍)
- 低剂量预防性抗生素 (复发性尿路感染)
其他治疗:
- 全髋关节置换术 (1998)
- 白内障手术 (2003)
- 维生素 B12 注射 (2008)
- 乳房肿瘤切除术和放射治疗 (乳腺癌,2013)
- 全膝关节置换术 (2017)
- 物理治疗和家庭健康助理(2023)
近期担忧:
- 肾功能恶化(2022 年 eGFR 下降)
- 行动能力下降 (2023)
行动项目:
- 监测肾功能并根据需要调整药物
- 继续物理治疗和家庭健康支持
- 评估认知能力下降并调整治疗计划
- 解决行动问题和跌倒风险
- 确保遵守推荐的癌症筛查
下面是一个包含 5 条医疗记录的 Python 列表,我们将尝试使用我们的提示:
patient_records = [
"""
患者姓名:Evelyn Thompson
年龄:78
医疗记录:
1985 年:诊断为 2 型糖尿病,开始服用二甲双胍
1992 年:出现高血压,处方为赖诺普利
1998 年:因骨关节炎进行全髋关节置换术(右侧)
2000 年:诊断为甲状腺功能减退症,开始服用左旋甲状腺素
2003 年:白内障手术(双眼)
2005 年:因心房颤动入院,开始服用华法林
2008 年:诊断为维生素 B12 缺乏症,开始每月注射
2010 年:因 A1C 水平升高增加二甲双胍剂量
2011 年:因短暂性脑缺血发作 (TIA) 入院,在治疗方案中添加阿司匹林
2013 年:诊断为 2 期乳腺癌,接受乳房肿瘤切除术和放射治疗
2014 年:开始服用阿那曲唑预防乳腺癌复发
2015 年:发展为 3 期慢性肾病 (CKD),调整二甲双胍
2017 年:因骨关节炎进行全膝关节置换术(左)
2018 年:因肺炎住院,接受静脉抗生素治疗
2019 年:出现轻度认知障碍,开始服用多奈哌齐
2020 年:由于难治性高血压,增加赖诺普利剂量
2021 年:复发性尿路感染,开具低剂量预防性抗生素
2022 年:每年乳房 X 线检查未见异常,但 eGFR 显示肾功能恶化
2023 年:活动能力下降,开始物理治疗和家庭健康助理访问
“””,
“””
患者姓名:Marcus Reyes
年龄:42 岁
病历:
2001 年:诊断为广泛性焦虑症 (GAD),开始服用帕罗西汀
2003 年:诊断为重度抑郁症 (MDD),增加服用安非他酮
2005 年:因自杀意念住院,增加认知行为疗法 (CBT)
2007 年:诊断为注意力缺陷多动障碍 (ADHD),开始服用哌甲酯
2009 年:报告帕罗西汀副作用,改用依他普仑
2012 年:诊断为阻塞性睡眠呼吸暂停 (OSA),开始接受 CPAP 治疗
2014 年:诊断为高血压,开始服用氯沙坦
2015 年:体重增加,转诊给营养师
2016 年:诊断为 2 型糖尿病,开始服用二甲双胍
2017 年:因糖尿病酮症酸中毒 (DKA) 住院,开始胰岛素治疗
2018 年:报告做噩梦,从安非他酮改用文拉法辛
2019 年:胃食管反流病(GERD) 诊断,开始服用奥美拉唑
2020 年:离婚,增加治疗次数,增加辩证行为疗法 (DBT)
2021 年:患上足底筋膜炎,医生开具矫形器和物理治疗处方
2022 年:因惊恐发作入院,被误认为心肌梗死,心脏检查阴性
2023 年:企图自杀,住院精神病治疗 30 天
2023 年:出院后,开始服用新的抗精神病药物(喹硫平)和情绪稳定剂(拉莫三嗪)
2024 年:报告情绪和睡眠改善,体重减轻
2024 年:A1C 水平改善,胰岛素剂量减少
“””,
“””
患者姓名:Lily Chen
年龄:8 岁
病历:
2016 年(出生):出生时 34 周,诊断为法洛四联症 (TOF)
- 立即手术放置分流器以增加肺血流
2016 年(3 个月):超声心动图显示右心室肥大恶化
2017 年(8 个月):TOF 完全修复(室间隔缺损闭合、肺动脉瓣置换、右心室流出道修复)
2017 年(10 个月):术后出现心律失常,开始服用胺碘酮
2018 年(14 个月):发现发育迟缓,转诊至早期干预服务
2018 年(18 个月):开始言语治疗以缓解语言发育迟缓
2019 年(2 年):诊断为发育迟缓,开始高热量饮食
2019 年(2.5 年):开始职业治疗以缓解精细运动技能迟缓
2020 年(3 年):心导管检查显示轻度肺动脉狭窄
2020 年(3.5 年):诊断为感觉处理障碍 (SPD)
2021 年(4 年):开始综合学前教育计划, IEP(个性化教育计划)
2021(4.5 年):因呼吸道合胞病毒细支气管炎住院,需要短暂供氧
2022(5 年):超声心动图显示肺动脉狭窄进展,进行球囊瓣膜成形术
2022(5.5 年):被诊断为注意力缺陷多动障碍 (ADHD),开始行为治疗
2023(6 年):因神经性听力损失进行人工耳蜗植入手术
2023(7 年):开始主流学校学习,继续接受 IEP 支持
2024(7.5 年):停止职业治疗,达到精细运动技能目标
2024(8 年):定期心脏随访显示肺动脉瓣功能稳定
2024(8 年):语言发育进展顺利,正在接受治疗
“””,
“””
患者姓名:Jason Tran
年龄:25
病历:
2010 年(11 岁):被诊断患有哮喘,开始使用沙丁胺醇吸入器
2012 年 (13 岁):第一次足球脑震荡,短暂失去意识
2013 年 (14 岁):踢足球时右胫骨骨折,手术固定
2014 年 (15 岁):第二次脑震荡,导致脑震荡后综合症
- 症状:头痛、头晕、记忆问题
- 转诊给儿科神经科医生,接受认知康复治疗
2015 年 (16 岁):出现焦虑和抑郁,开始服用氟西汀
2016 年 (17 岁)
: 打篮球时左膝前交叉韧带撕裂,重建手术
- 6 个月康复,改为非接触性运动
2017 年(18 岁):高中毕业,以奖学金开始上大学
2018 年(19 岁):被诊断患有与运动损伤相关的创伤后应激障碍
- 开始认知行为疗法 (CBT)
2019 年(20 岁):试图重返篮球,经历惊恐发作
- 增加治疗课程,增加暴露疗法
2020 年(21 岁):新冠疫情,远程学习,报告焦虑增加
- 开始正念冥想和瑜伽
2021 年(22 岁):被诊断患有睡眠呼吸暂停,开始 CPAP 治疗
- 睡眠研究表明脑震荡与睡眠障碍之间存在联系
2022 年(23 岁):逐渐恢复低冲击运动(游泳、骑自行车)
- 报告情绪和睡眠质量有所改善
2023 年(24 岁)年):大学毕业,开始从事体育分析工作
- 继续治疗,现在每两周一次
- 参加青少年脑震荡意识计划的志愿者活动
2024 年(25 岁):年度检查 - 哮喘得到良好控制,心理健康稳定
- 过去 2 年内没有运动相关伤害
- 为第一次半程马拉松训练
“”,
“”
患者姓名:Amira Khan
年龄:36
病历:
2011 年:反复关节疼痛和疲劳,初步诊断为纤维肌痛
- 开始服用普瑞巴林和物理治疗
2012 年:出现持续性皮疹和光敏性
- 皮肤科医生诊断为皮肤狼疮 (CLE)
- 开始使用外用皮质类固醇和防晒霜
2013 年:抱怨严重疲劳、脱发和认知问题(“脑雾”)
- 血液测试显示 ANA 和抗 dsDNA 抗体呈阳性
- 诊断为系统性红斑狼疮 (SLE)
- 开始服用羟氯喹和低剂量泼尼松
2014 年:因狼疮性肾炎 (III 类) 住院
- 肾活检确诊
- 开始服用霉酚酸酯并增加泼尼松剂量
2015 年:因 SLE 继发性间质性肺病 (ILD)
- 开始接受环磷酰胺脉冲治疗
- 需要家庭氧疗
2016 年:诊断为继发性干燥综合征
- 症状:眼干、口干
- 开始服用毛果芸香碱和人工泪液
2017 年:因狼疮性脑炎住院
- 症状:癫痫发作、精神错乱、记忆力减退
- MRI 显示脑部炎症
- 接受高剂量类固醇和利妥昔单抗治疗
2018 年:髋关节缺血性坏死 (AVN),类固醇诱发
- 接受全髋关节置换术
2019:开始使用贝利木单抗以降低发作频率
- 逐渐减少泼尼松剂量
2020:COVID-19 大流行,因免疫抑制而自我隔离
- 远程医疗随访,家庭输液
2021:被诊断为类固醇诱发的糖尿病
- 开始服用二甲双胍和胰岛素
- 转诊给内分泌科医生和营养师
2022:狼疮发作,关节疼痛和疲劳加剧
- 调整药物:增加霉酚酸酯,添加阿巴西普
2023:因长期使用类固醇而进行心血管筛查
- 超声显示舒张功能障碍的早期迹象
- 开始服用 ACE 抑制剂,转诊给心脏康复
2024:所有器官系统均有改善
- 逐渐减少免疫抑制剂,密切监测
- 继续物理治疗、瑜伽以保持关节健康
- 计划怀孕,咨询高风险产科
“””,
]
我们最初的“糟糕”提示 #
让我们从一个非常简单的提示开始,要求 Claude 为我们生成摘要。一个非常简单的第一次尝试可能看起来像这样:
我有这个病人的病历。你能帮我总结一下吗?
{医疗记录在这里}
我需要在明天病人的预约之前快速查看一下。
让我们将其形式化为一个特定的提示,我们可以将其与动态插入的医疗记录一起使用:
initial_prompt = """
我有这个病人的病历。你能帮我总结一下吗?
{record}
我需要在明天病人预约之前快速查看一下。
"""
接下来,让我们编写一个简单的函数,它将接受单个医疗记录,将其插入到我们的提示中,并让 Claude 生成摘要:
from anthropic import Anthropic
from dotenv import load_dotenv
load_dotenv()
client = Anthropic()
def generate_summary_with_bad_prompt(patient_record):
prompt_with_record = initial_prompt.format(record=patient_record)
response = client.messages.create(
model="claude-3-sonnet-20240229",
max_tokens=4096,
messages=[{"role": "user", "content": prompt_with_record}]
)
print("===============================")
print(response.content[0].text)
让我们尝试一下patient_records列表中的所有5条医疗记录:
generate_summary_with_bad_prompt(patient_records[0])
以下是 Evelyn Thompson 78 岁病历的摘要:
慢性病:
- 2 型糖尿病(自 1985 年起)- 服用二甲双胍,2010 年增加剂量
- 高血压(自 1992 年起)- 服用赖诺普利,2020 年增加剂量
- 甲状腺功能减退症(自 2000 年起)- 服用左旋甲状腺素
- 心房颤动(自 2005 年起)- 服用华法林
- 维生素 B12 缺乏症(自 2008 年起)- 每月注射
- 慢性肾病 3 期(自 2015 年起)- 调整二甲双胍
- 轻度认知障碍(自2019) – 服用多奈哌齐
手术史:
- 全髋关节置换术 (1998) – 右侧,因骨关节炎
- 白内障手术 (2003) – 双眼
- 乳房肿瘤切除术和放射治疗 (2013) – 针对 2 期乳腺癌
- 全膝关节置换术 (2017) – 左侧,因骨关节炎
癌症史:
- 乳腺癌 (2013) – 目前服用阿那曲唑预防复发
近期问题:
- 复发性尿路感染 (2021) – 服用预防性抗生素
- 根据 eGFR 肾功能恶化 (2022)
- 行动能力下降 (2023) – 开始物理治疗和家庭健康助理
总体而言,一名患有多种慢性疾病的老年患者需要多种药物治疗和密切监测,尤其是糖尿病、高血压、肾病和癌症复发。
如果我们仔细看看 Claude 提供的摘要,就会发现它们总结不明显!有些摘要只是长段文字。其他摘要则被分解为项目符号列表。每个摘要的实际内容截然不同。摘要内容并不糟糕,但摘要数据的格式、长度和类型不一致,很难通过编程使用。让我们改进它吧!
改进提示 #
正如我们在上一课中学到的,有一套明确的提示技术可以帮助我们获得更好、更一致的结果,包括:
- 添加清晰的系统提示来为助手设置上下文和角色,例如医疗专业人员或医疗数据分析师
- 使用 XML 标记(例如 )构造输入数据,以明确提示的哪部分是输入数据
- 提供关于摘要应关注哪些内容的明确、具体说明,例如诊断、药物和最近的健康问题
- 指定摘要所需的格式,例如项目符号或具有特定部分的结构化格式
- 包括一个格式良好的摘要示例来指导助手的响应
- 使用某种输出 XML 标记来构造输出,使用户能够轻松快速地找到相关信息
在接下来的课程中,我们将讨论一种具体的、细致入微的方法来提示工程和选择提示技术。在本课中,我们将采用“散弹枪”方法并同时使用所有这些方法。
添加系统提示 #
让我们逐一解决这些建议。我们首先定义一个系统提示来设置助手的上下文和角色。根据我们的经验,这是系统提示中应该包含的唯一信息。
对于我们的用例,我们的系统提示应该告诉 Claude,它的角色是充当一名擅长将长期病史转化为简明摘要的医疗专业人员。
以下是一种方法:
system = """
您是一位经验丰富的医疗专业人士,擅长将复杂的病史转化为简明、可操作的摘要。
您的职责是分析患者记录,识别关键信息,并以清晰、结构化的格式呈现,以帮助诊断和治疗计划。
您的摘要对于需要在预约前快速了解患者病史的繁忙医疗保健提供者来说非常宝贵。
"""
构造输入数据 #
使用 Claude 时最重要的提示技巧之一是使用 XML 标签清楚地标记输入数据。在我们当前的提示中,我们提供病史作为主要输入,如下所示:
- 我有这个病人的病历。你能帮我总结一下吗?
- {病历在这里}
- 我需要在明天病人预约之前快速查看一下。
一个简单的补充可以带来实质性的改进,那就是使用 XML 标签包装我们的输入数据。让我们更新我们的提示,使用 标签来执行此操作
#系统提示
system = """
您是一位经验丰富的医疗专业人士,擅长将复杂的患者病史转化为简明、可操作的摘要。
您的职责是分析患者记录,识别关键信息,并以清晰、结构化的格式呈现,以帮助诊断和治疗计划。
您的摘要对于需要在预约前快速了解患者病史的繁忙医疗保健提供者来说非常宝贵。
"""
#改进的提示(仍在进行中!)
updated_prompt = """
<patient_record>
{record}
</patient_record>
"""
提供清晰的指示 #
与 Claude 合作时,提供清晰直接的指示对于实现最佳结果至关重要。就像我们第一次指导人类完成一项任务时一样,我们越能以直截了当的方式准确解释我们想要什么,Claude 的回应就会越好、越准确。
在我们最初的“糟糕”提示中,我们有以下指示:
我有这个病人的病历。你能帮我总结一下吗?
这太模糊了!我们需要提出一套清晰具体的指示。我们到底希望总结是什么样子?
假设我们希望摘要包含以下不同类别的信息:
- 患者姓名
- 患者年龄
- 主要诊断列表
- 患者处方药物列表
- 非药物治疗列表(物理治疗、CBT 等)
- 近期关注事项列表
- 医生重要行动项目列表
指定我们想要的确切输出格式也很重要,因此我们一定要要求 Claude 提供项目符号列表,而不仅仅是通用的“列表”。
这是我们提示的更新版本:
#系统提示
system = """
您是一位经验丰富的医疗专业人士,擅长将复杂的病史转化为简明、可操作的摘要。
您的职责是分析患者记录,识别关键信息,并以清晰、结构化的格式呈现,以帮助诊断和治疗计划。
您的摘要对于忙碌的医疗保健提供者来说非常宝贵,他们需要在预约之前快速了解患者的病史。
"""
#改进的提示(仍在进行中!)
updated_prompt = """
我需要您的帮助,为我们的医生团队总结患者的病历。
我们明天有一系列的后续预约,医生需要快速、有见地的摘要来准备。
每个摘要应按此顺序包含以下元素:
- 患者姓名
- 患者年龄
- 按时间顺序排列的关键诊断项目符号列表
- 患者处方药物的项目符号列表
- 其他药物的项目符号列表治疗:非药物治疗,如 CBT 或物理治疗
- 近期关注事项的简短项目符号列表
- 关键行动项目的项目符号列表,帮助我们的医生为即将到来的患者就诊做好准备
<patient_record>
{record}
</patient_record>
"""
添加示例few shot #
示例是增强 Claude 的表现并指导其产生所需输出的最有力工具之一。通过在我们的提示中提供一些精心制作的示例,我们可以显著提高 Claude 响应的准确性、一致性和质量。这种技术对于高度详细或需要结构化输出或遵守特定格式的任务特别有效。
目前,我们的提示不包含任何示例。为了简洁起见,我们将包含一个示例,但通常最好至少包含两个。
我们将根据以下病史来输入和输出示例:
患者姓名:Ethan Blackwood
年龄:55
医疗记录:
2010 年:年度体检,发现轻度高血压
- 开始改变生活方式(饮食、运动)
2012 年:失业后被诊断为中度抑郁症
- 开始服用舍曲林和认知行为疗法 (CBT)
2014 年:新工作,报告情绪有所改善
- 继续服用舍曲林,减少 CBT 疗程
2015 年:轻度背痛,诊断为早期退行性椎间盘疾病
- 开具物理治疗和非处方 NSAID
2016 年:高血压恶化,开始服用赖诺普利
2017 年:常规结肠镜检查显示良性息肉,在手术过程中切除
2018 年:出现持续性咳嗽,胸部 X 光检查无异常
- 诊断为胃食管反流病 (GERD)
- 开始于奥美拉唑
2019:诊断为阻塞性睡眠呼吸暂停 (OSA)
- 开始 CPAP 治疗,报告能量水平有所提高
2020:COVID-19 大流行,在家工作
- 报告焦虑增加,恢复 CBT 课程(远程医疗)
- COVID-19 疫苗接种(Moderna,两剂)
2021:轻微膝盖疼痛,MRI 显示轻微半月板撕裂
- 建议进行关节镜手术,患者选择保守治疗
2022:年度检查显示糖尿病前期(A1C:6.1%)
- 加强生活方式改变,转诊给营养师
- 由于 GERD 症状缓解,停用奥美拉唑
2023:血液检查显示 PSA(前列腺特异性抗原)升高
- 进行前列腺活检,结果为癌症阴性
- 膝盖疼痛加剧,同意进行关节镜手术
2024:术后膝盖恢复:良好,继续物理治疗
- A1C 水平改善 (5.8%),糖尿病前期症状缓解
- 压力测试正常,但超声心动图显示轻度 LVH
- 开始服用低剂量 ACE 抑制剂以保护心脏
根据此示例输入,遵循我们的提示规则的结构良好的输出可能如下所示:
姓名:Ethan Blackwood
年龄:55
主要诊断:
- 高血压 (2010)
- 抑郁症 (2012)
- 退行性椎间盘疾病 (2015)
- 胃食管反流病 (GERD) (2018)
- 阻塞性睡眠呼吸暂停 (OSA) (2019)
- 糖尿病前期 (2022)
- 半月板撕裂 (2021)
- 左心室肥大 (LVH) (2024)
药物:
- 舍曲林 (抑郁症)
- 赖诺普利 (高血压)
- 奥美拉唑 (GERD) - 2022 年停产
- 低剂量 ACE 抑制剂 (心脏保护 - 2024)
其他治疗:
- 认知行为疗法 (CBT) (抑郁症)
- 物理治疗 (背痛、术后膝关节恢复)
- CPAP 治疗(OSA)
- 关节镜膝关节手术(2023)
近期关注:
- 膝关节疼痛加剧
- PSA 升高(2023)
- 超声心动图显示左心室肥大(2024)
行动项目:
- 术后膝关节恢复和物理治疗的跟进
- 监测 PSA 水平和前列腺健康
- 优化血压和高血压管理
- 评估发现 LVH 后是否需要进一步进行心脏检查
让我们更新提示以包含此示例输入和输出。为了让 Claude 更加清楚,我们将确保将示例包装在 标签内:
#系统提示
system = """
您是一位经验丰富的医疗专业人士,擅长将复杂的病史转化为简明、可操作的摘要。
您的职责是分析患者记录,识别关键信息,并以清晰、结构化的格式呈现,以帮助诊断和治疗计划。
您的摘要对于忙碌的医疗保健提供者来说非常宝贵,他们需要在预约之前快速了解患者的病史。
"""
#改进的提示(仍在进行中!)
updated_prompt = """
我需要您的帮助,为我们的医生团队总结患者的病历。
我们明天有一系列的后续预约,医生需要快速、有见地的摘要来准备。
每个摘要应按此顺序包含以下元素:
- 患者姓名
- 患者年龄
- 按时间顺序排列的关键诊断项目符号列表
- 患者处方药物的项目符号列表
- 其他药物的项目符号列表治疗:非药物治疗,如 CBT 或物理治疗
- 近期关注事项的简短项目符号列表
- 关键行动项目的项目符号列表,帮助我们的医生为即将到来的患者就诊做好准备
以下是我们希望摘要格式的示例:
<example>
<patient_record>
患者姓名:Ethan Blackwood
年龄:55
医疗记录:
2010 年:年度检查,发现轻度高血压
- 开始改变生活方式(饮食、锻炼)
2012 年:失业后被诊断为中度抑郁症
- 开始服用舍曲林和认知行为疗法 (CBT)
2014 年:新工作,报告情绪有所改善
- 继续服用舍曲林,减少 CBT 疗程
2015 年:轻度背痛,诊断为早期退行性椎间盘疾病
- 开具物理疗法和非处方 NSAID
2016 年:高血压恶化,开始赖诺普利
2017 年:常规结肠镜检查显示良性息肉,手术过程中切除
2018 年:出现持续咳嗽,胸部 X 光检查无异常
- 诊断为胃食管反流病 (GERD)
- 开始服用奥美拉唑
2019 年:诊断为阻塞性睡眠呼吸暂停 (OSA)
- 开始 CPAP 治疗,报告能量水平有所改善
2020 年:COVID-19 大流行,在家工作
- 报告焦虑增加,恢复 CBT 治疗(远程医疗)
- COVID-19 疫苗接种(Moderna,两剂)
2021 年:轻微膝盖疼痛,MRI 显示轻微半月板撕裂
- 建议进行关节镜手术,患者选择保守治疗
2022 年:年度检查显示糖尿病前期(A1C:6.1%)
- 加强生活方式改变,转诊给营养师
- 因 GERD 缓解而停用奥美拉唑症状
2023:血液检查显示 PSA(前列腺特异性抗原)升高
- 进行前列腺活检,结果为癌症阴性
- 膝盖疼痛加剧,同意进行关节镜手术
2024:术后膝盖恢复良好,继续进行物理治疗
- A1C 水平改善(5.8%),糖尿病前期得到解决
- 压力测试正常,但超声心动图显示轻度 LVH
- 开始服用低剂量 ACE 抑制剂以保护心脏
</patient_record>
您的输出:
姓名:Ethan Blackwood
年龄:55
主要诊断:
- 高血压(2010 年)
- 抑郁症(2012 年)
- 退行性椎间盘疾病(2015 年)
- 胃食管反流病 (GERD)(2018 年)
- 阻塞性睡眠呼吸暂停 (OSA)(2019 年)
- 糖尿病前期(2022 年)
-半月板撕裂 (2021)
- 左心室肥大 (LVH) (2024)
药物:
- 舍曲林 (抑郁症)
- 赖诺普利 (高血压)
- 奥美拉唑 (GERD) - 2022 年停产
- 低剂量 ACE 抑制剂 (心脏保护 - 2024)
其他治疗:
- 认知行为疗法 (CBT) (抑郁症)
- 物理治疗 (背痛、术后膝关节恢复)
- CPAP 治疗 (OSA)
- 关节镜膝关节手术 (2023)
近期关注:
- 膝关节疼痛加剧
- PSA 升高 (2023)
- 超声心动图显示左心室肥大 (2024)
行动项目:
- 跟进术后膝关节恢复和物理治疗
- 监测 PSA 水平和前列腺健康
- 优化血压和高血压管理
- 评估发现 LVH 后是否需要进一步进行心脏检查
</example>
现在,请以相同格式总结以下患者记录:
<patient_record>
{record}
</patient_record>
"""
输出 XML 结构 #
一种常见的提示策略是要求 Claude 在其响应中使用 XML 标签。这样可以更轻松地最终提取我们关心的确切内容,即使 Claude 决定给我们一个前言,例如“好的,这是您请求的摘要!”或添加其他内容。
在这种情况下,让 Claude 在 标签内生成医疗记录摘要可能是有意义的。一个简单的实现是更新我们的示例更新以向 Claude 显示我们想要的格式。
目前,我们提示的示例部分如下所示:
以下是我们希望摘要格式的示例:
患者姓名:Ethan Blackwood
年龄:55
医疗记录:
2010 年:年度体检,发现轻度高血压
- 开始改变生活方式(饮食、锻炼)
医疗记录已截断,以使此处的文本简短…
您的输出:
姓名:Ethan Blackwood
年龄:55
主要诊断:
- 高血压(2010 年)
摘要已截断,以使此处的文本简短…
通过一个简单的更改,我们可以指示 Claude 应该将输出包装在 标签内:
以下是我们希望摘要格式的示例:
患者姓名:Ethan Blackwood
年龄:55
医疗记录:
2010 年:年度体检,发现轻度高血压
- 开始改变生活方式(饮食、锻炼)
医疗记录已截断以保持此处文本简短…
姓名:Ethan Blackwood
年龄:55
主要诊断:
- 高血压(2010 年)
摘要已截断以保持此处文本简短…
让我们更新提示的示例部分以反映此更改:
#系统提示
system = """
您是一位经验丰富的医疗专业人士,擅长将复杂的病史转化为简明、可操作的摘要。
您的职责是分析患者记录,识别关键信息,并以清晰、结构化的格式呈现,以帮助诊断和治疗计划。
您的摘要对于忙碌的医疗保健提供者来说非常宝贵,他们需要在预约之前快速了解患者的病史。
"""
#改进的提示(仍在进行中!)
updated_prompt = """
我需要您的帮助,为我们的医生团队总结患者的病历。
我们明天有一系列的后续预约,医生需要快速、有见地的摘要来准备。
每个摘要应按此顺序包含以下元素:
- 患者姓名
- 患者年龄
- 按时间顺序排列的关键诊断项目符号列表
- 患者处方药物的项目符号列表
- 其他药物的项目符号列表治疗:非药物治疗,如 CBT 或物理治疗
- 近期关注事项的简短项目符号列表
- 关键行动项目的项目符号列表,帮助我们的医生为即将到来的患者就诊做好准备
以下是我们希望摘要格式的示例:
<example>
<patient_record>
患者姓名:Ethan Blackwood
年龄:55
医疗记录:
2010 年:年度检查,发现轻度高血压
- 开始改变生活方式(饮食、锻炼)
2012 年:失业后被诊断为中度抑郁症
- 开始服用舍曲林和认知行为疗法 (CBT)
2014 年:新工作,报告情绪有所改善
- 继续服用舍曲林,减少 CBT 疗程
2015 年:轻度背痛,诊断为早期退行性椎间盘疾病
- 开具物理疗法和非处方 NSAID
2016 年:高血压恶化,开始赖诺普利
2017 年:常规结肠镜检查显示良性息肉,手术过程中切除
2018 年:出现持续咳嗽,胸部 X 光检查无异常
- 诊断为胃食管反流病 (GERD)
- 开始服用奥美拉唑
2019 年:诊断为阻塞性睡眠呼吸暂停 (OSA)
- 开始 CPAP 治疗,报告能量水平有所改善
2020 年:COVID-19 大流行,在家工作
- 报告焦虑增加,恢复 CBT 治疗(远程医疗)
- COVID-19 疫苗接种(Moderna,两剂)
2021 年:轻微膝盖疼痛,MRI 显示轻微半月板撕裂
- 建议进行关节镜手术,患者选择保守治疗
2022 年:年度检查显示糖尿病前期(A1C:6.1%)
- 加强生活方式改变,转诊给营养师
- 因 GERD 缓解而停用奥美拉唑症状
2023:血液检查显示 PSA(前列腺特异性抗原)升高
- 进行前列腺活检,结果为癌症阴性
- 膝盖疼痛加剧,同意进行关节镜手术
2024:术后膝盖恢复良好,继续物理治疗
- A1C 水平改善(5.8%),糖尿病前期得到解决
- 压力测试正常,但超声心动图显示轻度 LVH
- 开始服用低剂量 ACE 抑制剂以保护心脏
</patient_record>
<summary>
姓名:Ethan Blackwood
年龄:55
主要诊断:
- 高血压(2010 年)
- 抑郁症(2012 年)
- 退行性椎间盘疾病(2015 年)
- 胃食管反流病 (GERD)(2018 年)
- 阻塞性睡眠呼吸暂停 (OSA)(2019 年)
- 糖尿病前期(2022 年)
-半月板撕裂 (2021)
- 左心室肥大 (LVH) (2024)
药物:
- 舍曲林 (抑郁症)
- 赖诺普利 (高血压)
- 奥美拉唑 (GERD) - 2022 年停产
- 低剂量 ACE 抑制剂 (心脏保护 - 2024)
其他治疗:
- 认知行为疗法 (CBT) (抑郁症)
- 物理治疗 (背痛、术后膝关节恢复)
- CPAP 治疗 (OSA)
- 关节镜膝关节手术 (2023)
近期关注:
- 膝关节疼痛加剧
- PSA 升高 (2023)
- 超声心动图显示左心室肥大 (2024)
行动项目:
- 跟进术后膝关节恢复和物理治疗
- 监测 PSA 水平和前列腺健康
- 优化血压和高血压管理
- 评估发现 LVH 后是否需要进一步进行心脏检查
</summary>
</example>
现在,请以相同格式总结以下患者记录:
<patient_record>
{record}
</patient_record>
"""
提示更改小结 #
在我们尝试新的提示之前,让我们先看看我们所做的更改:
- 我们添加了一个清晰的系统提示来设置上下文并赋予 Claude 明确的角色。
- 我们使用 XML 标签(在我们的例子中为 )构造输入数据,以明确提示的哪部分是输入数据。
- 我们提供了关于摘要应关注哪些内容的明确、具体的说明,例如诊断、药物和最近的健康问题。
- 我们指定了摘要所需的格式。
- 我们添加了一个示例输入和相应的格式良好的摘要来指导 Claude 的回复。
- 我们要求 Claude 在 标签内生成摘要。
测试新提示 #
让我们尝试使用我们的新system_prompt和 updated_prompt 提示,并使用我们patient_records 列表中的相同 5 条医疗记录:
def generate_summary_with_improved_prompt(patient_record):
prompt_with_record = updated_prompt.format(record=patient_record) #use our rewritten prompt!
response = client.messages.create(
model="claude-3-sonnet-20240229",
max_tokens=4096,
system=system, #add in our system prompt!
messages=[{"role": "user", "content": prompt_with_record}]
)
print("===============================")
print(response.content[0].text)
generate_summary_with_improved_prompt(patient_records[0])
==================================
姓名:Evelyn Thompson
年龄:78
主要诊断:
- 2 型糖尿病 (1985)
- 高血压 (1992)
- 骨关节炎(1998 年和 2017 年髋关节和膝关节置换术)
- 甲状腺功能减退症 (2000)
- 心房颤动 (2005)
- 维生素 B12 缺乏症 (2008)
- 短暂性脑缺血发作 (TIA) (2011)
- 乳腺癌 (2013)
- 慢性肾病 (CKD) 第 3 期 (2015)
- 肺炎 (2018)
- 轻度认知障碍 (2019)
- 复发性尿路感染(尿路感染)(2021 年)
药物:
- 二甲双胍(糖尿病)
- 赖诺普利(高血压)
- 左旋甲状腺素(甲状腺功能减退症)
- 华法林(心房颤动)
- 阿司匹林(抗血小板)
- 阿那曲唑(乳腺癌复发预防)
- 多奈哌齐(认知障碍)
- 低剂量预防性抗生素(复发性尿路感染)
其他治疗:
- 全髋关节置换术(1998 年)
- 白内障手术(2003 年)
- 维生素 B12 注射(2008 年)
- 乳房肿瘤切除术和放射治疗(乳腺癌,2013 年)
- 全膝关节置换术(2017 年)
- 物理治疗和家庭健康助理(2023 年)
近期担忧:
- 肾功能恶化(eGFR 下降2022 年)
- 行动能力下降(2023 年)
行动项目:
- 监测肾功能并根据需要调整药物
- 继续物理治疗和家庭健康支持
- 评估认知能力下降并调整治疗计划
- 解决行动问题和跌倒风险
- 确保遵守推荐的癌症筛查
效果很好!每个输出都遵循我们指定的规则和格式。滚动回到顶部,查看 Claude 使用我们的初始提示为我们生成的输出类型,并将它们与我们新的一致输出进行比较!
输出切换为JSON格式 #
我们可能非常乐意让 Claude 生成当前提示所导致的文本摘要,但我们通常希望获得更易于通过编程消化的特定结构化响应。最常见的方法是使用 JSON。
注意:最简单的“强制”JSON 响应方法是通过 Claude 的工具使用功能,我们将在工具使用课程的单独课程中介绍此功能。此演示的目的是展示更改提示可能产生的影响。
为了调整我们当前的提示以使其生成 JSON 响应,我们需要进行一些更改:
- 明确告诉 Claude 我们想要 JSON 结果并指定 JSON 输出应包含的内容。
- 将我们的示例摘要更新为 JSON 输出。
# 未更改的系统提示
system = """
您是一位经验丰富的医疗专业人员,擅长将复杂的患者病史转化为简明、可操作的摘要。
您的职责是分析患者记录,识别关键信息,并以清晰、结构化的格式呈现,以帮助诊断和治疗计划。
您的摘要对于需要在预约前快速了解患者病史的繁忙医疗保健提供者来说非常宝贵。
"""
#提示已更新以生成 JSON
updated_json_prompt = """
我需要您的帮助,为我们的医生团队总结患者的病历。
我们明天有一系列后续预约,医生需要快速、有见地的摘要来准备。
请以 JSON 格式提供这些摘要,结构如下:
{
"name": "患者的全名",
"age": 患者的年龄(整数),
"key_diagnoses": [
{
"diagnosis": "主要诊断",
“year”:以整数表示的诊断年份
},
...
],
“medications”:[
{
“name”:"药物名称",
“purpose”:"简要说明其用途"
},
...
],
“other_treatments”:[
{
“treatment”:"治疗名称",
“purpose”:"简要说明其用途"
},
...
],
“recent_concerns”:[
“简要说明最近的健康问题或担忧"
],
“action_items”:[
“行动项目 1”,
“行动项目 2”,
...
]
}
以下是我们希望摘要格式的示例:
<example>
<patient_record>
患者姓名:Ethan Blackwood
年龄:55
医疗记录:
2010 年:年度体检,发现轻度高血压
- 开始改变生活方式(饮食、运动)
2012 年:失业后被诊断出患有中度抑郁症
- 开始服用舍曲林和认知行为疗法 (CBT)
2014 年:新工作,报告情绪有所改善
- 继续服用舍曲林,减少 CBT 疗程
2015 年:轻度背痛,被诊断出患有早期退行性椎间盘疾病
- 开具物理治疗和非处方 NSAID
2016 年:高血压恶化,开始服用赖诺普利
2017 年:常规结肠镜检查显示良性息肉,手术过程中切除
2018 年:出现持续性咳嗽,胸部 X 光检查无异常
- 诊断出患有胃食管反流病 (GERD)
- 开始服用奥美拉唑
2019 年:诊断出患有阻塞性睡眠呼吸暂停 (OSA)
- 开始接受 CPAP 治疗,报告精力水平有所改善
2020 年:COVID-19 大流行,在家工作
- 报告焦虑加剧, CBT 课程恢复(远程医疗)
- COVID-19 疫苗接种(Moderna,两剂)
2021:轻微膝盖疼痛,MRI 显示轻微半月板撕裂
- 建议进行关节镜手术,患者选择保守治疗
2022:年度检查显示糖尿病前期(A1C:6.1%)
- 加强生活方式改变,转诊给营养师
- 由于 GERD 症状缓解,停用奥美拉唑
2023:血液检查显示 PSA(前列腺特异性抗原)升高
- 进行前列腺活检,结果为癌症阴性
- 膝盖疼痛加剧,同意进行关节镜手术
2024:术后膝盖恢复良好,继续物理治疗
- A1C 水平改善(5.8%),糖尿病前期缓解
- 压力测试正常,但超声心动图显示轻度 LVH
- 开始服用低剂量 ACE 抑制剂心脏保护
</patient_record>
<summary>
{
“name”:“Ethan Blackwood”,
“age”:“55”,
“key_diagnoses”:[
{
“diagnosis”:“高血压”,
“year”:“2010
},
{
“diagnosis”:“抑郁症”,
“year”:“2012
},
{
“diagnosis”:“退行性椎间盘疾病”,
“year”:“2015
},
{
“diagnosis”:“胃食管反流病 (GERD)”,
“year”:“2018
},
{
“diagnosis”:“阻塞性睡眠呼吸暂停 (OSA)”,
“year”:“2019
},
{
“diagnosis”:“糖尿病前期”,
“year”:“2022
},
{
“diagnosis”:“左心室肥大(左心室肥大症)”,
“年份”: 2024
}
],
“药物”: [
{
“名称”: “赖诺普利”,
“目的”: “高血压管理”
},
{
“名称”: “舍曲林”,
“目的”: “抑郁症”
},
{
“名称”: “血管紧张素转换酶 (ACE) 抑制剂 (低剂量)”,
“目的”: “心脏保护”
}
],
“其他治疗”: [
{
“治疗”: “认知行为疗法 (CBT)”,
“目的”: “抑郁症管理”
},
{
“治疗”: “物理治疗”,
“目的”: “背痛和膝盖恢复”
},
{
“治疗”: “CPAP 治疗”,
“目的”: “阻塞性睡眠呼吸暂停”
},
{
“治疗”: “关节镜膝关节手术”,
“目的”: “半月板撕裂修复”
}
],
“recent_concerns”:[
“膝盖疼痛加剧,需手术治疗”,
“PSA 升高(2023 年),活检阴性”,
“轻度左心室肥大(2024 年)”
],
“action_items”:[
“跟进术后膝盖恢复和 PT 进展”,
“监测 PSA 水平和前列腺健康”,
“评估 LVH 发现后的心脏健康”,
“检查血压情况
nagement"
]
}
</summary>
</example>
现在,请以相同的格式总结以下患者记录。在 <summary> 标签内输出您的 JSON 摘要
"""
#将此部分分解为其自己的变量,以便以后更轻松地使用 `format` 方法
#(上述提示变量中的 JSON 花括号在使用 `format` 时会导致问题)
medical_record_input_prompt = """
<patient_record>
{record}
</patient_record>
"""
让我们使用以下函数进行测试:
def generate_summary_with_json_prompt(patient_record):
final_prompt_part = medical_record_input_prompt.format(record=patient_record) #add the medical record to the final prompt piece
complete_prompt = updated_json_prompt + final_prompt_part
response = client.messages.create(
model="claude-3-sonnet-20240229",
max_tokens=4096,
system=system, #add in our system prompt!
messages=[{"role": "user", "content": complete_prompt}]
)
print(response.content[0].text)
generate_summary_with_json_prompt(patient_records[0])
<summary>
{
"name": "Evelyn Thompson",
"age": 78,
"key_diagnoses": [
{
"diagnosis": "Type 2 Diabetes",
"year": 1985
},
{
"diagnosis": "Hypertension",
"year": 1992
},
{
"diagnosis": "Osteoarthritis",
"year": 1998
},
{
"diagnosis": "Hypothyroidism",
"year": 2000
},
{
"diagnosis": "Atrial Fibrillation",
"year": 2005
},
{
"diagnosis": "Vitamin B12 Deficiency",
"year": 2008
},
{
"diagnosis": "Transient Ischemic Attack (TIA)",
"year": 2011
},
{
"diagnosis": "Breast Cancer (Stage 2)",
"year": 2013
},
{
"diagnosis": "Chronic Kidney Disease (CKD Stage 3)",
"year": 2015
},
{
"diagnosis": "Mild Cognitive Impairment",
"year": 2019
}
],
"medications": [
{
"name": "Metformin",
"purpose": "Diabetes management"
},
{
"name": "Lisinopril",
"purpose": "Hypertension management"
},
{
"name": "Levothyroxine",
"purpose": "Hypothyroidism treatment"
},
{
"name": "Warfarin",
"purpose": "Anticoagulant for atrial fibrillation"
},
{
"name": "Vitamin B12 Injections",
"purpose": "B12 deficiency treatment"
},
{
"name": "Aspirin",
"purpose": "Antiplatelet therapy after TIA"
},
{
"name": "Anastrozole",
"purpose": "Breast cancer recurrence prevention"
},
{
"name": "Donepezil",
"purpose": "Treatment for mild cognitive impairment"
},
{
"name": "Prophylactic Antibiotics",
"purpose": "Prevention of recurrent UTIs"
}
],
"other_treatments": [
{
"treatment": "Total Hip Replacement",
"purpose": "Osteoarthritis management"
},
{
"treatment": "Cataract Surgery",
"purpose": "Vision improvement"
},
{
"treatment": "Lumpectomy and Radiation",
"purpose": "Breast cancer treatment"
},
{
"treatment": "Total Knee Replacement",
"purpose": "Osteoarthritis management"
},
{
"treatment": "IV Antibiotics",
"purpose": "Treatment for pneumonia"
},
{
"treatment": "Physical Therapy",
"purpose": "Mobility and functional improvement"
},
{
"treatment": "Home Health Aide",
"purpose": "Assistance with activities of daily living"
}
],
"recent_concerns": [
"Declining mobility and functional status",
"Worsening kidney function (eGFR)",
"Recurrent urinary tract infections (UTIs)"
],
"action_items": [
"Review diabetes and hypertension management",
"Monitor kidney function and adjust medications as needed",
"Optimize mobility and functional status through PT and home care",
"Assess cognitive status and efficacy of donepezil",
"Evaluate risk for falls and need for additional safety measures"
]
}
</summary>
太好了,我们得到了想要的 JSON!为了演示我们的新 JSON 响应有多么容易使用,让我们编写一个函数,为一批患者生成患者摘要,然后输出给定医生在一天的预约中可能需要的所有“行动项目”的列表:
import re
import json
def generate_summary_with_json_prompt(patient_record):
final_prompt_part = medical_record_input_prompt.format(record=patient_record) #add the medical record to the final prompt piece
complete_prompt = updated_json_prompt + final_prompt_part
response = client.messages.create(
model="claude-3-sonnet-20240229",
max_tokens=4096,
system=system, #add in our system prompt!
messages=[{"role": "user", "content": complete_prompt}]
)
return response.content[0].text
def extract_json_from_summary_tags(summary_string):
# Use regular expressions to find content between <summary> tags
match = re.search(r'<summary>\s*(.*?)\s*</summary>', summary_string, re.DOTALL)
if not match:
print("No <summary> tags found in the input string.")
return
# Extract the JSON string
return match.group(1)
def extract_action_items(model_response):
summary = extract_json_from_summary_tags(model_response)
try:
# Parse the JSON string
summary_data = json.loads(summary)
# Extract and print action items
action_items = summary_data.get('action_items', [])
patient_name = summary_data.get('name', "")
print(f"Action Items for {patient_name}:")
for idx, item in enumerate(action_items, 1):
print(f"{idx}. {item}")
except json.JSONDecodeError:
print("Failed to parse JSON. Make sure the content between <summary> tags is valid JSON.")
def generate_daily_action_items(patient_records):
# Takes a list of patient records, generates a summary for each, and prints the action items:
for record in patient_records:
summary = generate_summary_with_json_prompt(record)
extract_action_items(summary)
generate_daily_action_items(patient_records)
Evelyn Thompson 的行动项目:
1. 监测肾功能并根据需要调整药物
2. 评估认知状态并优化治疗
3. 评估行动能力和家庭安全,考虑使用辅助设备
4. 跟进乳腺癌监测和预防
Marcus Reyes 的行动项目:
1. 密切监测心理健康,确保有足够的支持系统
2. 评估更新的药物治疗方案的有效性
3. 继续生活方式和糖尿病管理(饮食、运动)
4. 跟进足底筋膜炎的物理治疗
5. 为患者和家人提供与心理健康相关的资源
Lily Chen 的行动项目:
1. 评估当前的教育和治疗需求
2. 监测人工耳蜗植入后的听力和言语进展
3. 评估心脏状态和未来干预的需要
4. 继续密切的发展监测和支持
Jason Tran 的行动项目:
1. 监测哮喘控制和药物依从性
2. 评估心理健康状况和治疗进展
3. 评估睡眠质量和 CPAP 依从性
4. 鼓励逐步恢复低冲击运动
5. 讨论运动相关头部损伤的可能性
Amira Khan 的行动项目:
1. 监测器官系统受累情况并调整治疗
2. 管理类固醇诱发的糖尿病和心血管风险因素
3. 提供孕前咨询并协调高风险产科护理
4. 优化物理治疗和生活方式改变