AI記事生成 Anthropic 品質検品 画像生成AI 自動化

画像生成AIに日本語入りの図解を作らせると、漢字が高確率で崩れます。「月額」が「月髰」、「精度」が「精凄」、「買い切り」が「買切切り」——一見それらしいのに、よく見ると存在しない字が混ざる。この記事は、長文コンテンツの図解を自動生成している自作の仕組みで実際に起きた崩れの実例と、「生成した画像を視覚AIに検品させて、崩れていたら自動でやり直す」対策の実装をまとめたものです。

漢字はこう崩れる — 実際に生成された図解から

運用中に実際に出た崩れです。どれも図解としてのレイアウトや配色は完璧で、文字だけが壊れていました。

  • 「月額」→「月髰」(存在しない漢字が合成される)
  • 「精度」→「精凄」(似た形の別の字に化ける)
  • 「買い切り」→「買切切り」(文字の重複)
  • 「任せてよい」→「任せよいよい」(かなでも起きる)

原因は画像生成AIの構造そのものです。これらのモデルにとって文字は「文字」ではなく、絵の一部のテクスチャです。英数字は形が単純で学習量も多いためほぼ崩れませんが、画数の多い漢字は「それらしい形」が再現されるだけで、正しい字である保証がありません。つまりプロンプトを工夫しても確率が下がるだけで、ゼロにはなりません。崩れる前提で、崩れたものを出荷しない仕組みのほうが確実です。

対策の設計 — 検品を人間からAIに移す

人間が全画像を目視すればいいのですが、コンテンツ本体を自動生成している以上、画像だけ人間が見るのでは自動化の意味が半減します。そこで検品も自動化しました。全体の流れは次のとおりです。

  1. 予防: 図解に入れる文字を「短いラベル最大5個」に制限する(文字が少ないほど崩れる確率も、崩れたときの再試行コストも下がる)
  2. 生成: 画像生成AIで図解を作る
  3. 検品: 生成した画像を視覚AI(Claude)に渡し、「日本語の文字が正しく描画されているか」をJSONで判定させる
  4. 再試行: 崩れていたら画像を破棄し、「文字を最小限に」という追加指示つきで1回だけ作り直す
  5. 撤退: それでも崩れたら図なしで公開する(崩れた図を載せるくらいなら、図が無いほうがマシ)

マーカー方式 — 画像が全滅しても本文は無傷

前提として、本文と画像の生成は分離してあります。本文を書くAIには「図があると分かりやすい場所にマーカーだけ埋めさせ」、画像生成は後段の別処理がマーカーを見つけて行います。この構造にしておくと、画像側で何が起きても(生成失敗・検品ではじかれて図なし)本文はそのまま公開できます。検品→撤退という流れが気軽に選べるのは、この分離のおかげです。

検品はフェイルオープンにする

検品APIの呼び出し自体が失敗したとき(タイムアウト等)は、画像を通します。検品は品質を上げるための層であって、検品システムの障害が記事公開を止める理由にはならないからです。逆に「判定が返ってきて、崩れと言われた」ときだけ破棄します。自動化パイプラインに検査層を足すときの定石だと思います。

PHP実装 — 画像をClaudeに見せてJSONで判定させる

Anthropic Messages APIは画像入力に対応しているので、生成した画像をbase64で渡して質問するだけです。WordPressの関数で書くとこうなります。

$image = base64_encode( file_get_contents( $image_path ) );

$response = wp_remote_post(
    'https://api.anthropic.com/v1/messages',
    array(
        'timeout' => 60,
        'headers' => array(
            'x-api-key'         => $api_key,
            'anthropic-version' => '2023-06-01',
            'content-type'      => 'application/json',
        ),
        'body'    => wp_json_encode( array(
            'model'      => $model,
            'max_tokens' => 1000,
            'messages'   => array(
                array(
                    'role'    => 'user',
                    'content' => array(
                        array(
                            'type'   => 'image',
                            'source' => array(
                                'type'       => 'base64',
                                'media_type' => 'image/png',
                                'data'       => $image,
                            ),
                        ),
                        array(
                            'type' => 'text',
                            'text' => 'この画像内の日本語テキストをすべて読み取り、'
                                . '崩れた文字・存在しない漢字・重複・脱字がないか検査してください。'
                                . 'JSONのみで回答: {"ok": true/false, "problems": ["問題の説明", ...]}',
                        ),
                    ),
                ),
            ),
        ) ),
    )
);

ポイントは2つです。第一に、判定は自由文ではなくJSONで返させること。プログラム側は ok がfalseなら破棄、という機械的な分岐にできます。第二に、「読み取ってから検査しろ」という順序をプロンプトに入れること。読む工程を挟むと、字形の違和感を拾う精度が体感で上がります。

実運用の結果 — 検品が2回、崩れを捕捉して自動破棄した

この仕組みを入れてからの実運用で、検品層が実際に崩れた図解を多く検出し、自動で破棄・再試行しています。人間は何もしていません。以前は公開後に読者と同じ画面で崩れに気づいて手で差し替えていたので、「崩れた図が公開される」事故はこの層で止まるようになりました。

限界も書いておくと、視覚AIの検品も完璧ではなく、微妙な崩れを見逃す可能性はあります。また画像生成モデル自体の世代差が大きく、新しいモデルほど文字は崩れにくくなっています。それでも「文字を減らす予防」と「崩れたら出さない検品」の2枚を敷いておけば、モデルの進化を待ちながら今日から図解を運用に載せられます。文字の正確さが最優先の図(料金表など)は、そもそも画像にせずHTMLの表で組む、という使い分けも忘れずに。