コンテキストエンジニアリングアーキテクチャ
概要
コンテキストエンジニアリングは、各推論ステップで言語モデルに提供される情報を構築するプロセスです。
AI Dev Agentにとって、コンテキストの品質はエージェントが行える意思決定の品質を直接決定します。
単純なチャットシステムとは異なり、自律エンジニアリングエージェントは以下について推論しなければなりません:
- 大規模なコードベース
- 仕様
- 過去の作業
- アーキテクチャ決定
- リポジトリの状態
- タスクの進捗
現代の言語モデルはコンテキストウィンドウが制限されているため、システムは含める情報を慎重に選択しなければなりません。
したがって、コンテキストエンジニアリングはシステムの最も重要なコンポーネントの一つです。
目標
コンテキストエンジニアリングシステムはいくつかの目標を達成するよう設計されています。
関連性
最も関連性の高い情報のみがコンテキストに含まれるべきです。
無関係な情報はトークン使用量を増加させ、モデルのパフォーマンスを低下させます。
決定論
コンテキスト構築は予測可能なルールに従うべきです。
エージェントは関連情報の発見をモデルに完全に依存すべきではありません。
スケーラビリティ
システムは大規模なリポジトリと長期間の開発タスクをサポートしなければなりません。
コンテキストは大規模プロジェクトでも効率的でなければなりません。
説明可能性
特定の情報がコンテキストに含まれた理由を理解できるべきです。
コンテキストレイヤー
エージェントは複数の情報レイヤーを使用してコンテキストを構築します。
+--------------------------------+
| システム指示 |
+--------------------------------+
| タスク記述 |
+--------------------------------+
| アクティブな仕様 |
+--------------------------------+
| 関連コードコンテキスト |
+--------------------------------+
| リポジトリ状態 |
+--------------------------------+
| メモリ取得 |
+--------------------------------+
| ツール結果 |
+--------------------------------+各レイヤーは異なる種類の情報を提供します。
システム指示
システム指示はエージェントの動作と機能を定義します。
例:
- エージェントの役割
- ツール使用ルール
- コーディング標準
- 安全制約
これらの指示は通常静的で、常にコンテキストに含まれます。
例:
あなたは自律ソフトウェアエンジニアです。
ツールを使用してリポジトリと対話できます。
重複した機能を作成するよりも、常に既存のコードを変更することを優先してください。タスク記述
タスク記述は現在の目標を定義します。
例:
- 機能の実装
- バグの修正
- モジュールのリファクタリング
- テストの記述
例:
タスク: ユーザープロファイルサービスのキャッシュを実装する。この情報はエージェントの推論を固定します。
アクティブな仕様
エージェントは多くの場合、仕様に基づいて作業します。
例:
- 設計ドキュメント
- 機能仕様
- APIコントラクト
ソース例:
docs/specs/*
docs/architecture/*これらのドキュメントの関連セクションがコンテキストに注入されます。
これにより、実装が意図された設計に従うことが確保されます。
関連コードコンテキスト
コードコンテキストはコンテキストの最も重要な部分の一つです。
しかし、リポジトリ全体を含めることは不可能です。
したがって、システムは関連コードを選択しなければなりません。
方法:
シンボルベースの取得
エージェントがシンボルに取り組んでいる場合、システムは以下を取得します:
- 関数定義
- クラス定義
- 関連インターフェース
- インポート
例:
UserService.ts
UserRepository.ts
CacheClient.ts依存グラフの取得
システムは現在のモジュールに依存するコードを取得することがあります。
これにより、エージェントは副作用を理解できます。
ファイル近接性
近くのファイルはしばしば関連しています。
例:
/services/user/*これらのヒューリスティックにより、エージェントは最も関連性の高いコードを見ることができます。
リポジトリ状態
エージェントはリポジトリの状態を認識していなければなりません。
重要な情報:
- gitの状態
- 変更されたファイル
- 現在のブランチ
- 保留中の変更
例:
変更されたファイル:
* src/user/UserService.ts
* src/user/cache.tsこれにより、エージェントが自分の変更を上書きすることが防止されます。
メモリ取得
エージェントは長期メモリから知識を取得することがあります。
例:
- 過去の実装決定
- デバッグノート
- アーキテクチャの議論
- 一般的な解決策
メモリ取得には以下を使用できます:
- ベクター検索
- キーワード検索
- メタデータフィルター
関連するメモリがコンテキストに注入されます。
ツール結果
ツール呼び出しの出力もコンテキストに含まれます。
例:
- ファイルの内容
- コマンドの出力
- テスト結果
- エラーメッセージ
例:
テスト失敗:
期待されるステータス 200
受信したステータス 500これにより、エージェントはアクションの結果を観察できます。
コンテキスト構築パイプライン
コンテキストはパイプラインを使用して構築されます。
タスク
│
▼
コンテキストプランナー
│
▼
コード取得
│
▼
メモリ取得
│
▼
コンテキスト組み立て
│
▼
トークンバジェット最適化
│
▼
LLM入力各ステップは最終コンテキストに情報を提供します。
コンテキストプランナー
コンテキストプランナーはどの情報を取得すべきかを決定します。
入力:
- タスク記述
- 現在のステップ
- 以前のツール結果
プランナーは以下を決定します:
- どのファイルをロードするか
- どのメモリを取得するか
- どの仕様を含めるか
これにより、不必要なデータ取得が削減されます。
トークンバジェット管理
言語モデルはコンテキストウィンドウが制限されています。
システムはトークンを慎重に割り当てなければなりません。
バジェット例:
| コンテキストレイヤー | トークンバジェット |
|---|---|
| システム指示 | 1000 |
| タスク記述 | 500 |
| 仕様 | 2000 |
| コードコンテキスト | 4000 |
| メモリ | 1500 |
| ツール結果 | 2000 |
バジェットはモデルによって異なる場合があります。
コンテキスト圧縮
コンテキストがトークンバジェットを超えた場合、圧縮技術が適用される場合があります。
例:
要約
大きなドキュメントは含める前に要約される場合があります。
コード抽出
関連する関数またはクラスのみが含まれる場合があります。
メモリフィルタリング
優先度の低いメモリは除外される場合があります。
これらの技術は管理可能なコンテキストサイズの維持に役立ちます。
反復的コンテキスト拡張
エージェントが追加情報を必要とする場合があります。
システムは反復的拡張をサポートします。
ワークフロー例:
エージェントが関数を検査
↓
エージェントが依存関係を必要とする
↓
エージェントが追加ファイルを取得
↓
コンテキストが更新されるこれにより、最初に多すぎる情報をロードすることが避けられます。
コンテキストキャッシュ
一部のコンテキストコンポーネントは頻繁に変化しません。
例:
- システム指示
- アーキテクチャドキュメント
- コーディング標準
これらはオーバーヘッドを削減するためにキャッシュされる場合があります。
可観測性
コンテキスト構築は観察可能であるべきです。
ログには以下が含まれる場合があります:
- 取得されたファイル
- 取得されたメモリ
- トークン使用量
- 圧縮操作
これにより、開発者はエージェントの動作を理解できます。
失敗モード
一般的なコンテキスト関連の失敗:
欠けているコードコンテキスト
重要な依存関係が欠けている場合、エージェントはコードを誤って変更する可能性があります。
過剰なコンテキスト
コンテキストが多すぎると推論品質が低下する可能性があります。
無関係なメモリ
誤ったメモリ取得はエージェントを混乱させる可能性があります。
コンテキストエンジニアリングシステムはこれらのリスクを軽減しなければなりません。
将来の改善
可能な改善:
- 学習されたコンテキスト選択
- 適応的トークンバジェット
- 動的コード要約
- 構造的コード埋め込み
これらの技術によりエージェントの推論がさらに向上する可能性があります。
まとめ
コンテキストエンジニアリングはAI Dev Agentアーキテクチャのコアコンポーネントです。
各推論ステップで言語モデルが受け取る情報を決定します。
システムは複数のレイヤーからコンテキストを構築します:
- システム指示
- タスク記述
- 仕様
- 関連コード
- リポジトリ状態
- メモリ
- ツール結果
コンテキストを慎重に選択・管理することで、システムはエージェントが複雑なソフトウェアシステムについて効果的に推論できるようにします。