見出し画像

サムネのQAを別エージェントに分けたら、再生成ループが止まった

サムネ生成エージェント `thumbnailer` を作って運用していたら、不可解な現象が起きた。

同じ題材で何度生成しても、似たような失敗作が出続けることがあった。文字が描かれていない、立ち絵が混入している、文字化けしている。生成 → 失敗 → 再生成 → 同じ失敗、を5回くらい繰り返してから、人間が介入してプロンプトを書き直す、という運用。

問題は、`thumbnailer` 自身が「自分の出力をチェック」する責務を持っていたこと。生成して、自分で OK/NG を判定して、NG なら再生成する。

生成ロジックと判定ロジックが同じエージェントの中にあると、判定が甘くなる。「自分が作ったものを自分で評価する」のは、人間でも難しい。

これは、サムネ QA を別エージェント `thumb-qa` に分離して、再生成ループを止めた話だ。

サムネQA を生成側に持たせると、判定が甘くなる

「生成」と「判定」を同じエージェントに持たせるとどうなるか

`thumbnailer` 単体運用の時の挙動を観察した。

ひとつ。生成したサムネが「文字描画ゼロ」でも、thumbnailer は「OK」と判定する。「テキストが小さくて文字が崩れている」を「アーティスティック」と解釈する。

ふたつ。立ち絵が画面の半分を占めていても、「キャラブランディング」と解釈する。実際は他チャンネルとの差別化が崩れる。

みっつ。色数が 5 色以上あっても、「色彩豊か」と解釈する。実際は視覚的にうるさい。

要するに、thumbnailer は「自分の出力を肯定的に解釈するバイアス」がかかっていた。これは AI が悪いのではなく、生成と評価の責務を同じ Agent に持たせる設計が悪い。

人間でも、「自分が作った作品の欠点を客観的に指摘する」のは苦手。AI でも同じ。

生成側のAIは自分の出力を肯定的に解釈する

thumb-qa エージェントを別 spawn する

`.claude/agents/thumb-qa.md` という新エージェントを作った。役割を 1 つに絞る:「生成済みのサムネを Vision で見て、合否判定する」。

thumb-qa は thumbnailer から完全に独立。

ひとつ。spawn のタイミングは「サムネ生成直後」。
ふたつ。入力は生成された PNG のみ。プロンプトや生成元情報は見ない(=先入観なし)。
みっつ。出力は PASS / FAIL の判定 + 各項目のチェック結果。
よん。FAIL があれば、thumb-qa から指示を返して thumbnailer に再生成を依頼。

「先入観なしで、出来上がりだけ見る」のが、判定の客観性を担保する。

人間のレビュアーが「コードを書いた人と別の人」が良いのと同じ。AI でも、生成と評価は分離する。

thumb-qa独立: 生成情報なし、出来上がりだけ見る

F1〜F8 のチェック項目

thumb-qa の判定ロジックを、8 項目に明文化した。

  • F1:文字描画されているか(ゼロは BLOCK)

  • F2:文字数(8〜18 字推奨、3-7 字 FAIL、19+ WARN)

  • F3:立ち絵が混入していないか(右下小サイズ以外で混入は FAIL)

  • F4:色数 3 色以内

  • F5:可読性(文字サイズ、コントラスト)

  • F6:他動画のテンプレ流用(ベースラインが似すぎていないか)

  • F7:視覚的不協和(色の組み合わせが目に刺さる)

  • F8:文字化け(豆腐文字「□」が出ていないか)

最終決定された FAIL/WARN 種別:

  • F1〜F5:FAIL(再生成必須)

  • F6〜F8:WARN(人間判断)

「機械的に客観基準で弾けるもの」だけを FAIL にして、グレーゾーンは WARN で人間に判断を仰ぐ。

F1-F5=FAIL/F6-F8=WARN、グレーゾーンは人間判断

再生成ループの最小化

thumb-qa の判定後、FAIL があれば thumbnailer に再生成を依頼する。ただし、ここで重要なのが「再生成ループの最大回数」を決めることだった。

旧ループ(thumbnailer 単体時):

  • 生成 → 自己判定甘く OK

  • 結果として品質低いサムネが採用される

新ループ(thumb-qa 分離後):

  • 生成 → thumb-qa が FAIL → 再生成

  • 最大 3 回まで。3 回連続 FAIL なら人間にエスカレーション

最大回数を決めることで、無限ループを防ぐ。3 回 FAIL すると、プロンプト自体に問題がある可能性が高い。人間がプロンプトを見直す。

for attempt in range(3):
    img = generate_thumbnail(prompt)
    qa_result = thumb_qa(img)
    if qa_result.passes:
        return img
# 3回 FAIL → 人間エスカレーション
escalate_to_human(prompt, qa_result.reasons)

「気合で何度でも再生成」ではなく「決まった回数で人間判断に投げる」設計が、自動化の暴走を防ぐ。

再生成3回でエスカレーション、無限ループ防止

採用は「PASS のみ」厳守

最後の運用ルール:thumb-qa が PASS していないサムネは、絶対にアップロードしない。

これを徹底するために、`qa_upload_preflight.py`(post-025)に「thumb-qa の result.json が PASS で記録されているか」のチェックを足した。記録がない、あるいは FAIL のままだと、アップロードがブロックされる。

「人間が見て『まあいいか』で採用」を機械的に禁止する。客観基準で PASS していなければ、絶対に世に出ない。

これで、サムネの品質下限が機械的に保証される。生成ロジックや人間の判断ミスがあっても、QA ゲートで物理的に止まる。

PASS必須、preflight gate が物理的に弾く

数字の刷新

| 項目 | Before(thumbnailer単体) | After(thumb-qa 分離) |
|---|---|---|
| サムネ採用前の品質チェック | thumbnailer の自己判定 | thumb-qa による独立判定 |
| 1サムネあたりの再生成回数 | 5回以上(品質低めで採用) | 平均1.5回(PASS まで) |
| 文字描画なしサムネの混入 | 月数件発生 | ゼロ(F1 で BLOCK) |
| 「これでいいか…」の妥協採用 | 発生 | 機械的に不可能(preflight) |
| 人間エスカレーション頻度 | 不明(自分で気づくしかない) | 3回FAIL時のみ自動通知 |

学んだこと

ふたつだけ書く。

ひとつ。「生成」と「判定」は別エージェントに分離する。
1つのエージェントが両方を担うと、自分の出力を肯定的に解釈するバイアスがかかる。生成は生成専用、判定は判定専用、責務を分けると客観性が出る。これは AI に限らず、コードレビュー、品質管理、組織設計でも共通の原則。「セルフチェック」は、思っているほど機能しない。

ふたつ。再生成ループには「最大回数」を必ず設ける。
「PASS するまで再生成」を無条件に繰り返すと、無限ループや時間消費が発生する。「3 回 FAIL したら人間にエスカレーション」のように上限を切ると、AI 自動化と人間判断のバランスが取れる。AI は「気合」で解決しない、設計で抜け道を作る。

副次効果もあった。thumb-qa を分離した結果、サムネ生成の改善ループが回りやすくなった。「F1 が連続して FAIL する」「F4 が WARN ばかり」のような統計が取れて、プロンプトのどこに弱点があるかが分かる。生成と判定が分離していると、判定側のデータが「生成側の改善材料」になる。フィードバックループが、構造的に成り立つ。

次回予告

次回は、大きな仕様変更を本番に直接入れて、3回壊した話を書きます。prototyper エージェントの誕生秘話です。

設計テンプレをプレゼントします

20体のAIエージェントを組むときに、どう役割分担を設計したか。それをテンプレ化したPDFを用意しています。実際に自分が使っている定義の抜粋とフォーマットが入っているので、そのまま明日から自分のプロジェクトに使えます。

設計テンプレを受け取る
リンク先: https://note.com/claudecodevideo

公式LINEに登録してくれた方にお送りします。

公式LINEに登録する

法人のご相談はこちら

自社のYouTubeチャンネルを自動化したい、AIで動画運用代行を頼みたい、というご相談は、別途お受けしています。

 法人のお問い合わせはこちら
リンク先: https://forms.gle/SkDkkZi7hMFJUF9w7

いいなと思ったら応援しよう!