--- name: search-strategy description: 生物医药深度研究的统一检索策略。规定信源优先级金字塔、检索轮次、关键词策略、API 调用顺序,以及何时切换到专业信源。所有做信息收集的 agent(dr-searcher/dr-analyst/dr-verifier/dr-plan)必须加载此技能。 --- # 检索策略总纲(Deep Research 黄金法则) ## 一、信源优先级金字塔 **永远从上至下尝试,不要从 Tier 4 开始**: ``` ╱ Tier 1 ╲ 最高权重 ╱ (一手) ╲ ╱──────────────╲ ╱ Tier 2 ╲ 标准权重 ╱ (权威二手) ╲ ╱──────────────────╲ ╱ Tier 3 ╲ 辅助权重 ╱ (预印本/会议/券商) ╲ ───────────────────────── Tier 4 仅做发现入口 (通用搜索 + Wiki) ───────────────────────── 【黑名单】禁用 ``` ### Tier 1(优先使用,加权 1.2x) - **论文**:PubMed、Cochrane、顶刊(NEJM/Lancet/Nature/Science/Cell/JAMA/NatMed) - **监管**:FDA/EMA/NMPA/PMDA 官网、openFDA - **临床试验**:ClinicalTrials.gov、ChiCTR、EU CTR - **专利**:USPTO、EPO、CNIPA、Google Patents、PatentsView - **披露**:SEC(10-K/10-Q/S-1)、港交所、沪深交易所年报 ### Tier 2(可用,标准权重) - **咨询**:McKinsey/BCG/Deloitte/IQVIA/Evaluate Pharma/Frost & Sullivan/沙利文 - **综述**:系统综述、Cochrane Review、Meta 分析 - **协会**:PhRMA、BIO、中国医药工业协会、中国医药创新促进会 - **专业媒体**:BioSpace、Endpoints News、FiercePharma、STAT、医药魔方、Insight 数据库 ### Tier 3(辅助,需 Tier 1-2 支撑) - **预印本**:bioRxiv、medRxiv、SSRN(必须标注"未同行评审") - **券商**:中金/中信/高盛/摩根士丹利生物医药(注意利益冲突) - **会议**:AACR/ASCO/ASH/JPM Healthcare Conference 摘要 ### Tier 4(仅做入口) - Tavily / Brave / Exa 返回的普通网页 → **只用来发现 Tier 1-2 URL**,不做结论佐证 - Wikipedia → **只做术语理解**,结论不得引用 ### 黑名单(禁用为证据) - 百家号、头条号、大部分公众号自媒体 - 未署名行业博客 - Retraction Watch 标记的撤稿论文 - "据业内人士透露"类无来源文章 - >5 年的综述(机制研究可放宽) --- ## 二、检索 4 轮法则 对任何一个 section/chapter,**必须至少 4 轮检索**: ### 第 1 轮:Tier 1 直命中 - 先用**精确查询**去 PubMed / ClinicalTrials / openFDA 打 - 关键词用 MeSH Term(医学主题词)+ 布尔逻辑 - 例:`(GLP-1[MeSH] OR "glucagon-like peptide-1") AND (obesity[MeSH]) AND ("2023"[PDAT]:"2026"[PDAT])` ### 第 2 轮:Tier 2 综述扫描 - 去 McKinsey Insights / BCG / Deloitte 官网搜 industry-overview - Evaluate Pharma / IQVIA 白皮书(通常需注册) - 目标:获取市场规模、竞争格局、趋势判断 ### 第 3 轮:反方/证伪检索 - 主动搜索与初步结论相反的关键词 - 例:研究"GLP-1 成为减重首选"→ 反方要搜 "GLP-1 limitations" "semaglutide side effects" "discontinuation rate" - 至少 3-5 条反方证据 ### 第 4 轮:Tavily/Brave/Exa 补漏 - 仅用于发现前 3 轮遗漏的 URL - 发现后**必须**回溯到原始 Tier 1-2 来源(论文 DOI、监管公告原文) - 不得直接引用搜索返回的二次报道 --- ## 三、强制工具入口(v0.12) 所有 agent 做联网检索时,**优先调用项目内 Python 网关**,不要直接把 Tavily / Brave / Exa MCP 当成主路径: ```bash uv run python scripts/search.py "" --route scholar --num-results 10 --year-low 2023 uv run python scripts/search.py "" --route patents --num-results 10 uv run python scripts/search.py "" --route news --num-results 10 --time-range m uv run python scripts/search.py "" --route general --num-results 10 uv run python scripts/search.py "" --profile china_market --num-results 10 --trace uv run python scripts/ground.py "" --model google/gemini-3.1-flash-lite-preview --json ``` 也可以按研究场景跑 profile: ```bash uv run python scripts/search.py "" --profile biomed_literature --num-results 10 --year-low 2023 uv run python scripts/search.py "" --profile patent_heavy --num-results 10 ``` **原因**: - Python 网关在 repo 内,可被 OpenCode / Codex / Gemini CLI / Claude Code 共同复用。 - `--route patents` 固定优先 Serper + Google Patents,避免专利检索被 Tavily 普通网页结果替代。 - `--route scholar` 固定优先 Serper Scholar,避免论文检索只停留在通用网页摘要。 - 专用 route(scholar/patents/news)默认 `--strict-specialized`,Serper 异常时应显式失败,不允许静默降级。 - Tavily / Exa / Brave 只作为 gap-fill 或 MCP 兜底,不作为文献/专利主路径。 每个检索小结必须写明实际使用过的 route,例如: ```text Routes used: scholar, patents, general ``` 如果由于缺 key 或 API 错误无法调用 Serper,必须在输出中明确写(且建议重新执行,不直接进入正文证据): ```text Serper unavailable: <原因>; fallback used: general site:patents.google.com ``` ## 四、API 调用顺序(技术栈,v0.11 更新) **按"查询类型"路由到最合适的 API**,而不是一律走通用搜索。 ``` ┌──────────────────────────────────────────────────────────────┐ │ 查询类型 首选 备选 │ ├──────────────────────────────────────────────────────────────┤ │ 专利 Serper Patents Google Patents 爬页 │ │ (site:patents.google.com) │ │ │ │ 学术论文 Serper Scholar PubMed E-utils │ │ (带引用数/年份/期刊) (原始数据库) │ │ │ │ 新闻 / 行业动态 Serper News Tavily │ │ (时效性敏感) │ │ │ │ 临床试验 ClinicalTrials.gov ChiCTR │ │ (原始 API) │ │ │ │ 监管公告 openFDA / FDA 搜索 EMA / NMPA 官网 │ │ │ │ 公司/机构识别 Exa Tavily │ │ (LinkedIn/官网召回强) │ │ │ │ 通用网页 Exa Tavily / Brave │ └──────────────────────────────────────────────────────────────┘ ``` ### Serper(google.serper.dev)使用模板 **专利检索**: ```bash uv run python scripts/search.py "dual-target siRNA GalNAc" --route patents --num-results 10 ``` **学术论文**: ```bash uv run python scripts/search.py "dual-target RNAi 2024" --route scholar --num-results 10 --year-low 2023 ``` **新闻(时效性)**: ```bash uv run python scripts/search.py "Arrowhead ARO-DIMER-PA clinical trial" --route news --num-results 10 --time-range w ``` ### Tavily MCP 调用模板(兜底,不作为主路径) 仅当 `scripts/search.py` 不可用,或需要 MCP 特有能力时使用。通用网页结果必须回溯到 Tier 1-2 原始来源。 ``` 工具名:tavily_search 参数: query: "<关键词>" search_depth: "advanced" max_results: 10 include_domains: ["pubmed.ncbi.nlm.nih.gov", "nejm.org", "lancet.com"] exclude_domains: ["baijiahao.baidu.com", "toutiao.com"] time_range: "year" ``` ### 何时用哪个 - **专利相关问题**("谁拥有技术 X"、"FTO 自由度分析")→ `c.patents()`,**永远先走 Google Patents** - **需要引用数排序的论文**("找影响力最大的 N 篇")→ `c.scholar()` - **近期新闻**("2025 年 Q4 交易"、"上月 IND 批准")→ `c.news(..., time_range="m")` - **快速概念验证 / 术语理解** → `c.search()`(通用) ### PubMed E-utils(bash 调用示例) ```bash # 1. esearch 拿 PMID 列表 curl -s "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=GLP-1+obesity&retmax=20&api_key=$NCBI_API_KEY&retmode=json" # 2. efetch 拿摘要 curl -s "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=PMID1,PMID2&rettype=abstract&retmode=xml&api_key=$NCBI_API_KEY" ``` ### ClinicalTrials.gov v2 API ```bash curl -s "https://clinicaltrials.gov/api/v2/studies?query.term=semaglutide&pageSize=20&format=json" ``` ### openFDA ```bash curl -s "https://api.fda.gov/drug/event.json?search=patient.drug.medicinalproduct:semaglutide&count=patient.reaction.reactionmeddrapt.exact&limit=20" ``` --- ## 五、关键词策略 ### 中英双语必备 - 任何生物医药主题**必须同时用中英文检索** - 中文关键词去找:中国监管(NMPA)、A股研报、医药魔方、Insight - 英文关键词去找:PubMed、FDA、顶刊、欧美研报 ### MeSH Term 优先于自由词 - PubMed 查询必须用 MeSH Term(医学主题词表) - MeSH Term 能自动扩展同义词,召回更全 - 例:`obesity[MeSH]` 会自动包含 `adiposity`, `body weight, excess` 等 ### 布尔逻辑 + 时间过滤 - 默认加 `("2023"[PDAT]:"2026"[PDAT])` 时间窗 - 机制研究可放宽到 10 年,新药/市场/政策必须近 3 年 ### 反方关键词清单(备忘) - `limitations` / `adverse events` / `side effects` / `discontinuation` - `failed trial` / `FDA rejection` / `withdrawn` - `conflict of interest` / `industry-funded` - `retraction` / `replication failure` --- ## 六、每条信源的提取字段(标准化) 任何信源进 `sources.jsonl` 必须有以下字段: ```jsonl { "id": "src_001", "tier": 1, "score": 9.2, "type": "journal" | "trial" | "regulatory" | "patent" | "report" | "news", "url": "https://...", "doi": "10.xxxx/...", "title": "...", "authors": ["...", "..."], "year": 2025, "venue": "NEJM", "impact_factor": 176.0, "accessed_at": "2026-04-20", "abstract": "...", "key_data": { "market_size_2025": "12.3B USD", "cagr": "23%" }, "used_in": ["ch01", "ch03.sec2"], "notes": "关键图表见 Fig 2" } ``` --- ## 七、失败兜底 - 某个 API 限流/超时:**等 5s 重试 3 次**,仍失败则跳过并在日志标注 - 某个信源 404:在 sources.jsonl 标 `"dead_link": true`,不删除(审计用) - 关键数据查不到:**不要编造**,在正文写 "该数据暂未找到公开来源(截至 2026-04)" --- ## 八、硬规则总结 1. ✅ 每 section 至少 4 轮检索 2. ✅ 中英双语必查 3. ✅ PubMed 用 MeSH Term 4. ✅ 反方关键词必查 5. ✅ Tier 4 结果只做发现,不做佐证 6. ✅ 所有信源写入 sources.jsonl 并评分 7. ✅ 文献检索必须优先 `scripts/search.py --route scholar` 8. ✅ 专利检索必须优先 `scripts/search.py --route patents` 9. ❌ 不得引用 Wikipedia 做结论 10. ❌ 不得编造数据、URL、DOI 11. ❌ 不得使用黑名单信源