0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

エージェントを24時間働かせるハーネスエンジニアリング

0
Last updated at Posted at 2026-09-05

「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を使用しません

warakeru アーキテクチャ

記事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の条件に置く
  • モデルには判断を求め、実行と検算はコードで行う
  • ログを取ることが大事。エージェントの働きぶりを定量化して評価する
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?