Install any skill in seconds. Free to start, no credit card required.
Get Started Free →抓中国权威医学指南正文(CSCO / NCCN 中文版 / NMPA / CDE / NHC)并返回结构化"治疗推荐表"。当用户做中国市场的疾病调研、需要 I 级证据来源、或需要交叉验证治疗方案推荐是否符合 CSCO 指南时使用。v2 (2026-04-26):Cite-or-Block 升级 — 加 sources_dir 参数完整存档原文 + locate_section_in_guideline 函数,与 citation-anchor-resolver 联动。Iron Law:locale=zh-CN+geo=CN 时本 skill 在 PubMed 召回之前必跑,所有治疗方案推荐必须命中指南 I 级 ≥ 1 个。Fetches Chinese authoritative clinical guidelines (CSCO, NCCN-zh, NMPA, CDE, NHC) and returns structured "treatment recommendation tables". MUST run before PubMed recall when locale=zh-
.claude/skills/ethanyoq-cn-clinical-guidelines-fetch/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 69% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 352% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 431% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 140% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 140% | 0% |
抓中国权威医学指南正文,转成结构化"治疗推荐表"。供 orchestration 流水线在召回阶段之前调用,作为 I 级证据来源。只做指南抓取与 cross-check,不做检索、不做证据评分、不做 LP 嵌入。
> 中国市场调研 (locale=zh-CN + market_geo=CN) 时本 skill 必跑,且必须在 PubMed 召回之前。 > > 报告里所有治疗方案推荐必须命中指南 I 级 ≥ 1 个药; > 否则 cross_check_treatment_recommendations 返回 severity=critical, > orchestration 必须强制重生成或把 §"治疗方案" 改为 placeholder + 红色警告。 > > 指南证据等级:Practice Guideline = I 级证据,凌驾于 PubMed 任何 RCT / Meta / SR。 > 报告里所有治疗方案推荐必须以指南为锚,PubMed 文献只能补充"机制 / 真实世界数据 / 罕见亚群"。
触发场景:
不要使用本 skill:
| 上游 / 下游 skill | 协作方式 | |------------------|----------| | disease-market-sizing-orchestration | 调用方,市场调研 Step 0(在 Step 1 召回之前)调本 skill | | pubmed-eutils | 下游,本 skill 先跑,PubMed 召回作为补充证据 | | medical-evidence-grading | 下游,把本 skill 抓的指南打 I 级标签(最高) | | nmpa-drug-registry-lookup(A5) | 同级 / 替换,本 skill 的 _nmpa.py 当前是 minimal stub,A5 stable 后 refactor 复用 |
pythondef fetch_chinese_guidelines( disease: str, # e.g. "ALK 融合阳性非小细胞肺癌" year_max: int | None = None, # None = 最新版 sources: list[str] | None = None, # None = 全部 5 源 cache_dir: Path | None = None, # .cache/<slug>/guidelines/ sources_dir: Path | None = None, # v2: 原文存档目录,对接 A11 ) -> dict: """返回结构化指南数据。 Returns: { "csco": {"version": "2024", "url": "...", "treatment_table": [...]}, "nccn_zh": {...}, "nmpa_drug_status": [{"drug":"阿来替尼","approval":"2018-08","indications":[...]}, ...], "cde": {...}, "nhc": {...}, "fetched_at": "ISO 8601", "sources_attempted": [...], "sources_succeeded": [...], "source_errors": {"csco": "..."}, # 仅在某源失败时 } """
sources 可选项:["csco", "nccn_zh", "nmpa", "cde", "nhc"]。CSCO 默认最高优先级。
pythondef cross_check_treatment_recommendations( proposed_recs: list[dict], # [{"line": "1L", "drugs": [...]}] guidelines: dict, # fetch 返回的指南数据 ) -> dict: """检查 proposed_recs 是否命中指南 I 级推荐。 Returns: { "ok": bool, "guideline_hits": [{"line":"1L","drug":"洛拉替尼"}, ...], "missing_guideline_drugs": [...], # 指南 I 级有 但 proposed 漏 "extra_drugs_not_in_guideline":[...], # proposed 写了但指南没有 "violation_severity": "none" | "warning" | "critical", } """
严重性规则:
critical = 任意 line 上指南 I 级药物 → proposed 完全没命中warning = 部分命中(>= 1 个但不全)none = 全部命中 / 指南没数据pythondef locate_section_in_guideline( source_id: str, # e.g. "CSCO-2024-NSCLC" section: str, # e.g. "§5.5.2" sources_dir: Path | str, # 原文存档目录 ) -> dict: """ Returns: { "source_id": ..., "section": ..., "text": "章节正文", "start_line": int, "end_line": int, "anchor_str": "[guideline:CSCO-2024-NSCLC:§5.5.2]", } """
P0 守护:文件 / toc 不存在 → FileNotFoundError;章节在 toc 里找不到 → KeyError; 绝不回退到内置答案。
当调用 fetch_chinese_guidelines(..., sources_dir=Path(".cache/<slug>/sources")) 时, 本 skill 把抓到的指南原文写到:
sources_dir/
└── guidelines/
├── CSCO-2024-NSCLC.txt ← 原文(UTF-8)
├── CSCO-2024-NSCLC.toc.json ← {"§5.5.2": {"start_line": 18, "end_line": 28}, ...}
└── CSCO-2024-NSCLC.meta.json ← {"version", "url", "disease", "archived_at", ...}下游 citation-anchor-resolver.resolve_citation(anchor, sources_dir) 即可解析 [guideline:CSCO-2024-NSCLC:§5.5.2] → 章节正文,配合关键词核对实现 Cite-or-Block。
locate_section_in_guideline 是同一存档结构的更高层 API,多返一份行号 + anchor_str。
| 来源 | 用途 | 抓取方式 | |-----|------|---------| | CSCO(中国临床肿瘤学会) | 肿瘤精准医疗首选 | 公开 PDF / HTML,WebFetch + PDF 解析 | | NCCN 中文版 | 全球指南本地化 | 公开 HTML,WebFetch(P2 stub) | | NMPA(国家药监局) | 药物上市状态 + 适应症 | nmpa.gov.cn 数据库(minimal,TODO refactor to A5) | | CDE(药品审评中心) | 临床试验技术审评 | cde.org.cn(P2 stub) | | NHC(国家卫健委) | 诊疗规范(部分病种) | nhc.gov.cn(P2 stub) |
详见 references/source-priority.md。
| 场景 | 处置 | |-----|------| | CSCO 网站当下不可达 | fall back 到 cache_dir/csco_<slug>.json(若 < 7 天) | | cache_dir is None 且远程抓不到 | 回退 hardcoded fixture(仅 ALK+ NSCLC 等少数 ground-truth 病种) | | cache_dir 提供但 cache miss + 远程 fail | 抛 RuntimeError,调用方在 sources_succeeded 不写 csco | | 指南 PDF 解析失败 | 用 HTML 版本,失败再用文件名拼接的章节标题 | | 全部指南来源都失败 | manifest 标 guideline_fetch_failed: True,报告 §0 红色警告 + 不阻塞流水线但产物视为 draft | | cross-check critical violation | 重生成 1 次,仍违规 → 强制把 §"治疗方案" 改为 placeholder + warning |
详见 references/failure-modes.md。
treatment_table item 结构:
python{ "line": "1L" | "2L" | "3L" | "Maintenance" | "Adjuvant", "level": "I" | "II" | "III", # CSCO 推荐等级 "drug": "洛拉替尼", # 中文通用名 "drug_en": "Lorlatinib", # 可选 英文通用名 "category": "三代 ALK-TKI", # 可选 药物类别 "regimen": "..." , # 可选 联合方案(非单药时) }
详见 references/treatment-table-schema.md。
_nmpa.py 当前是 minimal hardcoded(仅 ALK+ NSCLC 八种 ALK-TKI),TODO:A5(nmpa-drug-registry-lookup)stable 后 refactor 复用_nccn.py / _cde.py / _nhc.py 当前是 stub,返回 Nonehttpx —— HTTP 请求beautifulsoup4 —— HTML 解析(P2)pypdf —— PDF 章节解析pyyaml —— 配置(可选)tests/test_cn_clinical_guidelines.py 含 4 个核心测试:| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-22 | pass→pass | 9,807 | 14,908 | +52% | 1 | 1 | 0% | 2,249 | 6,344 | +182% | 0 | 0 | — |
case-01 | fail→pass | 19,340 | 19,978 | +3% | 1 | 1 | 0% | 4,383 | 7,425 | +69% | 0 | 0 | — |
case-02 | fail→pass | 6,858 | 14,765 | +115% | 1 | 1 | 0% | 1,243 | 5,622 | +352% | 0 | 0 | — |
case-03 | fail→pass | 5,470 | 11,368 | +108% | 1 | 1 | 0% | 972 | 5,162 | +431% | 0 | 0 | — |
case-04 | pass→pass | 9,613 | 2,925 | -70% | 1 | 1 | 0% | 1,531 | 3,183 | +108% | 0 | 0 | — |
case-05 | pass→pass | 9,851 | 4,339 | -56% | 1 | 1 | 0% | 1,677 | 3,403 | +103% | 0 | 0 | — |
case-06 | fail→pass | 8,659 | 3,703 | -57% | 1 | 1 | 0% | 1,405 | 3,374 | +140% | 0 | 0 | — |
case-07 | pass→pass | 5,734 | 2,729 | -52% | 1 | 1 | 0% | 915 | 3,254 | +256% | 0 | 0 | — |
case-08 | fail→pass | 7,140 | 2,684 | -62% | 1 | 1 | 0% | 1,300 | 3,125 | +140% | 0 | 0 | — |
case-09 | fail→pass | 9,665 | 3,449 | -64% | 1 | 1 | 0% | 1,751 | 3,365 | +92% | 0 | 0 | — |
case-10 | pass→pass | 8,631 | 2,377 | -72% | 1 | 1 | 0% | 1,380 | 3,051 | +121% | 0 | 0 | — |
case-11 | fail→pass | 9,037 | 2,162 | -76% | 1 | 1 | 0% | 1,580 | 3,062 | +94% | 0 | 0 | — |
case-12 | fail→pass | 10,044 | 4,319 | -57% | 1 | 1 | 0% | 1,978 | 3,558 | +80% | 0 | 0 | — |
case-13 | fail→pass | 3,638 | 2,076 | -43% | 1 | 1 | 0% | 550 | 3,030 | +451% | 0 | 0 | — |
case-14 | pass→pass | 7,036 | 1,960 | -72% | 1 | 1 | 0% | 1,298 | 3,035 | +134% | 0 | 0 | — |
case-15 | fail→pass | 11,395 | 3,116 | -73% | 1 | 1 | 0% | 2,031 | 3,335 | +64% | 0 | 0 | — |
case-16 | fail→pass | 7,967 | 2,881 | -64% | 1 | 1 | 0% | 1,447 | 3,212 | +122% | 0 | 0 | — |
case-17 | fail→pass | 10,097 | 2,851 | -72% | 1 | 1 | 0% | 2,285 | 3,241 | +42% | 0 | 0 | — |
case-18 | fail→pass | 25,158 | 5,244 | -79% | 1 | 1 | 0% | 1,271 | 3,546 | +179% | 0 | 0 | — |
case-19 | pass→pass | 12,732 | 6,350 | -50% | 1 | 1 | 0% | 2,274 | 3,790 | +67% | 0 | 0 | — |
case-20 | pass→pass | 4,600 | 3,953 | -14% | 1 | 1 | 0% | 868 | 3,608 | +316% | 0 | 0 | — |
case-21 | pass→pass | 8,091 | 6,402 | -21% | 1 | 1 | 0% | 1,515 | 3,869 | +155% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 21 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +59 percentage points is the difference between those two pass rates over the 21 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.