Academic Paper Searchv0.1.2 已经正式发布。这个版本把用户可见名称从 Nature Academic Search 更新为更直接的 Academic Paper Search;为了不破坏已有安装和配置,PyPI、插件、CLI 与 Skill 的技术标识仍然是 nature-academic-search,现有用户不需要迁移命令。

Academic Paper Search 多源文献检索封面

我想解决的不是“让模型多给几个论文标题”,而是让一次文献检索留下可以复查的过程:实际查询了哪些来源、用了什么查询、何时检索、合并前后有多少记录、哪些 DOI / PMID / arXiv ID 得到核验、哪些冲突仍待人工处理,以及某个数据源失败后还缺什么。

为什么普通对话式检索不够

用 AI 找论文时,最危险的结果不一定是完全没有答案,而是得到一份看起来可信、却无法重放的清单。题名可能相似,作者和年份可能被拼接,预印本和正式版本可能重复出现;一个 DOI 即使格式正确,也不代表它对应当前列出的题名。

多来源检索还会带来另一类问题:每个数据库的职责和查询语言并不相同。PubMed 适合生物医学索引与 MeSH,CrossRef 更接近出版商元数据和 DOI 解析,arXiv 负责预印本及其版本线索。把一条 PubMed 检索式原样丢给三个来源,不能算真正的多源检索。

最后,上游 API 的限流、超时和临时故障是常态。如果系统因为 arXiv 暂时不可用就丢掉 PubMed 与 CrossRef 已经返回的记录,工作流会变得脆弱;如果它静默忽略故障,读者又会误以为三库都已覆盖。

Academic Paper Search 因此把“检索结果”定义成一份带来源状态的研究记录,而不是一段一次性回答。

核心方法:检索、去重、核验、分组、导出

Academic Paper Search 从三个来源到核验导出的流程

1. 对三个来源分别适配查询

Skill 建议先记录主题、日期范围、文献类型、结果数量和是否接受预印本,再针对 PubMed、CrossRef 与 arXiv 分别构造适合的查询并分次调用。当前 search_papers 的一次调用只接收一个 query,会把它原样传给本次选中的来源;它不会在底层自动把 PubMed 语法改写成 CrossRef 或 arXiv 语法。当前运行时只内置这三个来源,也不会把没有连接的数据库写进“已检索来源”。

底层 MCP(Model Context Protocol,模型上下文协议)暴露四个稳定工具:

工具负责的动作
search_papers并发查询一个或多个来源,合并结果,同时返回逐来源错误
get_paper_by_id解析 DOI、PMID 或 arXiv ID,并取回对应元数据
get_citation为已经解析的记录生成指定格式引用
lookup_mesh查询 PubMed MeSH 描述词,辅助构建检索式

客户端可能为工具名增加 MCP 命名空间前缀,但名称后缀与参数契约保持不变。这里有意把“搜索”和“按标识符核验”分成两步:搜索负责扩大召回,核验负责让拟引用记录回到稳定标识符和原始元数据。

2. 用标识符优先的规则合并重复项

同一论文可能同时出现在 PubMed 与 CrossRef,也可能先以 arXiv 预印本出现、之后有正式版本。v0.1.2 会先规范化 DOI 与 arXiv ID,再为每条记录同时建立所有可用键:DOI、PMID、arXiv ID,以及标准化题名加年份。任意一个键命中已有分组时就会合并,并保留记录来自哪些来源,而不是静默覆盖来源信息。

这并不意味着算法能自动解决所有版本关系。因为题名加年份也是合并键,不同标识符但同题同年的记录也可能被归到一起;题名变化、作者列表变化或元数据冲突时,更需要在 Skill 最终报告中标记为 mismatchmanual_needed,不能为了让清单更整齐而猜测它们是同一篇文章。

3. 把正式论文、预印本和未解决记录分开

由 Skill / Agent 整理的最终报告会区分 peer_reviewedpreprintsunresolved。这是一条很实际的证据边界:arXiv 记录可以提供及时线索,但不能仅凭出现在检索结果中就被描述为已经同行评审;标识符或关键字段有冲突的条目,也不应混入可直接引用的正式论文清单。

最终报告的核验状态至少包括 verifiedmismatchnot_foundmanual_needed。这些不是 search_papers 原始 JSON 自动生成的字段,而是 Agent 在继续调用 get_paper_by_id 并比较题名、作者、来源、年份和标识符后给出的分类。

4. 允许部分成功,但必须披露缺口

search_papers 会并发查询选定来源,并收集逐来源结果。某个来源失败时,其他来源成功返回的记录仍会进入去重;原始响应把失败项写入 errors,同时保留 sources_queriedraw_result_countresult_countresults。Skill / Agent 再基于这份原始响应整理面向读者的最终报告。

这种处理不是把失败“降级为成功”,而是把两件事同时说清楚:这次检索已经得到了哪些材料,以及由于哪个来源不可用,覆盖范围可能缺少什么。若三个来源都没有有效结果,应回到检索词、MeSH 或纳入条件,而不是让模型补出不存在的引用。

5. 从已解析记录生成引用文件

核验后的记录可以导出为 RIS、BibTeX、NBIB 或 ENW,进入 Zotero、EndNote、LaTeX 或其他参考文献工作流。NBIB 主要对应 PubMed/MEDLINE;CrossRef 或 arXiv 在请求 NBIB 时需要使用适用的其他格式。单条引用由 get_citation 处理,批量文件则通过 CLI 生成;未解决记录应排除或单独列出,不应伪装成已核验引用。

一个可执行的检索请求与结果结构

安装完成后,可以直接给 Codex 或 Claude Code 下面这段任务。它明确了主题、时间、来源、去重、核验、预印本处理、失败策略和导出格式,比“帮我找相关论文”更容易复查。

1
2
3
4
使用 $nature-academic-search 查找 2022 年以来 GLP-1 受体激动剂与抑郁风险的文献。
同时检索 PubMed、CrossRef 和 arXiv,去重后核验 DOI / PMID;
把正式论文、预印本和待人工核验记录分开,最后导出 RIS。
任一来源失败时继续,但要列出失败来源及可能造成的缺口。

下面是预期的结果结构示意mcp_raw 对应 search_papers 的原始字段;agent_report 是 Skill / Agent 继续核验后整理的交付层。尖括号是待填字段,数量不是一次真实检索的实测统计,不能把它们引用为项目效果数据。

1
2
3
4
5
6
7
8
9
10
11
12
query: "GLP-1 receptor agonists AND depression risk"
search_date: YYYY-MM-DD
mcp_raw:
sources_queried: [pubmed, crossref, arxiv]
raw_result_count: <去重前数量>
result_count: <合并后数量>
results: <合并记录>
errors: []
agent_report:
groups: [peer_reviewed, preprints, unresolved]
verification: [verified, mismatch, not_found, manual_needed]
export: references/results.ris

这个结构的重点不在于字段多,而是把原查询、实际来源、去重前后数量和错误放在同一份记录中。以后补搜或更新综述时,可以知道上一次到底做到了哪里,而不是重新依赖一段已经失去上下文的聊天。

一次真实的 DOI 核验

为了不把占位模板当成项目效果,我在 2026-07-18 使用 v0.1.2 的 get_paper_by_id 实际核验了 DOI 10.1038/nature14539。CrossRef 返回的稳定元数据子集如下;引用次数会持续变化,因此没有写入示例。

1
2
3
4
5
6
7
8
9
10
11
{
"title": "Deep learning",
"authors": ["Yann LeCun", "Yoshua Bengio", "Geoffrey Hinton"],
"year": 2015,
"doi": "10.1038/nature14539",
"journal": "Nature",
"volume": "521",
"issue": "7553",
"pages": "436-444",
"source": "crossref"
}

这个例子证明的是标识符解析与元数据返回可以复现,不证明多源检索已经覆盖充分。真正进入引用文件前,仍应把 DOI、题名、作者和出版信息与出版社页面或合法全文再核对一次。

快速开始:安装与最短使用路径

如果希望把 Skill 与 MCP 一起作为插件加载,可以分别使用 Codex 和 Claude Code 的 marketplace:

1
2
3
4
5
6
7
# Codex
codex plugin marketplace add wp-a/nature-academic-search
codex plugin add nature-academic-search@wp-a-academic-tools

# Claude Code
claude plugin marketplace add wp-a/nature-academic-search
claude plugin install nature-academic-search@wp-a-academic-tools

也可以通过隔离的 Python 应用安装 CLI,再让安装器同时配置两个客户端。这里需要提供 PubMed 联系邮箱,以遵守 NCBI 请求规范;NCBI API Key 是可选项。

1
2
3
uv tool install nature-academic-search
nature-academic-search install --client both --email [email protected]
nature-academic-search preflight

插件方式运行前,可以在启动客户端的环境里设置邮箱:

1
2
export [email protected]
export NCBI_API_KEY=optional-key

安装或更新后新建一个 Codex 任务或 Claude Code 会话,让客户端重新加载 Skill 与 MCP 工具。项目展示名已经变化,但调用仍然使用 $nature-academic-searchnature-academic-search-mcp、CLI 和插件 ID 也保持不变。

三个适合直接开始的场景

场景一:综述或开题前的可复现初筛

先给出研究问题、时间范围、文献类型和是否纳入预印本,让三个来源分别检索,再按正式论文、预印本和未解决记录分组。保存原查询、检索日期、去重数量与来源错误后,后续补搜时可以明确比较新增记录。它适合作为系统综述之前的探索与整理,但不能替代正式方案注册、完整数据库覆盖和双人筛选。

场景二:批量核验参考文献与版本关系

把 DOI、PMID、arXiv ID 或待核对的题名列表交给工作流,逐条比较题名、作者、来源、年份与标识符。遇到预印本与正式版本时保留两者关系;遇到冲突则单列 mismatchmanual_needed。这个场景适合投稿前清理参考文献,也适合检查模型生成的引用是否真的存在。

场景三:构建 PubMed MeSH 策略并导出

对于生物医学问题,先用 lookup_mesh 核对主题词,再把 MeSH 与自由词组合成 PubMed 查询;CrossRef 与 arXiv 则使用各自适配的关键词。确认纳入记录后,再按参考文献管理器选择 RIS、BibTeX、NBIB 或 ENW。这样可以把“怎么搜”和“怎么导出”连起来,同时保留人工调整检索式的空间。

能力边界

Academic Paper Search 当前只连接 PubMed、CrossRef 和 arXiv。它不是 Google Scholar、Web of Science、Scopus、Embase 或 CNKI 的替代接口,也不会声称检索了这些未连接来源。它不会绕过付费墙,核心处理对象是元数据、标识符、引用与检索策略,而不是承诺自动获得每篇论文全文。

它也不替代正式系统综述。完整系统综述通常还需要预注册方案、学科适配的订阅数据库、完整检索式记录、去重审计、双人筛选、排除理由、偏倚评估和图书馆员或方法学专家复核。这里的多源工作流更适合前期调研、引用核验、版本整理与可复现的初筛基础。

上游 API 可能限流、超时或临时不可用。这些限制不会因为保留了部分成功结果而消失:“有部分结果”不等于覆盖充分;正式使用时必须阅读原始响应的 errors,并在来源恢复后补搜或改用合规的人工数据库检索。

隐私与敏感数据

普通公开检索词通常风险较低,但未发表研究问题、患者描述、内部选题策略、评审意见和含个人信息的引用文件仍可能属于敏感数据。Skill 与 MCP 的运行路径取决于 Codex、Claude Code、Python 环境及其网络配置;在处理受限材料前,应确认组织政策、日志位置和允许访问的外部 API。检索请求只应包含完成任务必要的信息,不要把密钥、原始患者标识或未脱敏附件写进提示词。

人工复核

引用进入论文、基金申请或正式报告前,作者仍应回到 PubMed 记录、出版社页面、arXiv 版本页或合法全文,逐条确认作者顺序、题名、年份、卷期页码、DOI、同行评审状态和结论是否支持当前表述。自动去重与格式导出减少的是机械工作,不会证明文献已经满足纳入标准,也不会替代研究者对相关性和证据质量的判断。

系列导航

这是四篇 Skill 项目介绍之一。其余三篇分别是: