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?

AIエージェントを本番で動かすための「Agent Harness」入門

0
Posted at

はじめに

AIエージェントを本番環境にデプロイして実際に使ってみると、「性能の良いLLMがあるだけでは足りない」ことに気づきます。

LLMは基本的にステートレスです。新しいセッションを始めると、それまでの会話や作業内容を何も覚えておらず、ゼロからのスタートになります。
こうした「記憶もコンテキストも持たないモデル」を、現場で使えるエージェントに変えるソフトウェア基盤が Agent Harness です。

一言でいえば、モデルの推論(Reasoning)以外のすべて ― ツール実行、メモリ、コンテキスト管理、状態の永続化 ― を裏側で担う仕組みです。

Harnessがないと何が起きるか

Harnessを持たずにエージェントを組むと、次のような失敗パターン(Failure Modes)に陥りがちです。

  • Context Rot(コンテキストの劣化)
    コンテキストウィンドウが長くなるほど、モデルが最初に与えられた重要な指示を忘れたり、無視したりしやすくなります。
  • Hallucinated Tool Calls(ツール呼び出しの幻覚)
    誤ったパラメータで関数を呼んだり、存在しないAPIを使おうとしたりします。
  • Lost State on Failure(障害時の状態消失)
    ネットワークのタイムアウトやサーバーの再起動が起きると、それまでの進捗がすべて失われ、最初からやり直しになります。

Agent Harnessの主要コンポーネント

Harnessがきちんと機能するには、次の4つのレイヤーが必要です。

レイヤー 役割
Tool Integration Layer ファイルの読み書き、コード実行、DBクエリ、API呼び出しなどのアクションを、検証(Validate)・サニタイズしてから実行する
Memory & State Management Working context / Session state / Long-term memory の3層に分けて、エージェントの記憶を管理する
Context Engineering & Compression 不要な履歴を圧縮(Compaction)し、現在のタスクに本当に必要なコンテキストだけを選んで渡す
Verification & Guardrails タスクを「完了」とする前にテスト・検証する。重要な操作には人間の確認(Human-in-the-loop)を挟む

最小構成のイメージ

4つのレイヤーがエージェントのループのどこに入るのかを、TypeScript風の疑似コードで書くと次のようになります。

async function runAgent(task: string, harness: Harness) {
  // 状態の永続化:途中で落ちても続きから再開できる
  const state = await harness.state.loadOrInit(task);

  while (!state.done) {
    // Context Engineering:必要なコンテキストだけを選択・圧縮
    const context = harness.context.build(state);

    // 推論はモデルの仕事
    const action = await llm.decide(context);

    if (action.type === "tool") {
      // Tool Integration:存在しないツールや不正な引数はここで弾く
      const call = harness.tools.validate(action);

      // Guardrails:重要な操作は人間が承認
      if (harness.guardrails.needsApproval(call)) {
        await harness.guardrails.askHuman(call);
      }

      const result = await harness.tools.execute(call);
      state.history.push({ call, result });
    }

    if (action.type === "finish") {
      // Verification:「完了」と言う前に検証
      state.done = await harness.verify(state);
    }

    await harness.state.save(state);
  }
}

3つのアーキテクチャパターン

用途に応じて、Agent Harnessは主に次の3つの形で構築されます。

  • Single-agent Supervisor
    1つのモデルが、ツール・メモリ・検証を1つのループの中で最初から最後まで担当するパターン。
  • Initializer-executor Split
    最初に一度だけプロジェクトをセットアップし、その後はセッションごとに少しずつ(インクリメンタルに)作業を進めるパターン。
  • Multi-agent Coordination
    専門分野の異なる複数のエージェント間の受け渡し(Handoff)を、Harnessが仲介・管理するパターン。

Harness・Framework・Orchestratorの違い

似た言葉が多いので整理しておきます。

役割 例
Agent Framework エージェントを作るための部品(Building Blocks)を提供する LangChain, LlamaIndex
Agent Harness ツール・メモリ・状態とともに、エージェントを実際に動かすランタイム 自前で構築したインフラ
Orchestrator いつ・どのようにモデルを呼ぶかという制御フローを決める ワークフローエンジン、ルーター

Harness Engineeringは本当に重要なのか

Harness Engineeringの核となる考え方は、エージェントがエラーを起こしたときに「もう一度試せばいい」で済ませず、「これは環境の問題なので、二度と起きないよう恒久的に直す(Permanent Fix)」 と捉えて、Harnessを堅牢にしていくことです。

この考え方は、OpenAIが2026年2月に公開した記事「Harness engineering」でも示されています。Codexチームは空のリポジトリから始め、約5か月で約100万行のプロダクションコードを、人間が手で一行も書かずに生み出しました。チームは3人から7人に増え、エンジニア1人あたり1日平均3.5件のPull Requestを出せたのは、堅牢なHarness Engineeringがあったからだとされています。

まとめ

AIプロジェクトやエージェントを作るとき、モデルの性能だけに頼ることはできません。Agent Harnessという堅牢な基盤があって初めて、AIはその力を十分に発揮できます。

これからAI分野に入るエンジニアの方には、モデルだけでなく、それを「動かす」インフラ側もぜひ学んでほしいと思います。


本記事は、私がこれまで学んだことや読んだ書籍をもとに、AIの助けを借りて執筆したものです。誤りやご意見があれば、ぜひコメントで教えてください。

参考

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?