はじめに
「ChatGPTに同じ質問をしても、毎回違う答えが返ってくる」
「AIエージェントが途中で会話の内容を忘れてしまう」
「もっと精度の高い回答を引き出したいけど、どうすればいいかわからない」
このような悩みを持っていませんか?
実は、AIを効果的に使いこなすには「コンテキストエンジニアリング」という考え方が重要なんです。これは単なるプロンプトの書き方ではなく、AIに「何を覚えさせ、どう伝え、どう切り替えるか」を設計する技術です。
本記事では、コンテキストエンジニアリングの3つの核となる要素を、初心者の方にも分かりやすく解説します。
コンテキストエンジニアリングとは?
コンテキスト(Context) とは「文脈」のこと。AIとの対話において、「今、AIが何を知っているか」「どんな情報を参照しているか」を指します。
コンテキストエンジニアリング とは、この文脈を適切に設計・管理することで、AIの出力品質を高め、意図通りの動作をさせる技術です。
従来の「プロンプトエンジニアリング」が「質問の書き方」に焦点を当てていたのに対し、コンテキストエンジニアリングは以下の3つの要素を包括的に扱います:
- プロンプト設計 - 「何を、どう伝えるか」
- 記憶管理/文脈設計 - 「何を覚えさせ、何を忘れさせるか」
- 動的切り替え制御 - 「状況に応じてどう切り替えるか」
それでは、各要素を詳しく見ていきましょう!
1. プロンプト設計(Prompt Design)
何を解決するのか?
AIに対して「何を、どのように、どの順序で指示するか」を最適化する設計です。
例えば、以下の2つのプロンプトを比較してみましょう:
❌ 悪い例:
コードをレビューして
✅ 良い例:
あなたは経験豊富なシニアエンジニアです。
以下のPythonコードをセキュリティの観点からレビューしてください。
特に以下の点に注意してください:
- SQLインジェクションのリスク
- 認証・認可の不備
- 機密情報の露出
コード:
{code}
出力形式:
1. 重大度(高/中/低)
2. 問題点
3. 修正案
後者は「役割」「目的」「制約条件」「出力形式」が明確になっており、AIが期待通りの回答を返しやすくなります。
コア技術
1.1 テンプレート化とスロット化
プロンプトを再利用可能な「テンプレート」として設計し、動的に内容を差し替えます。
テンプレートの例:
あなたは{role}です。
{goal}を達成するために、以下の制約条件に従ってください。
制約条件: {constraints}
入力: {input}
出力フォーマット: {output_format}
使用例:
template = {
"role": "プロジェクトマネージャー",
"goal": "タスクの優先順位付け",
"constraints": "期限は2週間、チームは3名",
"input": "10個のタスクリスト",
"output_format": "優先度順の番号付きリスト"
}
このようにテンプレート化することで、異なるシナリオに対して一貫性のある指示を与えることができます。
1.2 チェーン・オブ・ソート(Chain-of-Thought, CoT)設計
AIに「思考の手順を明示的に出力させる」ことで、推論の精度を高めます。
例:
次の問題を解いてください。
ただし、手順を分けて考え、各ステップの理由を説明してから結論を述べてください。
問題: リンゴが3個、ミカンが5個あります。リンゴをさらに2個買いました。
果物は全部で何個ですか?
回答フォーマット:
ステップ1: [最初の状態]
ステップ2: [追加された情報]
ステップ3: [計算]
結論: [最終的な答え]
このように段階的に考えさせることで、AIの推論ミスを減らすことができます。
1.3 Few-shot/One-shot 学習構文
「正解例を見せてから、本題を解かせる」テクニックです。
One-shot(1つの例):
次の形式でメールを作成してください。
例:
件名: 【重要】プロジェクト進捗報告
本文:
〇〇様
いつもお世話になっております。
本日の進捗をご報告いたします。
...
それでは、以下の内容でメールを作成してください:
- 相手:山田部長
- 内容:明日の会議の時間変更
Few-shot(複数の例):
複数のパターンを見せることで、より複雑な出力形式を学習させることができます。
1.4 Instruction + Context + Goal の3層構造
複雑なタスクでは、プロンプトを3層に分けることで一貫性が高まります:
【Instruction(指示)】
あなたは技術ブログのライターです。
【Context(補助文脈)】
対象読者: プログラミング初心者
トーン: フレンドリーで分かりやすい
制約: 2000文字以内、コード例を3つ含む
【Goal(最終目標)】
「Pythonの例外処理」について解説記事を書いてください。
現在の発展方向
動的生成プロンプト(Dynamic Prompting)
ユーザーの履歴や状況に応じて、プロンプトを自動で組み立てる手法です。
例:
- 初回ユーザー → 丁寧な説明を含むプロンプト
- リピートユーザー → 簡潔な指示のみ
メタプロンプト(Meta Prompt)
「プロンプトを生成するためのプロンプト」です。
例:
以下のタスクに最適なプロンプトを生成してください:
タスク: SQLのパフォーマンス改善提案
対象: 中級エンジニア
出力形式: ステップバイステップガイド
2. 記憶管理/文脈設計(Memory & Context Design)
何を解決するのか?
AIが「いま何を知っているか」「過去のどんな履歴を覚えているか」を制御します。
例えば、長い会話の中でAIが「最初に話した内容を忘れてしまう」ことがありますよね?これは、AIのコンテキストウィンドウ(一度に処理できる情報量)に限界があるためです。
記憶管理では、「どの情報を、どのタイミングで渡すか」を設計することで、この問題を解決します。
コンテキストの種類
AIが参照するコンテキストには、以下の5種類があります:
| 種類 | 内容 | 例 |
|---|---|---|
| セッションコンテキスト | 現在の会話やタスクの履歴 | チャット履歴、過去の指示内容 |
| 永続コンテキスト | 長期的知識、ユーザープロファイル | "あなたはエンジニアとして…" などの初期設定 |
| 短期メモリ | 直近の入力・出力結果の要約 | 最新ステップの思考結果やAPIレスポンス |
| 長期メモリ | 検索可能な知識ベース | RAG(後述)での文書群 |
| 状態メモリ | 実行タスクや変数の状��� | タスク進捗、現在のフェーズ |
技術構成パターン
2.1 要約型メモリ(Summarized Memory)
会話履歴をそのまま渡すとトークン制限に当たるため、「重要部分を抽出・要約」して保持します。
例:
[元の履歴]
ユーザー: 明日の天気を教えて
AI: 明日は晴れです
ユーザー: 傘は必要?
AI: 必要ありません
ユーザー: 気温は?
AI: 最高気温25度です
[要約後]
「ユーザーは明日の天気について質問。晴れ、傘不要、最高気温25度と回答済み」
2.2 ベクトル検索型メモリ(Vector Store Memory)
過去の対話や知識を「埋め込みベクトル」として保存し、必要に応じて類似検索して取り出します。
これは**RAG(Retrieval-Augmented Generation)**の基盤技術です。
仕組み:
- 過去の会話や文書をベクトル化してデータベースに保存
- ユーザーの質問をベクトル化
- 類似度の高い情報だけを取り出してAIに渡す
メリット:
- 大量の情報から関連する部分だけを抽出できる
- トークン制限を超える情報でも扱える
2.3 階層型コンテキスト設計
コンテキストを3層に分けて管理します:
これらを階層的に合成して最終入力を形成します。
2.4 意図フィルタリング(Intent Filtering)
入力の意図を解析して、「関連度の高いメモリだけ」を取り出します。
例:
- ユーザーが「前回の会議の内容は?」と聞く
→ 会議関連のメモリのみを取り出す - ユーザーが「Pythonのコードを書いて」と聞く
→ コード関連のメモリのみを取り出す
これにより「Context Overload(過剰文脈)」を防ぎます。
設計上の指針
「何を覚えさせるか」より「何を忘れさせるか」
すべて記憶するのではなく、文脈の鮮度と関連性を制御することが重要です。
具体例:
- 1週間前の雑談は削除
- 重要な決定事項は永続保存
- 直近3回の会話は短期メモリに保持
Context Budgeting
コンテキストウィンドウを「リソース」として配分する考え方です。
例:
- 80% は履歴
- 10% はシステム指示
- 10% は現在入力
こうすることで、限られたトークン数を効率的に使えます。
3. 動的切り替え制御(Dynamic Context Switching)
何を解決するのか?
「状況・フェーズ・意図に応じて、参照すべきコンテキストを自動で切り替える」仕組みです。
例えば:
- ユーザーが「コードを書いて」と言ったら → コード生成用のコンテキストに切り替え
- ユーザーが「説明して」と言ったら → 知識ベースのコンテキストに切り替え
これにより、AIが適切な情報源を自律的に選ぶようになります。
主な実現方法
3.1 Intent Routing(意図ルーティング)
入力の意図を分類し、それに応じて異なるプロンプト/メモリ/ツールを選択します。
例:
入力: 「Pythonの例外処理について説明して」
↓
意図分類: 「説明依頼」
↓
選択: Knowledge Context(知識ベース)
入力: 「ログイン機能を実装して」
↓
意図分類: 「実装依頼」
↓
選択: Code Context(コード生成用)
3.2 Context Graph(文脈グラフ)
各文脈ノード(知識、履歴、状態)をグラフ構造で表現し、関連ノードを遷移的に辿ります。
イメージ:
[プロジェクト情報]
↓
[技術スタック] ← [過去の会話]
↓
[コード生成] → [テスト実行]
LangGraph、AutoGen、CrewAI などのマルチエージェント設計に使われます。
3.3 フェーズ管理(Stage-based Context)
タスクを段階的なフェーズに分け、それぞれに専用文脈を割り当てます。
例:
フェーズ1: 計画
↓ (計画用のプロンプトとメモリを使用)
フェーズ2: 実装
↓ (実装用のプロンプトとメモリを使用)
フェーズ3: テスト
↓ (テスト用のプロンプトとメモリを使用)
フェーズ4: 報告
(報告用のプロンプトとメモリを使用)
3.4 スイッチングポリシー
時間/イベント/意図などの条件に基づいてコンテキストを切り替えるルールです。
例:
- ユーザーが新タスクを開始
→ 旧メモリを要約して保存
→ 新コンテキストを初期化
実装例(概念コード)
以下は、Pythonで実装する場合のイメージです:
if intent == "code_generation":
# コード生成用のコンテキストをロード
context = memory.load("project_context")
prompt = build_prompt("code_agent", context, user_input)
elif intent == "planning":
# 計画用のコンテキストをロード
context = memory.load("goal_context")
prompt = build_prompt("planner_agent", context, user_input)
else:
# 汎用コンテキストをロード
context = memory.load("general")
prompt = build_prompt("assistant", context, user_input)
応用領域
- マルチエージェントシステムでの役割間の文脈共有
- ドメイン切り替え(例:フロントエンド → データ分析 → プレゼン資料生成)
- 長期プロジェクトでの履歴要約+文脈スイッチ
3要素の統合設計(全体像)
ここまでの3要素を統合すると、以下のようなAgentic Context Pipelineが構成されます:
各要素の役割
- Intent Parser: 入力から「今どんな目的か」を分類
- Context Selector: 適切なメモリを選択(過去履歴・知識ベース・状態)
- Prompt Builder: 選ばれた文脈とテンプレートを組み合わせて最終入力を生成
- LLM: 最適な推論結果を返す
- Memory Update: 結果を再びメモリへ保存
この循環が「コンテキストエンジニアリング」の生命線です。
今後の発展方向
コンテキストエンジニアリングは、今後さらに進化していくと予想されます:
| 項目 | 内容 |
|---|---|
| Adaptive Context Window | モデルの状態に応じてトークンウィンドウを動的拡張/圧縮 |
| Persistent Memory Graphs | 永続的に学習・成長する知識グラフ型メモリ |
| Hybrid Prompting | スクリプト的プロンプト+動的RAG統合 |
| Agentic Context Federation | 複数エージェントがコンテキストを共有・交渉する構造 |
| Observability & Metrics | コンテキスト利用率・精度・応答品質のモニタリング |
まとめ
コンテキストエンジニアリングの3要素をもう一度おさらいしましょう:
-
プロンプト設計 - AIへの伝え方を最適化
- テンプレート化、CoT設計、Few-shot学習など
-
記憶管理/文脈設計 - AIの記憶を制御
- 要約型メモリ、ベクトル検索、階層型コンテキストなど
-
動的切り替え制御 - 状況に応じた自動切り替え
- Intent Routing、フェーズ管理、スイッチングポリシーなど
これらを理解し、適切に組み合わせることで、AIをより効果的に活用できるようになります。
次のステップ
- 実際にプロンプトテンプレートを作ってみる
- LangChainやLlamaIndexなどのフレームワークを試す
- RAG(Retrieval-Augmented Generation)の実装に挑戦する
コンテキストエンジニアリングは、これからのAI活用において必須のスキルです。ぜひ、実践しながら学んでいってください!
参考資料
- LangChain: https://www.langchain.com/
- LlamaIndex: https://www.llamaindex.ai/
- AutoGen: https://microsoft.github.io/autogen/
- LangGraph: https://langchain-ai.github.io/langgraph/
AIエンジニアリングに関心のある方々のために、最新の技術トレンドをなるべく分かりやすく解説しています!