AIの業務活用

AIが引用した参考資料やリンクが実在するか確認する

AIが示した参考資料はもっともらしく見えても、リンクが存在しなかったり、実際の内容がAIの説明と一致しなかったりすることがあります。小さな合成例を使って、リンクの存在と主張との対応を確認します。

目次を表示

この翻訳はAIで作成しました。コード、単位、数値は原文と併せて確認してください。各言語のネイティブ話者による校閲は、まだ完了していません。 English

対象読者AIチャットアシスタントを調査、レポート、文書作成に使い、引用された参考資料を自分で確認したい人向けです。

準備するもの
  • Python 3.12
  • URL確認スクリプトを実行するときのインターネット接続

01AIが作った参考資料をなぜ確認するのか

専門的に見える参考資料でも、自動的に信頼できるとは限りません。AIの回答には、実在するURLでも説明が不正確なもの、すでに存在しないURL、完全に作られた参考資料が含まれることがあります。そのため、確認は2つの問いに分けます。参考資料が実在するか、そしてその資料がAIの主張を実際に裏付けているかです。

  • 存在確認: URLにアクセスでき、通常のWeb応答が返るか。
  • 内容確認: 取得したページにAIの主張と関係する情報が実際に含まれているか。
  • 出典確認: AIが挙げた組織、発行元、公式ドキュメントサイトのページであるか。
  • 人による最終確認: 数個のキーワードが一致するだけでなく、主張全体を本当に裏付けているか。

02小さな合成例で確認する

次の例は合成データです。AIチャットアシスタントに、URLを開く方法とJSONを扱う方法を説明するPython標準ライブラリの公式資料を尋ねたとします。業務メモに参考資料を載せる前に、自分で確認する場面です。

AIへの依頼例: URLを開く方法とJSONを読み書きする方法について、Pythonの公式参考資料を教えてください。各参考資料が裏付ける具体的な主張を1つと、正確なURLも示してください。

参考資料AIの主張URL
urllib.requestPythonはURLを開くためのurllib.requestを提供している。https://docs.python.org/3/library/urllib.request.html
jsonPythonのjsonモジュールはJSONのエンコードとデコード機能を提供している。https://docs.python.org/3/library/json.html
合成した偽の参考資料このページはAI専用の参考資料検証ツールを説明している。https://example.invalid/fake-reference

3行目は、この合成例のために意図的に作った偽の参考資料です。目的は、引用の見た目を信用するのではなく、確認手順でこのような項目を検出することです。

03AIの回答を明確な確認項目に変える

自然言語の主張全体が正しいかどうかをPythonだけに判断させるのは避けます。代わりに、URL、AIの主張、そのページが関連しているなら現れそうな少数の語を記録します。これらの語は、あくまで一次確認の補助です。

URL確認する語
https://docs.python.org/3/library/urllib.request.htmlurllib.request; URL
https://docs.python.org/3/library/json.htmljson; encoding; decoding
https://example.invalid/fake-referencereference; verifier
  1. AIが返した各URLをそのままコピーします。
  2. URLだけでなく、その横にAIの主張も記録します。
  3. ページとの関連性をすばやく確認できる特徴的な語を数個だけ選びます。
  4. 自動確認の後、実際に引用する参考資料はすべて開き、関連箇所を自分で読みます。

04PythonでURLとページ本文を確認する

次の標準ライブラリだけを使うスクリプトは、各ページへアクセスし、最終URLとHTTPステータスを記録し、基本的な表示テキストを抽出して、指定した語が含まれるか確認します。結果はoutputs/reference_check.jsonに保存します。以前の確認結果を上書きしないように、outputsフォルダがすでに存在する場合は停止します。

python
from pathlib import Path
from urllib.request import Request, urlopen
from urllib.error import HTTPError, URLError
import html
import json
import re

checks = [
    {
        "reference": "urllib.request",
        "url": "https://docs.python.org/3/library/urllib.request.html",
        "claim": "Python provides urllib.request for opening URLs.",
        "terms": ["urllib.request", "URL"],
    },
    {
        "reference": "json",
        "url": "https://docs.python.org/3/library/json.html",
        "claim": "Python's json module provides JSON encoding and decoding.",
        "terms": ["json", "encoding", "decoding"],
    },
    {
        "reference": "Synthetic fake reference",
        "url": "https://example.invalid/fake-reference",
        "claim": "This page documents an AI-specific reference verifier.",
        "terms": ["reference", "verifier"],
    },
]

output_dir = Path("outputs")
if output_dir.exists():
    raise SystemExit("outputs already exists; remove or rename it before running again")
output_dir.mkdir()

results = []

for item in checks:
    result = {
        "reference": item["reference"],
        "url": item["url"],
        "claim": item["claim"],
        "reachable": False,
        "status": None,
        "final_url": None,
        "term_matches": {},
        "error": None,
    }

    try:
        request = Request(
            item["url"],
            headers={"User-Agent": "Worknote reference checker/1.0"},
        )
        with urlopen(request, timeout=10) as response:
            result["status"] = response.status
            result["final_url"] = response.geturl()
            raw = response.read(500_000).decode("utf-8", errors="replace")

        text = re.sub(r"<script.*?</script>", " ", raw, flags=re.I | re.S)
        text = re.sub(r"<style.*?</style>", " ", text, flags=re.I | re.S)
        text = re.sub(r"<[^>]+>", " ", text)
        text = html.unescape(text)
        text = re.sub(r"\s+", " ", text)

        result["reachable"] = True
        lowered = text.casefold()
        result["term_matches"] = {
            term: term.casefold() in lowered for term in item["terms"]
        }

    except HTTPError as exc:
        result["status"] = exc.code
        result["error"] = f"HTTPError: {exc}"
    except URLError as exc:
        result["error"] = f"URLError: {exc.reason}"
    except Exception as exc:
        result["error"] = f"{type(exc).__name__}: {exc}"

    results.append(result)

report_path = output_dir / "reference_check.json"
report_path.write_text(
    json.dumps(results, indent=2, ensure_ascii=False),
    encoding="utf-8",
)

for result in results:
    print(result["reference"])
    print("  reachable:", result["reachable"])
    print("  status:", result["status"])
    print("  final URL:", result["final_url"])
    print("  term matches:", result["term_matches"])
    print("  error:", result["error"])

print(f"Saved: {report_path}")

05結果は保守的に解釈する

ページにアクセスでき、確認語も見つかった場合でも、「手動確認が必要な候補」と考えるべきです。自動的に検証済みの主張とは扱いません。単純な文字列一致では、文脈、適用範囲、否定表現、例外条件、AIによる誇張までは判断できません。

結果解釈次の対応
アクセス可能・確認語あり関連ページである可能性がある。該当セクションを読み、AIの正確な主張と比較する。
アクセス可能・確認語なしURLは存在するが、簡易確認では想定した表現が見つからなかった。ページを手動確認し、AIが別のページを誤って引用していないか調べる。
HTTPエラーサーバーがエラーステータスを返した。URL、リダイレクト、アクセス条件、資料の移動を確認する。
ネットワークまたはDNSエラースクリプトがアドレスへ到達できなかった。スペルを確認し、別の方法で資料の存在を確認する。

06最後は自分で確認する

  1. ページタイトルと組織名が、AIが挙げた出典と一致するか確認します。
  2. ページ内でAIの主張に含まれる中心的な概念を探します。
  3. 関連文の前後を十分に読み、条件や例外を確認します。
  4. AIが限定的な記述を、より広い結論に変えていないか確認します。
  5. 後で再確認できるように、関連するセクション名や位置を記録します。
  6. 出典を特定できない引用や、主張を裏付けない引用は削除または修正します。

07よくあるミスと限界

  • 見慣れたドメインだからという理由で、そのドメイン上のすべてのURLが正しいと考えること。
  • ページ内のどこかにキーワードが1つあるだけで、主張が検証済みだと判断すること。
  • リダイレクトを無視し、AIが最初に示したURLだけを確認すること。
  • ページタイトル、検索結果の説明、要約、目次だけで詳細な主張を確認すること。
  • 自動テキスト検索を、実際の引用箇所を読む作業の代わりにすること。
  • 正規のサイトでも、自動アクセスを拒否したり、JavaScript、認証、別のアクセス方法が必要だったりする場合があることを無視すること。

学術資料では、著者、タイトル、年、学術誌、DOI、実際の論文本文も確認する必要があります。単純なURL確認スクリプトだけでは、学術的妥当性の判断、撤回論文の検出、研究手法の信頼性評価まではできません。

実行・検証の記録

2026-09-21 · hand-checked example · Python 3.12

  • 例に参考資料が3件あり、3件目が合成した偽の参考資料として明示されていることを手作業で確認しました。
  • 2つの実在例のURLがurllib.requestとjsonのPython公式ドキュメントのパスであることを確認しました。
  • スクリプトがPython標準ライブラリだけを使う構成であることを確認しました。
  • スクリプトがoutputs/reference_check.jsonを作成し、既存のoutputsフォルダを上書きせず停止する構成であることを確認しました。
  • URLへの到達可否、単純な語の一致、人による主張確認を分ける構成を確認しました。
検証範囲の限界
  • コードは私自身では実行していません。
  • 実際のネットワークアクセスは行っていないため、現在のHTTPステータスコードやリダイレクトはここでは確認していません。
  • 確認語が含まれているだけでは、ページが主張を裏付けているとは判断できず、関連箇所を人が確認する必要があります。
  • 正規のWebサイトでも、自動アクセスを拒否したり、JavaScriptレンダリング、認証、その他のアクセス方法を必要としたりする場合があります。

サイト全体の執筆・検証方針

参考資料

説明と例は独自に作成しました。関連する動作や概念は、以下の公式資料で確認できます。