数週間くらい前に突然どいつもこいつも「ハーネスエンジニアリング」とツイートするようになり,最初はhooksとかskillsのことをハーネスと呼んでいるらしいと認識していたのだが,ある日ClaudeCodeのことをハーネスとして扱う発言をしているツイートを見つけて,「ハーネスエンジニアリング is 何?」となった.
本当によく分からなくなってきたので,ハーネスエンジニアリングとは一体何なのかを調べてその考え方をまとめることにした.
(同じような疑問を持った人が同じように最近記事を書いているようなのでn番煎じだが,自分の思考の整理として書くことにする)
そもそも一般用語としての「ハーネス」の定義を我々は意外と知らない問題
日常会話で「ハーネス」という言葉が出てくることはあまりない.
a piece of equipment with straps and belts, used to control or hold in place a person, animal, or object:
- a safety harness
- a baby harness
- a parachute harness
https://dictionary.cambridge.org/dictionary/english/harness より引用
"人や動物,モノを制御・固定するためのストラップやベルトを用いた装備"を指す.1
つまりハーネスは「何か対象(A)を」「何かの装備(B)を使って」御するものだということになるが,この(A)について何を対象にしているかを明示せずに「あれもハーネス!」「これもハーネス!」とみんなが合唱しているので,よく分からない状況になっていると考える.
統一された定義があるわけではないので,あちこちで提示される「ハーネス」はそれぞれ上記の(A)・(B)に何を想定しているのかを意識する必要がある.
AIに対する「ハーネス」とは何か
「うんうん それもまたハーネスだね」
この手の概念整理をする場合,Anthropicの解釈を起点に議論を進めることが多いように思うが,色々調べた中で自分がハーネスの理解の起点としてシンプルだと感じたのがLangChainの記事だったので,この立場からの視点を最初に整理する.
要約: エージェント = モデル + ハーネス
ハーネスエンジニアリングとは,モデルを"ワークエンジン"に変えるためシステムを作ることである.
モデルは知性を持っており,ハーネスはそれを有用にする.
https://www.langchain.com/blog/the-anatomy-of-an-agent-harness より
※ワークエンジンについて2
モデルでなかったら,それはハーネスである.
ハーネスとは,コードや設定,実行ロジックなど,モデル自体の全てである.
モデルそのものはエージェントではない.しかしハーネスが状態,ツール実行,フィードバックループ,強制できる制約を与えられれば,それはエージェントになる.具体的には,ハーネスとは
- システムプロンプト
- tools, skills, MCPやそれらのdescription
- バンドルされたインフラストラクチャ(ファイルシステム,サンドボックス,ブラウザ)
- オーケストレーションロジック(サブエージェント呼び出し,別のプロセスへのハンドオフ,モデルルーティング)
- 決定論的な実行のためのhooksやミドルウェア(compaction,continuation, lintチェック )
https://www.langchain.com/blog/the-anatomy-of-an-agent-harness より
「モデル以外はハーネス」,実に潔い定義だと思う.
前述の考え方に当てはめると,LangChainの示すハーネスとは
- 何か対象(A)を:LLMを
- 何かの装備(B)を使って:モデル以外の全てを使って
モデルを有用にするものだ,ということになる.
……なるのだが,それは 「うんうん それもまたアイカツだね」 みたいなもので情報量は増えたようであまり増えていない.
「ハーネス」がバズワードと化してしまう原因が端的に表れているように思う.
他所で色々言われていることも,実はLangChainと同じようなことでしかない
例えばMastraは,LangChainのようにブログ記事を出しているわけではないが,興味深いことにアルファ版としてHarnessというクラスが@mastra/coreで定義している.
このHarnessクラスは、複数のエージェントモード、共有状態、メモリ、およびストレージを統括します。また、TUIやその他のUIがスレッドの管理、モデルやモードの切り替え、メッセージの送信、ツールの承認処理、イベントの追跡を行うための制御レイヤーを提供します。
https://mastra.ai/reference/harness/harness-class より引用
Mastraのハーネスの捉え方はLangChainのそれと近いように感じる.
つまり,ハーネスとは何であるという狭義の定義を置くというよりは,モデルを制御するレイヤー全体のことをハーネスと呼ぶような説明に近い.3
ハーネスは我々にとって新奇なものでは"ない"のではないか?
「エージェント = モデル + ハーネス」であり,モデル単体ではエージェントたり得ないというのはその通り.
ただ一方でその定義に基づけば,我々はハーネスというものをそれこそClineに全部賭け始めたあたりから普通に使っているし,toolsにしてもskillsにしてもMCPにしても以前から使ってきた.hooksでlintエラーをフィードバックすることもしてきた.
とすると,「時代はハーネスエンジニアリング」と言うのは若干実態とズレていて, 「我々は既に当たり前にハーネスエンジニアリングしてきた」 ということになるのではなかろうか.
ここ数ヶ月とそれ以前の違いは,それを「ハーネス」と表現するかしないかの違いでしかない.
コーディングとそれ以外の文脈
コーディングエージェント文脈におけるハーネスのレイヤー
調べていて興味深いと感じたのが,ハーネスについての記事のAnthropicとOpenAIのブログ記事における微妙なスタンスの違いである.
OpenAIはハーネスエンジニアリング:エージェントファーストの世界における Codex の活用において,Codexを用いた人間が一切コードを書かない開発について語っている.そこでは例えば他のコーディングエージェントからのレビューフィードバック,同時並行開発を支える開発環境,そしてAGENTS.mdの工夫について語られているが,これは記事タイトルが示す通り,Codexに対してアドオンで何ができるか? ということを語っている.
つまり,LangChainの定義に基づけばCodex自体がハーネスであるが,OpenAIはCodexが存在することを前提にそれをより有効活用することをハーネスと位置づけているように読める.
OpenAIの考え方はLangChainの提示する考え方から逸脱するものではない.4
ここから言えることは,コーディングエージェント文脈においては
モデル
+ コーディングエージェントツール(ClaudeCode/Codexなど)
+ ツールを強化・補足する環境や仕組み
という2階層のハーネスという解釈があり得るということだ.
これが冒頭の「何か対象(A)を」「何かの装備(B)を使って」御するものという話に繋がる.
つまり,御する対象がモデルそのものなのか,ClaudeCodeやCodexなのか,で見ている世界が微妙に異なる.
「ハーネスエンジニアリング」というバズワードから学べることがあるとしたらそれは何か
コーディング以外の文脈における適用
多くのソフトウェアエンジニアはコーディングエージェントツールを使う立場にあるので,上記の階層の考え方に基づいて「ClaudeCode/Codexはハーネスである」と語ること自体にあまり意義はない.56
一方でこれをコーディング以外の文脈に広げたらどうなるだろうか.
コーディングエージェント以外の文脈では,それぞれが何らかの機能のためにAIエージェント機能を組み込んだアプリやサービスを提供することになるだろう.
(「AIエージェントを使って開発する」のではなく「AIエージェントを開発する」)
AIエージェントの開発は,自分がソフトウェアエンジニアなので贔屓目に見ている分を割り引いたとしてもコーディング分野が圧倒的に先に進んでいる.
従って,コーディング以外の文脈においては,以下の観点で「ハーネスエンジニアリング」を意識する意義があるかもしれない.
エージェントの開発・提供に関わる知見
言い換えれば「あなたの事業ドメインにおけるClaudeCode的存在を作ろう」ということ.
この開発において,今AnthropicやOpenAIがClaudeCodeやCodexの開発で工夫して得られた知見は,役に立つ「ハーネスエンジニアリング」の知見なのではないか.
開発したエージェントの活用フェーズにおけるエンドユーザーの工夫
コーディングエージェントの2階層のハーネスが示すのは(広く見れば)AIエージェントを活用するエンドユーザーの工夫余地・カスタマイズ性もまたハーネスエンジニアリングと言える,ということ.
それはコーディング以外の文脈においても,提供するAIエージェントをエンドユーザー自身が工夫して制御できる仕組み(コーディングにおけるskillsやhooksなどに相当するもの)を提供することはAIエージェントの価値をより高めるための選択肢のひとつである,という示唆なのかもしれない.
お前は「ハーネスエンジニアリング」とどう向き合うのか
自分はAIエージェントを開発するというよりは,AIエージェントを使って開発する立場にいるので,この立場においてはただのクソバズワード以外の何者でもないとしか言いようがない.
ただ,強いて今回バズワードと向き合った結果得られた成果を挙げるなら 「振り返りSkillsに対するベストプラクティス調査Skillsの作成」 がある.
ハーネスエンジニアリングについて調べていて上記の記事を見つけた.
この記事ではSonnet4.5で安定した稼働のために導入していたツールをOpus4.5では取り除いた.モデルの進化により不要になりむしろ足かせになっていたというようなことが書いてある.
元々自分は「振り返り」というSkillsを作っていた.これは会話の中で自分がClaudeCodeに対してブチギレた内容をClaudeCode自身に振り返りさせ,再発防止策を検討し導入するというSkillsである.
このSkillsにより同じ原因でのブチギレ再発がだいぶ抑止され,自分の精神安定上非常に効果を発揮しているのだが,CLAUDE.mdやSkillsが肥大化していくというデメリットがある.
そこで「Anthropicのブログとか最近のベストプラクティスについての記事を調査して,そこから逸脱するものや過去は必要だったが今は不要なルール・スキルがないかを調査して反映して」というSkillsを新たに作った.
これを定期的に流すことで,最新のベストプラクティスを取り込むサイクルを回せるようにした.
……しかし,これも何ならAIを使わなくても必要な改善サイクルでしかないので,やはり自分にとっては「ハーネスエンジニアリング」はただのバズワードでしかないようだ.
-
a baby harnessの例を見て,そういえば最後に「ハーネス」と聞いたのは,子どもがどこかに行かないようにするための"ハーネス"を使うことの是非が数年前にインターネッツでバズったときだな,と思い出した. ↩ -
うまい訳が思いつかず横文字のまま表記しているが,自分は「何か特定の作業を行うための仕組み全体」のような意味合いで捉えている ↩
-
とすると既存のMastraの提供機能と重複があるのでは?という気もするがMastraを全然使っていないので何とも言えない. ↩
-
というか,LangChainの定義が広すぎて逸脱しようがないとも言えるかもしれない. ↩
-
時代はハーネスエンジニアリング!ClaudeCodeという最強のハーネスを使おう!と言われたところで「だからどうした」「当たり前だろ」としか言いようがない.クソみたいな時代遅れの驚き屋仕草である. ↩
-
もちろん,コーディングエージェント自体を作るならそれは意義深いが ↩