医嘱信息提取系统2 - 题解

一、题目分析

本题要求从医嘱文本中解析用药信息,输出嵌套JSON:

  • drug_metadata:药品元数据(名称、分类、包装规格、优先级覆盖标记)
  • theoretical_total:理论用量(需分段累加计算)
  • final_dispense:最终发药(向上取整到整板)

涉及药品分类判定、分段给药计算、整板发药三个核心计算模块。

二、难点分析

  1. "总共X天" vs "再吃X天"语义差异:这是本题最大陷阱。"总共7天"中首剂占第1天,需减1;"再吃7天"是额外天数,不需要减。LLM极易混淆两者。
  2. 抗生素关键词的子串匹配阿莫西林含"西林"是抗生素,但阿司匹林含"匹林"不含"西林",不是抗生素。模型容易做模糊匹配。
  3. 优先级覆盖标记:当药名同时含抗生素和缓控释关键词时,分类按抗生素(pack_size=6),但需额外标记is_priority_override=true。这是一个容易遗漏的联动字段。
  4. 多段给药的累加计算:如"前2天2片qd + 之后1片qd再吃7天",需要正确识别分段边界并分别计算再求和。

三、Prompt设计思路

3.1 "总共" vs "再吃"对比教学

这是prompt设计的核心。用两组对比示例直接展示差异:

  • "总共7天":首剂3片 + 1片x(7-1)天 = 9。明确标注"不是3+7=10!"
  • "再吃7天":前2天用量 + 后7天用量 = 11。明确标注"不是减去前面的2天!"

通过正确答案+错误答案对比,让模型建立正确的语义映射。

3.2 抗生素关键词精确匹配

逐一列出4个关键词(霉素/沙星/头孢/西林),并用注释标注易混淆项:

  • "左氧氟沙星"含"沙星" -> 是抗生素
  • "阿司匹林"含"匹林"不含"西林" -> 不是抗生素

3.3 五个完整计算示例

覆盖所有关键场景:

  • 同时含抗生素+缓释关键词(阿奇霉素缓释片)
  • "阿司匹林"的反例(不是抗生素)
  • "总共吃1周"的首剂场景
  • "再吃X天"的额外天数场景
  • 三段给药的复杂累加(泼尼松缓释片)

3.4 频次映射表前置

将qd/bid/tid/qid/qn的频次映射集中呈现,避免模型在计算时猜测频次含义。

四、关键技巧

  1. 反例标注:在计算示例中用"不是X!"标注常见错误答案,主动预防误解。
  2. 优先级用检查顺序表达:"先检查抗生素关键词(优先级最高!)",用步骤顺序代替抽象优先级描述。
  3. ceil函数显式写出ceil(14/6)=3板(14/6=2.33->3),展示除法结果和取整过程。
  4. 子串匹配而非语义匹配:强调"药名包含'沙星'"是字面子串检查,避免模型做药理学推断。
  5. 完整计算链展示:每个示例从drug_name到final_dispense全流程展示,确保模型理解步骤依赖关系。