登録して招待リンクを共有すると、動画再生報酬と紹介報酬を獲得できます。

検索結果 LLMAgents
LLMAgents コミュニティ
1つのキーワードが1つのコミュニティです。
コミュニティ作成
アカウント
見つかりません
LLMAgents を含む検索結果
ターミナルエージェントの訓練データ、実は「指示・環境・解答・検証器」がバラバラで解けないタスクが量産されがち——その根本を絶つ合成フレームワークが登場しました。 タイトル: FACET: Preserving Source Intent and Executable State in Terminal Task Synthesis URL: 📌 概要 関連スキルを情報豊かなシナリオへ再構成し、環境を先に構築してその実行状態を共有の土台に。指示・解答・検証器を同じ状態に接地して生成します。 🧩 解決する課題 ・多段生成で元素材の依存や中間状態が失われる ・指示/環境/解答/検証器が食い違い、解けない・評価できないタスクになる ⚙️ 提案手法 ・7万件超のスキルを収集し5次元シナリオへ再構成 ・Dockerで環境をビルドし実状態を共有チャネルに ・指示→解答→検証器を順次生成し、失敗箇所だけをルーターが特定して修復 📊 実験結果 ・平均22.77テスト/タスクの検証済み6,078件を合成 ・Qwen3.5を微調整し4B +40.5%、9B +30.1%、27B +16.5% ・27B(47.57)が約15倍大の397B(49.06)に肉薄 ・エンドツーエンド歩留まり70%で競合の15〜28%を圧倒 質の高い実行可能タスクは、量産ではなく丁寧な状態接地から生まれる、と示す一本です。 #LLMAgents# #TerminalBench#
もっと見る
LLMエージェントの「検索」を「推論」から切り離すと、精度はほぼ維持したまま検索コストを最大98%削減できました🔌 タイトル: Decoupling Search from Reasoning: A Vendor-Agnostic Grounding Architecture for LLM Agents URL: 🔌 概要 検索による根拠づけ(grounding)を、言語モデルの推論から切り離す手法DSGの提案です。Model Context Protocol(MCP)に準拠した独立ゲートウェイとして動作し、ベンダー非依存の中間層として機能します。 ❓ 解決する課題 本番のLLMエージェントでは、リアルタイム検索がモデルプロバイダーに密結合しています。 ・システムの検査・再構成・転用・移行が難しい ・検索が「Search-Induced Verbosity(検索起因の冗長化)」を招き、厳格な出力要件に違反することがある 検索と推論の一体化が、柔軟性とコストのボトルネックでした。 💡 方法論と提案手法 根拠づけを「モデルの中」ではなく「検索と生成の境界」に置きます。これまでモデルに埋め込まれていた要素を制御可能な第一級機能として公開します。 ・プロバイダールーティング(検索先の選択・切り替え) ・ソースを意識したコンテキストレンダリング ・設定可能なフォールバック機構 ・検索深度の管理 ・厳密キャッシュとセマンティックキャッシュの両方 📊 実験結果 ・SimpleQA:精度86.1%(ネイティブ検索87.7%)を保ちつつ検索コストを91%削減 ・キャッシュのウォームヒット率99.4%、レイテンシ68%削減 ・本番Eコマース:ネイティブ同等の精度で検索コストを98%以上削減 ・一方、新しさが重要なFreshQAではネイティブ検索が優位 #LLMエージェント# #検索#
もっと見る
🧠 「記憶は検索されるのではなく、再構成される」——LLMエージェントのメモリを、一度きりの検索から推論しながら掘り進む方式に作り変えた研究がICML 2026に採択されました。 タイトル: Memory is Reconstructed, Not Retrieved: Graph Memory for LLM Agents URL: 🧠 概要 提案手法MRAgentは、連想記憶グラフと「能動的再構成メカニズム」を組み合わせたLLMエージェントのメモリ手法です。LLMの推論をメモリアクセスそのものに組み込み、推論中に見えてきた証拠をもとに検索パスを反復的に探索していきます。 ❓ 解決する課題 既存のメモリ拡張エージェントの多くは「まず検索→次に推論」という固定パイプラインでした。 ・最初のクエリだけで一度きりに取り出すため、推論の途中で重要だと分かった手がかりを使い直せない ・長い対話履歴から多段で証拠をたどる質問に弱い 💡 方法論と提案手法 メモリをCue(手がかり)・Tag(意味的な橋渡し)・Content(内容)の3種ノードを持つグラフで表現します。 ・まず関連するTagを選び、次にCueとTagの両方を条件にContentを取得する2段階検索 ・「どの方向に探すか」と「何を取り出すか」を分離し、組合せ爆発を回避 ・推論中の状態を保持し、新たな手がかり(例:「7月」という時間軸)を発見して未到達の証拠まで辿れる 🎯 ユースケース 長期記憶が必要な対話エージェントや、複数セッションをまたいで事実を組み合わせるアシスタントに有効です。十分な証拠が集まったとLLM自身が判断して探索を打ち切るため、無駄な検索も抑えられます。 📊 実験結果 ・LoCoMoでGeminiのスコアが68.31%→84.21%(相対+23.3%)、Claudeで75.88%→90.19% ・LongMemEvalで53.01%→72.95%(相対+37.6%)。マルチホップや時間推論で特に強い ・トークン消費は118kとベースライン(245k〜3,268k)より大幅に少なく、性能と低コストを両立 #LLMエージェント# #メモリ#
もっと見る
🧠 AIエージェントの「記憶」は、経験を保存する瞬間ではなく、思い出す瞬間にこそ整理すべきなのかもしれません。 タイトル: Just-in-Time Memory: Learning to Curate Task-Adaptive Memory for LLM Agents (JitMem) URL: ❓ JitMemの基本アイデアは何ですか? 従来のエージェント記憶は、タスク完了時(書き込み時)に経験を要約して保存します。JitMemはこれをやめ、生の軌跡をそのまま保存しておき、新しいタスクが来た「読み込み時」に、そのタスク専用の要約をその場で作ります。 ❓ なぜ書き込み時の要約では不十分なのですか? 将来どんなタスクに必要か分からない段階で情報を取捨選択するため、大事な情報が失われがちです。しかも同じ経験でも役立つ教訓はタスクによって違うのに、書き込み時には汎用的な要約しか作れません。 ❓ 学習はどう行うのですか? 現在のタスクと過去の軌跡から要約を作る「キュレーター」を、実行エージェントがその要約を使って得た成功報酬だけで直接学習させます。将来のクエリを待つ必要がなく、シンプルに最適化できます。 ❓ 効果はどれくらいですか? ALFWorld・WebShop・τ²-benchの3環境で、最強のベースラインを16.2・16.3・3.9ポイント上回りました。学習前でも十分に強く、読み込み時に要約するという発想自体が効果の大きな要因だと分かります。 #AIエージェント# #メモリ管理#
もっと見る
# ADK 2.0の便利だけど知られていない機能 🌍 実行中のエージェントを途中で安全にキャンセルし、それまでの処理結果は保持できたら理想的だと思いませんか? ADK 2.0のキャンセル機能は、AbortController/AbortSignalを使ってエージェントの実行をグレースフルに中断する仕組みです。キャンセルシグナルはRunner、LlmAgent、Models、Toolsへと伝播し、コミット済みのイベントは保持されます。 📌 タイトル:エージェント実行のキャンセル 🔗 URL: 🧩 概要 エージェント実行のキャンセルは、AbortControllerとAbortSignalのパターンで実現されます。AbortControllerからシグナルを発行すると、Runner→LlmAgent→Models→Toolsの順にキャンセルが伝播します。重要な点として、キャンセル時点ですでにコミットされたイベントは保持され、例外をスローせずグレースフルに完了します。AbortSignal.timeout()を使えばタイムアウトベースの自動キャンセルも可能で、AbortSignal.any()で複数のシグナルを組み合わせることもできます。 🛠 使い方 AbortControllerを作成し、そのシグナルをRunnerに渡します。 ```python from adk import App, AbortController, AbortSignal app = App(agent=my_agent) # 手動キャンセル controller = AbortController() task = "long task", signal=controller.signal) # 必要なタイミングでキャンセル controller.abort() # タイムアウトベースの自動キャンセル(2秒) signal = AbortSignal.timeout(2000) result = await "time-limited task", signal=signal) # 複数シグナルの組み合わせ combined = AbortSignal.any([ AbortSignal.timeout(5000), user_cancel_signal ]) result = await "task", signal=combined) ``` 🏗 本番システムへの組み込み方 ・ユーザー操作(キャンセルボタン)と連動したAbortControllerを実装し、UIからのキャンセルを可能にする ・AbortSignal.timeout()でAPI呼び出しの最大実行時間を制限し、リソースの無駄遣いを防ぐ ・AbortSignal.any()でユーザーキャンセルとタイムアウトの両方に対応する ・キャンセル後のコミット済みイベントを活用し、部分的な結果を返却する設計にする 💡 ユースケース ⏱ LLM呼び出しにタイムアウトを設定し、応答が遅い場合に自動キャンセル 🖱 ユーザーがUIのキャンセルボタンを押した際にエージェント実行を即座に中断 🔀 複数のエージェントを並列実行し、最初に完了したもの以外をキャンセル 💰 コスト上限に達した時点でLLM呼び出しを打ち切る ⚠️ 注意点 キャンセルはグレースフルに完了するため、abort()を呼んだ瞬間に即座に停止するわけではありません。現在実行中のオペレーション(LLM推論やツール実行)が完了するまで若干の遅延が生じる場合があります。また、コミット済みのイベントは保持されるため、キャンセル後の状態が中途半端にならないよう、ワークフロー設計時にキャンセルポイントを意識することを推奨します。ツール内部でシグナルを監視して早期リターンする実装も有効です。 ✨ キャンセル機能により、エージェント実行のライフサイクルを安全にコントロールできます。タイムアウトと組み合わせることで、本番環境での予測可能性が大きく向上します。 #ADK# #AIAgent#
もっと見る
# ADKの便利で実践的な使い方 ## 🎛️ エージェントの振る舞いを自在に制御!ADKのCallbacks機能 LLM呼び出しの前にガードレールをかけたい、ツール実行前にバリデーションしたい…そんな要望、ADKの **Callbacks** なら全部叶います!🔧 ## 📌 タイトル Callbacks(コールバック) ## 🔗 URL ## 🧩 概要 Callbacksは、エージェントの実行フローの重要なポイントにフックを仕掛け、振る舞いを観察・カスタマイズ・制御するための仕組みです。フレームワークのコアを変更することなく、6種類のコールバックで柔軟な制御が可能です。 - **before_agent / after_agent**:エージェント実行の前後 - **before_model / after_model**:LLM呼び出しの前後 - **before_tool / after_tool**:ツール実行の前後 最大のポイントは **戻り値によるフロー制御**。`None` を返せば通常続行、特定のオブジェクトを返せばその先の処理をスキップできます。 ## 🛠 使い方 **LLM呼び出しをスキップする(入力ガードレール/キャッシュ):** `before_model_callback` を定義し、引数として `CallbackContext` と `LlmRequest` を受け取り、戻り値を `Optional[LlmResponse]` とします。`llm_request.contents[-1].parts[0].text` からユーザーの最後のメッセージを取得し、禁止ワードが含まれていれば `LlmResponse` に `Content(role="model")` と拒否メッセージを詰めて返すことでLLM呼び出しをスキップします。問題なければ `None` を返して通常のLLM呼び出しを続行します。 **ツール実行をスキップする(バリデーション/モック):** `before_tool_callback` を定義し、`context`、`tool`、`args` を受け取ります。戻り値は `Optional[Dict]` です。`validate_args(args)` で引数を検証し、不正であれば `{"error": "引数が不正です"}` という辞書を返してツール実行をスキップします。正常であれば `None` を返して通常実行を続行します。 **エージェント実行をスキップする:** `before_agent_callback` を定義し、`context` を受け取り、戻り値を `Optional[Content]` とします。`is_authorized(context)` で権限チェックを行い、権限がなければ `Content(role="model", parts=[Part(text="権限がありません")])` を返してエージェント実行をスキップします。認可済みであれば `None` を返して通常続行します。 ## 🏗 実践的な使い方 **入力ガードレール + レスポンスキャッシュの組み合わせ:** `smart_before_model` 関数を定義し、`ctx` と `req` を受け取り `Optional[LlmResponse]` を返します。まず Step 1 として `req.contents[-1].parts[0].text` からユーザー入力を取得し、`contains_pii()` で個人情報を検出した場合は拒否メッセージ入りの `LlmResponse` を返してLLM呼び出しをスキップします。次に Step 2 として `hash(user_input)` でキャッシュキーを生成し、`ctx.state.get(f"cache:{cache_key}")` でキャッシュを検索します。キャッシュがあればそのテキストを `LlmResponse` に詰めて返し、なければ `None` を返してLLM呼び出しに進みます。最後に `LlmAgent` を作成する際、`name="SecureAgent"`、`model="gemini-2.0-flash"` を指定し、`before_model_callback=smart_before_model` でこのコールバックを登録します。 ## 💡 ユースケース - 🛡️ **入力ガードレール**:不適切な入力やプロンプトインジェクションをLLM呼び出し前にブロック - 💾 **レスポンスキャッシュ**:同じ質問にはキャッシュから即座に応答しコスト削減 - 🔍 **デバッグ・ログ**:各実行ポイントでリクエスト/レスポンスを記録 - ✅ **ツールバリデーション**:ツール引数の事前検証でエラーを未然に防止 - 🧪 **テスト用モック**:本番ツールの代わりにモックレスポンスを返す ## ⚠️ 注意点 - コールバックは同期的に実行されるため、重い処理(外部API呼び出し等)は避けてください - `before_*` で値を返すと後続処理が完全にスキップされるため、意図しないスキップに注意 - セキュリティガードレールをエージェント横断で適用したい場合は、Callbacksよりも **Plugins** の利用を検討してください - エラーハンドリングは必ず try-except で囲み、コールバックのエラーがエージェント全体をクラッシュさせないようにしましょう ## ✨ まとめ ADKのCallbacksは、エージェントの実行フローに対する「外科手術的な制御」を可能にします。ガードレール、キャッシュ、ログ、バリデーション…あらゆるクロスカッティングな関心事を、コアロジックを汚さずに実装できます。まずは `before_model_callback` から始めてみましょう! #ADK# #AIAgent#
もっと見る
# ADKの便利で実践的な使い方 ## 🧠 長いセッションでもコストを抑える!ADKのContext Compaction機能 エージェントとの長い対話、コンテキストが膨らんでコストもレイテンシも増加していませんか?ADKの **Context Compaction** を使えば、古いイベントを自動要約して常にスリムなコンテキストを維持できます!🎯 ## 📌 タイトル Context Compaction(コンテキスト圧縮) ## 🔗 URL ## 🧩 概要 Context Compactionは、セッション中に蓄積されるワークフローイベントデータを自動的に要約し、処理オーバーヘッドを削減する機能です。スライディングウィンドウ方式で、最新のイベントはそのまま保持しつつ、古いイベントを圧縮することで、コストとレイテンシを最適化します。 `EventsCompactionConfig` を使って、圧縮間隔(`compaction_interval`)とオーバーラップサイズ(`overlap_size`)を設定するだけで有効になります。 ## 🛠 使い方 Appレベルで `EventsCompactionConfig` を設定します。 ` から `App` と `EventsCompactionConfig` をインポートします。`App` の `events_compaction_config` パラメータに `EventsCompactionConfig(compaction_interval=3, overlap_size=1)` を渡すことで、3イベントごとに圧縮が実行され、前回の圧縮から1イベント分を重複保持する設定になります。 TypeScriptでは `TokenBasedContextCompactor` でトークン閾値ベースの圧縮も可能です。 ```typescript const agent = new LlmAgent({ name: 'my-agent', model: 'gemini-flash-latest', contextCompactors: [ new TokenBasedContextCompactor({ tokenThreshold: 1000, eventRetentionSize: 1, summarizer: new LlmSummarizer({ llm: new Gemini({model: 'gemini-flash-latest'}) }) }) ] }); ``` ## 🏗 実践的な使い方 **カスタマーサポートボットでの活用例:** 長時間の問い合わせ対応では、対話履歴が数十ターンに達することがあります。Context Compactionを導入することで: 1. **コスト削減**:古い対話内容を自動要約し、毎回のLLM呼び出しで送信するトークン数を大幅に削減 2. **レスポンス改善**:コンテキストが小さくなることで、LLMの応答速度が向上 3. **精度維持**:直近のやり取りはそのまま保持するため、文脈を失わずに対話を継続 `compaction_interval=5, overlap_size=2` のような設定で、5ターンごとに圧縮しつつ、直前2ターン分の文脈を次の圧縮に引き継げます。 **カスタムサマライザーの活用:** デフォルトの要約モデルではなく、ドメイン特化の要約プロンプトを使うことで、業務固有の重要情報(注文番号、顧客IDなど)を確実に保持できます。 ## 💡 ユースケース - 📞 **カスタマーサポート**:長時間の問い合わせ対話でコンテキスト爆発を防止 - 📝 **ドキュメント作成支援**:長い執筆セッションで過去の議論を要約しつつ最新の方針を保持 - 🔍 **データ分析エージェント**:多段階の分析プロセスで中間結果を圧縮 - 🎮 **ゲームNPC**:長時間のプレイセッションで過去のイベントを要約して記憶 ## ⚠️ 注意点 - 圧縮は不可逆です。要約された情報の細部は失われる可能性があります - `overlap_size` が小さすぎると文脈の断絶が起きやすくなります - カスタムサマライザーを使う場合、要約モデル自体のコストも考慮が必要です - 圧縮間隔が短すぎると、頻繁な要約処理でオーバーヘッドが増加します ## ✨ まとめ Context Compactionは「長いセッション=高コスト」という常識を覆す機能です。設定一つで古いイベントを自動要約し、最新の文脈を保ちながらコストとレイテンシを最適化できます。長時間対話が発生するエージェントには、ぜひ導入を検討してみてください! #ADK# #AIAgent#
もっと見る
# ADKの便利で実践的な使い方 🔀 プロンプトだけでエージェントの実行フローを制御するのは不安定になりがちです。ADKのGraph Workflowsなら、ノードとエッジでワークフローを明示的に定義し、AIノードと関数ノードを自在に組み合わせられます! 📌 タイトル:Graph Workflows — ノードとエッジによる明示的なワークフロー定義 🔗 URL: 🧩 概要 Graph Workflowsは、`Workflow`クラスの`edges`パラメータでノードの接続関係を定義し、実行フローを構築する仕組みです。AIエージェントノード、関数ノード、ツールノード、ネストされたWorkflowを混在させることができます。ルーターノードが`Event(route=...)`を返すことで辞書ベースの条件分岐が可能になり、「プロンプトに頼らない予測可能な制御フロー」を実現します。 🛠 使い方 基本的なGraph Workflowの構成です。 `google.adk` から `Workflow` と `Event` をインポートします。ルーター関数 `process_message` は `node_input` の内容に応じて `Event(route="BUG")`、`Event(route="LOGISTICS")`、または `Event(route="CUSTOMER_SUPPORT")` を返します。各ルートに対応する関数(`response_bug`、`response_support`、`response_logistics`)はそれぞれ `Event(output=...)` で応答メッセージを返します。 `Workflow` の `name="support_router"` で、`edges` に2つのタプルを定義します。1つ目は `("START", process_message)` で開始ノードからルーターへ接続し、2つ目は `process_message` の出力を `{"BUG": response_bug, "CUSTOMER_SUPPORT": response_support, "LOGISTICS": response_logistics}` の辞書で各ハンドラーに振り分けます。 順次実行のシンプルなチェーンも定義できます。 `Workflow` の `edges` にタプル `("START", agent1, function1, agent2, function2)` を1つ渡すことで、ノードを順次接続するシンプルなチェーンを定義できます。 🏗 実践的な使い方 **AIフリー関数チェーン + AIノードの混在**: データの前処理や後処理はPython関数で行い、判断が必要な部分だけAIエージェントノードを使います。これによりLLMの呼び出し回数を最小限に抑え、コストと遅延を削減できます。 関数ノード `extract_data` は `json.loads(node_input)` でデータを解析し `Event(output=parsed["content"])` を返します(AI不要)。`LlmAgent` の `analyzer` がデータの分析と要約を行い、関数ノード `format_output` が `Event(output=f"## 分析結果\n{node_input}")` でフォーマットします(AI不要)。 `Workflow` の `name="hybrid_pipeline"` で `edges=[("START", extract_data, analysis_agent, format_output)]` と定義し、関数ノードとAIノードを混在させたハイブリッドパイプラインを構築します。 **カスタマーサポートの自動振り分け**: 問い合わせ内容をルーター関数で分類し、適切な対応エージェントに振り分けます。分類ロジックがコードで明示されているため、動作の予測と検証が容易です。 💡 ユースケース 📨 問い合わせの自動分類・振り分け(バグ/サポート/配送) 🔧 前処理(関数)→ 分析(AI)→ 後処理(関数)のハイブリッドパイプライン 🏭 ETLパイプラインのAI組み込み(抽出は関数、変換にAIを活用) 🔀 ルーティングロジックの明示化によるテスタビリティ向上 ⚠️ 注意点 - ライブストリーミング機能はGraph Workflowsと互換性がありません。 - 一部のサードパーティ連携はGraph Workflowsをサポートしていない場合があります。 - ルーターの辞書にないrouteキーが返された場合のエラーハンドリングを考慮してください。 - ノードは1回の実行で1つの`Event.output`のみを出力できます。 ✨ Graph Workflowsは、AIノードと関数ノードをノードとエッジで明示的に結合し、プロンプトだけに頼らない予測可能なエージェントパイプラインを構築します。コスト効率と信頼性を両立したい場面でぜひ活用してください! #ADK# #AIAgent#
もっと見る
# ADKの便利で実践的な使い方 🔧 標準ワークフローでは実現できない独自のオーケストレーションロジックが必要な場面、ありますよね。ADKのCustom Agentsなら、`BaseAgent`を継承して自由自在に制御フローを組み立てられます! 📌 タイトル:Custom Agents — BaseAgent継承による自由な制御フロー設計 🔗 URL: 🧩 概要 Custom Agentsは、`google.adk.agents.BaseAgent`を継承し、`_run_async_impl`メソッドを実装することで、任意のオーケストレーションロジックを構築できる仕組みです。SequentialAgentやParallelAgentなどの定型パターンでは対応できない、条件分岐・ループ・外部状態同期といった高度なワークフローを実現します。サブエージェントの呼び出し、セッション状態の共有、イベントの伝播がフレームワーク標準で管理されます。 🛠 使い方 Custom Agentの基本構造は以下のとおりです。 `google.adk.agents.BaseAgent` を継承して `MyCustomAgent` クラスを定義します。フィールドとして `story_generator`、`critic_agent`、`tone_checker` の3つの `LlmAgent` を宣言します。`_run_async_impl` メソッド内で、まず `self.story_generator.run_async(ctx)` でストーリーを生成し、次に `self.critic_agent.run_async(ctx)` を `for i in range(2)` で最大2回ループして批評・修正を行います。最後に `self.tone_checker.run_async(ctx)` でトーンを確認し、`ctx.session.state.get("tone_result")` が `"negative"` の場合は `self.story_generator.run_async(ctx)` で再生成する条件分岐を行います。各サブエージェントの実行は `async for event in ... yield event` パターンでイベントを伝播します。 サブエージェント間のデータ共有には`ctx.session.state`を使います。 エージェントAが `ctx.session.state["analysis_result"] = result` で結果を書き込み、エージェントBが `ctx.session.state.get("analysis_result")` でそれを読み取ります。 🏗 実践的な使い方 **レガシーステートマシンの再現**: 既存の状態遷移ロジックをCustom Agentに移植できます。`_run_async_impl`内でPythonの標準的な制御構文(if/elif/while/try-except)を使い、状態ごとに異なるサブエージェントを呼び分けます。 `_run_async_impl` 内で `state = "INIT"` から開始し、`while state != "DONE"` でステートマシンを実装します。`"INIT"` 状態では `self.init_agent.run_async(ctx)` を実行し、`ctx.session.state.get("next_state", "PROCESS")` で次の状態を決定します。`"PROCESS"` 状態では `self.process_agent.run_async(ctx)` を実行後 `"REVIEW"` に遷移します。`"REVIEW"` 状態では ` を実行し、`ctx.session.state.get("approved")` が真なら `"DONE"` に、偽なら `"PROCESS"` に戻ります。 **外部状態との同期**: データベースやAPIから取得した状態に基づいて実行パスを動的に切り替えられます。例えば、外部システムのステータスを確認してから次のエージェントを選択するパターンが実現可能です。 💡 ユースケース 🔄 レガシーシステムの状態遷移ロジックをAIエージェントとして再実装 🔀 中間結果に基づく条件分岐ワークフロー(品質チェック → 不合格なら再生成) 🔗 外部API/DBの状態に応じたエージェント選択 🔁 批評・修正の反復ループ(最大N回で打ち切り) ⚠️ 注意点 - `sub_agents`リストには、`_run_async_impl`内で直接呼び出すすべてのサブエージェントを含める必要があります。含めないとフレームワークのライフサイクル管理が正しく動作しません。 - `ctx.session.state`は全サブエージェント間で共有されるため、キー名の衝突に注意してください。プレフィックスをつけるなどの規約を決めておくと安全です。 - 無限ループを防ぐため、ループ処理には必ず最大回数や終了条件を設けてください。 ✨ Custom Agentsは、定型パターンでは収まらない独自のビジネスロジックをエージェントに組み込むための最も柔軟な手段です。ステートマシンの移行や複雑な条件分岐が必要な場面で、ぜひ活用してみてください! #ADK# #AIAgent#
もっと見る
# ADK 2.0の便利だけど知られていない機能 🌍 長い会話を続けていると、コンテキストウィンドウがいっぱいになってエージェントの品質が低下した経験はありませんか? ADK 2.0のコンテキスト圧縮(コンパクション)機能は、古いイベントをスライディングウィンドウ方式で要約し、コンテキストウィンドウを効率的に管理する機能です。長時間の会話でもエージェントの応答品質を維持できます。 📌 タイトル:コンテキスト圧縮(コンパクション) 🔗 URL: 🧩 概要 コンテキスト圧縮は、会話が長くなった際に古いイベントを要約して圧縮する仕組みです。2つの主要パラメータで動作を制御します。compaction_intervalは圧縮を実行するイベント間隔、overlap_sizeは圧縮時に次のウィンドウに引き継ぐイベント数です。例えば、compaction_interval=3、overlap_size=1の場合、3イベントごとに圧縮が実行され、最後の1イベントは次のウィンドウにも含まれます。Pythonではアプリに設定し、TypeScriptではTokenBasedContextCompactorでトークンしきい値ベースの制御が可能です。カスタムサマライザーも実装できます。 🛠 使い方 PythonではEventsCompactionConfigをAppに設定します。 ```python from import App from google.adk.context import EventsCompactionConfig compaction_config = EventsCompactionConfig( compaction_interval=5, # 5イベントごとに圧縮 overlap_size=2, # 直近2イベントを次のウィンドウに引き継ぎ ) app = App( agent=my_agent, events_compaction_config=compaction_config, ) ``` TypeScriptではTokenBasedContextCompactorを使用します。 ```typescript import { TokenBasedContextCompactor } from '@anthropic-ai/adk'; const compactor = new TokenBasedContextCompactor({ tokenThreshold: 4000, }); ``` カスタムサマライザーが必要な場合は、LlmEventSummarizerを拡張して独自の要約ロジックを実装できます。 🏗 本番システムへの組み込み方 ・compaction_intervalを会話の平均長さに合わせて調整する ・overlap_sizeを大きくすると文脈の連続性が向上するが、圧縮効率は低下する ・カスタムサマライザーで業務ドメインに特化した要約を実装する ・圧縮前後のイベント数とトークン数をモニタリングし、パラメータを最適化する 💡 ユースケース 💬 カスタマーサポートの長時間チャットでコンテキスト品質を維持 📝 長期プロジェクト管理エージェントの会話履歴を効率的に圧縮 🎯 重要な情報を保持しながら不要な詳細を削減してコストを最適化 🔧 ドメイン固有のカスタムサマライザーで業務に最適な要約を実現 ⚠️ 注意点 圧縮により古いイベントの詳細な情報は失われます。重要な情報はStateに保存するなど、圧縮されても失われない設計を心がけてください。また、overlap_sizeが小さすぎると文脈の断絶が生じ、エージェントの応答品質が低下する可能性があります。compaction_intervalとoverlap_sizeのバランスを実際のユースケースでテストすることをお勧めします。 ✨ コンテキスト圧縮により、長時間の会話でもコンテキストウィンドウを効率的に活用できます。エージェントの応答品質とコスト効率の両立に大きく貢献する機能です。 #ADK# #AIAgent#
もっと見る