Communitygithub.com

Moonweave-Research/ref-verify

防止学术写作中的引用幻觉。在以下情况下调用:寻找支持特定声明的论文;验证/检查/审核现有引用或DOI;确认论文是否确实表达了用户所声称的内容(“论文是这么说的吗?”,“他们真的展示了X吗?”);通过描述一篇论文来添加引用(“添加对这篇论文的引用,其中X”);运行提交前的参考文献检查。请勿在以下情况下调用:格式化APA/IEEE风格参考文献、解释一般性主题、引用风格问题或散文编辑。自动选择快速筛查(每篇论文数秒)或全面审计(源深度声明检查)。

ref-verify 是什么?

**ref-verify** 是一个专为学术写作场景设计的AI技能,其核心目标是消除LLM在生成引用时的“幻觉”——即模型根据训练数据而非实际论文内容来描述论文发现。该技能通过强制要求所有关于论文内容的陈述必须来自实时获取的源(摘要或全文),并严格执行“无法获取源则明确声明”的规则,从根本上防止不实引用。 该技能支持多种平台:Claude Code、Cursor、Codex等。其工作流程智能且灵活:根据用户提供的DOI数量、任务类型(查找论文、审核引用列表、添加单个引用)自动选择“快速筛查”(通过CrossRef元数据验证、DOI解析和着陆页确认进行基本检查,每篇论文约5秒)或“全面审计”(五层深度验证:存在性、元数据、内容可追溯性、DOI解析和撤稿检查)。尤其值得关注的是“内容可追溯性”层,它将声明分类为“标题级/概要级”或“机制/实施/程序级”,并针对后者要求获取全文证据,而非仅依赖摘要。 此外,该技能提供了一个可由终端调用的可执行引擎(Python CLI),支持Crossref元数据和声明检查,并默认使用Crossref、OpenAlex、Semantic Scholar和PubMed等API作为摘要源回退。如果CLI不可用,则回退到详细的手动协议。该技能还内置了路径决策逻辑,避免不必要的昂贵操作,例如当参考文献列表超过10条时,仅对匹配失败或失效的DOI执行全面审计。 总体而言,ref-verify是一个严谨、可审计的学术引用验证工具,显著提升了AI辅助学术写作的可信度。它通过结构化的、不可退让的规则,将引用检查从“猜测”转化为“验证”。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add Moonweave-Research/ref-verify

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

ref-verify — 参考文献幻觉防护

该技能旨在防止的特定故障:LLM根据训练数据(而非摘要实际内容)描述论文内容。论文被赋予其不包含的发现,或被引用以支持文中未出现的声明。解决方案是始终如一地应用一条规则:

关于论文的每一条内容陈述都必须来自实时获取的源——标题级/概要级声明使用摘要,机制/实施/程序级声明使用全文——逐字引用或改写。如果无法获取所需源,请明确说明——切勿用回忆的描述填补空白,也切勿让主题匹配的摘要代替机制级声明。


模式决策

在执行任何工作之前,先选择模式。此选择控制成本和深度。

用户提供了DOI进行合理性检查?
  └─ ≤10条参考文献 → 全部快速筛查
  └─ >10条参考文献 → 全部快速筛查;仅对不匹配/失效的结果进行全面审计

用户说“查找关于X的论文”或“引用支持声明Y的论文”?
  └─ 全面审计(从头搜索需要内容验证)

用户说“验证/检查我的参考文献列表”或进行提交前审计?
  └─ ≤5条参考文献 → 全部全面审计
  └─ >5条参考文献 → 先全部快速筛查;对不匹配/失效的参考文献以及任何被引用以支持特定事实声明的参考文献进行全面审计

用户正在内联写作,根据记忆添加单条引用?
  └─ 最低限度快速筛查;如果为特定声明引用则进行全面审计

昂贵部分是全面审计(五层、源深度证据获取)。快速筛查每篇论文约5秒。仅在任务确实需要内容验证时才升级到全面审计。


可执行引擎

将其用作技能级工作流。无需为此路径构建或要求MCP。 CLI是该技能可从终端调用的执行引擎;手动协议仍是回退方案,也是CLI尚未覆盖的层的真理来源。

CLI可用性检查

在基于DOI的检查之前,检查可执行引擎是否可用:

ref-verify --help

npx skills add不会通过pip安装Python CLI。如果控制台脚本不可用,不要将其视为验证结果。

如果控制台脚本不可用但仓库源存在,请使用:

PYTHONPATH=src python3 -m ref_verify.cli --help

如果两个命令都失败,请遵循下面的手动回退协议。不要假装CLI已运行,也不要凭记忆发明结果。

CLI优先工作流

当用户提供DOI或询问基于DOI的摘要是否支持特定事实声明时,首先使用CLI。当前CLI范围包括CrossRef元数据验证和DOI绑定的摘要声明检查。声明检查首先使用CrossRef,然后使用DOI绑定的OpenAlex、Semantic Scholar和PubMed作为CrossRef没有摘要时的回退源。

CrossRef元数据屏幕:

ref-verify verify-doi <doi> \
  --title "<提供的标题>" \
  --first-author <提供的第一作者姓氏> \
  --year <提供的年份> \
  --json

源码签出回退:

PYTHONPATH=src python3 -m ref_verify.cli verify-doi <doi> \
  --title "<提供的标题>" \
  --first-author <提供的第一作者姓氏> \
  --year <提供的年份> \
  --json

verify-doi仅在结果为PASS时退出0;WARN和REJECT返回非零值。仅提供DOI可检查CrossRef是否解析,但不足以通过元数据验证。

路由结果:

  • PASS:报告元数据匹配,然后在所选模式要求时继续第4层DOI着陆页解析和第5层撤稿检查。
  • WARN:报告缺失或薄弱的元数据,然后继续手动回退以处理缺失的层,而不是静默接受该参考文献。
  • REJECT:停止将该引用视为已验证;报告不匹配并请求更正后的DOI或引用,除非用户明确要求替代方案。

针对DOI摘要的单一声明检查:

ref-verify check-claim <doi> --claim "<特定事实声明>" --json

源码签出回退:

PYTHONPATH=src python3 -m ref_verify.cli check-claim <doi> --claim "<特定事实声明>" --json

默认情况下,check-claim首先使用CrossRef。如果CrossRef没有摘要,它会尝试DOI绑定的OpenAlex、Semantic Scholar和PubMed回退源。使用--source crossref、--source openalex、--source semantic-scholar或--source pubmed进行特定源调试。显式的非CrossRef源选择会绕过CrossRef,因此可以隔离OpenAlex、Semantic Scholar或PubMed的故障。

路由结果:

  • ACCEPT:引用CLI证据,然后继续进行任何所需的手动DOI解析、第二源存在性和撤稿层。
  • WARN或PARTIAL:报告所选摘要源支持和不支持的内容,然后在需要更多层时继续手动回退。
  • UNVERIFIABLE:从尝试的CLI源中未获得可信的DOI绑定摘要证据。继续下面的手动回退链,而不是将该声明视为已拒绝或已支持。

CLI的ACCEPT仅是摘要级别的证据。如果声明描述的是机制、实施或程序,请勿将该结果提升为全面审计的结论;在第3层对声明进行分类,并首先获取所需的全文证据。

对于JSON输出,使用abstract_source、source_attempts和error_code来决定下一步:

  • CLAIM_SUPPORTED:找到明确的摘要支持。
  • CLAIM_NOT_EXPLICIT:摘要可用,但声明未得到明确支持。
  • CLAIM_AMBIGUOUS:存在数字证据或上下文,但绑定不明确。
  • NO_ABSTRACT:尝试的DOI绑定源未提供摘要文本。
  • DOI_NOT_FOUND:所选源未找到DOI绑定的记录。
  • DOI_MISMATCH:主要或显式选择的DOI绑定记录与请求的DOI不匹配。
  • SOURCE_API_ERROR、SOURCE_TIMEOUT、SOURCE_RATE_LIMITED、SOURCE_UNSUPPORTED:源查找失败、超时、被限速或无法使用。

CLI不能替代第4层DOI着陆页解析、双源存在性检查或撤稿检查。当所选模式要求时,继续为这些层使用手动协议。


快速筛查 — 元数据 + DOI合理性检查

当用户提供DOI或完整引文并希望进行合理性检查时使用。

  1. 访问CrossRef:https://api.crossref.org/works/{DOI}
  2. 将返回的标题 + 第一作者姓氏与用户提供的内容进行比较
  3. 获取https://doi.org/{DOI} — 确认其解析并定位到正确的论文
  4. 每篇参考文献报告一行:
Smith et al. (2021) 10.1234/example — PASS(标题/作者匹配,DOI解析)
Jones (2019) 10.5678/other — MISMATCH(CrossRef:Jones & Lee 2019,而非仅有 Jones)
Kim (2023) 10.9999/fake — DEAD DOI

升级到全面审计的情况:DOI解析到不同的论文、任何字段不匹配,或用户为特定事实声明引用。


全面审计 — 用于文献搜索或提交前检查

在以下情况下使用:搜索论文以支持声明,或进行最终引用扫描。

对每篇论文运行所有五层。这些层按它们捕获的内容排序——不要跳过。

第1层 — 存在性

独立搜索两个来源:

  • CrossRef:https://api.crossref.org/works?query.bibliographic={标题+作者}&rows=5
  • Semantic Scholar:https://api.semanticscholar.org/graph/v1/paper/search?query={标题+作者}&fields=title,authors,year,externalIds,abstract&limit=5
  • 预印本arXiv:https://export.arxiv.org/api/query?search_query=ti:{标题}&max_results=3

仅当标题基本匹配且第一作者姓氏在两个来源中一致时,才确认论文存在。

  • 双源命中 → CONFIRMED
  • 单源 → SINGLE-SOURCE ⚠ — 谨慎进行,在输出中注明
  • 零源 → NOT FOUND ✗ — 停止;明确报告;不要发明替代品

第2层 — 元数据

从确认的来源中提取并比较:标题、所有作者(姓氏)、年份、期刊全名、DOI、卷/页(如果缺失则标记[NOT IN SOURCE])。如果任何字段在不同来源间不同,则显示两者——不要静默选择一个。

第3层 — 内容可追溯性 ← 最重要的一层

这是该技能核心价值所在。目标不仅是“这篇论文存在吗”,而且是“这篇论文实际上包含被归因给它的声明吗?”

步骤0 — 对声明进行分类。

在任何内容获取之前,对要验证的声明进行分类:

  • 标题级/概要级声明 — 摘要通常陈述的发现(总体结果、概要数字、一般性结论)。对于此类别,仅摘要证据是合法的真理来源。
  • 机制/实施/程序级声明 — 描述某事物如何工作或完成:特定的机制、算法、架构、参数、实验步骤、控制条件、或与表格/图形/方法部分相关而非总结性结果的数值。摘要通常即使论文支持这些内容,也会省略它们。信号词:“机制”、“如何”、“架构”、“算法”、“实施”、“程序”、“协议”、“参数”、“对照组”、“消融”、“表格”、“图形”或任何比单段摘要更具体的声明。

如果声明是机制/实施类,即使摘要在主题上吻合,仅摘要检查也不够。获取摘要作为存在性/主题匹配的证据,但不要仅凭摘要做出裁决——继续下面的第3b层。

使用以下优先级顺序获取摘要:

  1. CrossRef原始JSON:https://api.crossref.org/works/{DOI} — 检查abstract字段
  2. OpenAlex:https://api.openalex.org/works/doi:{DOI}?mailto={联系邮箱} — 重建abstract_inverted_index
  3. Semantic Scholar:将&fields=abstract附加到你的S2 DOI查找中
  4. 开放获取回退:https://api.unpaywall.org/v2/{DOI}?email={联系邮箱} — 检查is_oa和oa_locations
  5. 预印本arXiv回退:https://export.arxiv.org/api/query?id_list={arxiv_id}
  6. 生命/生物论文的PubMed Central:https://www.ncbi.nlm.nih.gov/pmc/articles/{PMCID}/

对于需要联系邮箱的API,请将{contact_email}替换为配置中真实的、用户授权的地址。不要发送占位符地址。

获取后,检查:摘要是否包含被引用的特定声明?

  • 摘要明确包含该声明(逐字引用) → CONTENT: SUPPORTED
  • 摘要涉及该主题但未做出特定声明 → CONTENT: PARTIAL — 引用摘要实际内容
  • 摘要与声明矛盾 → CONTENT: CONTRADICTED — 请勿使用此引用
  • 尝试所有源后仍无法访问摘要 → CONTENT: UNVERIFIABLE — 用户必须检查全文
  • 声明为机制/实施类,且在尝试所有第3b层源后仍无法获取全文 → CONTENT: ABSTRACT-ONLY — 全文不可用,验证不足。此标签绝不可升级为SUPPORTED/ACCEPT。

不能放松的规则:如果你描述论文“显示了”、“证明了”或“报告了”什么,你必须逐字引用或直接改写获取的源文本,且达到要求的深度。即使你感到自信,也不允许凭记忆总结。

第3b层 — 全文确认(仅限机制/实施类声明)

当步骤0将声明分类为机制/实施类时,或当摘要裁决为PARTIAL但声明比摘要的总结级别更具体时,始终需要此层。仅对直接从摘要获得CONTENT: SUPPORTED的标题级声明跳过此层。

按此优先级顺序获取论文正文,在首次成功时停止:

  1. 本地Zotero PDF — 如果配置了Zotero库,查询其数据库中此DOI,解析附件键,并读取链接的PDF。常见默认路径是~/Zotero/zotero.sqlite,附件位于~/Zotero/storage/{key}/;发现实际路径,而不是假设它。
  2. research-wiki vault — 当research-wiki技能可用时,在其配置的vault中搜索已摄取的全文本副本。不要假设特定于机器的vault路径。
  3. 开放获取链接 — 解析并获取实际全文(不仅仅是可用性标志):
    • Unpaywall:https://api.unpaywall.org/v2/{DOI}?email={联系邮箱} → 获取best_oa_location.url_for_pdf(或任何oa_locations[].url_for_pdf)。
    • arXiv:https://export.arxiv.org/api/query?id_list={arxiv_id} → 获取完整论文,而不仅仅是<summary>字段。
  4. 失败 — 如果以上均未产生可读的全文,不要将摘要视为足够。应用上述定义的CONTENT: ABSTRACT-ONLY标签。

当获取到全文时,引用支持、部分支持或反驳该声明的段落。对于机制/实施声明,CONTENT: SUPPORTED需要全文引用——摘要级别的主题匹配无法满足要求。

第4层 — DOI解析

获取https://doi.org/{DOI}。确认着陆页与预期的论文匹配。来自包含标题和卷的URL slug的403(机器人屏蔽)不是死链——将其注明为付费墙。重定向到无关页面是关键失败。

第5层 — 撤稿

搜索"{第一作者姓氏}" "{期刊名称}" retraction并检查DOI着陆页上的撤稿横幅。已撤稿的论文不得用作主要来源。


输出格式

快速筛查:每篇参考文献一行(见上文)。

全面审计:每篇论文一个卡片,然后是汇总表。

参考文献审计
────────────────────────────────────────────────
论文:   [来自实时源的标题 — 而非来自记忆]
DOI:    [DOI] — [✓ 可解析 | ✗ 死链 | ✗ 错误论文 | ⚠ 付费墙-403]
作者:   [完整作者列表 — 来自实时源]

第1层 存在性:CONFIRMED(CrossRef + Semantic Scholar)
第2层 元数据:完整(来源间一致)
第3层 内容:SUPPORTED
  声明:“深度学习方法将准确率提高了5%”
  证据:“我们提出的方法在基准测试上达到了92%的准确率,而之前的工作为87%”(摘要第2段)
第4层 DOI:✓ Resolves
第5层 撤稿:无撤稿指示

结论:此引用已验证。
────────────────────────────────────────────────

相关技能