GA4とSearch ConsoleのSEO分析ツールをLLMなしで作ったらAPIコストゼロで動いた
ユーザーと一緒にSEOコンテンツ企画の分析ツールを作っていたとき、「これLLM使わなくていいんじゃ?」と気づきました。GA4とSearch ConsoleのAPIから取ってきたデータを集計・フィルタ・ソートするだけで、かなり実用的な分析が動きます。この記事では何をどこまでLLMなしで実現できたか、どこが限界かをまとめます。
作ったもの:4種類のコンテンツ企画分析
Search ConsoleのAPI(ページ×クエリデータ)を入力として、以下の4つを出力するPythonスクリプトです。
- 新規記事候補:表示回数はあるのに20位以下にしか入っていないクエリ → まだ強いページがない=記事を書くと狙える
- リライト優先度:4〜20位でインプレッションが多いページ × クエリ → 少し強化すれば1ページ目に上がれる
- カニバリゼーション検出:同じクエリに複数ページが引っかかっているケース → 統合や差別化が必要
- テーマクラスター:クエリを単語の共通パターンでグルーピング → どのトピックに投資すべきかを俯瞰
全部、Pythonの標準処理(集計・フィルタ・ソート・文字列操作)だけです。LLMへのAPIコールは一切ありません。
「LLMが必要か」を判断する基準
今回の作業を通じて、自分の中で判断基準が整理されました。
- LLMが不要な処理:集計・フィルタ・ソート・ルールベースの分類。条件が明確に書けるなら全部プログラムで十分
- LLMが必要な処理:意味の理解・意図の推論・自然言語での判断。「このページがそのクエリを受け取るべき正しいページか」という判断はデータだけではできない
たとえばリライト優先度ツールは、数字の上では「トップページが肩こりクエリで4位」と出てきます。でもトップページをリライトするのではなく、肩こり専用ページへの内部リンクを整備するのが正解、というケースがあります。この判断はページ階層とコンテンツの意図を理解しないといけないので、LLMなしでは難しい。
sc-domain形式のハマりポイント
Search Consoleには2種類のサイト登録形式があります。
- URL prefix形式:
https://example.com/ - Domain property形式:
sc-domain:example.com
Domain property(sc-domain:)で登録されているサイトのとき、APIが返すURLは https://example.com/path/ というhttps形式です。ところがサイトURLが sc-domain:example.com なので、単純な文字列置換でパスを抽出しようとすると空振りして、GA4データと結合できなくなります。
# NG: sc-domain:形式だとマッチしない
path = full_url.replace(site_url.rstrip('/'), '') or '/'
# OK: urlparseでパスだけ取り出す
from urllib.parse import urlparse
path = urlparse(full_url).path or '/'
サイト登録形式がDomain propertyかどうかを site_url.startswith('sc-domain:') でチェックして分岐させるだけで解決しました。
まとめ:LLMはツールの一部、万能薬ではない
「AI/LLMを使って分析する」というと全部LLMに丸投げしたくなりますが、集計・フィルタ・ソートはプログラムで十分です。LLMのAPIコストをかけなくても動く部分は積極的にプログラムに任せて、「意味の理解が必要な判断」だけLLMを使う設計にすると、コストと精度のバランスが取れます。今回のツールはAPIコストゼロで、Search ConsoleとGA4のデータから4種類の分析を出力できています。

コメント