Academic Paper Search:可复现的多源文献检索工作流
这篇文章解决什么问题:Academic Paper Search v0.2.0:默认并行检索五个论文源,按需使用 Semantic Scholar 富化,并把 ClinicalTrials.gov 试验与论文严格分开。
Academic Paper Search 的 v0.2.0 已经发布。默认论文检索从三个来源扩展到 CrossRef、PubMed、arXiv、OpenAlex 和 Europe PMC;Semantic Scholar 用于显式搜索或基于强标识符的富化,ClinicalTrials.gov 则走独立的试验实体通道。为了不破坏已有安装和配置,PyPI、插件、CLI 与 Skill 的技术标识仍然是 nature-academic-search。

我想解决的不是“让模型多给几个论文标题”,而是让一次文献检索留下可以复查的过程:实际查询了哪些来源、用了什么查询、何时检索、合并前后有多少记录、哪些 DOI / PMID / arXiv ID 得到核验、哪些冲突仍待人工处理,以及某个数据源失败后还缺什么。
为什么普通对话式检索不够
用 AI 找论文时,最危险的结果不一定是完全没有答案,而是得到一份看起来可信、却无法重放的清单。题名可能相似,作者和年份可能被拼接,预印本和正式版本可能重复出现;一个 DOI 即使格式正确,也不代表它对应当前列出的题名。
多来源检索还会带来另一类问题:每个数据库的职责和查询语言并不相同。PubMed 适合生物医学索引与 MeSH,CrossRef 更接近出版商元数据和 DOI 解析,arXiv 负责预印本,OpenAlex 提供跨学科发现与来源化指标,Europe PMC 补充 PMCID 和开放全文线索。把一条 PubMed 检索式原样丢给所有来源,不能算真正的多源检索。
最后,上游 API 的限流、超时和临时故障是常态。如果系统因为一个来源暂时不可用就丢掉其他来源已经返回的记录,工作流会变得脆弱;如果它静默忽略故障,读者又会误以为所有数据库均已覆盖。
Academic Paper Search 因此把“检索结果”定义成一份带来源状态的研究记录,而不是一段一次性回答。
核心方法:检索、去重、核验、分组、导出
1. 对不同来源分别适配查询
Skill 建议先记录主题、日期范围、文献类型、结果数量和是否接受预印本,再按数据库语法构造查询。search_papers 的默认论文搜索会并行调用 CrossRef、PubMed、arXiv、OpenAlex 和 Europe PMC;它不会把 PubMed 字段语法自动翻译成其他数据库的专用语法。Semantic Scholar 需要显式选择,或在有 DOI、PMID、arXiv、Semantic Scholar ID 等可路由标识符时用于 enrich。ClinicalTrials.gov 只在 entity_type="trial" 下返回 NCT 试验记录,不能和论文结果混在一个实体集合里。
底层 MCP(Model Context Protocol,模型上下文协议)暴露四个稳定工具:
| 工具 | 负责的动作 |
|---|---|
search_papers | 并发查询一个或多个来源,合并结果,同时返回逐来源错误 |
get_paper_by_id | 解析 DOI、PMID、PMCID、arXiv、OpenAlex、Semantic Scholar URL 或 NCT ID |
get_citation | 为已经解析的记录生成指定格式引用 |
lookup_mesh | 查询 PubMed MeSH 描述词,辅助构建检索式 |
客户端可能为工具名增加 MCP 命名空间前缀,但名称后缀与参数契约保持不变。这里有意把“搜索”和“按标识符核验”分成两步:搜索负责扩大召回,核验负责让拟引用记录回到稳定标识符和原始元数据。
2. 用标识符优先的规则合并重复项
同一论文可能同时出现在 PubMed、CrossRef、OpenAlex 与 Europe PMC,也可能先以 arXiv 预印本出现、之后有正式版本。v0.2.0 会规范化 DOI、PMID、PMCID、arXiv、OpenAlex 与 Semantic Scholar 标识符,再以标准化题名和年份作为弱回退键。任意强键命中已有分组时就会合并,并在 sources、source_records 和 conflicts 中保留来源与冲突,而不是静默覆盖。NCT 记录始终属于试验实体,不参与论文去重。
这并不意味着算法能自动解决所有版本关系。因为题名加年份也是合并键,不同标识符但同题同年的记录也可能被归到一起;题名变化、作者列表变化或元数据冲突时,更需要在 Skill 最终报告中标记为 mismatch 或 manual_needed,不能为了让清单更整齐而猜测它们是同一篇文章。
3. 把正式论文、预印本和未解决记录分开
由 Skill / Agent 整理的最终报告会区分 peer_reviewed、preprints 和 unresolved。这是一条很实际的证据边界:arXiv 记录可以提供及时线索,但不能仅凭出现在检索结果中就被描述为已经同行评审;标识符或关键字段有冲突的条目,也不应混入可直接引用的正式论文清单。
最终报告的核验状态至少包括 verified、mismatch、not_found 和 manual_needed。这些不是 search_papers 原始 JSON 自动生成的字段,而是 Agent 在继续调用 get_paper_by_id 并比较题名、作者、来源、年份和标识符后给出的分类。
4. 允许部分成功,但必须披露缺口
search_papers 会并发查询选定来源,并收集逐来源结果。某个来源失败时,其他来源成功返回的记录仍会进入去重;原始响应把失败项写入 errors,同时保留 sources_queried、raw_result_count、result_count、results。Skill / Agent 再基于这份原始响应整理面向读者的最终报告。
这种处理不是把失败“降级为成功”,而是把两件事同时说清楚:这次检索已经得到了哪些材料,以及由于哪个来源不可用,覆盖范围可能缺少什么。若选定来源均没有有效结果,应回到检索词、MeSH 或纳入条件,而不是让模型补出不存在的引用。
5. 从已解析记录生成引用文件
核验后的记录可以导出为 RIS、BibTeX、NBIB 或 ENW,进入 Zotero、EndNote、LaTeX 或其他参考文献工作流。NBIB 主要对应 PubMed/MEDLINE;CrossRef 或 arXiv 在请求 NBIB 时需要使用适用的其他格式。单条引用由 get_citation 处理,批量文件则通过 CLI 生成;未解决记录应排除或单独列出,不应伪装成已核验引用。
一个可执行的检索请求与结果结构
安装完成后,可以直接给 Codex 或 Claude Code 下面这段任务。它明确了主题、时间、来源、去重、核验、预印本处理、失败策略和导出格式,比“帮我找相关论文”更容易复查。
1 | 使用 $nature-academic-search 查找 2022 年以来 GLP-1 受体激动剂与抑郁风险的论文。 |
下面是 2026-07-31 的真实限量检索。查询为 large language models medical education,每个来源最多取三条:CrossRef、arXiv、OpenAlex 和 Europe PMC 成功,PubMed 返回 HTTP 429。系统保留了四个成功来源的 12 条合并结果,同时把失败写进 errors;因此这次运行证明的是“部分失败可见”,不代表完成了五库覆盖。
1 | query: large language models medical education |
前三条候选记录分别带有 DOI 10.1371/journal.pdig.0000198、10.2196/45312、10.2196/48291,并同时保留 PMID 与 OpenAlex ID。它们只是按这次查询返回的候选项,仍需根据开题问题、纳入标准和全文内容人工筛选。这个记录的价值在于把原查询、日期、实际成功来源、数量和错误放在一起;PubMed 恢复后可以有针对性地补搜,而不是假设清单已经完整。
一次真实的 DOI 核验
为了不把占位模板当成项目效果,我在 2026-07-31 使用 get_paper_by_id 实际核验了 DOI 10.1038/nature14539。CrossRef 返回的稳定元数据子集如下;引用次数会持续变化,因此没有写入示例。
1 | { |
这个例子证明的是标识符解析与元数据返回可以复现,不证明多源检索已经覆盖充分。真正进入引用文件前,仍应把 DOI、题名、作者和出版信息与出版社页面或合法全文再核对一次。
快速开始:安装与最短使用路径
如果希望把 Skill 与 MCP 一起作为插件加载,可以分别使用 Codex 和 Claude Code 的 marketplace:
1 | # Codex |
也可以通过隔离的 Python 应用安装 CLI,再让安装器同时配置两个客户端。这里需要提供 PubMed 联系邮箱,以遵守 NCBI 请求规范;NCBI API Key 是可选项。
1 | uv tool install nature-academic-search |
上面的 PyPI 0.2.0 与插件固定版本尚未包含 2026-07-31 的 MeSH ESummary 修复。需要运行本文的 lookup_mesh 场景时,从当前 main 安装:
1 | git clone https://github.com/wp-a/nature-academic-search.git |
插件方式运行前,可以在启动客户端的环境里设置邮箱:
1 | export [email protected] |
安装或更新后新建一个 Codex 任务或 Claude Code 会话,让客户端重新加载 Skill 与 MCP 工具。项目展示名已经变化,但调用仍然使用 $nature-academic-search;nature-academic-search-mcp、CLI 和插件 ID 也保持不变。
三个适合直接开始的场景
场景一:综述或开题前的可复现初筛
先给出研究问题、时间范围、文献类型和是否纳入预印本,让五个默认论文源执行限量检索,再按正式论文、预印本和未解决记录分组。保存原查询、检索日期、去重数量与来源错误后,后续补搜时可以明确比较新增记录。它适合作为系统综述之前的探索与整理,但不能替代正式方案注册、完整数据库覆盖和双人筛选。
场景二:批量核验参考文献与版本关系
把 DOI、PMID、PMCID、arXiv 或 OpenAlex ID 交给工作流,逐条比较题名、作者、来源、年份与标识符。遇到预印本与正式版本时保留两者关系;遇到冲突则单列 mismatch 或 manual_needed。这个场景适合投稿前清理参考文献,也适合检查模型生成的引用是否真的存在。
场景三:构建 PubMed MeSH 策略并导出
对于生物医学问题,先用 lookup_mesh 核对主题词,再把 MeSH 与自由词组合成 PubMed 查询;其他来源使用适配的自然语言或字段。当前 main 已修正 MeSH ESummary 解析,但这项提交不应被描述为 PyPI 0.2.0 已发布能力。确认纳入记录后,再按参考文献管理器选择 RIS、BibTeX、NBIB 或 ENW。
能力边界
Academic Paper Search 当前连接 CrossRef、PubMed、arXiv、OpenAlex、Europe PMC、Semantic Scholar 与 ClinicalTrials.gov,但这些来源并不执行同一种任务:前五个是默认论文源,Semantic Scholar 是显式搜索或富化源,ClinicalTrials.gov 返回独立的试验注册。它不是 Google Scholar、Web of Science、Scopus、Embase 或 CNKI 的替代接口,也不会绕过付费墙或承诺自动获得全文。
它也不替代正式系统综述。完整系统综述通常还需要预注册方案、学科适配的订阅数据库、完整检索式记录、去重审计、双人筛选、排除理由、偏倚评估和图书馆员或方法学专家复核。这里的多源工作流更适合前期调研、引用核验、版本整理与可复现的初筛基础。
上游 API 可能限流、超时或临时不可用。这些限制不会因为保留了部分成功结果而消失:“有部分结果”不等于覆盖充分;正式使用时必须阅读原始响应的 errors,并在来源恢复后补搜或改用合规的人工数据库检索。
隐私与敏感数据
普通公开检索词通常风险较低,但未发表研究问题、患者描述、内部选题策略、评审意见和含个人信息的引用文件仍可能属于敏感数据。Skill 与 MCP 的运行路径取决于 Codex、Claude Code、Python 环境及其网络配置;在处理受限材料前,应确认组织政策、日志位置和允许访问的外部 API。检索请求只应包含完成任务必要的信息,不要把密钥、原始患者标识或未脱敏附件写进提示词。
人工复核
引用进入论文、基金申请或正式报告前,作者仍应回到 PubMed 记录、出版社页面、arXiv 版本页或合法全文,逐条确认作者顺序、题名、年份、卷期页码、DOI、同行评审状态和结论是否支持当前表述。自动去重与格式导出减少的是机械工作,不会证明文献已经满足纳入标准,也不会替代研究者对相关性和证据质量的判断。
三篇可直接复用的实战
系列导航
这是四篇 Skill 项目介绍之一。其余三篇分别是:


