超说明书用药循证证据双模型审核
本技能用于医院药学部门的超说明书用药循证证据审核工作流:
输入文献信息 → 识别研究类型 → 双模型并行评价 → 差异对比 → 人工确认 → 输出Excel审核表。
工作流程总览
用户输入文献 → Step 1: 收集信息 → Step 2: 双厂商模型并行评价
├─ 模型A: DeepSeek (Jadad/MINORS + Thomson)
└─ 模型B: 火山方舟(豆包) (Jadad/MINORS + Thomson)
↓
Step 3: 自动差异对比
↓
Step 4: 生成Excel审核表
↓
呈现给用户 → 人工复核确认
Step 1: 收集输入信息
向用户收集以下必填信息(缺一不可,缺失则逐一询问):
| 字段 | 说明 | 示例 |
|---|---|---|
| 文献标题 | 完整的文献标题 | "Efficacy and Safety of...in Patients with..." |
| 研究类型 | RCT / Non-RCT / Meta分析 / 系统评价 / 指南 / 病例报告 | Non-RCT(前瞻性队列研究) |
| 文献全文 | PDF上传或文本粘贴(摘要+方法+结果) | — |
| 申请科室 | 申请备案的临床科室 | 血液科 |
| 备案项目 | 药品通用名 + 用于 + 适应症 | 利妥昔单抗用于难治性免疫性血小板减少症 |
| 必要性分级 | 1级 / 2级 / 3级 | 2级 |
研究类型自动识别
根据用户提供的文献信息自动判断研究类型:
- 描述为"随机对照""randomized controlled trial""RCT" → RCT
- 描述为"队列研究""病例对照""回顾性""观察性""单臂" → Non-RCT
- 描述为"Meta分析""荟萃分析""系统评价""systematic review" → Meta分析/系统评价
- 描述为"指南""guideline""共识""consensus" → 指南
- 描述为"病例报告""case report""个案" → 病例报告
识别后向用户确认再继续。
若用户上传PDF文件:使用 MarkItDown 将PDF转为文本后再提取上述信息。
Step 2: 双厂商模型并行评价
这是本技能的核心步骤。通过 scripts/run_dual_review.py 真正调用两个不同厂商的 API(DeepSeek + 火山方舟/豆包),对同一文献独立评价,互不干扰。不同厂商模型的训练数据与偏见不同,互查比同框架双变体更抗偏倚。
评价任务定义(两个Agent执行相同任务)
每个Agent执行以下4个子任务:
任务2.1 — 选择评价量表
- RCT → 使用 Jadad 量表(0-5分),参考 references/jadad_scale.md
- Non-RCT → 使用 MINORS 量表(前8条0-16分/全12条0-24分),参考 references/minors_scale.md
- Meta分析/系统评价 → 使用 AMSTAR2 核心条目 + Jadad评价纳入研究
- 指南 → 使用 AGREE II 关键维度评价
- 病例报告 → 直接评为低质量证据
任务2.2 — 逐条方法学质量评分
- 逐条打分,每条评分必须引用原文具体描述作为依据
- 强制要求:每条评分必须附带原文直接引语(英文文献需引用英文原文),不得只概括
- 强制要求:每条必须注明引语在原文中的具体位置(如"Abstract第2句""Methods第2.1段""Results第3.2段"等)
- 注明原文中哪一段话支持该评分
- 汇总总分和质量等级(高/中/低)
- RCT Jadad示例输出:
1. 随机序列产生:2分
原文出处:"randomly assigned using a computer-generated random number table"(Methods第2段)
2. 随机化隐藏:1分
原文出处:原文提及"sealed envelopes"(Methods第2段),但未说明是否不透光
3. 盲法:2分
原文出处:"double-blind, placebo-controlled",描述了安慰剂制备过程"identical in appearance"(Methods第3段)
4. 撤出与退出:1分
原文出处:"Of the 120 patients, 8 (6.7%) withdrew...reasons were..."(Results第1段)
总分:5分 — 高质量
⚠️ MINORS 易错点护栏(必须严格区分,避免模型误判)
- 条目7「失访率<5%」≠「疗效终点可评价人数」:
- "Loss to follow-up(失访)" 指患者失联、结局无法追踪(outcomes unknown / uncontactable)。
- 若研究描述所有患者均有明确的治疗终止/退出原因记录(如手术、疾病进展、撤回知情同意、疫情旅行限制等),即使仅部分患者可评价疗效(evaluable for efficacy),也不等于"失访"。
- 典型误判:看到 "only eight patients were evaluable for efficacy" 就判为"失访率高→0分"是错误的。该句只说明疗效终点数据不完整(attrition / 可评价性不足),不等于患者失联。
- 正确做法:去 Results/Discussion 中查找是否报告了每例患者的去向与原因。若全部有记录、无人失联 → 失访率=0%,应评 2 分(或按原文实际比例),并引用"all patients discontinued treatment including..."等原句。
- 仅在原文确实出现患者失联/无法追踪结局、或完全未描述失访情况时,才评 0 分。
- 条目6「随访时间充足」:以中位随访时间是否≥主要/关键次要终点的中位事件发生时间为准。若中位 OS 因随访不足而"not estimable",可判为"部分充足(1分)";若 PFS/ORR/DCR 等关键终点均已可估计,倾向于"充足(2分)"。该项 1↔2 均属可辩护区间,两模型可保留分歧。
- 条目2「纳入患者连贯性」:标准(年龄/分期/PS/器官功能等)报告充分即倾向 2 分;仅当完全未描述入排标准时才评 0 分。
任务2.3 — Thomson有效性分级
根据 references/thomson_classification.md 判定为 Class I/IIa/IIb/III:
| Thomson分级 | 有效等级 | 证据等级 | 证据来源 | 建议倾向 |
|---|---|---|---|---|
| Class I | 治疗有效 | A类 | 多个、设计良好、大规模的RCT;RCT荟萃分析 | 推荐使用 |
| Class IIa | 证据支持有效 | B类 | 小规模/有显著缺陷的RCT;结论冲突的RCT荟萃分析;非随机试验;非随机研究 | 可以推荐 |
| Class IIb | 有效性具有争议 | C类 | 专家意见或共识;个案报道或系列案例 | 可以考虑 |
| Class III | 治疗无效 | 无证据 | 没有证据 | 不推荐 |
关键边界:前瞻性单臂研究、非随机对照研究、队列研究、病例对照研究等均属于 Class IIa / B类;只有专家意见、个案报道、系列案例才归入 Class IIb / C类。
- 需引用原文数据支持分级结论
- 说明有效性和安全性证据的充分程度
任务2.4 — 提取关键证据摘要
- 提取研究的核心结论(含效果数据 + 安全性数据)
- 指南类证据:摘录与申请用法直接相关的推荐意见
- 摘要不超过200字
- 尽可能引用原文关键数据
并行执行方式(调用真实厂商 API)
通过 scripts/run_dual_review.py 真正调用两个不同厂商的 API,实现厂商级独立审核:
- 模型A:DeepSeek —— 调用
https://api.deepseek.com(OpenAI 兼容),默认模型deepseek-chat(可改deepseek-reasoner) - 模型B:火山方舟(豆包) —— 调用
https://ark.cn-beijing.volces.com/api/v3(OpenAI 兼容),模型为你自己的 endpoint id(如ep-2025xxxx)或可用模型名(如douabao-seed-1.6-250615)
两模型使用完全相同的文献全文与评价指令(references/reviewer_prompt.md 模板,文献以 {LITERATURE} 占位符注入),独立输出 MINORS/Jadad + Thomson 评价,每条评分均附原文直接引语与出处。
API 密钥配置(首次使用前必做)
在技能目录新建 config.json(不要提交/分享,打包 zip 时排除):
{
"deepseek_api_key": "你的 DeepSeek Key",
"deepseek_base_url": "https://api.deepseek.com",
"deepseek_model": "deepseek-chat",
"ark_api_key": "你的火山方舟 Key",
"ark_base_url": "https://ark.cn-beijing.volces.com/api/v3",
"ark_model": "你的方舟 endpoint id 或模型名"
}
也可改用环境变量 DEEPSEEK_API_KEY / ARK_API_KEY / ARK_MODEL 等(环境变量优先级高于 config.json)。参考模板见 config.example.json。
运行命令
python scripts/run_dual_review.py \
--literature <PDF提取的全文文本.txt> \
--out dual_review_result.json
脚本会解析两模型返回的 ##EVALUATION_JSON##,写入 dual_review_result.json(含 model_a / model_b 两份结构化结果 + meta)。若某模型调用失败,对应字段写入 _error 并以非零退出码结束,便于排查。
两模型使用完全相同的文献信息和评价指令,独立完成评价。脚本运行完毕即可读取结果。
模型输出格式要求(必须严格遵守,确保结构化对比)
每个模型必须在输出末尾附加一个 ##EVALUATION_JSON## 结构化代码块,格式如下:
对于Non-RCT/MINORS量表:
##EVALUATION_JSON##
{
"scale": "MINORS",
"items": [
{"id": 1, "name": "研究目的", "score": 2, "quote": "[原文直接引语]", "quote_location": "[Methods第1段]", "reasoning": "[评分理由]"},
{"id": 2, "name": "患者连贯性", "score": 1, "quote": "[原文直接引语]", "quote_location": "[Methods第2段]", "reasoning": "[评分理由]"},
...
],
"total_score": 8,
"max_score": 16,
"quality_level": "中等",
"thomson_class": "IIa",
"thomson_level": "B级",
"thomson_quote": "[支持分级的原文数据描述]",
"thomson_reasoning": "[分级理由]",
"evidence_summary": "[≤200字摘要]"
}
对于RCT/Jadad量表:
##EVALUATION_JSON##
{
"scale": "Jadad",
"items": [
{"id": 1, "name": "随机序列产生", "score": 2, "quote": "[原文直接引语]", "quote_location": "[位置]", "reasoning": "[评分理由]"},
{"id": 2, "name": "随机化隐藏", "score": 1, "quote": "[原文直接引语]", "quote_location": "[位置]", "reasoning": "[评分理由]"},
{"id": 3, "name": "盲法", "score": 2, "quote": "[原文直接引语]", "quote_location": "[位置]", "reasoning": "[评分理由]"},
{"id": 4, "name": "撤出与退出", "score": 1, "quote": "[原文直接引语]", "quote_location": "[位置]", "reasoning": "[评分理由]"}
],
"total_score": 5,
"max_score": 5,
"quality_level": "高",
"thomson_class": "I",
"thomson_level": "A级",
"thomson_quote": "[支持分级的原文数据]",
"thomson_reasoning": "[分级理由]",
"evidence_summary": "[≤200字摘要]"
}
JSON 字段说明:
- quote:原文直接引语(英文文献保留英文原文),不得省略或只概括。即便条目评为0分(未报告/不适用),也必须写明原文相关描述或注明"原文未描述[具体查找范围]"
- quote_location:引语在原文中的位置(如 "Methods第2段"、"Abstract"、"Results第3段"),每条必填
- reasoning:将该原文证据映射到量表评分标准的推理过程
- thomson_quote:支持Thomson分级的核心原文数据或描述
- thomson_reasoning:分级推理过程
- 严禁编造不存在的引语——每条引语必须可追溯到文献原文
参考标准注入
以下关键标准已内联于 references/reviewer_prompt.md(脚本会自动注入到每次模型调用的 user prompt 中)。此处列出供核对,修改量规时请同步更新 reviewer_prompt.md:
Jadad量表核心(来自 references/jadad_scale.md):
随机序列产生(0-2):恰当2/不清楚1/不恰当0
随机化隐藏(0-2):恰当2(中心控制/不透光密封信封)/不清楚1/不恰当0
盲法(0-2):恰当2(安慰剂双模拟)/不清楚1/不恰当0
撤出与退出(0-1):描述数目和理由1/未描述0
质量等级:4-5分=高 / 2-3分=中 / 0-1分=低
MINORS量表核心(来自 references/minors_scale.md):
前8条(0-16分): 研究目的/患者连贯性/数据收集/终点指标/客观评价/随访时间/失访率/样本量
有对照组时加后4条(0-8分): 对照组选择/同步性/基线可比/统计分析
每条0-2分,高质量≥12(有对照≥16),中等8-11(有对照12-15),低<8(有对照<12)
Thomson分级(来自 references/thomson_classification.md):
Class I(A级): 多个设计良好RCT / RCT荟萃分析 → 推荐使用
Class IIa(B级): 小规模/有缺陷RCT;非随机试验;非随机研究 → 可以推荐
Class IIb(C级): 专家意见或共识;个案报道或系列案例 → 可以考虑
Class III(D级): 没有证据 → 不推荐
Step 3: 逐条评分对比与差异分析
读取 dual_review_result.json 中 model_a / model_b 两份结果后,逐条展示全部条目的评分、原文出处和评分依据,同时标注差异项。
⭐ 核心原则:全部条目均需展示原文出处
无论两模型评分是否一致,每条评分必须附带各自的英文原文直接引语和出处位置,这是本次审核的核心质量控制环节——用户需要核对每条评分的原文依据是否真实、准确、完整。
对比项目
| 对比维度 | 标记规则 |
|---|---|
| 量表各条目评分 | 全部条目逐条展示,标注是否一致(✓/⚠️) |
| 特别关注条目 | 分配隐藏、盲法、样本量估算等关键条目重点标注 |
| 总分 | 总分差≥2分 → "⚠️显著差异" |
| 质量等级 | 不一致 → "⚠️等级差异" |
| Thomson有效性分级 | 不一致 → "⚠️分级差异" |
| 关键证据摘要 | 结论性内容不一致 → 标注 |
逐条评分对比报告格式
生成完整的逐条评分对比报告,全部条目均需展示原文出处。差异条目用 ⚠️ 标记,一致条目用 ✓ 标记,但一致条目也必须列出完整原文出处——用户需要核对模型引用的原文是否准确:
【双模型逐条评分对比报告】
════ 文献信息 ════
标题:[文献标题]
研究类型:[RCT/Non-RCT/Meta分析等]
评价量表:[Jadad/MINORS/AMSTAR2]
════ 方法学质量评分逐条对比 ════
条目1:[条目名称]
模型A:[X]分
原文出处:"[英文原文直接引语]"([Abstract/Methods第X段/Results第X段/Discussion第X段])
评分依据:[将原文证据映射到量表标准的推理]
模型B:[X]分
原文出处:"[英文原文直接引语]"([位置])
评分依据:[推理]
→ ✓ 一致
条目2:[条目名称]
模型A:[X]分
原文出处:"[原文引语]"([位置])
评分依据:[推理]
模型B:[X]分
原文出处:"[原文引语]"([位置])
评分依据:[推理]
→ ⚠️ 差异(X分):[差异原因简述]
...(全部条目均按此格式展示)...
──────────────────────────────────────
总分对比:模型A=X vs 模型B=X [✓/⚠️]
质量等级:模型A=[高/中/低] vs 模型B=[高/中/低] [✓/⚠️]
════ Thomson有效性分级对比 ════
模型A:Class [I/IIa/IIb/III]([A/B/C/D]级)
原文依据:"[核心疗效/安全性数据]"
分级理由:[解释为何符合该分级]
模型B:Class [I/IIa/IIb/III]([A/B/C/D]级)
原文依据:"[核心疗效/安全性数据]"
分级理由:[解释为何符合该分级]
→ [✓ 一致 / ⚠️ 分级差异]
════ 综合判定建议 ════
差异条目数:X/Y
关键差异:有/无
采纳建议:[推荐模型A/模型B/折中方案] 评分X分,理由:[说明]
质量重点核对项(用户视角)
对比报告呈现后,引导用户关注以下核对点:
- 每条原文引语是否真实存在于文献原文中(防止模型幻觉)
- 评分依据是否与量表标准逻辑自洽(防止评分漂移)
- 差异条目的两模型推理路径是否有实质分歧(需人工裁定)
差异处理策略
- 一致条目(无差异):仍需展示原文出处,供用户核对引用准确性
- 总分差1分:优先采纳评分有原文引用支持的模型
- 总分差≥2分:标注为"⚠️显著差异",人工裁定
- 关键条目不一致:标注为"⚠️关键差异",人工裁定
- 分级不一致:标注为"⚠️分级差异",人工裁定
- 无差异或差异不影响结论:直接输出
对比报告必须呈现给用户,用户确认最终结果后再生成Excel。
差异处理策略
- 总分差1分:优先采纳评分有原文引用支持的模型
- 总分差≥2分:标注为"⚠️显著差异",人工裁定
- 关键条目不一致:标注为"⚠️关键差异",人工裁定
- 分级不一致:标注为"⚠️分级差异",人工裁定
- 无差异或差异不影响结论:直接输出
差异报告必须呈现给用户,由用户确认最终结果后再生成Excel。
Step 4: 生成Excel审核表
用户确认评价结果后,生成JSON数据并使用 scripts/generate_review_excel.py 生成Excel文件。
4.1 构建数据JSON
创建临时JSON文件(如 /tmp/review_data.json),格式:
{
"entries": [
{
"department": "血液科",
"project": "利妥昔单抗用于难治性ITP",
"necessity_level": "2级",
"evidence_citation": "Author A, et al. Title. Journal. 2024;50(3):123-130.",
"evidence_summary": "该研究为前瞻性队列研究,纳入XX例...(<=200字)",
"evidence_level": "B级",
"rationality": "合理",
"opinion": "【必要性描述】临床在该疾病的治疗中有替代方案..."
}
],
"comparison_report": {
"has_significant_diff": false,
"summary": "两个模型评价结果基本一致",
"details": [
"Jadad总分:模型A=5 vs 模型B=4(差1分,模型A的评分依据更充分)",
"Thomson分级一致:均为Class IIa(B级)"
]
},
"scoring_comparison": {
"scale": "MINORS",
"total_range": "0-16",
"items": [
{
"id": 1, "name": "研究目的",
"score_a": 2, "quote_a": "[原文直接引语]", "reasoning_a": "[评分理由]",
"score_b": 2, "quote_b": "[原文直接引语]", "reasoning_b": "[评分理由]",
"diff": false, "diff_label": ""
},
{
"id": 2, "name": "患者连贯性",
"score_a": 1, "quote_a": "[原文直接引语]", "reasoning_a": "[评分理由]",
"score_b": 1, "quote_b": "[原文直接引语]", "reasoning_b": "[评分理由]",
"diff": false, "diff_label": ""
}
],
"total_score_a": 8, "total_score_b": 8,
"quality_level_a": "中等", "quality_level_b": "中等",
"thomson_class_a": "IIa", "thomson_level_a": "B级",
"thomson_quote_a": "[支持分级的原文数据]",
"thomson_reasoning_a": "[分级理由]",
"thomson_class_b": "IIa", "thomson_level_b": "B级",
"thomson_quote_b": "[支持分级的原文数据]",
"thomson_reasoning_b": "[分级理由]",
"adopted_score": 8,
"adopted_quality": "中等",
"adopted_thomson_class": "IIa",
"adopted_thomson_level": "B级",
"adopted_reasoning": "两模型评价完全一致,采纳共识评分"
}
}
scoring_comparison 字段说明:
- items[]:逐条评分对比,每项含两模型的评分、原文直接引用出处和推理理由
- quote_a/quote_b:原文直接引语(英文文献保留英文原文),不得省略或只概括
- reasoning_a/reasoning_b:将该原文证据映射到量表评分标准的推理过程
- diff:该条目两模型评分是否不一致(true/false)
- diff_label:差异级别标记(空=一致,"显著差异"/"关键差异"/"等级差异")
- adopted_*:人工确认后最终采纳的评价结果
- thomson_quote_*:各模型进行Thomson分级所依据的原文核心数据
4.2 字段填充规则
循证医学证据(E列):
- 指南格式:[学会名称]. [指南名称]([年份])
- 文献格式:[作者]. [标题]. [期刊]. [年份];[卷]([期]):[页码]
- 多个证据源用分号隔开
证据简述(F列):
- ≤200字
- 指南证据:摘录与申请用法直接相关的推荐意见
- 文献证据:摘录研究结论(效果数据 + 安全性数据)
证据等级(G列):
- 根据 references/evidence_grading.md 判定为 A/B/C/D 级
- 综合方法学质量 + Thomson分级确定
合理性(H列):
- 合理:A/B级证据 + 必要性1/2级,获益>风险
- 不合理:D级证据 或 获益<风险
- 待定:C级证据 + 必要性3级,或证据间有矛盾
药学初审意见(I列):三段式模板:
【必要性描述】
{根据必要性分级选择模板}
【证据描述】
{根据证据等级选择模板}
【建议】
{根据综合判断选择建议}
- 必要性描述模板(见
references/necessity_grading.md) - 证据描述模板:
- A/B级:
该备案项目具有【A/B】级证据支持,[概括证据结论],其预期临床获益明确且大于潜在风险,符合患者病情需要。 - C级:
目前提供的证据等级为【C】级,[概括证据结论],证据强度不足,缺乏高质量的临床研究支持。 - D级:
目前提供的证据等级为【D】级,按照我院管理规定,不予上会。 - 建议模板:同意备案 / 暂缓备案 / 原则同意,提交伦理审查后备案 / 不予上会
审核人(J列):留空,供人工填写。
4.3 运行脚本生成Excel
python scripts/generate_review_excel.py /tmp/review_data.json "超说明书用药审核表_{备案项目简称}_{日期}.xlsx"
确保先安装 openpyxl:
pip install openpyxl
4.4 输出呈现
生成Excel后,使用 present_files 呈现给用户,同时附上差异报告摘要和关键判定说明。
质量控制检查清单
生成最终输出前确认:
- [ ] 全部条目(含一致条目)均在对比报告中展示了原文出处和评分依据
- [ ] Jadad/MINORS每条评分均有原文引用依据(英文文献保留英文原文引语)
- [ ] 每条原文引语均可在文献全文中追溯验证(防止模型幻觉/捏造引用)
- [ ] Thomson分级引用了原文数据支持
- [ ] 差异条目已用 ⚠️ 标记,一致条目已用 ✓ 标记
- [ ] 「双模型评分详情」工作表包含所有评分条目及其原文出处
- [ ] 证据简述<=200字且包含核心数据
- [ ] 药学初审意见包含完整三段式模板
- [ ] 合理性判定与证据等级+必要性分级逻辑一致
- [ ] Excel包含全部6个工作表(审核表、双模型评分详情、证据等级、必要性分级、GRADE、伦理审查)
- [ ] Excel格式(字体/颜色/边框/冻结)符合模板规范
- [ ] 双模型评分详情表中差异条目已用黄色/粉色高亮标记
- [ ] 用户已确认最终结果
注意事项
- 双厂商模型并行是关键差异化特征——必须在Step 2通过脚本同时调用 DeepSeek + 火山方舟(豆包) 两个厂商 API(非同框架双变体)
- 差异报告必须呈现给用户,待确认后再生成Excel——不可跳过人工复核环节
- 评分引用原文是质量控制的核心——每条评分都必须注明原文依据
- 若文献为中文,评价仍使用中文进行,Excel输出使用中文
- 若用户同时提交多篇文献,逐篇独立评价后汇总到同一个Excel的多行中
- 生成的JSON临时文件在使用后应清理