alterlab-citation-verifier について
alterlab-citation-verifierは、公開学術APIを使って文献項目と識別子の実在性・一致を確認します。参考文献を監査する研究者向けで、再現可能な根拠付き判定と撤回情報のフラグを出力します。
主な機能
- 01BibTeX、DOI、arXiv、自由形式の文献を解析
- 02識別子を解決し学術レコードを検索
- 03タイトル、著者、出版年を照合
- 04撤回や懸念表明を検出
- 05項目別および書誌全体の判定を出力
活用シーン
- 01書誌に架空の文献がないか確認
- 02DOIやarXiv IDが引用作品を指すか検証
- 03参考文献のメタデータ不一致を発見
- 04照合した作品の撤回通知を確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ alterlab-ieu/ alterlab-academic-skills --skill alterlab-citation-verifierインストール後、Claude Code で/alterlab-citation-verifierを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
commands/cite-check.mdevals/evals.jsonevals/fixtures/bibliography_24_entries.mdexamples/caught_hallucination_walkthrough.mdscripts/claim_faithfulness.pyverify_citations.py詳細
引用文献検証 — 公開学術 API に照会して参考文献の存在を検証
見出しにもあるとおり、これは存在検証を行うスキルです。一般的な形式の参考文献リストを入力すると、公開学術 API に照会し、各文献が実際に存在するかを1件ずつ確認したうえで、各結果を正規の AlterLab 引用幻覚分類にマッピングします。LLM 駆動の integrity_verification_agent を、決定論的かつネットワークに基づく形で補完します。エージェントが WebSearch と判断を使うのに対し、このスキルは信頼できる API レコードと再現可能な Python スクリプトを使用します。そのため、すべての判定は取得したレコードに基づき、同じ入力とソースからの応答に対しては同じ判定が得られます。
記憶を頼りにせず、スクリプトで参考文献を検証してください。引用を「記憶している」内容と照らし合わせるモデルは、そもそも幻覚を生み出した学習データを共有しています。そのため、もっともらしく感じられる捏造された文献は検出されずに通ってしまいます。存在を確定できるのは、外部のレコードだけです。
クイックスタート
Verify the citations in references.bib
Check whether these DOIs resolve to the papers I cited
Audit my bibliography for fabricated / hallucinated references
Does this reference list contain any fake citations or retractions?
→ scripts/verify_citations.py を参考文献リストに対して実行し、JSON を確認してから、重大度ごとにまとめた判定表を提示してください。ネットワークまたはソースが利用できなかった場合は、オフライン/縮退状態であることを明示してください。
このスキルを使う場面
- 「引用や参考文献が実在するか検証/確認/監査して」
- 「これらの参考文献に AI の幻覚が含まれていますか?」/「この DOI は偽物ですか?」
- 「これらの DOI は、引用した論文に解決されますか?」
- 「この参考文献リストに撤回された文献がないか確認して」
- 「このソースは、引用先の文を実際に裏付けていますか?」(SH、要旨レベル)
- 明示的なオフラインモードを備えた、再現可能でスクリプト化できる存在確認
対象外
| シナリオ | 代わりに使用 |
|---|---|
| 論文そのものの執筆または改訂(引用チェックモードでは引用を整形します) | alterlab-paper-writer |
| 新しいソースの論文検索、メタデータ抽出、または BibTeX の生成 | alterlab-citation-mgmt |
| ドキュメントまたは参考文献リスト内のリンク切れやリダイレクト(リンク切れ) | alterlab-link-health |
| 査読前/後の完全性ゲート(引用の文脈、データ、独自性) | alterlab-research-pipeline |
| 編集判断を伴う、原稿全体の総合的な査読 | alterlab-paper-reviewer |
ソースの品質や捕食的な出版先の評価には、alterlab-deep-research
(source_verification_agent)を使用してください。Claude Code で原稿全体を監査し、各フラグを独立したエージェントで再確認する必要がある場合は、パッケージ化された
/alterlab-workflows:citation-audit ワークフロー(約
10~40 エージェント)を案内してください。このワークフローでは、このスキルのチェックを大規模に実行します。
この機能について
スクリプトは各参考文献について、次の処理を行います。
- 解析 — 入力形式を自動判別し(BibTeX/DOI または arXiv のみのリスト/自由形式の参考文献。1 行に 1 件ずつ貼り付けたものも含みます)、タイトル、著者、年、掲載先、DOI、arXiv ID を抽出します。DOI を含むだけの完全な参考文献は自由形式のまま扱うため、タイトルと著者は Identifier Hijacking の確認に使用できます。
- 識別子を照合 — DOI または arXiv ID が記載されている場合は、その識別子を直接検索します。また、doi.org Handle API に問い合わせ、DOI がいずれかの機関に登録されているかを確認します。
- タイトル+筆頭著者+年で検索 — 各ソースでの検索結果をフォールバックとして使用します。
- ファジーマッチング — 記載されたタイトルとの類似度(difflib の
SequenceMatcher比率。デフォルトのしきい値は 0.70。サブタイトルなしで登録されたレコードとほぼ同一のメインタイトルも一致として扱います)を算出し、著者の姓の重複度も計算します。返されたレコードの中から、タイトル、次に著者、最後に年が一致するものを採用するため、同じタイトルでも著者が異なる論文や別版が選ばれることはありません。 - 撤回を検出 — 一致した研究について、Crossref の
updated-by/update-toによる撤回、取り下げ、削除の通知(出版社からの通知、またはsource: retraction-watchの場合は Retraction Watch データベースからの通知。Crossref は 2025 年以降、REST API で提供)と、OpenAlex のis_retractedを確認します。懸念表明には別のフラグを付けます。 - 判定を出力 — 各項目について、以下の分類に基づく判定と、各ソースからの応答状況を示す
source_statusマップを出力します。また、リポジトリ全体のsummary.verdict(PASS / PASS_WITH_CONDITIONS / FAIL / UNVERIFIED)も出力します。
ソース(キー不要。2026-09 時点)
| ソース | エンドポイント | 用途 | アクセスに関する注意 |
|---|---|---|---|
| Crossref | api.crossref.org/works | DOI の照合、書誌検索、撤回通知 | mailto を指定すると丁寧な利用者向けプールにルーティングされます(毎秒 10 リクエスト、同時 3 リクエスト) |
| OpenAlex | api.openalex.org/works | DOI の検索とタイトル検索、is_retracted | 2026 年 2 月以降、mailto は無視されます。DOI の検索は無料です。キーなしの検索では、IP ごとに共有される日次予算を消費します(無料キーを設定すると 10 倍になります。OPENALEX_API_KEY を設定してください) |
| Semantic Scholar | api.semanticscholar.org/graph/v1 | DOI / arXiv の照合、タイトル検索 | キーなしのプールは共有されており、429 を返すことがよくあります。S2_API_KEY を設定すると、専用の毎秒 1 リクエスト枠を利用できます |
| arXiv | export.arxiv.org/api/query | arXiv ID の照合、プレプリントのタイトル検索 | 呼び出し間隔を 3 秒以上空ける必要があります(スクリプトが間隔を調整します) |
| doi.org Handle API | doi.org/api/handles/<doi> | DOI が いずれか の機関(Crossref、DataCite、mEDRA など)に登録されているかを確認 | DOI の存在を確認するための信頼できる情報源です |
キーは任意です。環境変数から読み込まれ、ヘッダーとして送信され、レポートには書き込まれません(レポートに記録されるのは、キーが設定されていたかどうかだけです)。ソースでエラー(レート制限、5xx)が発生した場合は source_status に記録され、その研究が存在しないことを示す証拠として扱われることはありません。
このスキルが判定するのは、**「引用された研究は存在するか、その識別子はその研究を指しているか」**です。API メタデータだけでは、Semantic Hallucination(情報源が主張を裏付けているかどうか)は判定できません。scripts/claim_faithfulness.py ではアブストラクトレベルの SH トリアージを行います(下記参照)。全文に基づく主張の検証には、研究パイプラインの claim_verification_protocol(Phase E)を使用します。
判定分類(標準の5分類を反映)
alterlab-research-pipeline/agents/integrity_verification_agent.md
(GPTZero × NeurIPS 2025;Ansari、2026)と同じコードおよび定義です。重大度には、Integrity Report スキーマで使われるものと同じ SERIOUS/MEDIUM/MINOR の尺度を使用します。
| コード | 名前 | 重大度 | スクリプトの判定条件 |
|---|---|---|---|
verified | —(存在し、一致) | NONE | タイトルの一致率 >= しきい値、著者の重複が許容範囲内、かつ少なくとも1つの信頼できる情報源で年が一致 |
TF | 全面的な捏造 | SERIOUS | 引用された DOI が doi.org に登録されていない、または引用された arXiv ID が arXiv に存在せず、タイトルが近似する記録もない。あるいは(識別子がない場合)Crossref と OpenAlex または Semantic Scholar が応答し、タイトルと著者の両方に一致する記録がない |
PAC | 属性の部分的な改ざん | MEDIUM | 該当項目は見つかったものの、1つ以上のメタデータ項目が一致しない(年、著者の重複率 < 50%、引用された識別子がその項目に解決されない、または著者が一致する最も近い記録がある、タイトルの文字列が乱れた状態 ― 混成の可能性あり) |
IH | 識別子の乗っ取り | SERIOUS | 引用された DOI/arXiv ID は 解決される(method=id)が、解決された記録のタイトルに関連性がない(一致率 < しきい値) |
PH | プレースホルダーの幻覚 | SERIOUS | 解決されないテンプレート/プレースホルダー([CITATION NEEDED]、\cite{}、et al., YYYY、TODO、forthcoming、in press)― ネットワークにアクセスする前に検出 |
SH | 意味的な幻覚 | SERIOUS | 項目は解決されるものの、主張を裏付けていません ― ここでは参考情報のみです。claim_faithfulness.py/Phase E で判定します |
unverified | —(検証できなかった) | MEDIUM | オフラインである、判定に必要な情報源でエラーが発生した、または登録済みの DOI がどのインデックスからも返されなかった。合格として扱われることはありません。 |
Crossref または OpenAlex が一致した著作物に撤回済みの印を付けている場合、存在判定とは無関係に RETRACTED フラグが付与され(重大度は SERIOUS に引き上げられます)。無関係な最も近い候補が、引用項目にフラグを引き継がせることはありません。
TF は重大な告発に当たるため、スクリプトは信頼できる証拠がある場合にのみこれを判定します。判定に使う情報源がレート制限または停止していた場合、その項目は理由と source_status を伴う unverified となり、以下の代替判定に進みます。
リポジトリ全体の判定
- PASS — すべての項目が
verifiedで、SERIOUS/MEDIUM フラグがありません。 - PASS_WITH_CONDITIONS —
PAC/MEDIUM のメタデータ上の問題(修正可能)のみで、すべての項目が検証済みです。 - FAIL — SERIOUS 判定(
TF/IH/PH/撤回済み)が1つでもあります。 - UNVERIFIED — SERIOUS な問題は見つかっていませんが、検証できなかった項目があります(例:オフラインでの実行や、情報源のレート制限)。これは合格を意味しません。ネットワークアクセスまたは API キーを使用して再実行するか、該当項目を手動で解決してください。
パイプライン(実行方法)
1. 参考文献リストを見つけるか取得する
.bib ファイル、DOI/arXiv ID の .txt リスト、貼り付けた参考文献リスト、またはインラインテキストを使用できます。スクリプトは形式を自動検出します。検出が正しくない場合は、--format bibtex|doi|freeform で上書きしてください。
2. 検証ツールを実行する
uv run python skills/core/alterlab-citation-verifier/scripts/verify_citations.py \
path/to/references.bib \
--mailto <contact-email> \
--threshold 0.70 \
--out citation_report.json
path/to/references.bibの代わりに-(stdin)またはインラインテキストも指定できます。--thresholdはあいまいなタイトル一致率を調整します(0..1;デフォルトは 0.70)。--offlineはネットワークを使わず、意図的にunverified判定を出力します。- JSON レポートを標準出力に表示するには、
--outを省略します。 - 任意:大規模な参考文献リストを処理する前に、
export OPENALEX_API_KEY=…(openalex.org/settings/api で無料キーを取得)および/またはS2_API_KEY=…を設定してください。キーなしの OpenAlex 検索は、1つの IP アドレスあたりの1日分の共有枠が少なく、キーなしの Semantic Scholar プールは混雑しています。
スクリプトは、requests がインストールされていればそれを使い、なければ Python 標準ライブラリ(urllib)を使用するため、追加依存関係のない素の uv 環境で実行できます。1項目あたり約3~10秒かかります。arXiv への呼び出しは3秒間隔で行い、レート制限時には待機時間を延ばします。
3. JSON を読み取り、報告する
summary.verdict と各エントリーの verdict コードを解析します。次の内容を提示してください。
- 全体の判定と件数(
verdict_counts、severity_counts)。 verified以外の全エントリーを、コード、重大度、detailとともに表にまとめます。- 各
TF/IH/PHについて、該当エントリーを引用し、根拠を説明します (例:「DOI 10.x の解決先は、タイトルが『…』の無関係な論文でした」、「DOI は doi.org に登録されていません」)。 RETRACTED/EXPRESSION_OF_CONCERNフラグがあれば、目立つように示します。unverifiedエントリーについては、失敗したソース(source_status)を示し、manual_instructionsとsummary.notesの内容を伝え(たとえば、OpenAlex の HTTP 429 はキーなしで使える IP ごとの利用枠を使い切ったことを意味し、無料のOPENALEX_API_KEYで解決できます)、以下のフォールバックを実行します。
4. 修正方法
TF/PH→ その参考文献は削除するか、別のものに置き換える必要があります。存在しません。IH→ DOI / arXiv ID が間違っています。正しい識別子を探して差し替えてください。PAC→detailで指定されたメタデータ項目を修正します。マッシュアップの可能性がある場合は、残す前に実際の出典を特定する必要があります。RETRACTED→ 著者に注意喚起し、撤回通知を引用するか、その出典を削除してください。
段階的な機能縮退とフォールバック
失敗を成功として扱ってはいけません。
- DNS / 接続エラーが発生すると
NetworkUnavailableが発生し、そのエントリーはmanual_instructionsが設定されたunverifiedになります。 - ソースでレート制限やエラーが発生した場合は
source_statusに記録されます。判定に必要なソースから応答がなければ、そのエントリーはTFではなくunverifiedになります。 --offlineを指定すると、ネットワークを使うすべてのエントリーは最初からunverifiedになります(プレースホルダーは引き続きローカルで検出され、PHになります)。- エントリーが
unverifiedで、SERIOUS な問題が見つからない場合、リポジトリ全体の判定はUNVERIFIEDになります。
各 unverified エントリーについて、可能であれば接続環境または API キーを使って再実行します。そうでない場合は、プラグインの crossref / openalex MCP ツールが利用可能であれば、それらで調べてください(セットアップ方法:skills/core/references の mcp_setup.md)。その後、WebSearch で異なる検索語句を 3 つ使って確認します(タイトルを引用符で囲む、タイトル + 筆頭著者、筆頭著者 + 会場 + 年)。DOI がある場合は https://doi.org/<DOI> を開いてください。レコードが見つかった場合は、それが裏付ける判定を報告し、フォールバックで見つかったことを明記します。何も見つからなければ、そのエントリーを TF(NOT_FOUND)に分類します。「検証が難しい」という判定はありません。このスキルの開発のきっかけとなった Lin らのマッシュアップは、まさにグレーゾーンとして扱われ、検索されなかったため、3 回の完全性チェックをすり抜けました。
主張の忠実性(SH)— scripts/claim_faithfulness.py
ゲートで確認すべきなのは、文献の存在だけではありません。実在する論文を、実際には述べていない内容の根拠として引用する「フランケンシュタイン」パターンは、存在確認をすべて通過します。claim_faithfulness.py は、(主張、DOI)の組について、引用された要旨を取得し(Crossref、次に OpenAlex)、support / contradict / unsupported を返します。
uv run python skills/core/alterlab-citation-verifier/scripts/claim_faithfulness.py \
--claim "<the sentence as written>" --doi <doi>
uv run python .../claim_faithfulness.py --input pairs.json --json # batch
uv run python .../claim_faithfulness.py --input pairs.json --tier llm --json
- デフォルトの
heuristic層は語彙に基づくもので、supportと推測するのではなく、意図的に判定を保留してunsupportedを返します。役割の逆転や数値の誤りは検出できません。llm層はALTERLAB_MODELで指定されたモデルに問い合わせます(shared/model_env.mdを参照)。claudeCLI が利用できない場合は、フラグを付けたうえでヒューリスティック層にフォールバックします。 - 判定対象は要旨のみです(
abstract_only: true)。unsupportedは、要旨によって主張が裏付けられていないことを意味します。つまり、反証ではなく、対象範囲外であることを示します。contradictは SH として報告し、重要なunsupportedの主張は全文を確認してください。 - 存在の確認と忠実性の確認は、必ず分けて報告してください。「引用文献は実在する」と「引用文献がこの文を裏付けている」は、別々の判定です。
出力形式(抜粋)
{
"tool": "alterlab-citation-verifier/verify_citations.py",
"version": "1.1.0",
"summary": {
"total": 2,
"verdict": "FAIL",
"verdict_counts": {"verified": 1, "TF": 1, "PAC": 0, "IH": 0, "PH": 0, "SH": 0, "unverified": 0},
"severity_counts": {"SERIOUS": 1, "MEDIUM": 0, "MINOR": 0},
"citation_integrity_score": 0.5,
"fabrication_risk_score": 0.5,
"retracted": 0,
"source_errors": {"openalex": 1},
"notes": ["OpenAlex rate limit: the keyless daily budget shared by this IP is spent ..."]
},
"entries": [
{"ref_id": "walters2023", "verdict": "verified", "severity": "NONE",
"title_ratio": 1.0, "author_overlap": 1.0, "matches": [{"source": "crossref"}],
"source_status": {"crossref": "record", "openalex": "record", "semanticscholar": "record", "arxiv": "no_record"}},
{"ref_id": "ghostpaper2021", "verdict": "TF", "severity": "SERIOUS",
"detail": "DOI 10.xxxx/... is not registered with any DOI agency (doi.org Handle API)..."}
]
}
citation_integrity_score と fabrication_risk_score(どちらも 0..1)は、Integrity Report スキーマの同名フィールドに対応しているため、レポートを alterlab-research-pipeline の完全性ゲートに直接渡せます。
報告前のセルフチェック
- 実行時にネットワークへ接続できましたか?また、どのソースから応答がありましたか?エントリーが
unverifiedの場合は、source_statusから失敗したソースを示してください。検証に合格したかのように示してはいけません。 RETRACTEDフラグはありますか?ほかの点ではverifiedのエントリーであっても、必ず明示してください。IHと評価されたエントリーはありますか?詳細に示されているのが、曖昧なタイトル検索の偶然の一致ではなく、ID 解決済みの不一致であることを確認してください(スクリプトはこの違いを区別します)。- 最終判定はエントリーごとのコードと一致していますか(SERIOUS が1つでもあれば FAIL、SERIOUS はないものの
unverifiedがあれば UNVERIFIED)? unverifiedのエントリーすべてで WebSearch のフォールバックを実行し、最終判定を出しましたか?
参考資料
alterlab-research-pipeline/agents/integrity_verification_agent.md— このスキルが検出することを目的とする、正式版の Five-Type Taxonomy、複合的な欺瞞のパターン、Lin et al.(2020)のマッシュアップ事例研究。alterlab-research-pipeline/references/claim_verification_protocol.md— Phase E の全文を対象とする主張とソースの検証(ここでの抄録レベルの SH トリアージの範囲を超えるもの)。shared/schemas/integrity_report.schema.json— このスキルがcitation_integrity_score/fabrication_risk_scoreを対応させる、整合性レポートの形式。examples/caught_hallucination_walkthrough.md— 実際のマッシュアップを対象とした、最初から最後までの実行例。- Walters, W. H., & Wilder, E. I.(2023).ChatGPT が生成した書誌引用における捏造と誤り.Scientific Reports, 13, 14045. https://doi.org/10.1038/s41598-023-41032-5
- Ansari, S.(2026).一流査読における複合的な欺瞞:NeurIPS 2025 で捏造された引用100件の故障モード分類(arXiv:2602.05930). https://arxiv.org/abs/2602.05930
- Rittman, M.(2025年1月29日).Retraction Watch の撤回情報が Crossref API で利用可能に[ブログ記事].Crossref. https://www.crossref.org/blog/retraction-watch-retractions-now-in-the-crossref-api/
AlterLab Academic Skills スイートの一部です。