@@ -4,30 +4,47 @@ search:
44---
55# コンテキスト管理
66
7- コンテキストは多義的な用語です。気にするべきコンテキストには主に 2 つの種類があります 。
7+ コンテキストは多義的な用語です。主に、関心を持つ可能性があるコンテキストには 2 つのクラスがあります 。
88
9- 1 . コード側でローカルに利用できるコンテキスト: ツール関数の実行時、 ` on_handoff ` のようなコールバック、ライフサイクルフックなどで必要になり得るデータや依存関係です 。
10- 2 . LLM が利用できるコンテキスト: LLM が応答を生成する際に目にするデータです 。
9+ 1 . コードでローカルに利用可能なコンテキスト: これは、関数ツールの実行時、 ` on_handoff ` のようなコールバック時、ライフサイクルフック時などに必要になる可能性があるデータや依存関係です 。
10+ 2 . LLM から利用可能なコンテキスト: これは、 LLM がレスポンス生成時に参照するデータです 。
1111
1212## ローカルコンテキスト
1313
14- これは [ ` RunContextWrapper ` ] [ agents.run_context.RunContextWrapper ] クラスと、その中の [ ` context ` ] [ agents.run_context.RunContextWrapper.context ] プロパティで表現されます。仕組みは次のとおりです。
14+ これは [ ` RunContextWrapper ` ] [ agents.run_context.RunContextWrapper ] クラスと、その内部の [ ` context ` ] [ agents.run_context.RunContextWrapper.context ] プロパティで表現されます。仕組みは次のとおりです。
1515
16- 1 . 任意の Python オブジェクトを作成します。一般的なパターンは、 dataclass または Pydantic オブジェクトを使うことです。
16+ 1 . 任意の Python オブジェクトを作成します。一般的なパターンは dataclass または Pydantic オブジェクトを使うことです。
17172 . そのオブジェクトを各種 run メソッドに渡します(例: ` Runner.run(..., context=whatever) ` )。
18- 3 . すべてのツール呼び出しやライフサイクルフックなどには、ラッパーオブジェクト ` RunContextWrapper[T] ` が渡されます 。ここで ` T ` はコンテキストオブジェクトの型を表し、` wrapper.context ` でアクセスできます。
18+ 3 . すべてのツール呼び出し、ライフサイクルフックなどには ` RunContextWrapper[T] ` というラッパーオブジェクトが渡されます 。ここで ` T ` はコンテキストオブジェクトの型を表し、` wrapper.context ` でアクセスできます。
1919
20- ** 最も重要** な注意点は、あるエージェント実行におけるすべてのエージェント、ツール関数、ライフサイクルなどが、 同じコンテキストの _ 型_ を使わなければならないことです 。
20+ 認識しておくべき ** 最も重要** な点: あるエージェント実行に対するすべてのエージェント、関数ツール、ライフサイクルなどは、 同じコンテキストの _ 型_ を使う必要があります 。
2121
2222コンテキストは次のような用途に使えます。
2323
24- - 実行に関するコンテキストデータ (例: ユーザー名 / uid や、ユーザーに関するその他の情報など )
24+ - 実行のためのコンテキストデータ (例: username / uid やユーザーに関するその他情報 )
2525- 依存関係(例: logger オブジェクト、データフェッチャーなど)
2626- ヘルパー関数
2727
28- !!! danger "Note "
28+ !!! danger "注意 "
2929
30- コンテキストオブジェクトは LLM に送信され **ません**。これは純粋にローカルなオブジェクトであり、読み取り、書き込み、メソッド呼び出しができます。
30+ コンテキストオブジェクトは LLM に **送信されません**。これは純粋にローカルオブジェクトであり、読み取り、書き込み、メソッド呼び出しを行えます。
31+
32+ 単一の実行内では、派生ラッパーは同じ基盤の app context、承認状態、使用量トラッキングを共有します。ネストされた [ ` Agent.as_tool() ` ] [ agents.agent.Agent.as_tool ] 実行では別の ` tool_input ` が付与される場合がありますが、デフォルトでは app 状態の分離コピーは取得しません。
33+
34+ ### ` RunContextWrapper ` の公開内容
35+
36+ [ ` RunContextWrapper ` ] [ agents.run_context.RunContextWrapper ] は、アプリで定義したコンテキストオブジェクトのラッパーです。実際には、最もよく使うのは次です。
37+
38+ - 独自の可変 app 状態と依存関係のための [ ` wrapper.context ` ] [ agents.run_context.RunContextWrapper.context ] 。
39+ - 現在の実行全体で集計されたリクエストとトークン使用量のための [ ` wrapper.usage ` ] [ agents.run_context.RunContextWrapper.usage ] 。
40+ - 現在の実行が [ ` Agent.as_tool() ` ] [ agents.agent.Agent.as_tool ] 内で動いているときの構造化入力のための [ ` wrapper.tool_input ` ] [ agents.run_context.RunContextWrapper.tool_input ] 。
41+ - 承認状態をプログラムで更新する必要があるときの [ ` wrapper.approve_tool(...) ` ] [ agents.run_context.RunContextWrapper.approve_tool ] / [ ` wrapper.reject_tool(...) ` ] [ agents.run_context.RunContextWrapper.reject_tool ] 。
42+
43+ ` wrapper.context ` だけがアプリ定義のオブジェクトです。他のフィールドは SDK が管理するランタイムメタデータです。
44+
45+ 後で human-in-the-loop や耐久ジョブワークフロー向けに [ ` RunState ` ] [ agents.run_state.RunState ] をシリアライズする場合、そのランタイムメタデータは状態とともに保存されます。シリアライズ状態を永続化または送信する予定がある場合は、[ ` RunContextWrapper.context ` ] [ agents.run_context.RunContextWrapper.context ] に秘密情報を入れないでください。
46+
47+ 会話状態は別の関心事項です。ターンをどう引き継ぐかに応じて、` result.to_input_list() ` 、` session ` 、` conversation_id ` 、` previous_response_id ` を使い分けてください。この判断については [ results] ( results.md ) 、[ running agents] ( running_agents.md ) 、[ sessions] ( sessions/index.md ) を参照してください。
3148
3249``` python
3350import asyncio
@@ -66,18 +83,18 @@ if __name__ == "__main__":
6683 asyncio.run(main())
6784```
6885
69- 1 . これはコンテキストオブジェクトです。ここでは dataclass を使っていますが、任意の型を使えます 。
70- 2 . これはツールです。` RunContextWrapper[UserInfo] ` を受け取っていることが分かります。ツール実装はコンテキストから読み取ります 。
71- 3 . 型チェッカーがエラーを検出できるように、エージェントをジェネリック ` UserInfo ` としてマークします(例: 異なるコンテキスト型を受け取るツールを渡そうとした場合)。
86+ 1 . これはコンテキストオブジェクトです。ここでは dataclass を使用していますが、任意の型を使用できます 。
87+ 2 . これはツールです。` RunContextWrapper[UserInfo] ` を受け取ることがわかります。ツール実装はコンテキストを読み取ります 。
88+ 3 . 型チェッカーがエラーを検出できるように、エージェントにジェネリック ` UserInfo ` を付けます(たとえば、 異なるコンテキスト型を受け取るツールを渡そうとした場合)。
72894 . コンテキストは ` run ` 関数に渡されます。
73905 . エージェントは正しくツールを呼び出し、年齢を取得します。
7491
7592---
7693
77- ### 上級 : ` ToolContext `
94+ ### 発展 : ` ToolContext `
7895
7996場合によっては、実行中のツールに関する追加メタデータ(名前、call ID、raw 引数文字列など)にアクセスしたいことがあります。
80- その場合は 、` RunContextWrapper ` を拡張する [ ` ToolContext ` ] [ agents.tool_context.ToolContext ] クラスを使えます 。
97+ そのために 、` RunContextWrapper ` を拡張した [ ` ToolContext ` ] [ agents.tool_context.ToolContext ] クラスを使用できます 。
8198
8299``` python
83100from typing import Annotated
@@ -110,18 +127,18 @@ agent = Agent(
110127
111128- ` tool_name ` – 呼び出されるツールの名前
112129- ` tool_call_id ` – このツール呼び出しの一意識別子
113- - ` tool_arguments ` – ツールに渡された raw 引数文字列
130+ - ` tool_arguments ` – ツールに渡された raw 引数字符串
114131
115132実行中にツールレベルのメタデータが必要な場合は ` ToolContext ` を使用してください。
116- エージェントとツール間での一般的なコンテキスト共有には 、` RunContextWrapper ` で十分です。
133+ エージェントとツール間の一般的なコンテキスト共有には 、` RunContextWrapper ` で十分です。 ` ToolContext ` は ` RunContextWrapper ` を拡張しているため、ネストされた ` Agent.as_tool() ` 実行で構造化入力が渡された場合は ` .tool_input ` も公開できます 。
117134
118135---
119136
120- ## エージェント / LLM コンテキスト
137+ ## Agent/ LLM コンテキスト
121138
122- LLM が呼び出されるとき、LLM が見られるデータは会話履歴のもの ** だけ ** です。つまり、新しいデータを LLM から利用できるようにしたい場合は、それが履歴内で利用可能になる方法で行う必要があります 。方法はいくつかあります。
139+ LLM が呼び出されるとき、参照できるデータは会話履歴にあるもの ** のみ ** です。つまり、新しいデータを LLM で利用可能にしたい場合は、その履歴で利用可能になる形で渡す必要があります 。方法はいくつかあります。
123140
124- 1 . Agent の ` instructions ` に追加します。これは「system prompt」や「 developer message」 とも呼ばれます。システムプロンプトは静的な文字列にすることも、コンテキストを受け取って文字列を出力する動的な関数にすることもできます 。これは、常に有用な情報(例: ユーザーの名前や現在日付など)に対してよく使われる戦術です 。
125- 2 . ` Runner.run ` 関数を呼び出す際に ` input ` に追加します。これは ` instructions ` の戦術に似ていますが 、[ chain of command] ( https://cdn.openai.com/spec/model-spec-2024-05-08.html#follow-the-chain-of-command ) の中でより下位のメッセージを持てます。
126- 3 . 関数ツールとして公開します 。これは _ オンデマンド_ なコンテキストに有用です。つまり、 LLM がいつデータが必要かを判断し、そのデータを取得するためにツールを呼び出せます 。
127- 4 . 検索や Web 検索を使います 。これらは、ファイルやデータベース(検索)や Web(Web 検索)から関連データを取得できる特殊なツールです 。これは、関連するコンテキストデータに基づいて応答を 「グラウンディング」するのに有用です。
141+ 1 . Agent の ` instructions ` に追加します。これは "システムプロンプト" または " developer message" とも呼ばれます。システムプロンプトは静的な文字列にも、コンテキストを受け取って文字列を出力する動的関数にもできます 。これは、常に有用な情報(たとえばユーザー名や現在日付)でよく使われる手法です 。
142+ 2 . ` Runner.run ` 関数を呼ぶ際に ` input ` に追加します。これは ` instructions ` の手法に近いですが 、[ chain of command] ( https://cdn.openai.com/spec/model-spec-2024-05-08.html#follow-the-chain-of-command ) の中でより下位のメッセージを持てます。
143+ 3 . 関数ツール経由で公開します 。これは _ オンデマンド_ なコンテキストに有用です。LLM がデータを必要とするタイミングを判断し、そのデータ取得のためにツールを呼び出せます 。
144+ 4 . retrieval または Web 検索を使用します 。これらは、ファイルやデータベース(retrieval)または Web(web search)から関連データを取得できる特別なツールです 。これは、関連するコンテキストデータでレスポンスを 「グラウンディング」するのに有用です。
0 commit comments