「AIが24時間自動で働いてくれたらなあ」と思いませんか?今回は完全自律でウェブサイトの管理をさせてみたので、その方法を紹介します。
ワラケルという、お笑い動画を分析させるサイトです。人間の「笑い」を理解することが苦手とされているAIが、お笑い動画から笑いのタイミングや回数を読み取り、「なぜこの動画がおもしろいのか」を真面目に分析しています。2026年8月25日公開、9月5日時点で532本の記事を書いています。
| 記事 | 532本 |
| 登場した芸人 | 189組 |
| 数えた笑い | 15,899回 |
| 文字起こしした尺 | 65.1時間 |
| 文字起こし本文 | 119,513行 / 300万字 |
動画を選ぶのも、測るのも、記事を書くのも、公開のPull Requestを出すのもエージェントです。
この記事では、その仕組みを紹介します。
ハーネスエンジニアリング
ハーネス(harness): Hugging Face の用語集が Agent = Model + Harness と定義していて、モデル以外の全部 — ループを回す部分、ツール、上限、検査 — がハーネスにあたります。OpenAI の Harness engineering: leveraging Codex in an agent-first world(2026年2月11日)をきっかけに広まった言葉で、日本語だとサーバーワークスや電通総研に解説があります。以下電通総研の説明より。
長時間動き続ける AI エージェントを、いかに破綻させずに走らせ続けるか——その「型枠」や「足回り」にあたる仕組み
ハーネスの必要十分条件を示した論文(arXiv:2606.10106)は、条件を4つに絞っています。T1がループ、T2がツール、T3がコンテキスト管理、そしてT4が下記です。
(T4) does it include at least one control mechanism, verification, limit, or deterministic action, that does not depend on the mere obedience of the model?
(訳)(T4)モデルがただ従うことに依存しない制御機構・検証・上限・決定的な動作が、少なくともひとつ含まれているか?
同じ論文の表で、T4が無い場合こうなると書かれています。
Demo without guarantee; trusts the model's word
(訳)保証のないデモ。モデルの言い分を信じている
つまり、モデルに依存しない制御機構がひとつも無ければ、それは保証のないデモであるということです。
全体図
基本的にはAWSで構築していますが、ローカルでないと扱えない処理やクラウドでは高コストになる処理はローカルの常駐プロセスを使っています。左がローカル、中央がAWS、右がGitHubから公開まで。四角の中は上から名前・役割・モデルで、モデル名が「モデルなし」と書いてある部品はAIを使用しません。
記事1本が公開されるまでに、これら20前後の処理が関わります。
ワーカーとモデルの対応
役割ごとにモデルを変えています。
| ワーカー | 役割 | モデル | 反復上限 | 状態 |
|---|---|---|---|---|
| dispatcher | 仕事を1分1件だけ投入 | なし | — | 稼働 |
| agent runner | ReActループの実行 | z-ai/glm-5.3-flash |
— | 稼働 |
| watchdog | 経過時間だけで強制終了 | なし | — | 稼働 |
| retranscribe worker | 測り直し依頼の処理 | なし | — | 稼働 |
| 窓ごとの文字起こし | 動画から発話と笑いを起こす | gemini-3.7-flash |
2回→半分割り | 稼働 |
| 話者の縫い合わせ | 窓をまたいだ話者の同定 | gemini-3.7-flash |
1回 | 稼働 |
| 笑いの再カウント | 音声だけを聴き直す | gemini-3.7-flash |
1回 | 稼働 |
| 字幕との照合 | 構造化出力で差分を出す | gemini-3.7-flash |
3回 | 稼働 |
| whisper | Geminiに拒否されたときの代替 | whisper.cpp large-v3 |
— | やり直し時のみ |
| persona-study | 動画を選び記事を書く | z-ai/glm-5.3-flash |
14 | 稼働 |
| persona-editor | 修正依頼を本文に反映 | z-ai/glm-5.3-flash |
8 | 稼働 |
| persona-reviewer | 反映結果を検証 | z-ai/glm-5.3-flash |
6 | 稼働 |
| persona-grader | 記事を採点 | moonshotai/kimi-k2.5 |
12 | 稼働 |
| persona-reflector | 週次の振り返り | z-ai/glm-5 |
14 | 稼働 |
| eval-judge | 設定変更の対比較判定 | google/gemini-3.7-flash |
— | 稼働 |
| character-designer | 架空の登場人物を設計 | gemini-3.7-flash |
— | 停止中 |
| scene-writer | 挿絵の場面を書く | gemini-3.7-flash |
— | 停止中 |
| image-builder | 挿絵生成と実在人物の検査 | gemini-3.1-flash-lite-image |
— | 停止中 |
| persona-chat | 対話 | z-ai/glm-5 |
10 | 稼働 |
| pr-watcher | PRの監視 | z-ai/glm-5 |
12 | 稼働 |
| echo-worker | 疎通確認 | z-ai/glm-5 |
6 | 稼働 |
中心は glm-5.3-flash です。低コストながら考察が優れています。採点と判定は別ベンダーのモデルにして、モデルのクセに引きずられないようにしました。
挿絵生成の3ワーカーは動く状態ですが、現在はストップしています。初期は生成させていましたが、あまり面白くなかったもので。
上限設定
上限値はコード・環境変数・DBで設定します。
| 上限 | どこにあるか | 値 |
|---|---|---|
| 1日の記事数(ペース) | dispatcherの定数 | 10 |
| 1日の記事数(バックストップ) | Lambdaの環境変数 | 250 |
| 1動画1記事 | S3の条件付きPUT | — |
| 1エージェントのターン数 | DBの列 max_iterations
|
14 |
| 動画の尺 | 文字起こしツールの定数 | 60分 |
| 1日のジョブ数 / 秒数 | ランナーの設定ファイル | 700 / 82,800秒 |
| 1日の予算(円) | dispatcherの定数 | ¥4,000 |
| ワーカーの生存時間 | watchdogの経過時間判定 | 1,800秒 |
CIで公開
公開はPull Requestさせています。PRが触っていい場所は、ブランチのプレフィックスで機械的に制限しています。
if [[ "$HEAD_REF" == post/* ]]; then
bad=$(echo "$changed" | grep -v '^site/src/content/posts/' || true)
if [ -n "$bad" ]; then
echo "::error::post/* branches may only modify site/src/content/posts/**."
exit 1
fi
fi
編集ではedit/<slug> は本文をいじれますが、frontmatterはバイト比較され、1バイトでも変わると落ちます。逆に images/<slug> はfrontmatterしか触れず、本文をバイト比較しています。
# The frontmatter carries every measured number, so it is byte-compared.
git show "$base:$md" | fm > /tmp/base-fm
fm < "$md" > /tmp/head-fm
if ! cmp -s /tmp/base-fm /tmp/head-fm; then
echo "::error::edit/* may not change the frontmatter (measurements are not editable prose)"
exit 1
fi
check:laughs は文章の品質ではなく、数の一致を見ています。記事ページは笑いのタイムラインを描きますが、本文から数えた笑いの数と frontmatter の数が食い違うと、エラーも出さずに描画をやめる設計です。check:laughs はその沈黙に声をつけるもので、数が合わなければCIが落ちてマージされません。
前述で紹介した OpenAI の記事に、ブロックするマージゲートは最小限(minimal blocking merge gates)、「エージェントのスループットが人間の注意力を超える環境では、修正は安く、待つことは高くつく」とあります。
ワラケルはゲートを6つ設定しています。守っているのは分析の正確さです。Codexの出力はコードで、間違いをチェックしやすく再マージすれば消えます。ワラケルの出力は数字の入った公開記事で、間違えると人間による指摘が必要になり修正にもコストがかかります。
なぜワーカーを細かく分けているか
1つの巨大なエージェントにしなかった理由は3つあります。
役割ごとに必要なモデルが違うから。記事を書くのに適したモデル、ツールを使うのが得意なモデルなど、モデルの性能やコストに合わせて配分しています。
失敗を局所化できるから。例えばある動画の文字起こしが失敗した場合、それが素材に由来するのか、ワークフローに由来するのか、モデルに原因があるのか切り分けることができます。
採点者を書き手から分離できるから。書き手はGLM系、採点と判定はKimiとGeminiです。
分けたことの副産物もあります。どのワーカーがどのモデルで何ターン回るかが全てデータとして残るので、それを元にワークフローの改善や機能の追加を進めています。将来的には自分自身を改善していくワークフローを目指しています。
費用
7日間(2026-09-05 12:00 JST時点)のコストを公開します。
| エージェント | 呼び出し | 入力トークン | 出力トークン | 費用 |
|---|---|---|---|---|
| persona-study | 748 | 82,000,326 | 2,105,938 | $4.567 |
| persona-reflector | 7 | 473,009 | 25,245 | $0.162 |
| その他3種 | 12 | 138,681 | 6,818 | $0.023 |
| 合計 | 767 | 8,261万 | 214万 | $4.75 |
**入力が97.5%**を占めますが、うち5,699万トークンはプロンプトキャッシュに当たっていて、費用が抑えられています。
文字起こしは1本あたり約¥17.8、そのうち63%が出力トークンです。
13本を公開した2026年9月4日のコストは以下です。
| 2026-09-04(13本公開) | |
|---|---|
| 記事を書くLLM(persona-study) | $0.21 |
| 動画を測るGemini(¥17.8 × 13本) | 約$1.43 |
サイトの性質上、エージェントに動画を理解させる必要がありますが、そこでけっこうコストが発生しています。
まとめ
- 24時間動く自律エージェントの「自律」は、モデルの賢さではなくモデルの従順さに依存しないハーネスでできています(論文でいうT4)
- 上限はプロンプトではなく、コード・環境変数・DBの列・CIの条件に置く
- モデルには判断を求め、実行と検算はコードで行う
- ログを取ることが大事。エージェントの働きぶりを定量化して評価する
