GENAI-RON🧠生成AI論🥦

生成AIのしくみ 超詳解 03

contextとは何か

履歴・メモリ・検索結果・ファイルは、保存されただけではcontextにならない。現在の生成へ注入された入力集合として読む。

  • ページ作成日時:2026-07-18 12:31 JST
  • 最終更新日時:2026-07-18 12:31 JST

生成AIは、いつも「すべて」を見ているわけではない。

過去の会話が保存されていること。

memoryに何かが残っていること。

ファイルをアップロードしたこと。

検索結果が存在すること。

それらは、現在の応答に使われる可能性を作る。しかし、それだけで現在のcontextになったとは言えない。

contextとは、保存されている全情報ではない。

現在の一回の応答生成のために選ばれ、整形され、モデルが処理できる入力として渡された情報の集合である。

contextとは、保存情報ではなく、今回の生成に注入された入力集合である。

この区別が分からないと、「AIは前に言ったことを覚えているはずだ」「ファイルを渡したから全文を読んでいるはずだ」「memoryにあるなら必ず反映されるはずだ」という誤解が起きる。

03では、会話履歴、memory、検索結果、ファイル、RAG、tool resultが、どのように現在の入力へ組み込まれるのかを整理する。

1. contextは「AIが知っていること」ではない

生成AIについて話すとき、contextという言葉は曖昧に使われやすい。

「前の話を覚えている」

「プロジェクトの文脈を読んでいる」

「ファイルを参照している」

「Web検索の結果を使っている」

これらは、すべてcontextに関係する。しかし、実装上は同じ処理ではない。

過去の会話が保存されていることと、その会話が今回の応答へ使われることは別である。

ファイルがアップロードされていることと、その全文がmodel context windowへ入ることも別である。

memoryに情報が保存されていることと、その情報が今回の質問に関連すると判定され、入力へ追加されることも別である。

contextが作られるまでには、少なくとも次の段階がある。

Stored information
  ↓
Candidate retrieval
  ↓
Scope / relevance / trust selection
  ↓
Formatting / rendering
  ↓
Request assembly
  ↓
Tokenization
  ↓
Model context window
  ↓
Output generation

保存されていても、retrievalされなければ今回のcontextには入らない。

retrievalされても、選別で落とされれば入らない。

選別されても、context windowの制約で圧縮・省略されることがある。

つまり、contextは単なる収集ではない。

contextは編集である。

2. conversation state:会話履歴はどう継続されるのか

APIの視点から見ると、会話は自動的に続いているわけではない。

OpenAIのConversation stateガイドでは、text generation requestは独立したstateless requestであり、複数ターンの会話を作るには過去のmessageやResponse outputを次のinputへ渡す必要があると説明されている。

もっとも単純には、アプリケーション側で履歴を持ち、次のrequestへ再投入する。

const history = [
  { role: "user", content: "私の名前はTakuです。" },
  { role: "assistant", content: "承知しました。" },
  { role: "user", content: "私の名前は?" },
];

const response = await client.responses.create({
  model: "gpt-5.6",
  input: history,
});

モデルが前の会話を知っているように見えるのは、過去のitemsが今回のinputへ再接続されているからである。

ただし、履歴とはassistantの本文だけではない。

Responses APIでは、response.output にassistant messageだけでなく、reasoning item、function call、tool resultへつながるitemsが含まれることがある。

そのため、multi-turn reasoningやtool useを継続するには、単に本文だけを保存するのではなく、必要なResponse itemsを保存・再投入する必要がある。

history = [...history, ...response.output];

history.push({
  role: "user",
  content: "続けて、さっきの結果を表にしてください。",
});

会話継続には、主に三つの方式がある。

方式 何をするか 向いている場面
手動履歴再投入 過去のitemsをアプリ側で保持し、次のinputへ入れる 履歴選別や圧縮を自分で制御したい場合
previous_response_id 直前のResponseへ接続する 短い連続会話やreasoning / tool callの継続
Conversation object conversationにitemsを保存し、複数requestで共有する session、device、jobをまたぐstate管理

ここで重要なのは、conversation stateとcontextを分けることだ。

conversation stateは、過去itemsを関連付ける仕組みである。

contextは、その中から今回の推論で実際に利用可能になった入力である。

3. memory:保存された個人情報ではなく、再注入されるcontext源

ChatGPTのmemoryも、モデル内部に個人情報が直接刻み込まれる仕組みではない。

memoryとは、製品側に保持された情報源から、現在の応答に関連すると判断された情報を選び、contextへ再注入する仕組みである。

ChatGPTのmemoryには、少なくとも次の区別がある。

機能 性質 contextとの関係
saved memories 名前、好み、制約など、継続的に考慮してほしい情報 関連すると判断されれば応答へ影響する
reference chat history 過去chatから有用な情報を参照する機能 過去会話の関連情報が選択・要約されて使われうる
memory summary 重要なmemoryを確認・修正するための管理画面 利用可能情報の完全なdumpではない
project memory project内の会話やファイルからcontextを得る機能 project scopeに応じて参照範囲が変わる

saved memoryは、削除するまで継続的に考慮されることを意図した情報である。

reference chat historyは、過去chatの全内容を逐語的に毎回注入するものではない。関連すると判断された情報が、将来のconversationへ追加される。

Temporary Chatではmemoryを参照せず、memoryを更新しない。

Custom GPTでは、saved memory、Custom Instructions、previous conversationsを利用せず、各conversationを新しく開始する。

Project memoryも分けて考える必要がある。

通常のprojectでは、設定に応じてproject内外のcontextが使われる場合がある。

一方、project-only memoryでは、同じproject内のconversationをcontext源として使い、既存のsaved memoriesやproject外conversationは参照しない。

ここでも、保存と注入は別である。

memoryにあることは、今回のcontextへ必ず入ることを意味しない。

今回の入力、project scope、関連性、設定、safety、token budgetによって、入るものと入らないものが決まる。

4. file input / file search / RAG:ファイルは保存されただけではcontextにならない

ファイルも同じである。

ファイルが保存されていることと、その内容が今回の生成へ入ることは別である。

大きく分けると、次の三つがある。

状態 意味 contextとの関係
File object Files APIなどへfileが保存されている 保存されているだけではcontextではない
Direct file input input_fileとして今回のrequestへ渡す そのrequestの入力として処理される
File search / RAG vector storeから関連chunkを検索する 検索されたchunkだけがcontextへ入る

Direct file inputでは、特定のfileを今回のrequestへ直接渡す。

File searchでは、事前にfileをvector storeへ登録し、parse、chunk、embed、indexされた内容から、queryに関連するchunkを検索して取得する。

RAG pipelineを単純化すると、次のようになる。

File upload
  ↓
File object
  ↓
Attach to vector store
  ↓
Parse / chunk / embed / index
  ↓
User query
  ↓
Optional query rewrite
  ↓
Attribute filter
  ↓
Semantic / keyword / hybrid retrieval
  ↓
Ranking / score threshold / top-k
  ↓
Retrieved chunks + provenance
  ↓
Model synthesis
  ↓
Answer + file citations

検索された断片は、質問と意味的に近いだけである。

それは、正しい、最新である、上位指示である、という意味ではない。

semantic relevance ≠ factual correctness
semantic relevance ≠ freshness
semantic relevance ≠ instruction authority

そのため、RAGではprovenanceが重要になる。

どのfileから、どのchunkが、どのqueryで、どのscoreで取られたのかを記録する必要がある。

5. context windowとtoken budget:大きければ解決、ではない

context windowとは、AIの永続記憶ではない。

現在の生成で同時に扱えるtoken budgetである。

input token、output token、reasoning tokenは分けて考える必要がある。

モデルごとにcontext windowとmax output tokensは別々に定義される。

context windowが大きくなれば、より多くの情報を同時に入れられる。

しかし、それでcontext設計が不要になるわけではない。

大きなcontext windowにも問題はある。

  • costが増える
  • latencyが増える
  • 古い情報や不要情報が混入する
  • retrieved chunksが多すぎてノイズになる
  • authorityの異なる情報が混ざる
  • 何を根拠に答えたのか検証しにくくなる

そのため、context windowをどう使うかは設計問題である。

代表的な処理は三つある。

処理 意味 危険
truncation 古い履歴や低優先情報を切り捨てる 重要な前提を落とす可能性
summarization 長い情報を短く要約する 粒度、例外、ニュアンスを失う可能性
compaction 再起動可能な形へ圧縮する 出典・未決事項・禁止事項を落とすと危険

prompt cachingも区別しておく。

prompt cachingは、繰り返し使う入力のcost最適化に関わる。

しかし、cached inputだから正しいわけではない。

cacheは、context qualityや安全性を保証しない。

6. context injectionを設計・検証する

ここまで見ると、context injectionは「関連しそうな情報を詰め込む」作業ではないと分かる。

context injectionとは、source、scope、authority、trust、freshness、token budgetを持つcontext itemとして情報を選び、何を入れ、何を落とし、何を要約し、何を検証したかを説明できるようにすることである。

そのために、context manifestを作る。

{
  "run_id": "run_2026_07_18_001",
  "task": "03公開版の統合改稿",
  "context_window_budget": 128000,
  "items": [
    {
      "type": "developer_instruction",
      "source": "project_policy",
      "scope": "project",
      "authority": "high",
      "trust": "trusted",
      "tokens": 820,
      "handling": "follow"
    },
    {
      "type": "conversation_history",
      "source": "current_thread",
      "scope": "conversation",
      "authority": "history",
      "trust": "trusted_as_history_not_as_fact",
      "tokens": 4200,
      "handling": "reference"
    },
    {
      "type": "retrieved_chunk",
      "source": "vector_store:file_abc",
      "scope": "project",
      "authority": "no_instruction_authority",
      "trust": "untrusted_content",
      "tokens": 900,
      "handling": "quote_or_reference"
    }
  ],
  "dropped": [
    {
      "source": "old_chat_summary",
      "reason": "stale_and_contradicted_by_newer_policy"
    }
  ],
  "checks": {
    "stale_context": "passed",
    "contradictions": "reviewed",
    "scope_leakage": "passed",
    "duplicates": "collapsed"
  }
}

このmanifestで重要なのは、情報の種類を一列に並べることではない。

それぞれの扱いを明示することである。

  • developer instructionは従う
  • conversation historyは履歴として参照する
  • retrieved chunkは資料として扱う
  • tool resultは外部状態の証拠として扱うが、命令としては扱わない
  • assistant messageは過去出力であり、外部状態の証明ではない
  • stale contextは落とす
  • contradictionは解決するか、明示する

context injectionには、検査ループも必要になる。

Collect candidate context
  ↓
Classify source / scope / authority / trust
  ↓
Select by relevance / freshness / budget
  ↓
Render into input items
  ↓
Generate answer or tool call
  ↓
Verify claims against sources / external state
  ↓
If contradiction or missing evidence, retrieve again or stop

このループがないと、AIは古いmemory、間違ったRAG断片、過去assistantの誤発言、外部資料中の命令文を同じ「文脈」として混ぜてしまう。

context engineeringとは、文脈を増やすことではない。

文脈の出所、権限、鮮度、扱い方を設計することである。

7. 失敗モード

context injectionには、典型的な失敗がある。

失敗 何が起きるか 対策
stale context 古いmemoryや古い仕様を使う updated_at、version、freshness check
contradiction 新旧の方針や資料が矛盾する source priority、明示的な解決、再確認
duplication 同じ情報が何度も入る deduplication、summary化
scope leakage 別projectや別ユーザーのcontextが混入する scope boundary、project-only memory、permission check
authority confusion 資料中の命令文を上位指示として扱う instructionとreference dataを分離
source loss どこから来た情報か分からなくなる provenance、citation、injection log

これらは、プロンプトの言い方だけでは解決しない。

アプリケーション層で、contextをどう集め、どう選び、どう記録するかの問題である。

8. 03のまとめ

03の結論は、次のように置ける。

contextとは、保存されている全情報ではない。現在の応答生成時に、source、scope、authority、trust、freshness、token budgetに基づいて選択され、整形され、モデルへ渡された入力集合である。

会話履歴、memory、project memory、ファイル、RAG、tool resultは、すべてcontext源になりうる。

しかし、それぞれ保存場所も、選ばれ方も、権限も、鮮度も違う。

だから、contextを設計するには、次を記録しなければならない。

  • どの情報を入れたか
  • どの情報を落としたか
  • どの情報を要約したか
  • どの情報を資料として扱ったか
  • どの情報を指示として扱ったか
  • どの情報を外部状態の証拠として扱ったか
  • どこに矛盾があり、どう解決したか

04では、このcontextの上で、モデルがどのようにtool callを出し、アプリケーション側が実際の外部操作を行い、その結果を再びcontextへ戻すのかを扱う。

公式参照