AIで自動化

この記事もAIが書いてます。Gemini 3 PreviewとStreamlitで構築した「完全自動化ブログエンジン」の正体

この記事の音声解説は、以下のキャラクターを使用しています。
進行: VOICEVOX:ずんだもん
アシスタント: VOICEVOX:春日部つむぎ

導入:Chromeのメモリ不足への絶望と、自律型エージェント「Lumina AI」の誕生

「キーン……」

2024年の冬、深夜2時。私の部屋に響いていたのは、暖房の音ではなく、悲鳴を上げ続けるMacBook Proのファンノイズでした。

Activity Monitor(アクティビティモニタ)を開くまでもなく分かります。犯人はChromeです。「Google Chrome Helper (Renderer)」がメモリを食いつぶしている。開かれているタブは20を超えていました。ChatGPT、Claude、キーワードプランナー、競合サイトの分析タブ、そしてWordPressのエディタ……。

「AIでブログ執筆は自動化できる」
当時、Tech系インフルエンサーたちはこぞってそう叫んでいました。しかし、その甘美な言葉を信じた私たちエンジニアの現実はどうだったでしょうか?

確かにAIは文章を書けました。しかし、SEOで勝てる記事を作るための「一連のワークフロー」において、人間はAIの「介護役」に過ぎませんでした。

キーワードボリュームをCSVで落とし、競合の見出しを目視でスクレイピングし、それをコンテキストとしてプロンプトに詰め込む。出力された構成案は「いかがでしたか?」的な薄い内容で、修正指示を出すと今度は前の指示を忘れる。やっとの思いで本文を書かせても、ファクトチェックとリンク確認、WordPressへの転記、hタグの修正、画像の選定……。

結局のところ、私たちがやっていたのは「自動化」などではなく、「超高性能な確率的オウムを、人力で制御し続ける苦行」だったのです。

「コピペ地獄」と「コンテキストの分断」という構造的欠陥

当時市販されていたAIライティングツール(Jasperや当時のCopy.aiなど)も試しましたが、エンジニアとして「解約ボタン」を押すのに3日とかかりませんでした。

最大の欠点は、UI/UXの問題ではなく、LLMの構造的な限界に起因する「コンテキストの分断」です。

多くのツールは「タイトル生成」「見出し生成」「本文生成」を独立したAPIコールとして切り離していました。その結果、何が起きるか。
タイトルで「React Server Componentsの実装詳細を解説」と謳っているのに、本文では「ReactはFacebookが開発したUIライブラリです」という概論から始まってしまう。記事全体を貫通する「論理の背骨」が折れているのです。

これは以前、Gemini 2.5とStreamlitで自律型AIライター開発に挑戦した記録でも触れましたが、E-E-A-T、特に「全体としての品質」を担保する上で致命的な問題でした。

特に技術ブログにおいて、我々エンジニアが求めているのは「教科書的な正解」ではありません。「なぜそのライブラリを選定し、どこでハマり、どう解決したか」という“血の通った体験(Experience)”です。当時のAIにそれを求めると、途端にハルシネーション(幻覚)を起こし、存在しないAPIを自信満々に解説し始めるのがオチでした。

「私が欲しいのは、単語を予測するだけのボットじゃない。企画から入稿まで、私の『思考の写し鏡』として自走する編集チームだ」

既存のSaaSに月額数千円を払ってストレスを溜めるくらいなら、自分で作るしかない。エンジニア特有の傲慢さと、単純作業への病的なまでの嫌悪感(Laziness)が、私を開発へと突き動かしました。

コンセプトは “One Prompt, Massive Reasoning”

こうして開発が始まったのが、完全自動化ブログエンジン「Lumina AI」です。

余談ですが、開発初期のコードネームは「Lazy Writer v1(怠惰なライター)」でした。しかし、システム自身にネーミングを相談したところ、「その名前ではユーザーの信頼(Trust)を獲得できません。情報の海を照らす光、そしてブラックボックス化しがちなAIの思考プロセスを可視化するという意味を込めて『Lumina』を提案します」と、極めてもっともな説教(フィードバック)を受けたため、現在の名前になりました。

Lumina AIの表向きのコンセプトはシンプルです。
“One Prompt, Full Publish”(ワンプロンプトで、公開まで)

ユーザー(私)がやるべきことは、たった一つ。「今、Gemini 3のAgent機能について書きたい」と入力するだけ。しかし、その裏側で起きていることは「魔法」ではありません。極めて泥臭く、暴力的なまでの計算リソースの投入です。

たった一度の「書きたい」という入力に対し、Lumina AIのバックエンドでは平均30回以上の内部的なAPIコールと、数百万トークンに及ぶ推論ループが回っています。

  1. 多角的リサーチ: Google検索上位10記事だけでなく、GitHubのIssue、Stack Overflowの議論までクローリングし、「コードレベルでの正解」と「開発者の悩み(インサイト)」を特定する。
  2. 再帰的構成設計: 構成案を作成した後、別のAIエージェントが「批判者(Critic)」として振る舞い、「この構成では読者の課題解決にならない」「技術的に浅い」とダメ出しを行う。この自己批判ループを合格ラインに達するまで繰り返す。
  3. 文脈保持執筆: タイトルからまとめまで、一つの巨大なコンテキストとして保持し、「伏線回収」すら可能なレベルで執筆する。
  4. 自動リファクタリング: 書いたコード(記事)をAI自らが読み返し、デバッグ(推敲)する。
  5. 画像・DOM生成: 記事の内容にマッチした図解を生成し、WordPressへREST API経由で、HTMLタグ、alt属性、パーマリンク設定まで含めてPOSTする。

人間がコーヒーを淹れている間に、AIは見えないところで冷や汗をかきながら、数百回の「思考と修正」を行っているのです。このプロセスは、AIブログ成功の「全自動執筆フロー」全解剖で解説した手動フローを、コードレベルで完全に自動化したものです。

なぜ2026年の今、実現できたのか?「Gemini 3」という特異点

正直に告白すると、このアーキテクチャ自体は2024年から構想していました。しかし、当時の技術では「絵に描いた餅」でした。GPT-4oクラスのモデルでは、これほど複雑な再帰的指示(Recursive Instructions)を処理しきれず、ループの途中で「指示忘れ」や「論理破綻」を起こしていたのです。

しかし、2025年後半。状況は一変しました。Googleが「Gemini 3」シリーズをリリースしたからです。

コンテキストウィンドウの拡大? いえ、そんなレベルの話ではありません。決定的な違いは、「マルチモーダルな推論(Reasoning)能力」と「エージェントとしての自律性」の飛躍です。

Gemini 3は、単にテキストを生成するだけでなく、Webサイトのスクリーンショットから「UIの配置意図」を読み取ったり、GitHubのコード差分から「開発者の苦悩」を推察したりすることが可能になりました。テキスト情報の裏にある「非言語的なニュアンス」まで理解できるようになったことで、初めて「人間味のある技術記事」が書けるようになったのです。

そして、Pythonエンジニアにとっての救世主Streamlitも、バージョンアップを経て「Agentic UI」の標準フレームワークへと進化しました。複雑なバックエンドの状態管理(State Management)を、我々が慣れ親しんだPythonコードだけで制御できるようになったのです。

「Gemini 3」×「Streamlit」。この2つの技術スタックが交わった特異点(シンギュラリティ)に、Lumina AIは立っています。


エンジン性能:Lumina AIのここがヤバい!Gemini 3シリーズの実力

この章では、Lumina AIの頭脳であるGemini 3が、従来のLLM(大規模言語モデル)と決定的に何が違うのか。単なるスペック比較ではなく、「記事の品質」に直結するエンジニアリングの特異点について、コードの裏側を透かして見るような深度で解説します。

1. 「確率」ではなく「論理」で構成する:Gemini 3 Pro PreviewのDeep Think

Lumina AIで採用しているgemini-3-pro-previewは、APIパラメータに thinking_level="high" をセットすることで発動する「Deep Think(深層思考モード)」が、このゲームのルールを変えました。

このモードをオンにすると、Gemini 3は即座に回答を出力しません。裏側で数十秒〜数分間、完全に沈黙します。APIのレスポンス待ち時間(Latency)は増大しますが、その間、モデル内部ではChain of Thought(思考の連鎖)を超えた、以下のような「一人ディベート(Adversarial Reasoning)」が行われています。

【内部思考ログの可視化】

(思考ステップ 1: 現状分析)
「ユーザーはReactの初心者向け記事を求めている。だが、検索上位(SERPs)には既に『公式ドキュメントの焼き直し』が溢れている。今さら同じ構成で勝てる確率は3%以下だ。この方針は棄却する。」

(思考ステップ 2: 反証と再提案)
「では、逆に『UseEffectを使うな』という逆説的なアプローチはどうか? 最近のトレンドはServer Componentsへの移行だ。しかし、ターゲット層の検索意図(Search Intent)データを見ると、まだClient Sideでの基礎トラブルに悩んでいる層が8割を占める。」

(思考ステップ 3: 弁証法的解決)
「ならば、折衷案だ。前半で『初心者が陥る無限レンダリングの罠』という”痛み”に共感し、後半で『それを解決するためのカスタムフック化』を提案するストーリー構成にする。これなら、検索意図を満たしつつ、独自性スコアを高められる。よし、H2タグの構成案を作成開始……」

結果として出てくるのは、Webの平均値ではなく、「検索意図の裏を読み、独自の切り口を提案するプロの企画書」です。

2. 「記憶喪失」の克服:Thought Signatures(思考署名)による状態管理

長文記事をAIに書かせた時、後半になるにつれて論理が破綻する「記憶喪失」現象。Gemini 3では、これを解決するために「Thought Signatures(思考署名)」という概念を実装しました。

具体的には、セクションごとの執筆リクエストを送る際、System Instruction(システムプロンプト)に以下のような構造化されたコンテキストメタデータを注入し続ける仕組みです。

// Thought Signaturesの概念スキーマ(簡略化)
{
  "article_state": {
    "core_thesis": "Pythonは遅いが、開発速度で回収できる",
    "tone_voice": "辛口だが愛のあるシニアエンジニア",
    "defined_terms": {
      "GIL": "Global Interpreter Lockのこと。本記事では『悪者』として扱う"
    }
  },
  "logic_trace": [
    {"section_1": "Pythonの遅さを認める(読者への共感)"},
    {"section_2": "C++で書くコストと比較する(対比構造)"}
  ],
  "forbidden_patterns": ["Javaへの言及", "中立的なまとめ"]
}

これのおかげで、「伏線回収」ができるAIが実現しました。記事のタイトルから最後の「まとめ」まで、一本の太い論理の串が通った文章を作成可能です。

3. コストと速度の暴力:Flashモデルによる「敵対的評価と無限リライト」

Lumina AIは、「頭脳(Pro)」と「手足(Flash)」の完全分業制です。
執筆作業には、高速で安価なgemini-3-flash-previewを使用し、「Council of Critics(批評家会議)による無限リライト」を実行します。

  1. 並列生成(Parallel Generation): Flashモデルが3パターンの案を同時生成。
  2. 敵対的評価(Adversarial Evaluation): 別のFlashエージェントが0-100点でスコアリング。
  3. 採用・却下・マージ: 80点未満なら、迷わず全案を破棄し、再生成ループ(Retry Loop)に入ります。

「品質」を「才能」ではなく「試行回数」でカバーする。かつてAI記事の品質革命。検査プロンプト術で解説した手動のチェック体制を、Flashモデルの圧倒的な速度とコストで力技解決しています。

4. 視覚情報の統合:Visual QAによる「自動検品」システム

ブログに欠かせない「アイキャッチ画像」と「図解」。Lumina AIは、「Visual QA(視覚的品質保証)」のパイプラインを組んでいます。

  1. Generate: 画像を生成する。
  2. Vision Check: 生成された画像を即座にgemini-3-pro-visionに入力し、「文字崩れはないか?」「配色はずれていないか?」を検品させる。
  3. Decision: NGなら理由を添えて自動で再生成を実行する。

私たちは、完成した画像を見るだけです。その裏で、AI同士が「これじゃダメだ」「やり直し」というやり取りを何度も繰り返しています。


技術解剖:Python × Streamlitで作る「堅牢な」執筆システム

Lumina AIのソースコードは、エントリーポイントであるapp.pyとその依存モジュールを含めると3,200行を超えますが、その動作は極めて堅牢です。本章では、Lumina AIを支える技術スタックの全貌を、コードレベルで解剖します。

1. アーキテクチャ概観:スパゲッティを回避する「モジュラーモノリス」

Streamlit(app.py)を「純粋なステートマシン」として機能させ、重い処理はagents/ディレクトリ配下のクラスに委譲する構成を採用しています。

lumina-ai/
├── app.py                  # フロントエンド兼コントローラー(Streamlit)
├── agents/                 # 自律エージェント群
│   ├── architect.py        # 構成作成・検索意図分析(Gemini 3 Pro)
│   ├── writer.py           # 執筆・推敲・思考署名管理(Gemini 3 Flash)
│   └── vision.py           # 画像生成・Visual QA(Imagen 4 + Gemini Vision)
├── core/                   # コアロジック
│   ├── llm_client.py       # APIリトライ・コスト計算・レート制限管理
│   ├── sandbox.py          # AST解析による安全なコード実行環境
│   └── wordpress.py        # REST API / Application Passwords認証
├── database/               # 永続化層
│   ├── connection.py       # SQLite接続・マイグレーション
│   └── schema.sql          # 記事・ログ・設定のテーブル定義
└── utils/
    └── gsc_analyzer.py     # Search Console API連携・データ分析

2. 安全装置:AIにコードを書かせるなら「AST解析」は義務教育

Lumina AIには、記事執筆中に必要に応じてPythonコードを生成・実行する機能があります。しかし、ローカル環境でLLMに生のexec()を実行させるのは危険です。

そこで実装したのが、Python標準ライブラリのast(抽象構文木)モジュールを用いた「ホワイトリスト方式のサンドボックス」です。

import ast

class SecurityValidator(ast.NodeVisitor):
    def __init__(self):
        # 許可するモジュールと関数を厳格に定義
        self.allowed_modules = {'pandas', 'matplotlib.pyplot', 'numpy', 'seaborn', 'math'}
        self.is_safe = True
        self.error_message = ""

    def visit_Import(self, node):
        for alias in node.names:
            if alias.name not in self.allowed_modules:
                self.is_safe = False
                self.error_message = f"禁止モジュールを検出: {alias.name}"
        self.generic_visit(node)

    def visit_Call(self, node):
        # 関数呼び出しの安全性をチェック
        if isinstance(node.func, ast.Name):
             # exec, eval, open などの危険な関数は名前解決の時点で弾く
             if node.func.id in ['exec', 'eval', 'open', 'input']:
                 self.is_safe = False
                 self.error_message = f"危険な関数実行を検出: {node.func.id}"
        self.generic_visit(node)

このAST解析バリアが、AIによる予期せぬシステム操作を未然に防ぎます。このような「防御的プログラミング」は、AI開発は「最初の1ファイル」で決まる!Markdown設計図完全ガイドでも触れたように、設計段階で組み込むべき必須要件です。

3. データ永続化:SQLiteと`st.connection`が叶える「忘れない」執筆環境

ブラウザリロードによるデータ消失を防ぐため、Streamlitのst.connection機能を利用したSQLiteによるローカル永続化を導入しています。

# database/connection.py の一例
import streamlit as st
from sqlalchemy import text

# Streamlit推奨のコネクション管理
conn = st.connection("lumina_db", type="sql", url="sqlite:///lumina.db")

def save_draft(article_id, content, thought_signature):
    with conn.session as s:
        # トランザクション管理も自動化
        s.execute(
            text("UPDATE articles SET content = :c, meta = :m, updated_at = CURRENT_TIMESTAMP WHERE id = :id"),
            {"c": content, "m": thought_signature, "id": article_id}
        )
        s.commit()

自律動作:プロの編集脳を再現する「3フェーズ生成フロー」

app.pyの裏側では、「Architect(設計)」「Writer/Editor(執筆・編集)」「Publisher(入稿)」という3体のデジタル人格が連携して記事を作成します。

ここでは実際の実行ログ(Debug Modeの出力)を見てみましょう。冒頭で宣言した通り、今あなたが読んでいるこの記事は、100% Lumina AIによって生成されました。

[14:02:15] Phase 1: Architect ―― 抽象を具体に変換する

ユーザー入力:「Gemini 3とStreamlitで自作したブログエンジン『Lumina AI』の技術解説記事を書いて…」

[14:02:18] [Architect] INFO: Session Initialized.
           Loading Context: "Lumina_System_Architecture.md" (45KB)
           Loading Persona: "Hard-nosed Tech Lead"
[14:02:25] [Architect] WARNING: Search API Timeout (Attempt 1/3).
           Error: 504 Gateway Time-out.
           Action: Exponential Backoff (waiting 2s)...
[14:02:28] [Architect] RETRY: Search API (Attempt 2/3) -> SUCCESS.
[14:02:35] [Architect] THINKING (Gemini 3 Pro):
           ターゲットは「メモリ不足に悩むエンジニア」。
           → 解決策として「ローカルLLM」ではなく「クラウドAPI×軽量フロントエンド(Streamlit)」の利点を強調すべき。
           Decision: Plan Cを採用(開発ストーリー形式)。

[14:03:35] Phase 2: Writer & Editor ―― 2つのAIによる「殴り合い」

[14:03:45] [Writer] DRAFT_GENERATED (Ver.1):
           "AIツールは便利ですが、最近は種類が増えすぎて困りますよね。特にブラウザが重くなるのが悩みです。"
[14:03:48] [Editor] CRITIQUE (Gemini 3 Pro Deep Think):
           Verdict: REJECTED.
           Reason: 弱い。あまりにも平凡。「困りますよね」という共感の強要はエンジニアが最も嫌う文体だ。
           Instruction: 五感に訴えろ。「Chromeのタブを開きすぎてファンが唸る音」や「Activity Monitorのメモリ使用量」など、具体的な情景描写で始めろ。
[14:04:00] [Writer] RETRY_DRAFT_GENERATED (Ver.2):
           "『キーン……』深夜2時、静まり返った部屋にMacBook Proのファンノイズだけが響く..."
[14:04:05] [Editor] Verdict: APPROVED. Proceed.

最初のドラフトがいかにEditorエージェントによって否定され、ブラッシュアップされたかが分かります。この「AIによる自己批判」こそが、私が以前最強生成ツール「Prompt Architect」で目指した理想形です。


まとめ:「欲しいツールは自分で作る」がAI時代の最強戦略

現在、Lumina AIは`preview`版のAPIで動作していますが、Gemini 3の正式リリースにより、推論速度はさらに向上するでしょう。

私の開発ロードマップは、単なる「記事生成」の先を見据えています。

  • Night Shift(夜勤モード): 人間が寝ている間にAIワーカーが100記事分のリサーチと執筆を並列で実行する。
  • The Gardener(庭師機能): 掲載順位が落ちた記事を検知し、自動でリライト案を作成する。

月額数千円のSaaS型AIツールは便利ですが、あくまで「他人が定義したワークフロー」です。Gemini 3やStreamlitのような強力な武器がAPIとして使える今、自分だけの「最強の編集部」をコードで構築できるのがエンジニアの特権です。

ぜひ、あなたのIDEを開いてください。そして、あなただけのLumina AIを作り始めてください。


あわせて読みたい

Google Antigravityで誰でもアプリ開発者になれる?未来のプログラミングを大解剖前のページ

I Built a Fully Autonomous Blog Engine with Gemini 3 & Streamlit (And Yes, It Wrote This)次のページ

ピックアップ記事

  1. Google Antigravityで誰でもアプリ開発者になれる?未来のプログラ…

  2. I Built a Fully Autonomous Blog Engine w…

  3. AIブログ“組立ライン”構築術:コピペ地獄から「AI工場長」へ変わる5段階ワーク…

  4. 【脱・挫折】知識ゼロの私がAIとペアプログラミング!自作Webツールを「Wind…

  5. プログラミング不要論の最終回答。Gemini 2.5 × Streamlitで「…

関連記事

  1. AIで自動化

    AIブログ“組立ライン”構築術:コピペ地獄から「AI工場長」へ変わる5段階ワークフロー

    導入:なぜ今、単なる「変数」ではなく「変数の連鎖」なのか?…

  2. AIで自動化

    AI量産記事がインデックスされない問題の終焉。cosmic-note.comの全手口

    序章:「クロール済み – インデックス未登録」の悪夢。AI量…

  3. AIで自動化

    【完全解説】非エンジニアがAIで開発した生産管理システム「Forge」の全貌

    はじめに:なぜ、素人が「メーカー製」を超えられたのか…

最近の記事
最近の記事
  1. バイテック生成AI|【高額報酬】話題の生成AIオンラインスク…
  2. 流行りの「AIチャットボット」を作るなら、Gemini AP…
  3. Cursorとの決定的な違い。「Gemini」がプロジェクト…
  4. 挫折率No.1の「エラー地獄」を逆手に取る!AI時代の「エラ…
  5. 【月額1万円】動画講座見放題+無制限添削+毎月個別面談で成果…
  1. プロンプト

    読者を惹き込む「PASONAの法則」AI強制インストール術
  2. AIで自動化

    【完全無料】Google AntigravityはCursorの代わりになる?非…
  3. AIで自動化

    脱・読み物。Claude 3.5で「ツール記事」を自作し滞在時間を倍増させる技術…
  4. プロンプト

    AIブログの成果は「プロンプト」が9割だった
  5. AIで自動化

    I Built a Fully Autonomous Blog Engine w…
PAGE TOP