- AI ⚙️
コンテキストエンジニアリングとは プロンプトとの違いと設計方法
コンテキストエンジニアリングとは、モデルに渡す情報全体(システムプロンプト・ツール定義・検索結果・会話履歴・メモ)を、限られた枠の中で「何を入れ、何を捨てるか」設計することです。 指示の文面を磨くプロンプトエンジニアリングに対して、こちらは作業が進むたびに変わっていく情報の出し入れを扱います。
この記事では、Anthropic が公開している文章に沿って定義と考え方を整理し、要素ごとの「入れるもの・削るもの」チェック表、4つの手法の使いどころ、そのまま書き換えて使える指示ファイルのひな形・ツール説明文の良否例・会話を要約して引き継ぐテンプレートを載せます。
確認環境:Anthropic の Engineering ブログ(2025-09-29 公開の記事、2025-09-11 公開の記事)、Claude のドキュメント(ツール定義、コンテキスト編集、メモリ ツール)、Claude Code のドキュメント(ベストプラクティス)、LangChain のブログ(2025-07-02 公開の記事)を 2026-10-05 に開いて照合しました。掲載した Python のコードは Python 3.11.15 で実行し、ツール定義の JSON は Python で読み込めることと名前の形式を確かめています。テンプレートはこの記事のために書いたもので、モデルの出力例は載せていません。
この記事の結論
- コンテキストは有限の資源です。 入れる情報が増えるほど、モデルがその中の情報を正確に取り出す力は下がっていきます。目指すのは「望む結果が得られる、できるだけ小さく、役に立つ情報の集まり」です。
- 単発の質問は文面の工夫、長時間・多ステップの作業は情報の出し入れの設計が効きます。
- 手法は4つに整理できます。 枠の外に書き出す、必要なものだけ選んで入れる、圧縮する、別の枠に分離する、です。
- 最初に見直すのは、常に読み込まれるもの(システムプロンプト、指示ファイル、ツール定義)です。毎回の枠を使うので、削った効果がすべてのやり取りに及びます。
| 作業の形 | 主に調整するもの | 使う手段 |
|---|---|---|
| 1回の質問と回答 | 指示の文面 | プロンプトの書き方 |
| 資料を参照して答える | 入れる資料の選び方 | 検索して必要な部分だけ入れる |
| 数十回のツール呼び出しが続く作業 | 履歴とツール結果の量 | 圧縮、以前のツール結果の整理 |
| 日をまたぐ作業 | 次の回に残す情報 | メモの書き出しと読み込み |
| 調査と実装が混ざる大きな作業 | 枠そのものの分け方 | サブエージェントへの分離 |
要素ごとの「入れるもの・削るもの」早見表
| 要素 | 入れるもの | 削るもの・外に出すもの |
|---|---|---|
| システムプロンプト | 役割、背景、守ってほしい決まり、出力の形。見出しやタグで区切る | 場合分けを細かく書き並べた条件、どの作業にも当てはまる一般論 |
| 指示ファイル | 推測できないコマンド、既定と違う書き方の決まり、テストの方法、気を付ける点 | コードを読めば分かること、頻繁に変わる情報、長い解説、ファイルごとの説明 |
| ツール定義 | 何をするか、いつ使うか(使わないか)、各引数の意味、返さない情報 | 役割が重なるツール、使う場面が判断できないツール |
| ツールの戻り値 | 次の判断に必要な項目、意味の分かる名前や安定した識別子 | 内部用の ID、使わない項目、上限のない全件の一覧 |
| 例示 | 期待する動きを表す、種類の違う代表的な例を少数 | 例外的な場合を網羅しようとした長い一覧 |
| 検索結果・資料 | いまの手順に必要な部分。残りはファイルのパスや URL などの参照で持つ | 念のために入れた全文、すでに使い終えた資料 |
| 会話履歴 | 決めたこと、未解決の問題、実装の詳細 | 重複したツールの出力、すでに解決した試行錯誤 |
| メモ | 目的、進み具合、次にやること、依存関係 | 会話の逐語的な写し |
表計算ソフトに貼れるタブ区切り版です。
要素 入れるもの 削るもの・外に出すもの
システムプロンプト 役割、背景、決まり、出力の形 細かい場合分けの列挙、一般論
指示ファイル 推測できないコマンド、既定と違う決まり、テストの方法 コードを読めば分かること、頻繁に変わる情報、長い解説
ツール定義 何をするか、いつ使うか、引数の意味、返さない情報 役割が重なるツール
ツールの戻り値 次の判断に必要な項目、意味の分かる名前 内部用のID、使わない項目、全件の一覧
例示 種類の違う代表的な例を少数 例外を網羅する長い一覧
検索結果・資料 いま必要な部分と、残りへの参照 念のための全文、使い終えた資料
会話履歴 決めたこと、未解決の問題、実装の詳細 重複したツールの出力、すでに解決した試行錯誤
メモ 目的、進み具合、次にやること 会話の逐語的な写し
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「コンテキストエンジニアリングとは プロンプトとの違いと設計方法」
コンテキストエンジニアリングの定義
Anthropic は 2025 年 9 月 29 日に公開した記事「Effective context engineering for AI agents」で、次のように説明しています。
- コンテキストとは、モデルに出力させるときに含まれるトークン(情報)の集まりのこと。
- コンテキストエンジニアリングとは、推論のたびに、その最適な集まりを選び、保ち続けるための一連の方法のこと(原文:the set of strategies for curating and maintaining the optimal set of tokens (information) during LLM inference)。
同じ記事には、設計のよりどころになる考え方が3つ書かれています。
| 考え方 | 内容 |
|---|---|
| コンテキスト ロット(context rot) | コンテキスト ウィンドウの中のトークンが増えるほど、モデルがその中の情報を正確に思い出す力が下がる。ある量で急に落ちるのではなく、少しずつ下がる |
| 注意の予算(attention budget) | 新しいトークンを1つ入れるたびに、限られた予算が少しずつ減る。だから入れるものを選ぶ必要がある |
| 指針 | 望む結果が得られる可能性を最大にする、できるだけ小さく、信号の強いトークンの集まりを見つける |
つまり「枠に入る量なら何でも入れる」のではなく、枠に余裕があっても、入れる量そのものを設計の対象にするという立場です。
用語の広まりについては、LangChain が 2025 年 7 月 2 日に公開した記事が、Andrej Karpathy 氏の言葉として「次の手順のために、コンテキスト ウィンドウをちょうどよい情報で満たす、繊細な技術と科学」という説明を引用しています。
プロンプトエンジニアリングとの違い
Anthropic の記事は、プロンプトエンジニアリングを「指示(とくにシステムプロンプト)の書き方と整理の方法」、コンテキストエンジニアリングを「指示以外も含めて、コンテキストに入ってくる情報全体を扱う方法」として対比しています。前者は1回ごとの作業、後者は情報がモデルに渡されるたびに繰り返される選別だと書かれています。
| 観点 | プロンプトエンジニアリング | コンテキストエンジニアリング |
|---|---|---|
| 何を調整するか | 指示の文面と構成 | 枠に入る情報全体(指示、ツール、資料、履歴、メモ) |
| いつ調整するか | 依頼を書くとき | 作業の途中も含めて、情報を渡すたび |
| 主な問い | どう書けば意図が伝わるか | いま何を入れ、何を外に置くか |
| 効きやすい場面 | 単発の質問、決まった形の生成 | 長時間・多ステップの作業、ツールを使うエージェント |
| 見直すきっかけ | 答えの形や内容が意図とずれる | 作業が長くなると、前に伝えた決まりが守られなくなる |
両者は置き換えの関係ではなく、プロンプトの書き方はコンテキストを構成する要素の1つです。
RAG・メモリ・サブエージェントとの違い
よく一緒に語られる仕組みは、どれもコンテキストエンジニアリングの中で使う手段です。
| 仕組み | 何を調整するか | いつ効くか |
|---|---|---|
| プロンプトの書き方 | 指示の文面 | 毎回のやり取り |
| RAG(検索して資料を入れる) | 枠に入れる外部の資料 | 手元の知識だけでは答えられない質問のとき |
| メモリ(メモの保存と読み込み) | 枠の外に置く情報と、次に読み込む情報 | 作業が長く続くとき、会話をまたぐとき |
| 圧縮(要約して引き継ぐ) | 会話履歴の量 | 枠の上限に近づいたとき |
| サブエージェント | 枠そのものの数と分け方 | 調査のように大量に読む作業を、本筋から切り離したいとき |
| コンテキストエンジニアリング | 上のすべての組み合わせ | 作業の設計時と、作業の途中の両方 |
どちらを見直すかの判断表
| 条件 | 見直すもの |
|---|---|
| 1回の質問で、答えの形や詳しさが意図と違う | 文面(プロンプトの書き方) |
| 最初は決まりを守るが、作業が長くなると守られなくなる | 情報の出し入れ(履歴の圧縮、常に読み込む指示の量) |
| 関係のない資料の内容が答えに混ざる | 入れる資料の選び方 |
| ツールの選び方や引数の渡し方がずれる | ツールの数と説明文 |
| 翌日に続きを頼むと、前提の説明からやり直しになる | メモの書き出しと読み込み |
| 調査で大量のファイルを読んだあと、実装の精度が下がる | 調査をサブエージェントに分離 |
4つの手法と使いどころ
LangChain の記事は、エージェントのコンテキストを扱う方法を、書き出す(write)・選ぶ(select)・圧縮する(compress)・分離する(isolate)の4つに分類しています。Anthropic の記事に出てくる手法をこの4つに当てはめると、次のようになります。
| 手法 | すること | Anthropic の記事での呼び方 | 使いどころ |
|---|---|---|---|
| 書き出す | 情報を枠の外に保存する | 構造化されたメモ取り(structured note-taking) | 区切りのはっきりした作業を、何度も繰り返しながら進めるとき |
| 選ぶ | 必要な情報だけを枠に入れる | 必要になった時点での取得(just in time) | 資料が多く、どれが必要かが作業の途中で決まるとき |
| 圧縮する | 必要な分だけを残して量を減らす | コンパクション(compaction) | やり取りが長く続き、会話の流れを保ちたいとき |
| 分離する | 枠を分けて、互いに持ち込む量を減らす | サブエージェントの構成 | 並行して調べる価値がある、複雑な調査や分析のとき |
使いどころの列は、Anthropic の記事が挙げている例(コンパクションは長いやり取り、メモ取りは区切りのある反復的な開発、マルチエージェントは並行した探索が生きる調査と分析)に沿っています。
書き出す:メモを枠の外に置く
エージェントが定期的にメモを書き、あとでそれを読み込み直す方法です。Anthropic の記事は、やることリストを作る、NOTES.md のようなファイルを保つ、といった単純な形で、数十回のツール呼び出しをまたいで進み具合と依存関係を保てると説明しています。
選ぶ:参照だけ持ち、必要になったら読み込む
関係しそうな資料を先にすべて入れておくのではなく、ファイルのパス、保存した検索条件、リンクなどの軽い参照だけを持ち、必要になった時点でツールを使って読み込む方法です。記事では、フォルダーの構成、名前の付け方、更新日時といった情報も、どの資料をいつ使うかを判断する手がかりになると書かれています。
先に入れておく方法は速く、その都度取りに行く方法は柔軟です。記事は、少量の決まった情報(指示ファイル)は先に読み込み、残りは検索のコマンドでその都度探すという組み合わせを例に挙げています。
圧縮する:要約して新しい枠に引き継ぐ
枠の上限に近づいた会話を要約し、その要約から新しい枠を始める方法です。記事によると、残すのは設計上の決定・未解決の不具合・実装の詳細で、捨てるのは重複したツールの出力やメッセージです。
要約のプロンプトを作るときの進め方も書かれています。まず取りこぼしを無くす(必要な情報をすべて拾う)ことを優先し、そのあとで余分な内容を削って精度を上げるという順番です。削りすぎると、あとになって重要だと分かる細かな文脈が失われます。
いちばん手軽な圧縮として挙げられているのが、履歴の奥にあるツール結果を消す方法(tool result clearing)です。
分離する:調査を別の枠で行い、要約だけ受け取る
1つのエージェントがすべての状態を持ち続ける代わりに、絞った作業を担当するサブエージェントに、まっさらな枠で作業させる方法です。記事には、サブエージェントは数万トークン以上を使って広く調べても、返すのは凝縮した要約(多くは 1,000〜2,000 トークン)だけ、と書かれています。調べた内容の詳細はサブエージェントの中にとどまり、全体を進めるエージェントは結果の統合と分析に集中できます。
実物1:指示ファイルのひな形(常に読み込む情報を小さく保つ)
指示ファイルは毎回の枠を使うので、「常に必要なこと」だけを本体に書き、詳細は参照先に置く形にします。あわせて、メモの置き場所と、圧縮するときに残す情報を決めておきます。
# {システム名} 作業の決まり
## このファイルの方針
- ここには、毎回の作業で必要なことだけを書く
- 詳細な仕様は docs/ に置き、必要になったときに読む
## よく使うコマンド
- 起動: {コマンド}
- テスト(1ファイル): {コマンド}
- 型と書式の検査: {コマンド}
## 既定と違う決まり
- {例: 日時は UTC で保存し、表示のときに変換する}
- {例: 例外は握りつぶさず、共通のエラー型に包んで投げる}
## 必要になったら読む資料(先に全部は読まない)
- 画面の仕様: docs/screens.md
- テーブル定義: docs/tables.md
- 過去の決定とその理由: docs/decisions/
## 作業メモの置き場所
- 進み具合と次にやることは NOTES.md に書く
- 作業を始めるときに NOTES.md を読み、区切りごとに更新する
## 会話を要約するときに必ず残すもの
- 変更したファイルの一覧
- 実行したテストのコマンドと、その結果
- 決めたことと、その理由
- まだ解決していない問題
記入例(架空の備品予約システム)
# 備品予約システム 作業の決まり
## このファイルの方針
- ここには、毎回の作業で必要なことだけを書く
- 詳細な仕様は docs/ に置き、必要になったときに読む
## よく使うコマンド
- 起動: npm run dev
- テスト(1ファイル): npm test -- tests/reservation/overlap.test.ts
- 型と書式の検査: npm run check
## 既定と違う決まり
- 日時は UTC で保存し、表示のときに利用者のタイムゾーンへ変換する
- 予約の重なりの判定は src/reservation/overlap.ts だけで行う(画面側で再実装しない)
## 必要になったら読む資料(先に全部は読まない)
- 画面の仕様: docs/screens.md
- テーブル定義: docs/tables.md
- 過去の決定とその理由: docs/decisions/
## 作業メモの置き場所
- 進み具合と次にやることは NOTES.md に書く
- 作業を始めるときに NOTES.md を読み、区切りごとに更新する
## 会話を要約するときに必ず残すもの
- 変更したファイルの一覧
- 実行したテストのコマンドと、その結果
- 決めたことと、その理由
- まだ解決していない問題
Claude Code のドキュメントには、指示ファイル(CLAUDE.md)について「1行ごとに、これを消すと間違いが起きるかを問い、起きないなら削る」という目安と、長すぎるファイルでは大事な決まりが埋もれるという注意が書かれています。また、圧縮のときに残したい情報は、指示ファイルに「変更したファイルの一覧とテストのコマンドは必ず残す」といった文で書いておけるとされています。上のひな形の最後の節は、その使い方に合わせたものです。
作業メモ(NOTES.md)のひな形
# 作業メモ
## 目的
{この作業で達成したいこと。1〜2行}
## 完了したこと
- {日付} {やったこと}(確かめ方: {テストやコマンド})
## いま取り組んでいること
- {作業の内容と、現在の状態}
## 次にやること
1. {次の手順}
2. {その次の手順}
## 決めたことと理由
- {決定}:{理由}
## 未解決の問題・確認待ち
- {問題}({誰に・何を確認するか})
## 参照
- {関係するファイルのパス、資料の場所}
実物2:ツール説明文の書き方(直す前と後)
ツール定義は、使うかどうかにかかわらず毎回の枠に入ります。Claude のドキュメントは、説明文に次の4点を書くよう勧めています。
- ツールが何をするか
- いつ使うか(いつ使わないか)
- 各引数の意味と、動きへの影響
- 注意点や制限(返さない情報など)
長さの目安は、1つのツールにつき3〜4文以上、複雑なツールはそれ以上です。
直す前(何を検索するのか、引数に何を渡すのかが読み取れない例)
{
"name": "search",
"description": "予約を検索する。",
"input_schema": {
"type": "object",
"properties": {
"q": {
"type": "string"
},
"user": {
"type": "string"
}
},
"required": [
"q"
]
}
}
直した後
{
"name": "reservation_search",
"description": "備品予約システムの予約を、備品名・利用者・期間で検索して返します。利用者から「いつ空いているか」「誰が予約しているか」を尋ねられたときに使います。予約の登録・変更・取り消しはできません(それらは reservation_update を使います)。結果は開始日時の新しい順に最大 limit 件で、各予約の ID・備品名・利用者名・開始と終了の日時だけを返します。該当が無いときは空の配列を返します。",
"input_schema": {
"type": "object",
"properties": {
"item_name": {
"type": "string",
"description": "備品名の一部。例: プロジェクター。指定しないと全備品が対象になります。"
},
"user_id": {
"type": "string",
"description": "利用者の ID。例: U0123。利用者名ではなく ID を渡します。"
},
"date_from": {
"type": "string",
"description": "検索する期間の開始日。YYYY-MM-DD 形式。例: 2026-10-05"
},
"date_to": {
"type": "string",
"description": "検索する期間の終了日。YYYY-MM-DD 形式。date_from 以降の日付にします。"
},
"limit": {
"type": "integer",
"description": "返す件数の上限。既定は 20、最大 100。",
"default": 20,
"minimum": 1,
"maximum": 100
}
},
"required": [
"date_from",
"date_to"
]
}
}
| 観点 | 直す前 | 直した後 |
|---|---|---|
| 名前 | search(何の検索か分からない) |
reservation_search(対象を前に付けた) |
| 説明文 | 8 文字、1 文 | 200 文字、5 文 |
| 使う場面 | 書かれていない | 尋ねられる内容の例を書いた |
| 使わない場面 | 書かれていない | 登録・変更・取り消しには使わないと書いた |
| 引数の名前 | q、user |
item_name、user_id(ID を渡すと分かる名前) |
| 引数の説明 | なし | 形式と例を書いた |
| 戻り値の量 | 決まりなし | 件数の上限と、返す項目を書いた |
文字数と文の数は Python で数えた値です。どちらの JSON も読み込めること、名前がドキュメントに書かれた形式(英数字・アンダースコア・ハイフンで 1〜128 文字)に合うことを確かめています。
ツールの設計について、Anthropic の文章に書かれている目安です。
| 目安 | 内容 |
|---|---|
| 数を絞る | 人が見て「この場面でどれを使うか」を言い切れないツールの集まりは、エージェントにも選べない |
| まとめる | 細かい操作ごとにツールを分けるより、関連する操作を1つにまとめ、引数で切り替える |
| 名前に対象を付ける | 複数のサービスや対象にまたがるときは、名前の先頭をそろえる |
| 戻り値を絞る | 次の判断に必要な項目だけを返す。ページ分け・絞り込み・切り詰めに、妥当な既定値を持たせる |
| 引数の名前をはっきりさせる | user より user_id のように、渡すものが分かる名前にする |
| 新しく入った人に説明するつもりで書く | 暗黙の前提を言葉にする |
実物3:会話を要約して引き継ぐプロンプトのテンプレート
長くなった会話を区切り、新しい会話へ引き継ぐときに使うテンプレートです。取りこぼしを無くすことを先に、短くすることを後にしています。
ここまでの会話を、新しい会話へ引き継ぐためのメモにまとめてください。
新しい会話では、このメモだけを読んで作業を続けます。
# まとめ方
- 下の「出力形式」の見出しをそのまま使う
- 決めたことには、理由を1行で添える
- ファイル名・コマンド・エラー文・数値は、言い換えずにそのまま書く
- すでに解決した試行錯誤は「うまくいかなかった方法」に1行ずつ残し、経過は書かない
- ツールの出力は、結論だけを書く(全文は写さない)
- 分からないことは推測で埋めず、「確認待ち」に書く
- 迷ったら残す。短くするのは、すべて拾ったあとにする
# 出力形式
## 目的
## 現在の状態
## 変更したファイル
## 実行したコマンドと結果
## 決めたことと理由
## うまくいかなかった方法
## 未解決の問題・確認待ち
## 次にやること(順番つき)
## 参照(ファイルのパス、資料の場所)
出力形式の記入例(人が書いた見本)
テンプレートがどんな粒度を求めているかを示すための見本です。モデルの出力ではありません。
## 目的
備品予約システムで、終了時刻と開始時刻が同じ予約が「重なり」と判定される不具合を直す。
## 現在の状態
判定の式を修正し、単体テストは通っている。画面からの確認はまだ。
## 変更したファイル
- src/reservation/overlap.ts(比較を < と > に変更)
- tests/reservation/overlap.test.ts(隣り合う予約のテストを2件追加)
## 実行したコマンドと結果
- npm test -- tests/reservation/overlap.test.ts → 12 件すべて通過
## 決めたことと理由
- 終了時刻ちょうどに始まる予約は重なりとしない:利用者の案内文に「前の予約の終了時刻から使えます」とあるため
## うまくいかなかった方法
- 画面側で終了時刻を1分引く:一覧の表示時刻までずれるため取りやめ
## 未解決の問題・確認待ち
- 日をまたぐ予約の扱い(総務の担当者に確認待ち)
## 次にやること(順番つき)
1. 画面から隣り合う予約を登録して確かめる
2. docs/decisions/ に今回の決定を追記する
## 参照
- docs/screens.md の「予約の登録」
以前のツール結果を整理する最小のコード
いちばん手軽な圧縮である「以前のツール結果を目印に置き換える」処理を、自分で会話履歴を組み立てている場合を想定して書いた例です。メッセージの形は説明用に簡略にしています。
"""会話履歴のうち、以前のツール結果を短い目印に置き換える例(Python 3.11、標準ライブラリのみ)"""
KEEP_RECENT = 2 # 新しいほうから何件のツール結果を残すか
PLACEHOLDER = "[以前のツール結果は省略しました。必要なら同じツールで取り直してください]"
def clear_old_tool_results(messages, keep_recent=KEEP_RECENT):
"""role が "tool" のメッセージのうち、新しい keep_recent 件以外の本文を目印に置き換える。"""
tool_indexes = [i for i, m in enumerate(messages) if m["role"] == "tool"]
to_clear = set(tool_indexes[:-keep_recent]) if keep_recent > 0 else set(tool_indexes)
result = []
for i, m in enumerate(messages):
if i in to_clear:
result.append({**m, "content": PLACEHOLDER})
else:
result.append(m)
return result
def total_chars(messages):
return sum(len(m["content"]) for m in messages)
messages = [
{"role": "system", "content": "あなたは備品予約システムの開発を手伝うアシスタントです。"},
{"role": "user", "content": "予約の重なりを調べる処理がどこにあるか探して、直してください。"},
{"role": "assistant", "content": "まず関係するファイルを探します。"},
{"role": "tool", "name": "search_files", "content": "src/reservation/overlap.py\n" * 40},
{"role": "assistant", "content": "overlap.py を読みます。"},
{"role": "tool", "name": "read_file", "content": "def is_overlap(a, b):\n return a.start < b.end\n" * 30},
{"role": "assistant", "content": "終了時刻の比較が抜けています。テストを実行します。"},
{"role": "tool", "name": "run_tests", "content": "FAILED test_overlap.py::test_adjacent - AssertionError\n" * 10},
{"role": "assistant", "content": "修正しました。もう一度テストを実行します。"},
{"role": "tool", "name": "run_tests", "content": "12 passed in 0.31s"},
]
trimmed = clear_old_tool_results(messages)
print(f"置き換え前: {len(messages)} 件 / {total_chars(messages)} 文字")
print(f"置き換え後: {len(trimmed)} 件 / {total_chars(trimmed)} 文字")
for m in trimmed:
label = m["role"] + (f"({m['name']})" if "name" in m else "")
text = m["content"].replace("\n", " ")
print(f"- {label}: {text[:36]}{'…' if len(text) > 36 else ''}")
実行結果(Python 3.11.15)です。
置き換え前: 10 件 / 3256 文字
置き換え後: 10 件 / 780 文字
- system: あなたは備品予約システムの開発を手伝うアシスタントです。
- user: 予約の重なりを調べる処理がどこにあるか探して、直してください。
- assistant: まず関係するファイルを探します。
- tool(search_files): [以前のツール結果は省略しました。必要なら同じツールで取り直してください…
- assistant: overlap.py を読みます。
- tool(read_file): [以前のツール結果は省略しました。必要なら同じツールで取り直してください…
- assistant: 終了時刻の比較が抜けています。テストを実行します。
- tool(run_tests): FAILED test_overlap.py::test_adjacen…
- assistant: 修正しました。もう一度テストを実行します。
- tool(run_tests): 12 passed in 0.31s
メッセージの件数は 10 件のままで、文字数は 3,256 から 780 になりました。消すのではなく目印に置き換えているのは、「ここでツールを使った」という流れを残し、必要なら取り直せると伝えるためです。
製品に用意されている機能(公式ドキュメントで確認できたもの)
Claude Code
| やりたいこと | 機能 | ドキュメントの記載 |
|---|---|---|
| 関係のない作業に移る前に枠を空にする | /clear |
関係のない作業の間でコンテキストをリセットする |
| 会話を要約して続ける | /compact <指示> |
例:/compact Focus on the API changes のように、残したい内容を指示できる |
| 会話の一部だけ要約する | /rewind(Esc を2回) |
選んだ位置から先、または手前までを要約できる |
| 履歴に残さず質問する | /btw |
答えは会話履歴に入らない |
| 読み込まれている内容を確かめる | /context |
指示ファイルが読み込まれたかを確認できる |
| 調査を別の枠に分ける | サブエージェント | 別のコンテキスト ウィンドウで動き、要約を返す |
| たまにしか使わない知識を分ける | スキル | 必要なときだけ読み込まれる |
枠の上限に近づくと会話は自動で圧縮され、コードのパターン・ファイルの状態・主な決定が要約に残ると書かれています。同じ問題で2回直しても解決しないときは、/clear して、分かったことを入れた依頼文で始め直すことが勧められています。
Claude の API
| 機能 | 内容 |
|---|---|
| コンテキスト編集(ベータ) | 会話が長くなったとき、以前のツール結果などをサーバー側で消す。ツール結果を消す方式の識別子は clear_tool_uses_20250919 で、既定では入力が 100,000 トークンに達したときに働き、直近 3 回分のツール使用を残す。消した結果は目印の文に置き換わる。利用にはベータ用のヘッダー context-management-2025-06-27 を付ける |
| メモリ ツール | モデルが /memories というディレクトリの下に、ファイルの作成・閲覧・置き換え・挿入・削除・名前変更を依頼できる。識別子は memory_20250818。実際の読み書きは利用者側のアプリケーションが行い、保存先も利用者側で決める |
コンテキスト編集のページには、長い会話の管理はサーバー側のコンパクションを主な方法とし、コンテキスト編集は細かく制御したい場合に使う、という位置づけが書かれています。
確かめて分かったこと
公式の文章を開いて照合し、コードを動かして分かった点です。
- Anthropic の記事は、枠の大きさではなく「入れた量に応じて少しずつ精度が下がる」ことを出発点にしています。 上限まで余裕があっても、入れる量を減らす意味があるという立場です。
- 4つの分類(書き出す・選ぶ・圧縮する・分離する)は LangChain の記事の整理で、Anthropic の記事はこの4語を見出しにしていません。 内容は対応しており、Anthropic 側はコンパクション・構造化されたメモ取り・サブエージェント・必要になった時点での取得という呼び方です。
- 圧縮のプロンプトは「取りこぼしを無くす → 余分を削る」の順で調整すると書かれています。最初から短さを求めない点が、要約の一般的な頼み方と違います。
- サブエージェントが返す要約の目安は 1,000〜2,000 トークンと具体的な数字が出ています。分離の効果は、調べた量と返す量の差で決まります。
- ツール結果の置き換えだけで、例では文字数が約4分の1になりました(3,256 → 780)。履歴の量の多くをツールの出力が占める作業では、会話の文面を削るより先に手を付ける価値があります。
- ツールの説明文は長くする方向の指針です(1つにつき3〜4文以上)。枠を節約するために削るのは説明文ではなく、ツールの数と戻り値の量です。
よくある質問
Q. コンテキストエンジニアリングとは何ですか? A. モデルに渡す情報全体を、限られた枠の中で何を入れ何を捨てるか設計することです。システムプロンプト、ツール定義、検索結果、会話履歴、メモのすべてが対象になります。
Q. プロンプトエンジニアリングとコンテキストエンジニアリングの違いは何ですか? A. プロンプトエンジニアリングは指示の文面を整えること、コンテキストエンジニアリングは指示以外も含めた情報の出し入れを設計することです。単発の質問は前者、長時間・多ステップの作業は後者が効きます。
Q. RAG とコンテキストエンジニアリングの違いは何ですか? A. RAG は外部の資料を検索して枠に入れる手段の1つで、コンテキストエンジニアリングはそれを含む全体の設計です。RAG で取ってきた資料を「どれだけ入れ、いつ外すか」を決めるのがコンテキストエンジニアリングの役割です。
Q. 作業が長くなると指示が守られなくなるときはどうしますか? A. 常に読み込む指示を短くし、会話を区切って要約から始め直します。関係のない作業が混ざっているなら、作業ごとに会話を分けます。
Q. コンテキスト ウィンドウが大きいモデルなら、設計は要りませんか? A. 要ります。Anthropic の記事は、トークンが増えるほど情報を正確に取り出す力が少しずつ下がると説明しており、枠に入るかどうかとは別に、入れる量を選ぶ意味があります。
まとめ
- コンテキストエンジニアリングは、モデルに渡す情報全体の「入れる・捨てる」を設計すること
- 単発の質問は文面の工夫、長時間・多ステップの作業は情報の出し入れの設計で見直す
- 手法は、書き出す・選ぶ・圧縮する・分離するの4つ。長いやり取りは圧縮、区切りのある反復はメモ、並行した調査は分離が向く
- 常に読み込まれるもの(指示ファイル・ツール定義)から小さくする。詳細は参照先に置き、必要になったら読む
- ツールは数と戻り値を絞り、説明文は「いつ使うか・使わないか」まで書く
- 要約して引き継ぐときは、決めたこと・未解決の問題・変更したファイル・コマンドと結果を残す。まず取りこぼしを無くし、そのあとで短くする
- 以前のツール結果は目印に置き換えるだけでも、履歴の量を大きく減らせる
参考・出典
いずれも 2026-10-05 に閲覧しました。
- Anthropic Engineering「Effective context engineering for AI agents」(2025-09-29) https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents
- Anthropic Engineering のエージェント向けツールの書き方に関する記事(2025-09-11) https://www.anthropic.com/engineering/writing-tools-for-agents
- Claude ドキュメント(ツール使用の実装) https://platform.claude.com/docs/en/agents-and-tools/tool-use/implement-tool-use
- Claude ドキュメント(コンテキスト編集) https://platform.claude.com/docs/en/build-with-claude/context-editing
- Claude ドキュメント(メモリ ツール) https://platform.claude.com/docs/en/agents-and-tools/tool-use/memory-tool
- Claude Code ドキュメント「Best practices for Claude Code」 https://code.claude.com/docs/en/best-practices
- LangChain Blog「Context Engineering for Agents」(2025-07-02) https://www.langchain.com/blog/context-engineering-for-agents
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「コンテキストエンジニアリングとは プロンプトとの違いと設計方法」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。