Agentic Loopの心臓部:Context Engineeringの実装パターンを徹底解説
出典: ymd

AIエージェントが自律的に問題解決する「Agentic Loop」において、コンテキスト設計がなぜ重要なのか。Claude Codeの具体例から、システムプロンプト・ユーザーコンテキスト・システムコンテキストの3層構造の実装パターンを解説します。
AIエージェントの自律性を支える設計思想
AIエージェントが「ログインテストが落ちています。原因を直してください」という曖昧な指示から、自律的に問題を特定し、コードを修正し、検証まで完了する——こうした自律的な問題解決サイクルを「Agentic Loop」と呼びます。
今回は、このAgentic Loopの実装において最も重要な要素である**Context Engineering**の具体的な設計パターンを、Claude Codeの実例をもとに深掘りします。多くの開発者がプロンプトの「内容」に注目する一方で、コンテキストの「構造化」こそが、エージェントの自律性を左右する決定的な要素なのです。
Context Engineeringの3層アーキテクチャ
Agentic Loopを効果的に回すためには、コンテキストを戦略的に層分けする必要があります。Claude Codeの実装から見えてくるのは、以下の3層構造です。
1. System Prompt層:エージェントの「人格」を定義する
systemPrompt: Claude Codeの基本指示、ツール利用方針、検証方針などこの層は、AIエージェントの行動原則そのものを規定します。単に「あなたはコーディングアシスタントです」と伝えるだけでなく、以下を明確化する必要があります:
2. User Context層:プロジェクト固有の「文脈」を提供する
userContext: CLAUDE.md、今日の日付などこの層が、汎用的なAIモデルを「あなたのプロジェクト専用」のエージェントに変えます。重要なのは:
3. System Context層:「今この瞬間」の状態を反映する
systemContext: git status、最近のcommitなどこの層は動的に変化する情報を扱います:
4. Tools層:エージェントの「手足」を揃える
tools: Read, Grep, Glob, Bash, Edit, To...ツールセットは、エージェントができることの範囲を決定します。重要なのは、ツールの「粒度」と「組み合わせ可能性」です。
編集部の視点
従来のプロンプトエンジニアリングとの決定的な違い
従来のプロンプトエンジニアリングは「1回の入力→1回の出力」を最適化する技術でした。しかし、Agentic Loopにおけるコンテキスト設計は、**複数ターンにわたる自律的な意思決定プロセス**を支える必要があります。
ChatGPTのCode Interpreterと比較すると、違いは明確です:
この違いを実現しているのが、**QueryEngine側での事前コンテキスト構築**です。ユーザーが「ログインテストが落ちています」と言った瞬間に、エージェントは既に:
1. どのツールが使えるかを知っている
2. プロジェクトのコーディング規約を理解している
3. 現在のgit状態を把握している
この「準備された状態」があるからこそ、エージェントは迷わず行動できるのです。
この設計パターンの強力なメリット
1. **再現性の確保**:コンテキスト構造が標準化されているため、同じ問題に対して一貫した対応が可能
2. **拡張性の高さ**:新しいツールを追加する際も、既存の層構造を崩さず統合できる
3. **デバッグのしやすさ**:問題が起きた時、どの層に原因があるか特定しやすい
注意すべき設計上の落とし穴
一方で、この設計には慎重に扱うべき側面もあります:
1. **トークンコストの増大**:3層すべてを毎回送信すると、コストが膨らむ可能性があります。System Context層は動的に更新されるため、差分のみを送信する工夫が必要です。
2. **コンテキストの競合**:System PromptとUser Contextで矛盾する指示があった場合、エージェントが混乱します。優先順位を明確にする必要があります。
3. **過剰な情報による判断の鈍化**:git履歴を100件も渡すと、重要な情報が埋もれます。「最近のcommit」は直近5〜10件程度に絞るべきです。
どんな開発シーンに最適か
この設計パターンは、以下のような場面で特に威力を発揮します:
逆に、創造的な設計判断が必要な場面(アーキテクチャ決定、UX設計など)では、人間の介入が各ステップで必要になるため、オーバーヘッドになる可能性があります。
今日から試せるアクション
アクション1:あなたのプロジェクトの「3層コンテキスト」を設計する
以下のテンプレートで、自分のプロジェクトのコンテキストを整理してみましょう:
## System Prompt層
- あなたはXXプロジェクトのコーディングアシスタントです
- 修正後は必ずテストを実行してください
- エラーが出たら、ログを確認してから再試行してください
## User Context層
- コーディング規約: [CODING_STYLE.md]
- 今日の日付: [動的に挿入]
- プロジェクトの目的: [PROJECT_GOALS.md]
## System Context層
- 現在のブランチ: [git branch]
- 未コミットの変更: [git status]
- 直近5件のコミット: [git log -5]アクション2:ツールセットの「粒度」を見直す
ツールは細かすぎても粗すぎても使いにくくなります。以下の基準で見直してください:
1つのツールで複数の責務を持たせないことが重要です。
アクション3:コンテキストの「鮮度」を管理する仕組みを作る
System Context層は頻繁に変化します。以下のような更新タイミングを設定しましょう:
class ContextManager:
def __init__(self):
self.cache_duration = 60 # 秒
self.last_updated = None
def get_system_context(self):
if self._is_cache_expired():
self.system_context = self._fetch_git_status()
self.last_updated = time.now()
return self.system_context毎回git statusを実行するのではなく、適切なキャッシュ戦略を持つことで、パフォーマンスとコストを最適化できます。
---
この情報は @ymd さんの投稿を参考にしています。
出典: ymd


