AI回答を使って技術調査や製品比較をしていると、「どのWebサイトが出典として表示されたのか」を後から確認したくなります。タブやスクリーンショットだけでは、質問・回答・引用元の対応関係を追いにくくなります。
この記事では、AI引用元を記録するときの分類、集計の単位、比較時の注意点を整理します。記録には、自作のChrome拡張 AnswerSift を使う手順を紹介します。集計部分は、他の方法で記録したデータにも応用できるPythonの小さな例で説明します。
筆者はAnswerSiftの開発・運営に関わっています。製品紹介を含みます。コード例のデータは説明用の架空データであり、実測結果や実際のエクスポート形式ではありません。本文の作成にはAIを補助的に使用し、製品説明は公開仕様と照合、コード例は実行して確認しています。
1. ブランド言及・引用・検索ソースを分ける
最初に決めたいのは、「何を1件として記録するか」です。
| 分類 | 観測するもの | そこから断定できないこと |
|---|---|---|
| ブランド言及 | 回答本文に現れるブランド名 | 公式サイトが引用されたこと |
| 回答中の引用 | 回答の出典として示されたURL | AIが内部で参照した全情報 |
| 検索・取得ソース | 検索結果やソース欄に表示されたページ | 回答本文でそのページが引用されたこと |
| 通常のリンク | 本文にある一般的なリンク | 出典として使われたこと |
たとえば、ある開発ツールの名前が回答に出ても、その公式ドキュメントが引用されているとは限りません。逆に、公式ドキュメントへの引用があっても、製品名が目立つ形で言及されるとは限りません。
LLMOやGEO/AEO、AI検索最適化の調査では、この違いを混ぜると「ブランドの露出」と「引用元の傾向」が同じ指標になってしまいます。まずは観測できた事実を分けて残します。
2. 質問・回答・日時をURLと一緒に残す
URLだけでは、どの質問に対する引用だったのか分かりません。調査用の表には、少なくとも次の項目を用意すると再確認しやすくなります。
- 質問文と回答本文
- AIプラットフォームと観測日時(タイムゾーンを明記)
- 調査テーマやウォッチグループ
- ソースの種類、URL、会話に戻るためのリンク
- ソースを確認できたか、取得できなかったか
これは分析用の項目案です。AnswerSiftの内部スキーマやCSVの列名を定義しているわけではありません。
「ソースを取得できなかった」と「引用がなかった」は別の状態です。画面の読み込み途中や表示仕様の違いによる欠損を、引用ゼロとして処理しないようにします。
3. AnswerSiftで調査記録をためる
AnswerSiftは、閲覧中のAI回答から、条件に合う質問・回答・取得可能なソースを整理するためのツールです。日常のリサーチを、後で見返せる記録につなげる用途を想定しています。
- Chrome Web StoreからAnswerSiftをインストールします。
- アカウントにログインし、利用権限を確認します。現在の料金・利用条件はAnswerSift公式サイトで確認できます。
- 製品や業界のキーワードでウォッチグループを作ります。必要に応じてブランド名・別名・Webサイトを追加します。
- 対象AIサイトを有効にし、必要なサイト権限を許可したうえで、普段の調査を進めます。
- 保存した回答とソースを確認し、プラットフォーム・グループ・期間で絞り込みます。追加分析には回答・ソースのCSV出力を使えます。
たとえば「APIドキュメント」をテーマに、「認証方式」「SDK」「レート制限」などの質問を調べる場合、同じグループに記録をまとめると、出典ページを元の回答と照合しやすくなります。この例は利用方法の説明であり、特定サイトでの収集成功例を示すものではありません。
現在のサービスはクラウドアカウントに記録を保存し、拡張側にローカルの作業画面とキャッシュを持ちます。完全にローカルだけで完結する構成ではありません。機密情報を含む会話を扱う前には、収集対象と保存先を確認してください。
自動収集は、有効化・許可したAIサイトを閲覧している間の対象回答が中心です。過去の全会話の一括取得や、プロンプトの定期実行を行うツールとしては扱いません。
4. Pythonで「回答単位の引用ドメイン数」を数える
引用URLの本数だけを数えると、1つの回答が同じサイトを何度も引用した場合に、そのサイトが過大に見えることがあります。
次の例では、同じ回答内の同じホスト名を1回にまとめる方法を使います。入力は説明用に作ったデータです。AnswerSiftからCSVを出力する場合は、実際の列を確認し、分析用の形式に変換してから使ってください。
from collections import Counter
from urllib.parse import urlsplit
# 架空データ。citedとretrievedを分けて保持する。
answers = [
{"id": "a1", "cited": ["https://docs.example/start",
"https://docs.example/auth"],
"retrieved": ["https://blog.example/guide"]},
{"id": "a2", "cited": ["https://docs.example/sdk"],
"retrieved": []},
{"id": "a3", "cited": [], "retrieved": []},
]
counts = Counter()
for answer in answers:
hosts = {urlsplit(url).hostname for url in answer["cited"]}
counts.update(host for host in hosts if host)
for host, count in counts.most_common():
print(f"{host}: {count}/{len(answers)} answers")
実行結果は docs.example: 2/3 answers です。同じ回答内の2つのURLは1回として数え、検索・取得ソースの blog.example は引用の集計に加えていません。
この例の分母は、ソースの有無を確認済みと仮定した架空の3回答です。実データでは、取得状態を別途管理し、未確認レコードをどう扱ったか明記します。また、このコードはホスト名単位なので、サブドメインは別扱いです。登録可能ドメイン単位で集計したい場合は、Public Suffix Listなどに基づく別の処理が必要です。
5. 期間比較ではサンプル条件をそろえる
引用数が増えても、質問数や質問内容が変わっていれば、単純に改善とは言えません。比較するときは、質問セット、言語、AIプラットフォーム、観測期間、回答件数をそろえるか、違いを記録します。
普段の閲覧から集める記録には、自分が調べたテーマへの偏りもあります。得られるのは保存した回答の観測サンプルであり、AIプロバイダーの完全なインデックスではありません。ソース一覧だけから、内部の検索・選択アルゴリズムを確定することもできません。
LLMOツールを使った調査では、「よく現れる出典の候補」を見つけた後、そのページを読み、質問との関連性や内容の正確性を確認する段階が必要です。引用頻度だけで掲載依頼先やコンテンツ方針を決めず、次の検証の材料として使います。
おわりに
AI引用元の分析では、収集量を増やす前に、分類・集計単位・欠損の扱いを決めると記録を再利用しやすくなります。AnswerSiftは、そのための質問・回答・ソースの整理を支援します。保存した根拠へ戻れる状態を作り、引用傾向の確認やコンテンツ調査につなげてください。
製品の機能と利用条件はAnswerSift公式サイトに掲載しています。