PubMed E-utilities 检索实战:基于 NCBI API 构建可复现的生物医学文献查询流程(scientific-agent-skills paper-lookup 详解)
【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000+ scientists worldwide. 165 ready-to-use validated skills plus 100+ scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills
导读
本文基于 scientific-agent-skills 仓库中 paper-lookup 技能的 PubMed 参考文档,系统讲解如何通过 NCBI E-utilities 接口检索 PubMed 上 3700 万+ 条生物医学与生命科学文献的题录、摘要与元数据。你将掌握 eSearch / eSummary / eFetch / eLink 四大端点的完整调用方式与参数语义、PubMed 检索语法(字段标签、布尔运算、日期区间、出版类型)、速率限制与错误处理规范,并了解该技能如何在实践中与 PMC 全文库、Europe PMC 及仓库自带脚本(paginate.py、jats_to_text.py)协同,把一次文献检索变成可审计、可复现的工程流程。
一、PubMed 在 paper-lookup 技能中的定位
paper-lookup 技能覆盖 11 个学术文献 API(PubMed、PMC、Europe PMC、bioRxiv、medRxiv、arXiv、OpenAlex、Crossref、Semantic Scholar、CORE、Unpaywall),每个数据库都在references/目录下有一份独立参考文件。根据 SKILL.md 中的数据库选择指南,PubMed 被定位为生物医学主题检索的默认首选库:
| 用户意图 | 首选库 | 备选库 |
|---|---|---|
| 生物医学主题的论文检索 | PubMed | Europe PMC、Semantic Scholar、OpenAlex |
| 生物医学文章全文 | Europe PMC | PMC、CORE |
| 综合文献检索 | PubMed + Europe PMC + OpenAlex + Semantic Scholar | — |
| 查找并阅读论文 | PubMed(查找)+ Unpaywall(OA 链接)+ Europe PMC/CORE(全文) | — |
理解 PubMed 的能力边界是正确使用它的前提:PubMed 只提供题录、摘要与元数据,不提供全文——全文检索与获取应交给 PMC 或 Europe PMC(详见 PMC 参考文档 与 Europe PMC 参考文档)。
二、Base URL 与认证(API Key 机制)
所有 E-utilities 调用都基于同一入口:
https://eutils.ncbi.nlm.nih.gov/entrez/eutils/认证要点如下:
- API key 可选但强烈推荐:无 key 时速率为 3 次/秒,携带 key 可提升到 10 次/秒;
- 通过
&api_key=YOUR_KEY传参; - 所有请求都应附带
&tool=your_app_name&email=your@email.com,这是 NCBI 要求的使用者标识,便于官方识别调用方身份。
在 SKILL.md 中,这一认证约定被映射为环境变量NCBI_API_KEY:技能会先检查环境变量,若工作目录存在.env文件,只读取表格中列出的四个变量(NCBI_API_KEY、CORE_API_KEY、S2_API_KEY、OPENALEX_API_KEY),绝不把整个.env载入上下文,以避免无关密钥泄露。
安全红线:E-utilities 通过查询字符串认证,因此你实际请求的 URL 本身就携带凭证。仓库脚本在输出溯源信息时会主动脱敏——见 scripts/_common.py 中定义的
REDACTED_PARAMS = frozenset({"api_key", "apikey", "key", "email", "mailto", "tool"}),任何手工记录的 URL 也应执行同样的脱敏处理,只保留参数名、替换参数值。
三、eSearch:检索并获取 PMID
eSearch 负责把检索词转换成 PMID 列表,是整个流程的入口。
GET /esearch.fcgi?db=pubmed&term={query}&retmode=json参数表
| 参数 | 必填 | 默认值 | 说明 |
|---|---|---|---|
db | 是 | -- | 固定为pubmed |
term | 是 | -- | 检索式,支持 PubMed 语法:字段标签[AU]、[TI]、[TA]、[MH](MeSH),布尔 AND/OR/NOT |
retmax | 否 | 20 | 返回的 PMID 最大条数(上限 10,000) |
retstart | 否 | 0 | 分页偏移量 |
retmode | 否 | xml | json或xml |
rettype | 否 | uilist | uilist(返回 ID 列表)或count(只返回总数) |
sort | 否 | relevance | relevance、pub_date、Author、JournalName |
datetype | 否 | -- | pdat(出版日期)、mdat(修改日期)、edat(Entrez 入库日期) |
mindate/maxdate | 否 | -- | 日期范围,格式YYYY/MM/DD |
reldate | 否 | -- | 最近 N 天内的记录 |
usehistory | 否 | -- | 设为y可把结果存到 History Server,适合大规模结果集 |
示例请求
https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=CRISPR+gene+therapy&retmode=json&retmax=5&sort=pub_date响应结构
{ "esearchresult": { "count": "224107", "retmax": "5", "retstart": "0", "idlist": ["39984857", "39984678", "39984543", "39984210", "39983901"] } }与仓库脚本的衔接:count与分页对账
注意响应中的count字段——它是这条检索式命中的总记录数。当需要穷举式检索(如"某作者的全部论文")时,SKILL.md 要求在调用前先读取count,再确定性分页,并把实际取回的条数与总数对账。这一逻辑在仓库中由 scripts/paginate.py 统一实现:walk()记录reconciliation.expected(API 报告的总数)与reconciliation.retrieved(实际取回数),若分页走完仍不足总数,则以退出码4明确报警——"记录丢失"与"调用方主动设置上限"在 scripts/_common.py 的Reconciliation类中被区分为三种状态:complete、stopped_at_limit、shortfall,绝不允许把不完整的检索结果伪装成完整结论。
四、eSummary:获取文档摘要元数据
拿到 PMID 后,eSummary 可批量返回每篇文献的结构化摘要信息,适合快速浏览命中结果的题录概览。
GET /esummary.fcgi?db=pubmed&id={pmids}&retmode=json参数表
| 参数 | 必填 | 说明 |
|---|---|---|
db | 是 | 固定为pubmed |
id | 是 | 逗号分隔的 PMID 列表(单次最多 10,000 个) |
retmode | 否 | json或xml |
示例请求
https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=39984857,39984678&retmode=json响应字段说明
uid(PMID)、pubdate(出版日期)、source(期刊缩写)、authors(作者列表)、title(标题)、volume/issue/pages(卷期页)、fulljournalname(期刊全名)、elocationid(DOI)、articleids(PMC、DOI 等各体系标识符)、pubtype(出版类型)、pmcrefcount(PMC 被引次数)。
实战要点:为什么"eSearch + eSummary"是标准组合
SKILL.md 的输出格式示例中,标准溯源记录写作PubMed (esearch+esummary)——这正是在 paper-lookup 中最常见的 PubMed 检索流水线:先用 eSearch 按主题拿到 PMID 候选集,再用 eSummary 一次批量取回题录元数据,避免对每条 PMID 单独发请求浪费速率配额。两者结合把两次调用变成一次"主题 → 结构化文献列表"的完整检索。
五、eFetch:获取完整记录(摘要与 MEDLINE)
eFetch 是四个端点中返回内容最完整的一个,可获取含摘要的完整题录或 MEDLINE 格式记录。
GET /efetch.fcgi?db=pubmed&id={pmids}&rettype={type}&retmode={mode}rettype × retmode 组合
| rettype | retmode | 返回内容 |
|---|---|---|
| (省略) | xml | PubMed 完整 XML(题录 + 摘要) |
medline | text | MEDLINE 格式 |
abstract | text | 纯文本摘要 |
uilist | text | PMID 列表 |
示例:以 XML 获取摘要
https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=39984857&retmode=xml返回的 XML 包含<PubmedArticle>节点,内部由两部分构成:<MedlineCitation>(标题、摘要、MeSH 主题词、作者)与<PubmedData>(各体系文章 ID、出版历史)。
重要边界:eFetch 只属于 PubMed 题录,不是全文通道
在 paper-lookup 技能的语境下必须强调:PubMed 的 eFetch 拿到的"完整记录"是完整题录 + 摘要,而不是全文。真正获取全文要走db=pmc(PMC eFetch 返回 JATS XML),而 PMC eFetch 存在一个本技能反复强调的"200 陷阱":当出版商不允许 XML 再分发时,它会返回格式良好但没有<body>的 XML,失败信息藏在 XML 注释里——详见 PMC 参考文档。这正是仓库提供 scripts/jats_to_text.py 的原因:该脚本检测到无<body>时以退出码2明确报错并输出full_text_available: false,同时把被解析器丢弃的出版商限制注释重新呈现给调用方(jats_to_text.py 起),杜绝"把题录当全文汇报"的错误。对应的测试用例见 tests/paper-lookup/test_scripts.py,其中jats_no_body.xmlfixture 专门复现这一静默失败场景。
六、eLink:发现相关文献
eLink 用于查找与给定文献相关(被共同引用/共同关键词等维度)的文献,是构建引文关联与推荐的基础能力。
GET /elink.fcgi?dbfrom=pubmed&db=pubmed&id={pmid}&cmd=neighbor_score&retmode=json返回相关 PMID 及关联度分数。当用户问"有没有类似这篇的文献"或需要从一个起点扩展综述范围时,eLink 是最直接的答案来源。
七、PubMed 检索语法速查
掌握检索式语法能显著提升命中精度,避免"宽泛关键词淹没相关文献"。
- 字段标签:
aspirin[TI](标题)、Smith J[AU](作者)、Nature[TA](期刊)、neoplasms[MH](MeSH 主题词); - 布尔运算:
CRISPR AND (therapy OR treatment); - 日期范围:
2020/01/01:2024/12/31[PDAT]; - 出版类型:
review[PT](综述)、clinical trial[PT](临床试验); - 物种限定:
humans[MH]、mice[MH]。
与 eSearch 参数的配合
语法中的字段标签与 eSearch 的datetype/mindate/maxdate/reldate参数互为补充:日期既可以通过检索式写成2020/01/01:2024/12/31[PDAT],也可以拆成datetype=pdat&mindate=2020/01/01&maxdate=2024/12/31参数形式。实践中按可读性与复用性选择其一即可。
八、速率限制与合规调用
NCBI 对 E-utilities 有明确的速率与使用规范:
- 无 API key:3 次请求/秒;
- 带 API key:10 次请求/秒;
- 每次请求都必须携带
tool和email参数; - 大批量作业应避开高峰时段(美东时间周一至周五 5:00–21:00)。
在 SKILL.md 的"Making API Calls"章节中,这一约束被落实为工程纪律:
- 串行化调用限速 API:NCBI(PubMed、PMC)无 key 3 req/s、有 key 10 req/s,arXiv 更是严格到 1 请求/3 秒;
- 只对不同的开放 API 并行化:OpenAlex、Crossref、Semantic Scholar、Europe PMC、Unpaywall 可并发,但绝不针对同一个限速主机做并行;
- 限制总工作量:先看 count 或首页,超过约 1,000 条记录或 50 次调用前必须与用户确认方案——
paginate.py的默认值DEFAULT_MAX_RECORDS = 1000、DEFAULT_MAX_CALLS = 50(见 scripts/paginate.py)正是这两个约束的落地; - 遇到 HTTP 429/503 短暂等待后重试一次,仍失败则如实报告并提示用户申请 key。
九、错误格式与失败识别
E-utilities 的错误响应采用如下 JSON 格式:
{"error": "API rate limit exceeded", "count": "11"}状态码语义:HTTP 400表示请求格式错误,HTTP 429表示触发速率限制。
本技能的第一原则:200 不等于成功
SKILL.md 反复强调:"These APIs fail with HTTP 200."(这些 API 会用 HTTP 200 返回失败。)对 PubMed 而言,虽然基础错误(400/429)是标准状态码,但当 eFetch 切换到db=pmc时,无全文的文章会以 HTTP 200 + 无<body>的 XML 返回——失败完全伪装成成功。因此本技能的调试清单是:
- 确认是否真的失败:检查 JATS 是否有
<body>、arXiv 是否返回Error条目、Europe PMC 的 body 是否带errCode、bioRxiv 是否返回status: "no articles found"; - 检查标识符格式:参考 SKILL.md 的标识符对照表——PMID 是纯整数,arXiv ID 是
YYMM.NNNNN,PMCID 是PMC+ 数字,DOI 是10.xxxx/xxxxx,用错体系是"查不到"最常见的根因; - 转换标识符或换库重试:DOI 失败可转 PMID/PMCID(用 PMC ID Converter),PubMed 查不到 CS 论文就换 Semantic Scholar 或 OpenAlex;
- 如实报告失败:告诉用户哪个库失败了、错误是什么、尝试了什么替代方案——报告出来的缺口是有价值的,沉默的缺口是误导。
十、标识符体系与跨库互转
不同数据库使用不同的标识符体系,SKILL.md 给出了完整的对照表,其中与 PubMed 直接相关的是:
| 标识符 | 格式 | 示例 | 使用方 |
|---|---|---|---|
| DOI | 10.xxxx/xxxxx | 10.1038/nature12373 | 所有数据库 |
| PMID | 纯整数 | 34567890 | PubMed、PMC、Europe PMC、Semantic Scholar |
| PMCID | PMC+ 数字 | PMC7029759 | PMC、Europe PMC |
| ORCID | 0000-XXXX-XXXX-XXXX | 0000-0001-6187-6610 | OpenAlex、Crossref |
| ISSN | XXXX-XXXX | 0028-0836 | Crossref、OpenAlex |
跨库检索时,Semantic Scholar 通过前缀接收多种 ID(DOI:...、PMID:34567890、ARXIV:...),OpenAlex 接收doi:与pmid:前缀。PMID → PMCID → DOI 的转换由 PMC ID Converter 完成,当某库对当前标识符返回空结果时,"转换后再试"通常比"重写检索式"更快。完整的转换 API 用法见 PMC 参考文档 的 ID Converter 一节(支持ids、idtype、format参数,返回pmcid/pmid/doi三字段映射,且只对已收录于 PMC 的文章返回 PMCID)。
十一、全文与摘要的边界:PubMed、PMC、Europe PMC 的分工
这是 paper-lookup 技能中最容易出错、也是本参考文档最想传达的一点。三者分工如下:
| 库 | 内容 | 何时选用 |
|---|---|---|
| PubMed | 3700 万+ 条题录、摘要、MeSH 元数据,无全文 | 主题检索、定位文献、确认题录 |
| PMC | 1000 万+ 篇生物医学全文(JATS XML)、BioC API、ID 转换、OA 可用性服务 | 获取全文,但仅 OA 子集(约 300 万篇)可通过 eFetch 直接取到 XML |
| Europe PMC | 单索引覆盖 PubMed + PMC + 预印本,支持全文关键词检索,fullTextXML对非 OA 文章返回干净的404 | 全文内检索、预印本关键词检索、需要"诚实的失败"时 |
实践中推荐的最优路径是:用 PubMed 找到 PMID → 用 PMC OA Web Service 预检全文是否可用 → 用 eFetch(db=pmc)或 Europe PMCfullTextXML取全文 → 用 Unpaywall 找开放获取副本。若全文不可用,就明确返回摘要并说明在哪里可能找到 OA 副本,绝不把<front>元数据当成全文呈现给用户。
十二、输出与溯源规范:让每次检索都可复现
paper-lookup 技能对检索结果有一套强制性的输出格式(见 SKILL.md 的 Output Format 章节),PubMed 查询的结果应按此结构返回:
## Retrieval Summary - Query: <用户的实际问题> - Scope: targeted lookup | exhaustive retrieval - Databases queried: PubMed (esearch+esummary), Unpaywall (DOI lookup) - Access date: <日期> ## Results ### PubMed <文献列表:标题、作者、年份、期刊、DOI/PMID> ## Provenance - Endpoints & parameters: <足以复现调用的完整参数> - Identifier conversions: <如有 ID 转换> - Count reconciliation: <预期 vs 实际取回、分页数,穷举检索必填> - Warnings: <空结果、分页不完整、仅有元数据无全文、缺少 key、端点过时>要点包括:默认输出用户关心的可读字段摘要而非原始 JSON 堆砌;对大数据量全文(PMC/Europe PMC/CORE)保存到本地文件并报告路径;绝不把元数据冒充全文;每条结果的溯源信息要足够让人类或其他 Agent 原样重放这次调用。paginate.py在输出中通过redact_url()(scripts/_common.py)保证溯源 URL 里不残留任何密钥或个人邮箱。
十三、仓库资源导航
若要深入本主题,建议按以下路径阅读当前仓库:
- PubMed 参考文档:本文的核心依据,包含全部端点参数与响应细节;
- SKILL.md:11 库的统一工作流、选择指南、错误恢复与输出规范;
- PMC 参考文档:全文获取、ID Converter、BioC API 与"无 body 的 200"陷阱详解;
- Europe PMC 参考文档:跨语料全文检索、预印本关键词检索、
fullTextXML诚实 404; - scripts/paginate.py:分页、限速与计数对账的统一实现,PubMed 场景下建议配合
retmax/count理解其设计; - scripts/jats_to_text.py:JATS 全文解析与"元数据冒充全文"防线;
- scripts/_common.py:输入边界(
MAX_INPUT_BYTES)、文本清洗(collapse_ws)、URL 脱敏(redact_url)与计数对账(Reconciliation)的公共底座; - tests/paper-lookup/test_scripts.py:离线测试,fixtures 全部来自 2026-07-27 真实响应,覆盖无
<body>、非 JATS、OpenAlex 倒排摘要等静默失败场景。
结语:把"查文献"变成"可复现的工程"
PubMed E-utilities 的四个端点构成了生物医学文献检索的最小完备集——eSearch 定位(找什么)、eSummary 概览(是什么)、eFetch 取录(读摘要)、eLink 扩展(还看什么)。在 scientific-agent-skills 的 paper-lookup 技能中,这套 API 被进一步封装为带有速率纪律、计数对账、URL 脱敏、结构化溯源与"失败必须可见"原则的检索流程。无论你是要为一个 Agent 技能编写检索逻辑,还是要构建自己的文献查询管线,遵循"选对库 → 读参考文档 → 有界调用 → 核对响应形状 → 输出可审计结果"这一工作流,都能让每一次检索既快又可信。
【免费下载链接】scientific-agent-skillsTurn any AI agent into an AI Scientist. The #1 Agent Skills library for science, used by 190,000+ scientists worldwide. 165 ready-to-use validated skills plus 100+ scientific databases covering biology, chemistry, medicine, and drug discovery. Compatible with Cursor, Claude Code, Codex, Pi, Antigravity, and the open Agent Skills standard.项目地址: https://gitcode.com/GitHub_Trending/cl/scientific-agent-skills
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考