Slide 1

Slide 1 text

Agent Development Kit によるエージェント開発入門 2025/06/09 ver2.1 中井 悦司 AI Solutions Architect, Google Cloud この資料はコミュニティイベント「#0 ADK User Groupのキックオフ」での発表スライドです

Slide 2

Slide 2 text

基礎知識 LLM からエージェントへ 拡張を 支える技術要素

Slide 3

Slide 3 text

単体の LLM ができること ● 単体の LLM は、「事前に学習済みの知識」だ に基づいて、出力テキストを生 成 ま 。 ○ ユーザーとの過去のやり取りの記憶を持ちま ん。 ○ 学習済み以外の知識を外部 ら得る とはありま ん。 ● 入力テキストのみに基づいて、対応 る出力テキストを生成 る静的な「関数」 のようなもので 。 3

Slide 4

Slide 4 text

「過去のやりとりの記憶を持たない」とは? [user] 愛知県の県庁所在地は? [model] 名古屋市で 。 [user] 北海道は? [model] 北海道の何 知りたいの で ? 直前の会話の事は 覚えていない 4

Slide 5

Slide 5 text

過去のやりとりの記憶を持たせる方法 [user] 愛知県の県庁所在地は? [model] 名古屋市で 。 [user] 愛知県の県庁所在地は? [model] 名古屋市で 。 [user] 北海道は? [model] 札幌市で 。 れまでの会話の内容を べてプロントに含める 5

Slide 6

Slide 6 text

ユーザーとのやりとりをアプリ化することで対応 [user] 愛知県の県庁所在地は? [model] 名古屋市で 。 [user] 愛知県の県庁所在地は? [model] 名古屋市で 。 [user] 北海道は? [user] 北海道は? [user] 愛知県の県庁所在地は? [model] 札幌市で 。 アプリ 過去のやりとり を記憶 て補完 る 6

Slide 7

Slide 7 text

LLM とエージェントの違い ● 「思考 て回答 る」という中核部分を LLM 担当 て、それ以外の必要な べての作業をプログラムで補ったもの 「エージェント」の実体 ● プログラムで補う代表的な作業 ○ コンテキスト(過去のやり取り)の記憶 ○ 情報検索(RAG) ○ ツール実行(API による外部サービスの利用) = + エージェント     プログラム      LLM 7

Slide 8

Slide 8 text

情報検索(RAG)の仕組み https://zenn.dev/google_cloud_jp/articles/598d52341cc56f 8

Slide 9

Slide 9 text

参考:RAG とグラウンディングの違い 改善前 カスタマーサポートのオペレーターと て、 回答 て だ い。 [質問] << に質問文を埋め込む >> 改善後 カスタマーサポートのオペレーターと て、 与えられた情報にのみ基づいて回答 て だ い。 [質問] << に質問文を埋め込む >> [情報] << にサポートマニュアル一式を埋め込む >> カスタマーサポートの AI エージェントを実現 る プロンプトの例 ※ れは RAG ではな 「グラウンディング」に当たりま 。 9

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

「検索」+「グラウンディング」 = RAG 検索 グラウンディング 知りたい事 書 れた本を探 出 特定の文献に 基づいて説明 る RAG 知りたい事 書 れた本 を探 出 て、その内容 に基づいて説明 る RAG システム構築で 難易度 高い部分 11

Slide 12

Slide 12 text

参考:Gemini のグラウンディング機能 12 プロンプト 回答生成 検索処理を 自動実行 利用可能な検索システム ● Google 検索 ● Vertex AI Search Gemini

Slide 13

Slide 13 text

ツール実行機能の追加(Function Calling) 13 ● エージェントに る「ツール実行」は、大 2 つの種類 ありま 。 ○ 情報検索のためのツール実行 ■ 例:Googleカレンダー ら今週の予定を検索 ○ アクション実行のためのツール実行 ■ 例:Googleカレンダーに新 い予定を登録 ● 「FC(情報検索のためのツール実行)」と「RAG」の違い ○ RAG :どの検索システムを使う ・どうやって検索 る は、LLM の前段にあるプ ログラム 考える(=プログラマー 考える) ○ FC:どの検索システムを使う ・どうやって検索 る を LLM 自身に考え る

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

Function Calling を LLM 単体で実現する場合 15 気象・交通情報 エージェントの実装例 東京と京都の現在の気温を知る必要 ありま ね。 ま 、気象情報APIを使って 東京の気温を調べま ょう。 使うツール:気象情報API 入力データ:{location: '東京', data_type: '気温'} 気象情報 API を 使って検索

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

Function Calling を LLM 単体で実現する場合 17 気象・交通情報 エージェントの実装例 東京の気温は32度で ね。次に、京都の気温を調べま ょう。 使うツール: 気象情報API 入力データ: {location: '京都', data_type: '気温'} 気象情報 API を 使って検索

Slide 18

Slide 18 text

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度 で 。

Slide 19

Slide 19 text

Function Calling をプログラムで自動化 19 東京と京都の現在の気温差 を教えて だ い。 東京と京都の現在の気温差 は 4度 で 。 = + エージェント     プログラム      LLM       外部ツール +

Slide 20

Slide 20 text

参考:MCP とは? 20 ● FC を実装 るプログラムは、使用可能なツールの情報を LLM に伝える必要 ありま 。従来は、プログラマ自身 ツールの仕様に合わ てコードを記述 る 必要 ありま た。 ○ 特定のエージェント専用のニッチなツールを使う場合は れで十分 ○ 広 公開 れている外部サービスをツールと て使う場合、サービス提供側で必要な 情報を「プログラムに に組み込める形」で用意 て れると助 る ● MCP は「外部ツールを提供 る側 FC の実装に必要な情報を公開・配信 る 仕組み」をつ るための標準仕様を定めたもので 。

Slide 21

Slide 21 text

MCP の仕組み 21 MCP サーバー 公開 たいツール ツールの 仕様書 仕様書に従ってツールにアクセス ツールへの アクセスを中継 ツールの仕様書 を事前登録

Slide 22

Slide 22 text

MCP のメリットとデメリット 22 ● メリット ○ FC を実装 るプログラマーは、ツール との個別設定を書 な てよい。 ○ ツール提供者は、 ま まなエージェントにツールを使ってもらえる。 ● デメリット ○ MCP サーバー 提供 る仕様書に従った方法で ツールを使えない(エージェン トを実装 る側 ら見ると、手軽な反面、柔軟性に欠 る) ● ADK には、細 な設定を書 にツール 利用で る仕組み 用意 れて り、MCP を使わな ても比較的容易 つ柔軟にツール 利用で ま 。ADK で あえて MCP を使うのは、次のような場合 よいで ょう。 ○ MCP サーバー でに提供 れて り、提供 れた使い方で十分な場合 ○ ツールを不特定多数のエージェントに使わ たい場合

Slide 23

Slide 23 text

ADK によるエージェント 実装

Slide 24

Slide 24 text

ADK の仕組みを理解するポイント 24 = + エージェント                LLM       外部ツール + 過去のやり取りの記憶を 管理 るプログラム FC で外部ツールを 利用 るプログラム

Slide 25

Slide 25 text

ADK の主要オブジェクト三兄弟 25 +                       LLM       外部ツール + LlmAgent オブジェクト SessionService オブジェクト Runner オブジェクト エージェントアプリ 過去のやり取りの記憶を 管理 るプログラム FC で外部ツールを 利用 るプログラム SessionService と LlmAgent を 組み合わ てユーザーとの やり取りを制御 るプログラム

Slide 26

Slide 26 text

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] )

Slide 27

Slide 27 text

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 追加 れる

Slide 28

Slide 28 text

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 オブジェクト

Slide 29

Slide 29 text

エージェントアプリと Runner オブジェクトの関係 29 Runner オブジェクト エージェントアプリ ユーザーログイン メッセージ 応答メッセージ User ID / Session ID / Message Event(複数) 応答メッセージ 使用 たツールの情報など ユーザーに見 るべ 応答メッセージ

Slide 30

Slide 30 text

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 オブジェクトを保存

Slide 31

Slide 31 text

Agent Engine によるエージェント デプロイ

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

デプロイした 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 に送信

Slide 35

Slide 35 text

ハンズオン:Search Agent App を動かしてみる https://github.com/google-cloud-japan/sa-ml-workshop/blob/main/blog/search_agent_app.ipynb 35

Slide 36

Slide 36 text

ADK によるエージェント 構成パターン

Slide 37

Slide 37 text

自作ツールを使用する https://zenn.dev/google_cloud_jp/articles/1b1cbd5318bdfe 「エージェント」と 呼んではいる 実際には Python の関数 37

Slide 38

Slide 38 text

自作ツールを使用する LlmAgent オブジェクト (ルートエージェント) ツール関数 ツール関数 ツール関数 ● ユーザーとの会話はルートエー ジェント 担当 ま 。 ● 必要に応 てツールの実行結果 を利用 て回答を生成 ま 。 ● LlmAgent オブジェクトはユーザーとの会話を制御 る役割に専念 て、(LLM を用い た処理であっても)その他の機能はツールと て外出 に るの 原則で 。 38

Slide 39

Slide 39 text

参考:ツールを単独で利用する例 ● 企画生成ツールの使用例 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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

参考:ツールを単独で利用する例(続き) ● 企画修正ツールの使用例 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

Slide 42

Slide 42 text

エージェントがツールの利用方法を理解する方法 ● 関数の型ヒントや 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

Slide 43

Slide 43 text

[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 にセット れる情報 ツール関数の定義

Slide 44

Slide 44 text

サブエージェントを使用する LlmAgent オブジェクト (ルートエージェント) LlmAgent オブジェクト (サブエージェント) LlmAgent オブジェクト (サブエージェント) LlmAgent オブジェクト (サブエージェント) ● は めに、ルートエージェント 会話を担当 ま 。 ● 必要に応 て他のエージェントに会話の担当 切り替わりま 。 ● 複数の用途(機能ドメイン)に対応 たエー ジェントを作成 る場合に有効で 。 44 https://zenn.dev/google_cloud_jp/articles/c5fa102f468cdf

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

* 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

Slide 48

Slide 48 text

Agent as a Tool の利用 ● サブエージェントをあえて「ツール」と て登録 る ともで ま 。 ● の場合、ユーザーとの会話は常にルートエージェント 担当 ま 。 ルートエージェント 必要に応 て 裏で問い合わ る 48

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

リモートエージェントをツールとして利用 ● ADK のエージェントを Agent Engine にデプロイ て 、 のエージェントに メッセージを送信 て、応答を受信 る関数をツールと て登録 ま 。 ● 実質的に、Agent as a Tool と同 使い方になりま 。リモートエージェントを 複数のチームで共有 て利用 る際に便利な使い方で 。 とばりちゃん Agent Engine ツール関数 Vertex AI SDK テラスガイド Vertex AI SDK で リモートエージェントを利用

Slide 52

Slide 52 text

A2A サーバーをプロキシとして配置するパターン ● 前段に A2A サーバーを配置 れば、ツール関数 らのアクセス方法を A2A のプ ロトコルに標準化で ま 。 ○ A2A サーバーと Agent Engine 間の通信部分は個別に作り込む必要 ありま 。(後 で説明) とばりちゃん ツール関数 テラスガイド Cloud Run Agent Engine A2A Client A2A サーバー A2A クライアントで リモートエージェントを利用

Slide 53

Slide 53 text

参考:A2A について ● A2A は、リモートエージェントへのアクセス方法を標準化 たプロトコルで 。 ○ ユーザーとエージェント 会話を るプロトコルではない点に注意 必要で 。ADK の「サブエージェント」とは異なり、ユーザーと会話 るエージェントを切り替える 機能はありま ん。 ○ ユーザーとの会話を担当 るエージェント (Agent as a Tool 的に)離れた場所の エージェントを裏側のツールと て利用 るのに的 ていま 。 ユーザーとの会話を担当 裏でタスクを実行 ユーザー 53

Slide 54

Slide 54 text

A2A と ADK を組み合わせる方法

Slide 55

Slide 55 text

A2A サーバーをプロキシとして配置するパターン 55 https://zenn.dev/google_cloud_jp/articles/3dadca4ff50f1f

Slide 56

Slide 56 text

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 のデータ形式を相互変換

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

ADK のエージェントとして A2A サーバーを利用する方法 58 ● A2A サーバー(を通 て提供 れる機能)を ADK のエージェントである のよ うに見 る場合は、ADK のコールバック機能を利用 ま 。 ○ 「before_model_callback」を利用 ると、モデル 受 取るメッセージを横取り て、モデルの代わりに応答を生成で ま 。 A2A サーバー A2A クライアント Message / Context ID Artifact before_model_callback LlmRequest LlmResponse LlmAgent オブジェクト オブジェクトに含まれる LLM モデルは使用 ない

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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 サーバーを利用する方法

Slide 61

Slide 61 text

Agentspace からエージェントを利用

Slide 62

Slide 62 text

Agentspace:企業内データの横断検索とエージェントによるデータ活用 62 分析プラットフォーム ⽣産性‧コンテンツ 顧客体験管理 コミュニケーション プロジェクト管理 サプライチェーン ⼈材管理 企業リソース計画 社内外のデータに基づき、業務効率化における あらゆるユースケースに対応する AI エージェントを提供するサービス データ分散化‧サイロの課題 Google Agentspace 3 つの統合要素 Gemini ⾼度な推論機能 検索 Google 品質の検索 データ連携 企業内外データ連携 データ形式や格納場所を問わず 情報を横断的に検索・活用が可能となり 企業内に分散した「知」が繋がる 簡単な アクセス! 従業員

Slide 63

Slide 63 text

Agentspace:企業内データの横断検索とエージェントによるデータ活用 63 A 社との商談に向けて、ビジネス視点で基礎分析をして ① 依頼 ② 複雑な⼿順を AI が⾃分なりに⽂脈を加味して分解 WEB CRM A 社の基礎分析結果は以下のとおりです。 1. 2. 3. ③ 提案 企業システム 10 年分の IR 情報 過去の すべての取引と 最新の取引状況 類似業界業種の すべての事例 過去の インタビュー記事 すべて

Slide 64

Slide 64 text

Agentspace にエージェントを登録して利用 64 Agentspace に登録 れたエージェント群 Deep Research は標準で利用可能 レポート作成に企業内データも活用

Slide 65

Slide 65 text

65 https://www.youtube.com/watch?v=0GZWDU421Fo

Slide 66

Slide 66 text

Thank you.