AI エージェントのハーネスエンジニアリング — コードで品質を縛る技術
イントロ:プロンプトだけで品質を担保しようとして破綻する
AI エージェント開発を日常的に回していると、次の悩みが常態化します。
- 同じ入力でも「微妙に違う」出力が出て、差分レビューが地獄になる
- 実行のたびにツール呼び出しの順序・回数が揺れ、コストや副作用が安定しない
- 「正しさ」の定義がプロンプトや人間の解釈に寄りすぎ、システムとしての境界条件が曖昧になる
ここで効くのが ハーネスエンジニアリングです。要点はシンプルで、プロンプトで説得するのではなく、コードで縛る。
モデルの自由度を前提にしつつ、自由に動ける範囲を狭める外骨格を用意して、出力の再現性と運用耐性を上げます。
近年この方向性が強くなった背景には、エージェントが「文章生成」から「ツール実行・業務オペレーション」に寄ってきたことがあります。MCP(Model Context Protocol)のような標準化が進み、ツール連携が急拡大するほど、誤実行・逸脱・セキュリティ事故が現実のコストとして降ってきます。 (modelcontextprotocol.io)
ハーネスとは何か:エージェントを「安全に動かす枠」
本記事でいうハーネスは、次の総称です。
- 入力・出力・ツール実行の各フェーズに、機械的な制約と検証を挿入する仕組み
- 「良い感じ」を目指すのではなく、逸脱を検出して止める/矯正する仕組み
- 運用上は、**観測(tracing)と評価(eval)**もハーネスの一部になる
この考え方は、OpenAI の Agents SDK が **Guardrails(入力・出力・ツールの検証)と Tracing(実行の観測)**を強調している点にも表れています。 (openai.com)
筆者の評価:
プロンプト中心の時代は「言葉で振る舞いを誘導」でしたが、エージェント時代は「実行系」なので、ソフトウェア工学の手触り(制約・テスト・境界・パイプライン)に回帰しているのが健全です。一方で、ハーネスが弱いままツール面だけ広げると、事故は時間の問題です(MCP 周辺のセキュリティニュースがそれを示唆します)。 (itpro.com)
1) エージェント組み込みハーネス機能の概観(rules files / hooks / skills)
何がトレンドか
最近のエージェント基盤は、だいたい次を標準装備し始めています。
- ルールの外部化:ルールやポリシーを「コード/設定」として分離し、モデルの会話から切り離す
- フック(hooks)/ パイプライン:実行の前後(入力→計画→ツール→出力)に割り込めるポイント
- スキル(skills)/ ツール定義:モデルが呼べる能力を宣言的に列挙し、許可されない行為を閉じる
OpenAI Agents SDK の Guardrails は、ツール呼び出し周辺のパイプラインとして説明されており、どこに適用されないか(例:handoff や一部 hosted tools)まで明記されています。ここが「ハーネス」の設計論に直結します。 (openai.github.io)
また、Semantic Kernel でもプランニング(どの関数をどう呼ぶか)が概念として整理され、移行ガイドまで用意されています。 (learn.microsoft.com)
実務への影響
- ルールが会話文に埋まっていると、変更がレビュー不能になりがちです。外部化すると 差分が読める。
- フックがあると、逸脱時の振る舞い(中断・再試行・縮退・人間承認)をプロンプトでなく制御フローで書ける。
- スキル定義があると、エージェントの能力が棚卸しされ、**権限設計(least privilege)**に接続できます。
筆者の意見
ポジティブ:
「プロンプトの中で言い聞かせる」のをやめ、実行系としての境界を引けるのは、品質とセキュリティの両面で大きい。
ネガティブ:
フック/スキルが増えるほど、エージェントの挙動は「結局どのルールが勝つのか」という優先順位問題に突入します。ハーネス自体の設計が散らかると、本末転倒です。
今後の展望
標準化はさらに進み、MCP のように「ツールの露出が容易」になるほど、ルール・権限・観測の標準化も同時に求められます。MCP は仕様改訂が継続しており、運用側の要求で育っていることが読み取れます。 (modelcontextprotocol.info)
2) Linter / Formatter / 静的解析による「出力矯正」
なぜ効くのか
エージェント出力の品質ぶれは、内容の正しさ以前に「形式のぶれ」として顕在化します。
- JSON が壊れる
- フィールド名が揺れる
- 余計な説明文が混ざる
- コード生成なら lint に通らない
ここで「モデルに頑張ってもらう」のではなく、出力を機械的に整形・拒否・再生成する方が、運用上の期待値が揃います。
実務への影響
- 人間レビューが「文章の揺れ」ではなく **差分の本質(仕様差)**に集中できる
- 後段システム(DB 更新・決済・デプロイ等)に入る前の故障が減り、運用コストが落ちる
- モデル更新時の影響が「lint failure」として表面化しやすく、回帰検知に効く
筆者の意見
ポジティブ:
Linter/Formatter/静的解析は、AI以前から鍛えられてきた「現場の武器」です。エージェントにもそのまま適用でき、投資対効果が高い。
ネガティブ:
矯正が強いと「形式は通るが意味は破綻」が残ります。形式チェックは入口で、後述の TDD/SDD/DDD に繋げないと片手落ちです。
比較:プロンプト矯正との違い
- プロンプト:モデルの気分に左右される、説明は増えるが保証は増えにくい
- ハーネス:失敗を検知して止める、再試行戦略を持てる、CI で再現可能
3) TDD によるテストファースト仕様駆動(エージェント版)
何が変わるのか
エージェントの「正しさ」は、自然言語の納得感より テストに落ちるかで定義した方が強いです。
TDD は古典ですが、エージェント時代に再評価される理由は、出力の揺れを前提に“受け入れ条件”を先に固定できるからです。
OpenAI もエージェントの評価(Agent evals / Evals)をガイドとして整備し、「一貫性・正確性」を評価で担保する方向を示しています。 (platform.openai.com)
実務への影響
- 「この挙動で良いのか」を会話で詰めるのではなく、失敗するテストとして提示できる
- モデルやプロンプトを変えたときの回帰が、CI で機械的に出る
- エージェントの暴走(ツール誤呼び出し、無限ループ、過剰コスト)を 非機能テストとして管理しやすい
筆者の意見
ポジティブ:
エージェントの議論を「感想戦」から「検証可能な仕様」に引き戻せます。これはチーム開発の摩擦を減らします。
ネガティブ:
テストが弱いと「通ったから良い」が発生します。特に生成物の品質(要約、提案、文章)は、合否の設計が難しい。ここで SDD(スキーマ制約)やドメイン境界が補助線になります。
4) SDD(Spec-Driven Development)によるスキーマ制約
トレンド:Structured Outputs の普及
近年の大きな流れとして、LLM の出力を スキーマ準拠に寄せる機能が普及しています。Anthropic は「schema-related parsing errors を減らす」狙いを明確にした Structured Outputs を紹介し、ツール定義への準拠(strict tool use)もドキュメント化しています。 (claude.com)
実務への影響
- JSON 修復や例外処理が減り、エージェントの後段が安定する
- ツール呼び出しが「それっぽい文章」から「構造化データ」になることで、事故の型が減る
- スキーマが仕様の中心になると、プロンプトは「補助線」へ降格し、保守性が上がる
筆者の意見
ポジティブ:
SDD はエージェントの品質ブレに対して、最も即効性があるアプローチの一つです。スキーマはレビュー可能で、差分も追いやすい。
ネガティブ:
スキーマを厳密にしすぎると、探索的なタスク(調査・仮説・提案)で表現力が落ち、ワークフローが硬直します。
設計としては「最終成果物」や「ツール入出力」を硬くし、途中の思考は柔らかく、が現実的です。
今後の展望
構造化出力と観測(trace)が揃うと、次は「そのスキーマが満たすべき意味論」をどう検証するかに移ります。つまり **型(schema)から契約(contracts / invariants)**へ、という流れです。
5) DDD + Clean Architecture:ドメイン境界でアーキテクチャを強制する
なぜ今これか
エージェントは「何でもできる顔」をします。だからこそ、システム側で次を徹底しないと破綻します。
- どの層が何を知ってよいか(依存方向)
- どこで外界(API/DB)に触れてよいか
- どの判断がドメインで、どれがアプリケーション都合か
DDD + Clean Architecture は、エージェントを中心に据えたときにも強いです。理由は、モデルは境界を理解しない前提で、境界をコードが守るから。
実務への影響
- エージェントが UI/インフラ層を直叩きする構造を避けられる
- 事故が起きたとき、責務が分離されているほど原因究明が速い
- 「エージェントを差し替える」「モデルを変える」が、ドメインを壊さずに済む
筆者の意見
ポジティブ:
生成 AI 導入で最も失われがちなのは「境界」です。DDD/Clean は古典ですが、エージェント時代の保険として価値が上がっています。
ネガティブ:
チームが境界設計に不慣れだと、抽象化が儀式になり、速度が落ちます。ハーネスは宗教ではなく、事故コストと釣り合う範囲でやるべきです。
比較:ガードレール機能との関係
- Guardrails/スキーマ:局所的(入出力・ツール呼び出し)
- DDD/Clean:大域的(システム設計の制約、依存関係)
局所と大域の両方が噛み合うと、初めて「壊れにくいエージェント」になります。
6) CI を最終防衛線としたパイプライン品質ゲート
なぜ CI が「最後」なのか
ハーネスは実行時にも効きますが、組織開発では CI が「強制力のある契約」になりやすい。
特にエージェントは変更頻度が高い(プロンプト、モデル、ツール、スキーマ、ルールが同時に動く)ため、人間の注意力では追いつきません。
OpenAI の Agents SDK が tracing/evals を押し出しているのは、CI と接続しやすい形で「観測と評価」を提供する意図が読み取れます。 (openai.com)
Microsoft Foundry 側でも tracing を OpenTelemetry 規約に寄せる動きがあり、運用観測がパイプライン化していく流れが見えます。 (devblogs.microsoft.com)
実務への影響
- PR ごとに「最低限の品質」を機械的に通す文化が作れる
- 本番での事故が、テスト・lint・スキーマ・セキュリティチェックで手前に寄る
- モデル更新やプロバイダ変更時も、同じゲートで比較できる
筆者の意見
ポジティブ:
CI を品質ゲートにすると、チームが「どこまでを品質として扱うか」を合意しやすい。
ネガティブ:
CI が重くなると開発が詰まります。ここは段階設計が重要で、たとえば
- 軽い静的検査は常時
- 重いエージェント評価は nightly
のような割り切りが要ります。
まとめ:ハーネスは「自由度の管理」であり、エージェント開発の本丸
エージェントの品質課題は、モデルの賢さより 自由度の大きさから来ます。
だから解法は、プロンプトの技巧を積むことより、プロンプトの外側にある **制約(schema)・検証(lint/test/eval)・境界(architecture)・ゲート(CI)**を整備することに寄ります。
- rules / hooks / skills:実行系の制御点を作る
- Linter / Formatter / 静的解析:形式の揺れを機械的に潰す
- TDD:正しさをテストとして固定する
- SDD:構造を契約として固定する
- DDD + Clean:システム境界で逸脱を起こしにくくする
- CI:組織としての強制力を持つ最終ゲートにする
今後、MCP の普及でツールが増えるほど、ハーネスの価値は上がります。一方で、MCP 周辺ではセキュリティ事故・脆弱性の話題も増えており、**「繋げる」より先に「縛る」**が重要になっています。 (itpro.com)
参考リンク(引用元)
※リンクは参照用(本記事は how-to や設定例を目的にしていません)
- OpenAI: New tools for building agents(Agents SDK / tracing / guardrails)
https://openai.com/index/new-tools-for-building-agents//(openai.com) - OpenAI Agents SDK Docs: Guardrails
https://openai.github.io/openai-agents-python/guardrails/(openai.github.io) - OpenAI Platform Docs: Agent evals
https://platform.openai.com/docs/guides/agent-evals(platform.openai.com) - Anthropic: Structured outputs on the Claude Developer Platform
https://www.claude.com/blog/structured-outputs-on-the-claude-developer-platform(claude.com) - Anthropic Docs: Structured outputs / strict tool use
https://docs.claude.com/en/docs/build-with-claude/structured-outputs(docs.claude.com) - Model Context Protocol Spec: Tools(2025-06-18)
https://modelcontextprotocol.io/specification/2025-06-18/server/tools(modelcontextprotocol.io) - Model Context Protocol Spec: Servers overview(2025-11-25)
https://modelcontextprotocol.io/specification/2025-11-25/server/index(modelcontextprotocol.io) - Microsoft Learn: Semantic Kernel Planners(更新: 2025-06-11)
https://learn.microsoft.com/en-us/semantic-kernel/concepts/planning(learn.microsoft.com) - Microsoft Foundry Blog: What’s new(Dec 2025 & Jan 2026 / tracing overhaul)
https://devblogs.microsoft.com/foundry/whats-new-in-microsoft-foundry-dec-2025-jan-2026/(devblogs.microsoft.com) - ITPro: malicious MCP server がメールを盗む事例(2025-09-26)
https://www.itpro.com/security/a-malicious-mcp-server-is-silently-stealing-user-emails(itpro.com) - TechRadar: Anthropic の Git MCP server の脆弱性(CVE-2025-68145)
https://www.techradar.com/pro/security/anthropics-official-git-mcp-server-had-some-worrying-security-flaws-this-is-what-happened-next(techradar.com)