VWork バイブコーディングフレームワーク

AIショート動画サイト(Kurage)のアクセスログを見ていたら、奇妙なことが起きていました。1982年のトルコ映画「土の汗(Toprağın Teri)」を紹介しただけのショート動画1本が、サイト全体の動画アクセスの半分以上を占めていたのです。

この記事は、その原因分析から「偶然を仕組みに変える」自動化をローカルLLM(gemma・Ollama)で実装するまでの記録です。

何が起きたか: 実測データ

該当動画ページのアクセスを集計した結果がこれです。

Search Consoleにはまだ出ていませんでした(GSCは集計に1〜2日遅れる)が、リファラログが検索流入を直接証明していました。

なぜ伸びたのか: 「バズった固有名詞 × 情報の空白」

流れを再構成するとこうなります。

  1. X(旧Twitter)で、この映画のワンシーンを貼ったポストがバズった(本文は「あっ」だけ)
  2. 見た人が「映画 土の汗」でGoogle検索する
  3. ところがこの映画は超マイナーで、日本語のWebにほぼ情報が存在しない
  4. 競合ゼロなので、タイトルに「土の汗」を含むうちの動画ページが即座に上位表示

重要なのは、この動画ページのSEOメタデータ(seo_title/description/keywords)が全部空だったことです。<title>にたまたま固有名詞が入っていただけで、この流入です。「バズった無名の固有名詞」は、SEOの世界で最も競争の少ないロングテールでした。

偶然を仕組みに変える: 固有名詞SEO自動化

そこで、完了した動画ジョブに対して「タイトル/要約から固有名詞を抽出し、それを軸にSEOメタデータを自動生成する」処理をローカルLLMで作りました。構成は:

プロンプトの中核はこの2つのルールです。

- タイトル/要約に含まれる固有名詞(映画・番組・作品名、人名、ブランド名等)を特定し、
  seo_title・seo_description・seo_keywordsに必ず含める。
- **ここに書かれていない事実(公開年・出演者・あらすじ・国名など)を推測で書かない。**
  与えられた情報だけを言い換える。知識の追加は禁止。

2つ目が肝です。マイナーな作品ほどLLMの幻覚リスクが高い。しかし検索ランキングに効くのは「固有名詞がページに存在すること」であって、捏造された蘊蓄ではありません。だから「知識の追加は禁止、言い換えのみ」に制約します。実際「土の汗」で生成された説明文を検証したところ、書かれた内容(窓のシーン、巨大な手の描写)はすべて元ポストに実在する記述でした。

もう1つの実務ポイント: gemmaの思考型モデルをOllama APIで使う場合、"think": false を明示しないと隠れ推論トークンが num_predict を食い潰し、空応答になります(これで1回ハマりました)。

resp = requests.post(f"{OLLAMA_URL}/api/generate", json={
    "model": OLLAMA_MODEL, "prompt": prompt, "stream": False,
    "think": False,
    "options": {"num_predict": 700, "temperature": 0.2},
})

検索者が実際に打ちそうなクエリの組み合わせもLLMに作らせます。「土の汗」の生成結果:

seo_keywords: 土の汗 / Toprağın Teri / 映画 土の汗 /
              土の汗 どんな映画 / 土の汗 1982 / 土の汗 シーン

バックフィルの結果

直近40本の動画に一括適用したところ、39本が更新され、狙える固有名詞が想像以上に埋まっていました。

あとはsystemdタイマーで2時間ごとに新規動画へ自動適用するだけです。「バズった固有名詞の動画→数時間以内に検索の受け皿完成」が全自動になりました。

学び

  1. アクセスログはGSCより速い。リファラ集計だけで「検索流入か否か」は即日わかる
  2. ロングテールの最強形は「情報の空白」。ドメインが弱くても、日本語情報が存在しない固有名詞なら初日から上位に入れる
  3. ローカルLLMはこの用途に十分。1件あたり数十秒・コストゼロで、外部APIを使う理由がない
  4. 幻覚対策は「知識の追加禁止」が一番シンプル。SEOに必要なのは固有名詞の存在であって、LLMの知識ではない

関連リンク: