AIエージェント自体の開発に関する記事です。
7月頃から、コンテキストエンジニアリングという言葉を目にする機会が増えました。これは私のAWS Summit Japanの登壇でも軽く触れましたが、エージェントへのコンテキストの与え方を工夫することで、トークン効率やタスク遂行性能、安定性など様々な面を改善しようという手法です。
Hackernewsを見ても、最近関連する投稿がやたらと増えていることが見て取れます。
おそらく出どころはエージェント開発の勘所をまとめた 12 factor agents だと思われます。この図の通り、非常に広い範囲に及ぶチューニング方法のため、正直エージェントに関するほとんどの改善施策はコンテキストエンジニアリングと言えるのではと思います。個人的には、もはやこの言葉に存在意義があるのか疑問に思うこともあります。笑
この記事では、AIエージェントにTODOツールを与えることの良さを、コンテキストエンジニアリング観点でまとめます。TODOツールとは、エージェントがタスクリストを作成し、一つずつタスクを遂行していくためのツールです。このようなTODOツールを活用するエージェントとして、Claude Codeが有名です。
Claudeのドキュメントには明示的に書かれていませんが、Claude Codeの利用者であれば、そのようなツールが使われている様子を目にしたことがあるでしょう。これこそがTODOツールの例です。
TODOツールの概要
本記事では、AIエージェントのもつTODOツールを、以下のようなツール群と定義します。
- updateTodoList ツール
- TODOリストを更新または新規作成するツールです
- ツールはファイルやDBなどに永続化され、エージェントのコンテキスト外で管理されます
- 以下のような入力を期待します:
type Input = { tasks: { title: string status: 'pending' | 'inProgress' | 'completed' }[] }
- getTodoList ツール
- 現在のTODOリストを取得するツールです
単純な2つのツールからなる仕組みですね。Claude Codeでも、似たようなツールを使ってTODOリストを管理しています。
TODOツールの何が良いか
上記のように単純な仕組みではありますが、これによりAIエージェントの挙動に関する多くの問題を解決できます。 以下に列挙していきましょう。
1. 計画立て → 実行の流れを促進できる
多くのエージェント用途において、まず全体像の計画を立ててから実行を始めることで性能が改善することはよく知られています。TODOツールがあることで、ユーザーがあまり指示せずとも、大抵このステップを踏んでくれるようになります。
Bedrockのログ機能を使うと分かりますが、 Claude CodeのTODOツールは長大なプロンプトで、TODOツールの使い方や使うべき状況、使うべきでない状況を説明しています。これくらいの説明があると、計画→実行の流れをエージェントが自ずと必要に応じて適用してくれるようになるようです。
これはどちらかというとプロンプトエンジニアリング的な観点なのですが、プロンプトもコンテキストの一種なので、コンテキストエンジニアリングに含まれますね (迫真)。
2. 計画に沿った実行を強制できる
TODOツールを使うことを選んだエージェントは、各タスクを遂行していくごとに、TODOリストを更新していきいます。
TODOリストの更新はツール内で実行されるので、エージェントの入力をコードでバリデーションし、エージェントにフィードバックできます。このバリデーションにより、エージェントの動作に、以下の大きな影響を及ぼすことができます。
例えば、以下のバリデーションです:
- 並行禁止: 同時に複数のタスクが
inProgress
状態にならないようにする- これにより、エージェントが複数のタスクを同時に進めてしまうような状況を防げます
- 例えばエージェントがtask1の進行中にtask2も進めようとした場合、「task1が進行中のため、TODOリストの更新に失敗しました」とtool resultに与えることで、エージェントの軌道修正を図れるでしょう。
- 順序強制: 直前のタスクが
completed
状態でない場合は、そのタスクはinProgress
状態にならないようにする- これにより、当初の計画の順序を無視して、デタラメにタスクに取り組むような状況を防げます
- 例えばエージェントがtask1の完了後にtask3を進めようとした場合、「task2が未完了のため、TODOリストの更新に失敗しました」とtool resultに与えることで、エージェントの軌道修正を図れるでしょう。
AIエージェントは基本的に物忘れが激しく、直前の入力に強く影響されがちです。そのため、このような形でエージェントの実行計画にレールを敷けることの有効性は、容易に想像できるでしょう。
個人的には、このツールによるコンテキストエンジニアリングが一番好きです。似たような手法は、多くの場面で活用できる機会があります *1。
3. 未完了のタスクの完了を促せる
エージェントがTODOリストにpendingなタスクを残した状態で自分のターンを終わらせた場合、自動的にターンを再開させることも容易です。例えば、「未完了なタスクがあるので完遂してください」などとプロンプトを渡し、ターンを再開させればよいでしょう。
TODOリストをコンテキスト外で管理していれば、ユーザーの手を煩わせることなく、プログラムで自動的に実行可能であることがポイントです。
ただし、ユーザーの確認が必要などの理由でエージェントが意図してターンを終えた場合もありうるため、何らかの方法でこの挙動はエージェント側から回避できるようにもすべきでしょう。(私はこの利点を机上では思いついたのですが、その懸念があるので特にこの処理は実装していません。)
やるとしたら、これもコンテキストエンジニアリングの一種ですね!
まとめ
TODOツールの魅力をコンテキストエンジニアリング観点で紹介しました。
私の自作コーディングエージェント (Remote SWE Agents) においても、TODOツールを実装してからは、自走力が確かに増したことを実感しています。 TODOツールは実装が簡単な割に、複雑なタスクを扱う多くのAIエージェントで効果的に活用できますので、オススメです。
また、Remote SWEはAWS Summit Japanでも展示し*2、以前記事を書いたときから大きくアップグレードされています (Web UIの追加やリモートMCP対応など)。 Devin的な体験をOSS & セルフホストで実現したいという方、ぜひお試しください!
*1:Summitのセッションでは、PR作成ツールの例を紹介しました。複数の問題を一網打尽にできた、気持ちの良いチューニングです。
*2:クラスメソッドの方がレポート記事を書いていただきました!