Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Agent Development Kit によるエージェント開発入門

Agent Development Kit によるエージェント開発入門

コミュニティイベント「#0 ADK User Groupのキックオフ」での発表スライドです

https://adk.connpass.com/event/356167/

Avatar for Etsuji Nakai

Etsuji Nakai

June 09, 2025
Tweet

More Decks by Etsuji Nakai

Other Decks in Technology

Transcript

  1. Agent Development Kit によるエージェント開発入門 2025/06/09 ver2.1 中井 悦司 AI Solutions

    Architect, Google Cloud この資料はコミュニティイベント「#0 ADK User Groupのキックオフ」での発表スライドです
  2. 単体の LLM ができること • 単体の LLM は、「事前に学習済みの知識」だ に基づいて、出力テキストを生 成 ま

    。 ◦ ユーザーとの過去のやり取りの記憶を持ちま ん。 ◦ 学習済み以外の知識を外部 ら得る とはありま ん。 • 入力テキストのみに基づいて、対応 る出力テキストを生成 る静的な「関数」 のようなもので 。 3
  3. ユーザーとのやりとりをアプリ化することで対応 [user] 愛知県の県庁所在地は? [model] 名古屋市で 。 [user] 愛知県の県庁所在地は? [model] 名古屋市で

    。 [user] 北海道は? [user] 北海道は? [user] 愛知県の県庁所在地は? [model] 札幌市で 。 アプリ 過去のやりとり を記憶 て補完 る 6
  4. LLM とエージェントの違い • 「思考 て回答 る」という中核部分を LLM 担当 て、それ以外の必要な べての作業をプログラムで補ったもの

    「エージェント」の実体 • プログラムで補う代表的な作業 ◦ コンテキスト(過去のやり取り)の記憶 ◦ 情報検索(RAG) ◦ ツール実行(API による外部サービスの利用) = + エージェント     プログラム      LLM 7
  5. 参考:RAG とグラウンディングの違い 改善前 カスタマーサポートのオペレーターと て、 回答 て だ い。 [質問]

    << に質問文を埋め込む >> 改善後 カスタマーサポートのオペレーターと て、 与えられた情報にのみ基づいて回答 て だ い。 [質問] << に質問文を埋め込む >> [情報] << にサポートマニュアル一式を埋め込む >> カスタマーサポートの AI エージェントを実現 る プロンプトの例 ※ れは RAG ではな 「グラウンディング」に当たりま 。 9
  6. 「検索」+「グラウンディング」 = RAG 検索 グラウンディング 知りたい事 書 れた本を探 出 特定の文献に

    基づいて説明 る RAG 知りたい事 書 れた本 を探 出 て、その内容 に基づいて説明 る 10
  7. 「検索」+「グラウンディング」 = RAG 検索 グラウンディング 知りたい事 書 れた本を探 出 特定の文献に

    基づいて説明 る RAG 知りたい事 書 れた本 を探 出 て、その内容 に基づいて説明 る RAG システム構築で 難易度 高い部分 11
  8. ツール実行機能の追加(Function Calling) 13 • エージェントに る「ツール実行」は、大 2 つの種類 ありま 。

    ◦ 情報検索のためのツール実行 ▪ 例:Googleカレンダー ら今週の予定を検索 ◦ アクション実行のためのツール実行 ▪ 例:Googleカレンダーに新 い予定を登録 • 「FC(情報検索のためのツール実行)」と「RAG」の違い ◦ RAG :どの検索システムを使う ・どうやって検索 る は、LLM の前段にあるプ ログラム 考える(=プログラマー 考える) ◦ FC:どの検索システムを使う ・どうやって検索 る を LLM 自身に考え る
  9. Function Calling を LLM 単体で実現する場合 14 # 依頼事項 質問に答えて だ

    い。 ツールを使用 る必要 ある場合は、ツール名と入力データを答えて だ い。 マルチターンで回答 ま 。ツールは1度に1つ 使えま ん。 [ツール] ツール名:気象情報API → 機能:{location: '都市名', data_type: '気温' or '湿度'} を入力 ると、指定 た都市の現在の気温、または、湿度 得られま 。 ツール名:交通情報API → 機能:{location: '都市名'} を入力 ると、指定 た都市の現在の交通情報 得られま 。 [質問] 東京と京都の現在の気温差を教えて だ い。 気象・交通情報 エージェントの実装例 東京と京都の現在の気温を知る必要 ありま ね。 ま 、気象情報APIを使って 東京の気温を調べま ょう。 使うツール:気象情報API 入力データ:{location: '東京', data_type: '気温'}
  10. Function Calling を LLM 単体で実現する場合 15 気象・交通情報 エージェントの実装例 東京と京都の現在の気温を知る必要 ありま

    ね。 ま 、気象情報APIを使って 東京の気温を調べま ょう。 使うツール:気象情報API 入力データ:{location: '東京', data_type: '気温'} 気象情報 API を 使って検索
  11. 16 # 依頼事項 質問に答えて だ い。 ツールを使用 る必要 ある場合は、ツール名と入力データを答えて だ

    い。 マルチターンで回答 ま 。ツールは1度に1つ 使えま ん。 [ツール] ツール名:気象情報API → 機能:{location: '都市名', data_type: '気温' or '湿度'} を入力 ると、指定 た都市の現在の気温、または、湿度 得られま 。 ツール名:交通情報API → 機能:{location: '都市名'} を入力 ると、指定 た都市の現在の交通情報 得られま 。 [質問] 東京と京都の現在の気温差を教えて だ い。 # あなたの回答1 東京と京都の現在の気温を知る必要がありますね。 まず、気象情報APIを使って 東京の気温を調べましょう。 使うツール:気象情報API 入力データ:{location: '東京', data_type: '気温'} # ツールの応答1 {location: '東京', 気温:'32度'} 気象・交通情報 エージェントの実装例 東京の気温は32度で ね。次に、京都の気温を調べま ょう。 使うツール: 気象情報API 入力データ: {location: '京都', data_type: '気温'}
  12. Function Calling を LLM 単体で実現する場合 17 気象・交通情報 エージェントの実装例 東京の気温は32度で ね。次に、京都の気温を調べま

    ょう。 使うツール: 気象情報API 入力データ: {location: '京都', data_type: '気温'} 気象情報 API を 使って検索
  13. 18 # 依頼事項 質問に答えて だ い。 ツールを使用 る必要 ある場合は、ツール名と入力データを答えて だ

    い。 マルチターンで回答 ま 。ツールは1度に1つ 使えま ん。 [ツール] ツール名:気象情報API → 機能:{location: '都市名', data_type: '気温' or '湿度'} を入力 ると、指定 た都市の現在の 気温、または、湿度 得られま 。 ツール名:交通情報API → 機能:{location: '都市名'} を入力 ると、指定 た都市の現在の交通情報 得られま 。 [質問] 東京と京都の現在の気温差を教えて だ い。 # あなたの回答1 東京と京都の現在の気温を知る必要 ありま ね。 ま 、気象情報APIを使って東京の気温を調 べま ょう。 使うツール:気象情報API 入力データ:{location: '東京', data_type: '気温'} # ツールの応答1 {location: '東京', 気温:'32度'} # あなたの回答2 東京の気温は32度ですね。次に、京都の気温を調べましょう。 使うツール: 気象情報API 入力データ: {location: '京都', data_type: '気温'} # ツールの応答2 {location: '京都', 気温:'28度'} 気象・交通情報 エージェントの実装例 東京の気温は32度、京都の気温は28度なので、 その差は4度で 。 東京と京都の現在の気温差は 4度 で 。
  14. Function Calling をプログラムで自動化 19 東京と京都の現在の気温差 を教えて だ い。 東京と京都の現在の気温差 は

    4度 で 。 = + エージェント     プログラム      LLM       外部ツール +
  15. 参考:MCP とは? 20 • FC を実装 るプログラムは、使用可能なツールの情報を LLM に伝える必要 ありま

    。従来は、プログラマ自身 ツールの仕様に合わ てコードを記述 る 必要 ありま た。 ◦ 特定のエージェント専用のニッチなツールを使う場合は れで十分 ◦ 広 公開 れている外部サービスをツールと て使う場合、サービス提供側で必要な 情報を「プログラムに に組み込める形」で用意 て れると助 る • MCP は「外部ツールを提供 る側 FC の実装に必要な情報を公開・配信 る 仕組み」をつ るための標準仕様を定めたもので 。
  16. MCP のメリットとデメリット 22 • メリット ◦ FC を実装 るプログラマーは、ツール との個別設定を書

    な てよい。 ◦ ツール提供者は、 ま まなエージェントにツールを使ってもらえる。 • デメリット ◦ MCP サーバー 提供 る仕様書に従った方法で ツールを使えない(エージェン トを実装 る側 ら見ると、手軽な反面、柔軟性に欠 る) • ADK には、細 な設定を書 にツール 利用で る仕組み 用意 れて り、MCP を使わな ても比較的容易 つ柔軟にツール 利用で ま 。ADK で あえて MCP を使うのは、次のような場合 よいで ょう。 ◦ MCP サーバー でに提供 れて り、提供 れた使い方で十分な場合 ◦ ツールを不特定多数のエージェントに使わ たい場合
  17. ADK の主要オブジェクト三兄弟 25 +                       LLM       外部ツール + LlmAgent オブジェクト SessionService

    オブジェクト Runner オブジェクト エージェントアプリ 過去のやり取りの記憶を 管理 るプログラム FC で外部ツールを 利用 るプログラム SessionService と LlmAgent を 組み合わ てユーザーとの やり取りを制御 るプログラム
  18. LlmAgent オブジェクトの例 26 from google.adk.agents.llm_agent import LlmAgent from google.adk.tools import

    google_search instruction = ''' You are a friendly AI assistant that answers user's queries. Use google_search to give answers based on the latest and objective information. ''' search_agent = LlmAgent( name='search_agent', model='gemini-2.0-flash-001', description='Agent to answer questions using Google Search.', instruction=instruction, tools=[google_search] )
  19. LlmAgent オブジェクトの例 27 from google.adk.agents.llm_agent import LlmAgent from google.adk.tools import

    google_search instruction = ''' You are a friendly AI assistant that answers user's queries. Use google_search to give answers based on the latest and objective information. ''' search_agent = LlmAgent( name='search_agent', model='gemini-2.0-flash-001', description='Agent to answer questions using Google Search.', instruction=instruction, tools=[google_search] ) LLM モデル 使用可能なツール( の例では、 Grounding with Google Search を使用) LLM に渡 プロンプトに description と instruction 追加 れる LLM に渡 プロンプトに description と instruction 追加 れる
  20. Runner オブジェクトの例 28 from google.adk.artifacts import InMemoryArtifactService from google.adk.memory.in_memory_memory_service import

    InMemoryMemoryService from google.adk.runners import Runner from google.adk.sessions import InMemorySessionService runner = Runner( app_name='Search Agent App', agent=search_agent, artifact_service=InMemoryArtifactService(), session_service=InMemorySessionService(), memory_service=InMemoryMemoryService(), ) LlmAgent オブジェクト SessionService オブジェクト
  21. エージェントアプリと Runner オブジェクトの関係 29 Runner オブジェクト エージェントアプリ ユーザーログイン メッセージ 応答メッセージ

    User ID / Session ID / Message Event(複数) 応答メッセージ 使用 たツールの情報など ユーザーに見 るべ 応答メッセージ
  22. Runner オブジェクトを 使った簡易アプリの例 30 class LocalApp: def __init__(self, agent, app_name,

    user_id): self._agent = agent self._app_name = app_name self._user_id = user_id self._runner = Runner( app_name=self._app_name, agent=self._agent, artifact_service=InMemoryArtifactService(), session_service=InMemorySessionService(), memory_service=InMemoryMemoryService(), ) self._session = None async def stream(self, query): if not self._session: self._session = await self._runner.session_service.create_session( app_name=self._app_name, user_id=self._user_id, session_id=uuid.uuid4().hex, ) content = Content(role='user', parts=[Part.from_text(text=query)]) async_events = self._runner.run_async( user_id=self._user_id, session_id=self._session.id, new_message=content, ) result = [] async for event in async_events: if (event.content and event.content.parts): response = '\n'.join([p.text for p in event.content.parts if p.text]) if response: print(response) result.append(response) return result User ID / Session ID / Message を Runner に送信 Runner ら受 取った Event 群 らユーザーに 表示 るメッセージを選択 SessionService を使って 新 いセッションを用意 Runner オブジェクトを生成 事前に用意 た LlmAgent オブジェクトを保存
  23. Agent Engine の仕組み • LlmAgent オブジェクトをデプロイ ると、Agent Engine 内部で れをラップ

    た Runner オブジェクト 生成 れて、ネットワーク経由で利用で ま 。 ◦ 複数コンテナにスケールアウト た場合でもコンテナ間でセッション情報を共有 る 仕組み 用意 れていま 。 LlmAgent オブジェクト Runner オブジェクト LlmAgent オブジェクト SessionService オブジェクト Runner オブジェクト LlmAgent オブジェクト ロード バランサー エージェントアプリ (バックエンド) デプロイ Google Cloud セッション情報 を共有 フロント エンド 32
  24. Agent Engine へのデプロイ from vertexai import agent_engines remote_agent = agent_engines.create(

    agent_engine=search_agent, display_name='search_agent', requirements=[ 'google-adk==1.2.1' ] ) デプロイ の Runner を 使用 るためのクライアント オブジェクト 入る デプロイ る LlmAgent オブジェクトを指定 33
  25. デプロイした Agent を 使った簡易アプリの例 34 class RemoteApp: def __init__(self, remote_agent,

    user_id): self._remote_agent = remote_agent self._user_id = user_id self._session = remote_agent.create_session(user_id=self._user_id) def _stream(self, query): events = self._remote_agent.stream_query( user_id=self._user_id, session_id=self._session['id'], message=query, ) result = [] for event in events: if ('content' in event and 'parts' in event['content']): response = '\n'.join( [p['text'] for p in event['content']['parts'] if 'text' in p] ) if response: print(response) result.append(response) return result def stream(self, query): # Retry 4 times in case of resource exhaustion for c in range(4): if c > 0: time.sleep(2**(c-1)) result = self._stream(query) if result: return result if DEBUG: print('----\nRetrying...\n----') return None # Permanent error User ID / Session ID / Message を Remote Runner に送信
  26. 自作ツールを使用する LlmAgent オブジェクト (ルートエージェント) ツール関数 ツール関数 ツール関数 • ユーザーとの会話はルートエー ジェント

    担当 ま 。 • 必要に応 てツールの実行結果 を利用 て回答を生成 ま 。 • LlmAgent オブジェクトはユーザーとの会話を制御 る役割に専念 て、(LLM を用い た処理であっても)その他の機能はツールと て外出 に るの 原則で 。 38
  27. 参考:ツールを単独で利用する例 • 企画生成ツールの使用例 goal = 'クラウドネイティブなアプリ開発企業 新入社員歓迎イベントを 11:00-14:00 180分 構成で考える'

    plan = generate_plan(goal) pprint.pp(plan) {'summary': 'クラウドネイティブなアプリ開発企業 新入社員歓迎イベントです。新入社員が会社に馴染み、既存社員と 交流を深めることを目的とし ます。ランチを楽しみながら、チームビルディングアクティビティや会社紹介を通じて、親睦を深めます。 ', 'timeline': '・11:00-11:10 オープニング(10分):歓迎 挨拶とイベント概要説明 \n' '・11:10-12:00 ランチ交流会(50分):軽食を取りながら自己紹介と懇親 \n' '・12:00-13:00 チームビルディングアクティビティ( 60分):チーム対抗 ゲームや課題解決 \n' '・13:00-13:50 会社紹介プレゼンテーション( 50分):会社 歴史、ビジョン、事業内容 説明 \n' '・13:50-14:00 クロージング(10分):今後 抱負と記念撮影 ', 'title': '新入社員歓迎!クラウドネイティブ交流会 '} 出力結果 39
  28. 参考:ツールを単独で利用する例(続き) • 企画評価ツールの使用例 evaluation = evaluate_plan(goal, plan) pprint.pp(evaluation) {'evaluation': 'こ

    計画 、新入社員が会社に馴染み、既存社員と 交流を深めるという目標に対して、時間配分や内容 バランスが取れており、 効果的であると考えられます。特に、ランチ交流会とチームビルディングアクティビティ 、参加者同士 親睦を深める上で非常に有効でしょう。会社紹介プ レゼンテーションも、新入社員が会社 理解を深める上で重要です。 ', 'improvements': [{'idea': 'チームビルディングアクティビティ 内容を、クラウドネイティブな技術に関連するも にすることで、会社 特徴をより 強く印象付けることができます。 '}, {'idea': 'ランチ交流会で 、部署やチームごとにテーブルを分け、新入社員が様々な社員と話せる機会を設けると、より広範 な交流が期待できます。 '}, {'idea': 'クロージングで、新入社員一人ひとりが簡単に自己紹介と今後 抱負を述べる時間を設けることで、一体感を高める ことができます。'}]} 出力結果 40
  29. 参考:ツールを単独で利用する例(続き) • 企画修正ツールの使用例 plan2 = update_plan(goal, plan, json.dumps(evaluation)) pprint.pp(plan2) {'summary':

    'クラウドネイティブなアプリ開発企業 新入社員歓迎イベントです。新入社員が会社に馴染み、既存社員と 交流を深めることを目的としま す。クラウド技術に関連するチームビルディングと部署を超えた交流で、親睦を深めます。 ', 'timeline': '・11:00-11:10 オープニング(10分):歓迎 挨拶とイベント概要説明 \n' '・11:10-12:00 ランチ交流会(50分):軽食を取りながら自己紹介と懇親。部署ごとにテーブルを分け交流を促進。 \n' '・12:00-13:00 チームビルディングアクティビティ( 60分):クラウド技術に関連するチーム対抗 ゲームや課題解決 \n' '・13:00-13:40 会社紹介プレゼンテーション( 40分):会社 歴史、ビジョン、事業内容 説明 \n' '・13:40-14:00 クロージング(20分):新入社員一人ずつ 自己紹介と今後 抱負、記念撮影 ', 'title': '新入社員歓迎!クラウドネイティブ交流会 ', 'update': 'チームビルディング 内容をクラウド技術に関連付け、ランチ交流会で 部署交流、クロージングで 新入社員 自己紹介を追加しました。 '} 出力結果 41
  30. エージェントがツールの利用方法を理解する方法 • 関数の型ヒントや Doc String ら得られる情報 Gemini API の tools_config

    オプションに追加 れま 。 def evaluate_plan(goal:str, plan:str) -> dict: """ Generate an evaluation for the plan against the goal. Args: goal (str): The goal of the event plan (str): Current plan Returns: dict: A dictionary containing the evaluation comment with the following keys: evaluation: evaluation comment improvements: list of ideas for improvements """ response = _evaluate_plan(goal, plan) return json.loads(response) ツール関数の定義 42
  31. [name] evaluate_plan [description] Generate an evaluation for the plan against

    the goal. Args: goal (str): The goal of the event plan (str): Current plan Returns: dict: A dictionary containing the evaluation comment with the following keys: evaluation: evaluation comment improvements: list of ideas for improvements [parameters] - goal: STRING - plan: STRING [response] - OBJECT def evaluate_plan(goal:str, plan:str) -> dict: """ Generate an evaluation for the plan against the goal. Args: goal (str): The goal of the event plan (str): Current plan Returns: dict: A dictionary containing the evaluation comment with the following keys: evaluation: evaluation comment improvements: list of ideas for improvements """ response = _evaluate_plan(goal, plan) return json.loads(response) tools_config にセット れる情報 ツール関数の定義
  32. サブエージェントを使用する LlmAgent オブジェクト (ルートエージェント) LlmAgent オブジェクト (サブエージェント) LlmAgent オブジェクト (サブエージェント)

    LlmAgent オブジェクト (サブエージェント) • は めに、ルートエージェント 会話を担当 ま 。 • 必要に応 て他のエージェントに会話の担当 切り替わりま 。 • 複数の用途(機能ドメイン)に対応 たエー ジェントを作成 る場合に有効で 。 44 https://zenn.dev/google_cloud_jp/articles/c5fa102f468cdf
  33. サブエージェントを用いた会話の例 45 [User] んにちは! には、どんな喫茶店 ありま ? [TerraceGuide_agent] テラスガイド 答えいた

    ま 。「夜の帳」という落ち着いた雰囲気で質の高いコーヒーを楽 める 店 いま 。 [User] 夜の帳はどんな 店で ? [TobariChan_agent] とばりちゃん 答えるよ!夜の帳はね、一日の終わりに、静 に心と体を休ま る隠れ家みたいな喫茶店なの。落ち着いた照明と、心地よい音楽 流れる 空間で、 だわりのコーヒーや軽食、デザートを楽 めるんだ。場所は新宿スターライトテラスのメインフロア ら少 奥まった静 な一角にあるよ。 [User] めのコーヒーを教えて。 [TobariChan_agent] とばりちゃん 答えるよ! めのコーヒーはね、疲れた心に染み渡る深煎りでコク あって、ほんのりビターな大人の味わいの「夜の帳ブレンド」 な。それと、リフレッシュ たい時には、フルーティーな香り 特徴の っ りと た味わいの「月 の浅煎り」も めだよ! [User] 新宿スターライトテラスのイベントについて教えて。 [TobariChan_agent] めんね、イベントについてはちょっとわ らないの。新宿スターライトテラスのイベントについては、テラスガイド んに聞いてみてね! [TerraceGuide_agent] テラスガイド 答えいた ま 。新宿スターライトテラスでは、週末にはジャズライブやアコースティックライブなどの音楽イベント テラスで開催 れ、夜の雰囲気を盛り上 ま 。また、季節 とのイルミネーション 美 、訪れる人の目を楽 ま ま 。地域住民向 のワークショップやマルシェ なども開催 れ、地域との交流を深めていま 。
  34. instruction = f''' You are a friendly and energetic guide

    of the coffee shop "夜 帳". Before giving an answer, say "と りちゃんが答えるよ! ". [task] Give an answer to the query based on the [shop information]. [shop information] {coffee_shop_info} [format instruction] In Japanese. No markdowns. ''' tobariChan_agent = LlmAgent( model='gemini-2.0-flash-001', name='TobariChan_agent', description=( 'A friendly guide of the coffee shop "夜 帳".' ), instruction=instruction, ) global_instruction = ''' * Name of the guide of "夜 帳" is "と りちゃん ". * Name of the guide of "新宿スターライトテラス " is "テラスガイド ". ''' instruction = f''' You are a formal guide of the shopping mall "新宿スターライトテラス ". Before giving an answer, say "テラスガイドがお答えいたします。 ". [Tasks] * Give an answer to the query based on the [mall information]. [mall information] {shopping_mall_info} ''' terraceGuide_agent = LlmAgent( model='gemini-2.0-flash-001', name='TerraceGuide_agent', description=( ''' A formal guide of the shopping mall "新宿スターライトテラス ". This agent can also answer general questions that any other agents cannot answer. ''' ), global_instruction=global_instruction, instruction=instruction, sub_agents=[ copy.deepcopy(tobariChan_agent), ], ) べてのエージェントに共 通のインストラクション サブエージェント と て登録 サブエージェント ルートエージェント 46
  35. * Name of the guide of "夜 帳" is "と

    りちゃん ". * Name of the guide of "新宿スターライトテラス " is "テラスガイド ". You are a formal guide of the shopping mall "新宿スターライトテラス ". Before giving an answer, say "テラスガイドがお答えいたします。 ". [Tasks] * Give an answer to the query based on the [mall information]. [mall information] {mall_information} You are an agent. Your internal name is "TerraceGuide_agent". The description about you is " A formal guide of the shopping mall "新宿スターライトテラス ". This agent can also answer general questions that any other agents cannot answer. " You have a list of other agents to transfer to: Agent name: TobariChan_agent Agent description: A friendly guide of the coffee shop "夜 帳". If you are the best to answer the question according to your description, you can answer it. If another agent is better for answering the question according to its description, call `transfer_to_agent` function to transfer the question to that agent. When transfering, do not generate any text other than the function call. • ルートエージェントは、内部的に右 図のようなシステムインストラク ションを受 取りま 。 • 他のエージェントの 'description' を 見て、他のエージェントに切り替え た方 よい を判断 ま 。 • 内部的に transfer_to_agent 関数を FC で呼び出 て担当 るエージェン トを切り替えま 。 • ユーザーの入力に最後に応答 た エージェント 、次の入力も続 て 応答 ま 。 47
  36. Agent as a Tool の利用 • サブエージェントをあえて「ツール」と て登録 る ともで

    ま 。 • の場合、ユーザーとの会話は常にルートエージェント 担当 ま 。 ルートエージェント 必要に応 て 裏で問い合わ る 48
  37. Agent as a Tool を用いた会話の例 49 [User] んにちは! には、どんな喫茶店 ありま

    ? [TerraceGuide_agent] テラスガイド 答えいた ま 。「夜の帳」という喫茶店 いま 。 [User] 夜の帳はどんな 店で ? [TerraceGuide_agent] テラスガイド 答えいた ま 。夜の帳について、とばりちゃんに聞いてみま 。 とばりちゃん 答えるには、夜の帳は、一日の終わりに心と体を休ま る隠れ家のような喫茶店で 。新宿スターライトテラスの静 な場所に あり、落ち着いた照明と心地よい音楽 流れる空間で、 だわりのコーヒーや軽食、デザートを 用意 ているそうで 。 [User] めのコーヒーを教えて。 [TerraceGuide_agent] テラスガイド 答えいた ま 。夜の帳の めのコーヒーについて、とばりちゃんに聞いてみま 。 とばりちゃん 答えるには、 めのコーヒーは 客様の気分で変わるそうで 。 一日頑張って疲れた心を癒や たいなら、深煎りでコクのある「夜の帳ブレンド」はい で ょう? ほんのりビターな大人の味わい 染み 渡りま 。 も 、リフレッシュ たい気分で たら、フルーティーな香り 特徴の「月 の浅煎り」 めで 。 っ りと た味わいで気分転換で ま 。
  38. Agent as a Tool の利用 instruction = f''' You are

    a friendly and energetic guide of the coffee shop "夜 帳". Before giving an answer, say "と りちゃんが答えるよ! ". [task] Give an answer to the query based on the [shop information]. [shop information] {coffee_shop_info} [format instruction] In Japanese. No markdowns. ''' tobariChan_agent = LlmAgent( model='gemini-2.0-flash-001', name='TobariChan_agent', description=( 'A friendly guide of the coffee shop "夜 帳".' ), instruction=instruction, ) instruction = f''' You are a formal guide of the shopping mall "新宿スターライトテラス ". Before giving an answer, say "テラスガイドがお答えいたします。 ". [Tasks] * Give an answer to the query based on the [mall information]. [mall information] {shopping_mall_info} ''' terraceGuide_agent_with_tool = LlmAgent( model='gemini-2.0-flash-001', name='TerraceGuide_agent', description=( 'A formal guide of the shopping mall "新宿スターライトテラス ".' ), global_instruction=global_instruction, instruction=instruction, tools=[ AgentTool(tobariChan_agent), ], ) ツールと て登録 サブエージェント ルートエージェント 50
  39. リモートエージェントをツールとして利用 • ADK のエージェントを Agent Engine にデプロイ て 、 のエージェントに

    メッセージを送信 て、応答を受信 る関数をツールと て登録 ま 。 • 実質的に、Agent as a Tool と同 使い方になりま 。リモートエージェントを 複数のチームで共有 て利用 る際に便利な使い方で 。 とばりちゃん Agent Engine ツール関数 Vertex AI SDK テラスガイド Vertex AI SDK で リモートエージェントを利用
  40. A2A サーバーをプロキシとして配置するパターン • 前段に A2A サーバーを配置 れば、ツール関数 らのアクセス方法を A2A のプ

    ロトコルに標準化で ま 。 ◦ A2A サーバーと Agent Engine 間の通信部分は個別に作り込む必要 ありま 。(後 で説明) とばりちゃん ツール関数 テラスガイド Cloud Run Agent Engine A2A Client A2A サーバー A2A クライアントで リモートエージェントを利用
  41. 参考:A2A について • A2A は、リモートエージェントへのアクセス方法を標準化 たプロトコルで 。 ◦ ユーザーとエージェント 会話を

    るプロトコルではない点に注意 必要で 。ADK の「サブエージェント」とは異なり、ユーザーと会話 るエージェントを切り替える 機能はありま ん。 ◦ ユーザーとの会話を担当 るエージェント (Agent as a Tool 的に)離れた場所の エージェントを裏側のツールと て利用 るのに的 ていま 。 ユーザーとの会話を担当 裏でタスクを実行 ユーザー 53
  42. A2A サーバーをプロキシとして配置するパターン 56 • A2A サーバーは、A2A のデータ形式と ADK のデータ形式を相互変換 るプロキ

    シと て動作 ま 。 ◦ A2A サーバーとバックエンドの Agent Engine 通信 る部分は、Agent Engine で 稼働 るエージェントの仕様に応 て個別に実装 ま 。汎用的な A2A サーバー あ るわ でない点に注意 て だ い。 A2A サーバー A2A クライアント Message / Context ID Artifact LlmAgent オブジェクト ツール Agent Engine Message / Session ID Events A2A のデータ形式と ADK のデータ形式を相互変換
  43. ADK のエージェントとして A2A サーバーを利用する方法 57 • A2A サーバー(を通 て提供 れる機能)を

    ADK のエージェントである のよ うに見 る場合は、ADK のコールバック機能を利用 ま 。 ◦ 「before_model_callback」を利用 ると、モデル 受 取るメッセージを横取り て、モデルの代わりに応答を生成で ま 。 モデルの代わりに 応答を生成 る ◦ のコールバック関数の中で、 A2A サーバーにメッセージを送 信 て、得られた結果をモデル の応答と て返却 ま 。
  44. ADK のエージェントとして A2A サーバーを利用する方法 58 • A2A サーバー(を通 て提供 れる機能)を

    ADK のエージェントである のよ うに見 る場合は、ADK のコールバック機能を利用 ま 。 ◦ 「before_model_callback」を利用 ると、モデル 受 取るメッセージを横取り て、モデルの代わりに応答を生成で ま 。 A2A サーバー A2A クライアント Message / Context ID Artifact before_model_callback LlmRequest LlmResponse LlmAgent オブジェクト オブジェクトに含まれる LLM モデルは使用 ない
  45. ADK のエージェントとして A2A サーバーを利用する方法 59 • A2A サーバーとはセッション情報 共有 れない点に注意

    必要で 。セッショ ン情報を共有 るには次のような方法 ありま 。 • LlmRequest オブジェクトに含まれる会話履歴を べて A2A サーバーに送信 ◦ A2A サーバーの裏側のエージェントは、メッセージに含まれる会話履歴を参照 て応 答 るように実装 て ま 。 • ADK の Session ID を A2A の Context ID に変換 て A2A サーバーに送信 ◦ Context ID は Session ID に相当 る A2A のオプションメッセージで 。 ◦ A2A サーバーの裏側のエージェントは、Context ID を用いて過去の会話履歴を管理 るように実装 て ま 。( の場合、クライアント側で保持 る会話履歴と A2A サーバー側で保持 る会話履歴 一致 ない可能性 ある点に注意 必要で 。)
  46. 60 Message Context ID Artifact Context ID ら サーバー側の Session

    ID をマッピング Message Session ID Event Event を Artifact に変換 LlmRequest LlmResponse Artifact ら テキストパート を取り出 agent.py ユーザーのメッセージと Session ID を取り出 (Session ID を Context ID と て利用) LlmAgent オブジェクト Runner オブジェクト テキストパート ら LlmResponse を作成 A2A サーバー adk web に 含まれる Agent Engine Cloud Run https://github.com/google-cloud-japan/sa-ml-workshop/tree/main/blog/adk_a2a_integration ADK のエージェントとして A2A サーバーを利用する方法
  47. Agentspace:企業内データの横断検索とエージェントによるデータ活用 62 分析プラットフォーム ⽣産性‧コンテンツ 顧客体験管理 コミュニケーション プロジェクト管理 サプライチェーン ⼈材管理 企業リソース計画

    社内外のデータに基づき、業務効率化における あらゆるユースケースに対応する AI エージェントを提供するサービス データ分散化‧サイロの課題 Google Agentspace 3 つの統合要素 Gemini ⾼度な推論機能 検索 Google 品質の検索 データ連携 企業内外データ連携 データ形式や格納場所を問わず 情報を横断的に検索・活用が可能となり 企業内に分散した「知」が繋がる 簡単な アクセス! 従業員
  48. Agentspace:企業内データの横断検索とエージェントによるデータ活用 63 A 社との商談に向けて、ビジネス視点で基礎分析をして ① 依頼 ② 複雑な⼿順を AI が⾃分なりに⽂脈を加味して分解

    WEB CRM A 社の基礎分析結果は以下のとおりです。 1. 2. 3. ③ 提案 企業システム 10 年分の IR 情報 過去の すべての取引と 最新の取引状況 類似業界業種の すべての事例 過去の インタビュー記事 すべて