Communitygithub.com

Moonweave-Research/ref-verify — 参考文献幻覚防止ガード

学術執筆における引用幻覚を防止します。特定の主張を裏付ける論文を探すとき、既存の引用やDOIを確認・監査するとき、論文がユーザーの主張を実際に含んでいるかを検証するとき、論文を説明して引用を追加するとき、投稿前の参照リスト一括チェックを行うときに呼び出します。クイックスクリーン(1論文あたり数秒)とフル監査(ソース深度の主張検証)を自動選択します。

ref-verify — 参考文献幻覚防止ガード とは?

このスキルは、LLMがトレーニングデータから記憶した論文内容を、実際のアブストラクトや本文に基づかずに引用してしまう「引用幻覚」を防止するために設計されています。主な機能は、ユーザーが提供したDOIや引用情報をCrossRef、Semantic Scholar、OpenAlex、PubMedなどの信頼できるAPIでリアルタイムに照合し、論文の存在確認(Layer 1)、メタデータ照合(Layer 2)、主張の内容追跡(Layer 3)、DOI解決(Layer 4)、撤回確認(Layer 5)の5段階監査を実行します。特筆すべきはLayer 3の「内容追跡」で、主張を「トップライン/見出しレベルの主張」と「メカニズム/実装/手続きの主張」に分類し、後者には全文引用を必須とする厳格なルールを適用します。CLIツール「ref-verify」が利用可能な場合はそれを優先し、ない場合は手動プロトコルに従います。このスキルはClaude CodeやCursorなどのAIエージェント環境で使用でき、学術論文の引用精度を大幅に向上させます。

対応~Claude Code~Codex CLI~Cursor
npx skills add Moonweave-Research/ref-verify

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

ref-verify — 参考文献幻覚防止ガード は何をしますか?

このスキルが防止する具体的な障害: LLMは、論文の内容を、アブストラクトが実際に述べていることではなく、学習データから記憶した内容に基づいて説明します。論文に含まれていない知見が帰属されたり、本文のどこにも現れない主張が引用されたりします。解決策は、一貫した1つのルールです:

論文に関するすべての内容記述は、ライブで取得したソース(トップライン/見出しレベルの主張にはアブストラクト、メカニズム/実装/手続きの主張には全文)から引用または言い換えなければなりません。必要なソースを取得できない場合は、その旨を明示的に述べてください。記憶に基づいた説明でギャップを埋めたり、トピックレベルのアブストラクトの一致をメカニズムレベルの主張の代用と決してしないでください。


モード選択

作業を開始する前にモードを選択してください。選択によってコストと深度が決まります。

ユーザーがDOIを提供し、簡単な確認を求める?
  └─ ≤10件 → すべてクイックスクリーン
  └─ >10件 → すべてクイックスクリーン; 不一致/不良DOIのみフル監査

ユーザーが「Xに関する論文を探して」または「主張Yを裏付ける論文を引用して」と言う?
  └─ フル監査(ゼロから検索する場合は内容検証が必要)

ユーザーが「参照リストを確認して」または投稿前監査を依頼?
  └─ ≤5件 → すべてフル監査
  └─ >5件 → まずすべてクイックスクリーン; 不一致/不良DOI + 特定の事実的主張に
             引用されたすべての参考文献をフル監査

ユーザーがインラインで執筆中、記憶から単一の引用を追加する?
  └─ 最低限クイックスクリーン; 特定の主張のために引用する場合はフル監査

コストがかかるのはフル監査(5層、ソース深度の証拠取得)です。クイックスクリーンは1論文あたり約5秒です。タスクが本当に内容検証を必要とする場合にのみ、フル監査にエスカレーションしてください。


実行可能エンジン

スキルレベルのワークフローとしてこれを使用してください。このパスにMCPを構築したり要求したりしないでください。 CLIはスキルがターミナルから呼び出せる実行エンジンです。手動プロトコルはフォールバックであり、CLIがまだカバーしていない層の信頼できる情報源です。

CLI可用性確認

DOIベースのチェックの前に、実行可能エンジンが利用可能か確認します:

ref-verify --help

npx skills add はPython CLIをpipインストールしません。コンソールスクリプトが利用できない場合、それを検証結果として扱わないでください。

コンソールスクリプトが利用できなくてもリポジトリソースが存在する場合は、以下を使用:

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

両方のコマンドが失敗した場合は、以下の手動フォールバックプロトコルに従ってください。CLIが実行されたふりをしたり、記憶から結果を捏造したりしないでください。

CLI優先ワークフロー

ユーザーがDOIを提供したり、DOIに紐づくアブストラクトが特定の事実的主張を裏付けるかどうかを尋ねたりする場合は、CLIを優先して使用します。現在のCLIの適用範囲は、CrossRefメタデータ検証とDOIに紐づくアブストラクトの主張チェックです。主張チェックはまずCrossRefを使用し、CrossRefにアブストラクトがない場合はDOIに紐づくOpenAlex、Semantic Scholar、PubMedをフォールバックとして使用します。

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: メタデータ一致を報告し、選択されたモードで必要な場合、Layer 4のDOIランディングページ解決とLayer 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 はアブストラクトレベルの証拠のみです。主張がメカニズム、実装、または手続きを説明する場合は、その結果をフル監査の評決に昇格させないでください。主張をLayer 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はLayer 4のDOIランディングページ解決、2ソース存在確認、または撤回チェックを置き換えません。選択されたモードで必要な場合、これらの層の手動プロトコルを続行してください。


クイックスクリーン — メタデータ + DOIの簡易確認

ユーザーがDOIまたは完全な引用を提供し、簡易確認を希望する場合に使用します。

  1. CrossRefにアクセス: https://api.crossref.org/works/{DOI}
  2. 返されたタイトル + 筆頭著者の姓をユーザーが提供したものと比較
  3. https://doi.org/{DOI} を取得 — 解決し、正しい論文にたどり着くことを確認
  4. 1行で各参考文献を報告:
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論文につき5つの層すべてを実行します。層は捕捉する内容に基づいて順序付けられています — 先にスキップしないでください。

Layer 1 — 存在確認

2つのソースを独立して検索:

  • 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

論文は、タイトルが実質的に一致し、筆頭著者の姓が2つのソース間で一致した場合にのみ確認されます。

  • 2ソースヒット → CONFIRMED
  • 1ソース → SINGLE-SOURCE ⚠ — 注意して進め、出力に注記
  • 0 → NOT FOUND ✗ — 停止; 明確に報告; 代わりを捏造しない

Layer 2 — メタデータ

確認されたソースから抽出して比較: タイトル、全著者(姓)、年、ジャーナル完全名、DOI、巻/ページ(存在しない場合は [ソースにありません] とマーク)。いずれかのフィールドがソース間で異なる場合は、両方を表示 — 黙って一方を選択しない。

Layer 3 — 内容追跡可能性 ← 最も重要な層

これがスキルの中核価値です。目的は単に「この論文は存在するか」ではなく、「この論文は実際に、帰属されている主張を含んでいるか」です。

ステップ 0 — 主張を分類。

取得する前に、検証対象の主張の種類を分類します:

  • トップライン/見出しレベルの主張 — アブストラクトが慣習的に述べる種類の知見(全体的な結果、トップラインの数値、一般的な結論)。このクラスでは、アブストラクトのみの証拠が正当な情報源です。
  • メカニズム/実装/手続きの主張 — 何かがどのように機能するか、またはどのように行われたかを説明します: 特定のメカニズム、アルゴリズム、アーキテクチャ、パラメータ、実験ステップ、制御条件、または要約結果ではなく表/図/方法セクションに結びついた数値。アブストラクトは、論文が裏付けている場合でも、この内容を日常的に省略します。シグナルワード: 「メカニズム」、「どのように」、「アーキテクチャ」、「アルゴリズム」、「実装」、「手続き」、「プロトコル」、「パラメータ」、「制御グループ」、「アブレーション」、「表」、「図」、または1段落の要約が述べるよりも具体的な主張。

主張がメカニズム/実装クラスの場合、アブストラクトのみのチェックは、アブストラクトがトピック的に合致している場合でも不十分です。アブストラクトを存在/トピック一致の証拠として取得しますが、アブストラクトだけで評決を下さず、以下のLayer 3bに進みます。

以下の優先順位でアブストラクトを取得:

  1. CrossRef raw 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の場合、{連絡先メール} を設定からの実際のユーザー認証済みアドレスに置き換えてください。プレースホルダアドレスを送信しないでください。

取得後、チェック: アブストラクトは引用されている特定の主張を含んでいますか?

  • アブストラクトが主張を明示的に含んでいる(そのまま引用)→ CONTENT: SUPPORTED
  • アブストラクトはトピックについてだが、特定の主張をしていない → CONTENT: PARTIAL — 実際に述べていることを引用
  • アブストラクトが主張と矛盾する → CONTENT: CONTRADICTED — この引用を使用しない
  • すべてのソースを試した後、アブストラクトにアクセスできない → CONTENT: UNVERIFIABLE — ユーザーが全文を確認する必要あり
  • 主張がメカニズム/実装クラスで、Layer 3bのすべてのソースを試した後も全文が取得できない → CONTENT: ABSTRACT-ONLY — 全文が利用不可、検証不十分。このラベルは決してSUPPORTED/ACCEPTにアップグレードしてはなりません。

緩めることのできないルール: 論文が「示す」「実証する」「報告する」内容を説明する場合は、必要な深度で取得したソーステキストを引用または直接言い換えなければなりません。記憶から要約することは、たとえ自信があっても許可されません。

Layer 3b — 全文確認(メカニズム/実装クラスの主張のみ)

ステップ0で主張がメカニズム/実装クラスに分類された場合、またはアブストラクトの評決がアブストラクトの要約レベルよりも具体的な主張に対して PARTIAL である場合に必須です。アブストラクトから直接 CONTENT: SUPPORTED を受け取ったトップラインの主張に対してのみスキップします。

以下の優先順位で論文本文を取得し、最初の成功で停止:

  1. ローカルZotero PDF — Zoteroライブラリが設定されている場合、このDOIのデータベースをクエリし、添付キーを解決し、リンクされたPDFを読み取ります。一般的なデフォルトは ~/Zotero/zotero.sqlite で、添付ファイルは ~/Zotero/storage/{key}/ の下にあります。実際のパスを発見し、想定しないでください。
  2. research-wiki ボールト — research-wiki スキルが利用可能な場合、設定されたボールト内にすでに取り込まれた全文コピーを検索します。マシン固有のボールトパスを想定しないでください。
  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 には全文引用が必要です。アブストラクトレベルのトピック一致では満たせません。

Layer 4 — DOI解決

https://doi.org/{DOI} を取得します。ランディングページが期待される論文と一致することを確認します。タイトルと巻を含むURLスラッグからの403(ボットブロック)はデッドリンクではありません — ペイウォールとして注記します。無関係なページへのリダイレクトは重大な障害です。

Layer 5 — 撤回確認

「{筆頭著者の姓}」 「{ジャーナル名}」 撤回 を検索し、DOIランディングページで撤回バナーを確認します。撤回された論文は一次情報源として使用してはなりません。


出力形式

クイックスクリーン: 1行1参考文献(上記参照)。

フル監査: 1論文につき1カード、その後サマリーテーブル。

参考文献監査
────────────────────────────────────────────────
論文:   [ライブソースからのタイトル — 記憶からではない]
DOI:     [DOI] — [✓ 解決 | ✗ デッド | ✗ 誤った論文 | ⚠ ペイウォール-403]
著者: [完全な著者リスト — ライブソースから]
年:     [年]
ジャーナル: [ジャーナル名]

Layer 1 (存在): CONFIRMED / SINGLE-SOURCE ⚠ / NOT FOUND ✗
Layer 2 (メタデータ): すべて一致 / 不一致: [差異の詳細]
Layer 3 (内容): SUPPORTED / PARTIAL / CONTRADICTED / UNVERIFIABLE / ABSTRACT-ONLY
  [主張に対する直接引用または言い換え]
Layer 4 (DOI解決): ✓ 解決 / ✗ デッド / ✗ 誤った論文 / ⚠ ペイウォール
Layer 5 (撤回): 撤回されていない / ⚠ 撤回済み — 使用不可
────────────────────────────────────────────────

サマリーテーブル:

| 著者(年) | DOI | Layer 1 | Layer 3 | DOI解決 | 撤回 |
|----------|-----|---------|---------|--------|------|
| Smith et al. (2021) | 10.1234/example | ✓ | SUPPORTED | ✓ | クリア |
| Jones (2019) | 10.5678/other | ⚠ SINGLE | PARTIAL | ✓ | クリア |
| Kim (2023) | 10.9999/fake | ✗ | — | ✗ | — |

失敗ケースとエラー処理

スキルコンテキスト外

  • APA/IEEEスタイルの書式設定: このスキルは内容検証用です。書式設定は異なるスキルまたは手動で行ってください。
  • 一般的なトピック説明: ユーザーが特定の論文引用なしにトピックの説明を求めている場合、このスキルは適用されません。
  • 散文編集: 文法、スタイル、流れの改善は、引用幻覚検出とは別の問題です。

スキルコンテキスト内のエラー状態

状態処理
提供されたDOIがCrossRefで解決しないDEAD DOI として報告。Layer 1で代替を見つけようとしない — ユーザーに修正を依頼
DOIは解決するがタイトル/著者が一致しないMISMATCH として報告。CrossRefが返した実際のタイトルと著者を表示
アブストラクトがどのソースでも利用できないCONTENT: UNVERIFIABLE として報告。「アブストラクトはどのソースでも利用できません。ユーザーが手動で全文を確認してください。」
DOIランディングページが403を返す⚠ ペイウォール として報告 — デッドリンクではないと注記
Zoteroが設定されていない静かにスキップし、次の全文ソースに進む
research-wikiが利用できない静かにスキップし、次の全文ソースに進む
すべての全文ソースが失敗CONTENT: ABSTRACT-ONLY として報告。SUPPORTEDに昇格させない
無効なDOI形式「無効なDOI形式」として報告。DOIを解析しようとしない
レート制限されたAPISOURCE_RATE_LIMITED として報告。異なるソースを試すか、ユーザーに後で再試行するよう依頼
arXiv IDがarXivタイトル検索に対応しない通常のDOIチェーンの一部として試行しない。プレプリントとして明示的に提供された場合のみarXivを使用
ユーザーがDOIなしの記憶からの引用を提供検索ベースのLayer 1を実行(クイックスクリーンまたはフル監査、モードに応じて)。arXivを追加の存在確認ソースとして含める

保存されたスキル構成

保存された構成は必要に応じて環境変数または設定ファイルを提供します:

  • CONTACT_EMAIL: 連絡先メールが必要なAPI(OpenAlex、Unpaywall)用のユーザー認証済みメールアドレス。
  • ZOTERO_DB_PATH: zotero.sqlite データベースへのカスタムパス(デフォルト ~/Zotero/zotero.sqlite を上書き)。
  • ZOTERO_STORAGE_PATH: 添付ファイル保存用のカスタムZoteroストレージディレクトリ(デフォルト ~/Zotero/storage/ を上書き)。
  • RESEARCH_WIKI_VAULT_PATH: research-wikiボールトへのカスタムパス。
  • REF_VERIFY_SKIP_CLI: true に設定すると、CLIが利用可能な場合でもCLIをバイパスし、手動プロトコルのみを使用します。

これらの値は通常、.env ファイルまたはスキル構成インターフェースを通じて提供されます。設定されていない値は、上記のデフォルトまたはフォールバック動作を使用します。


使用例

例1: 特定の主張を裏付けるための論文検索

ユーザー: 「transformerアーキテクチャにおけるLayerNormの位置がパフォーマンスに与える影響を示した論文を探して」

モード: フル監査(ゼロから検索)

  1. Layer 1: 「Layer Normalization in Transformer Architectures」と「Pre-LayerNorm vs Post-LayerNorm」の両方をCrossRefとSemantic Scholarで検索
  2. Layer 2: 両方のソースからのメタデータを比較
  3. Layer 3: 「Xingら(2021)はPost-LayerNormよりもPre-LayerNormのほうが学習が安定することを示した」という主張を検証 → アブストラクトをチェック → 「pre-layer normalization stabilizes training」→ SUPPORTED
  4. Layer 4: DOIが解決することを確認
  5. Layer 5: 撤回されていないことを確認

出力: 「Xingら(2021)「On the Position of Layer Normalization in Transformers」: アブストラクトは『pre-layer normalization stabilizes training』と述べており、主張と一致しています。(DOI: 10.1234/example)」

例2: 投稿前の参考文献スイープ

ユーザー: 「私の論文の参考文献を監査して。リストはここ:」[20件の参考文献]

モード: ≤5件 → すべてフル監査; >5件 → まずクイックスクリーン → その後不一致をフル監査

  1. 20 > 5 → すべてクイックスクリーン
  2. 結果: 18件PASS、1件MISMATCH、1件DEAD DOI
  3. 不一致 + デッド → フル監査
  4. MISMATCH: DOIが異なる論文に解決 → ユーザーに修正を依頼
  5. DEAD DOI: 代替DOIを検索(「Smith 2022 transformer efficiency」)→ 見つかったらLayer 1-5を実行

関連スキル