Vertex AI Agent Builderで、複数人の空き予定確認から予定の登録までやってくれるLLMエージェント作ってみた
ノーコードでエージェントが開発できるAgent BuilderとLLMエージェントについても薄く紹介します。
Table of contents
author: Shintaro
はじめに
先日、Google Cloud Next Tokyo ‘24が開催されましたが、
特に2日目の基調講演は「エージェント」という単語で溢れかえっていました。
そこで、Google CloudのVertex AI Agent Builderを使ったLLMエージェントの構築にトライしつつ、
個人的に感じていた以下の手間を解消してみました。
-
社内の複数人が参加する予定のスケジュール調整
- 全員のカレンダーを横に並べて共通の空いてる日にち探す
- お客様など関係者に提示する際に空き予定を書き起こす
- 仮押さえで予定を作る
LLMエージェントとは
LLMエージェントの定義から整理します。
(エージェント、AIエージェントの定義は割愛させてください)
LLMエージェントは「エージェント」、「AIエージェント」に包含された下位概念です。
そのためLLMエージェントをAIエージェントと呼んでも正解ですし、
AIエージェントという表現の方が多く見かける気がします。
LLMエージェントの定義として誰もが同意する共通認識はまだなさそうですが、
「以下の性質を持つ、LLMを基盤とする自立駆動型のシステム」であると言うことはできそうです。
- 人間が与えた目標をもとに、必要なタスクの洗い出しや優先順位付けをする
- web検索やAPI利用など、外部ツールを利用する
また論文や記事で紹介されている、LLMエージェントを構成する具体的な要素から、
「環境を知覚する脳として、LLMが機能するシステム」
と言うこともできそうです。
他にも、Profile、Memory、Planning、Actionに4つに分けて構造を整理する考え方などもあります。
このようなLLMエージェントを構築できるツールやサービスは増えてきています。
なんとなく聞いたことあるものをGitHubのスターの数順(2024/8/12現在)に並べました。
今回はエージェントが構築できるサービスのうち、
Google CloudのVertex AI Agent Builderについて紹介します。
※ちょっと余談
AWSにもAgents for Amazon Bedrockというサービスがありますが、
Azureは調べてもイマイチわかりませんでした。
Microsoft Power Virtual Agentsになるのでしょうか?どなたか詳しい方、教えてください。
Vertex AI Agent Builderとは
LLMエージェントや検索エンジンを開発できるGoogle Cloudのサービスで、
「Vertex AI Agents」と「Vertex AI Search」の2つの機能から構成されています。
すぐ下でご紹介しますが、サービス名の変更に伴い、構成する機能の名称も変化しています。
サービス名と機能の変遷
当初は「Generative AI App Builder」もしくは「Gen App Builder」と呼ばれていましたが、
2023年8月に「Vertex AI Search and Conversation」に。
そして2024年4月のGoogle Cloud Nextのタイミングで
「Vertex AI Agent Builder」という現在の名称に変更されました。
同時に、サービスを構成する機能の名称も以下のように変更されています。
約1年間で2回と、めまぐるしく変わっています(そろそろ落ち着いてほしいです)。
Vertex AI Agentsとは
ローコード / ノーコードでLLMエージェントが開発できるサービスです。
2024/8/12時点で、構築する画面は英語※ですが、
以下のようなシンプルなコンソール画面でエージェントを構築できます。
※エージェントとのチャットは日本語対応しています。
Vertex AI Agentsは主に「Agents」と「Tools」から構成されており、
これらを組み合わせてエージェントを構築していきます。
Vertex AI Agentsで日程調整エージェント作ってみた
まずは最終的にどんなことができるのかデモをお見せします。
Vertex AI Agentsで開発したエージェントは、SlackやGoogle Chatなどと簡単に連携できます。
以下はSlackで使用している画面です。
上記のやりとりを経てGoogleカレンダーを確認すると、
指定した日付、時間、タイトルで予定が追加されていることが確認できます。
わかりにくいですが、8/13の営業時間内(9時~17時開始)にあった共通の空き予定は12時のみでした。
このエージェントを以下の手順で作っていきます。
- Cloud Functionsの関数作成
- Agent BuilderでOpenAPIツールとして設定
- GoalやInstructions、Examplesを設定
- Slackとの連携
Cloud Functionsの関数作成
まず準備として、以下3つの関数を作っていきます。
- 名字を受け取って、その名字に該当する方々のメールアドレスをスプレッドシートから探して、返す
- メールアドレスをもとにカレンダーを確認し、共通で空いている日付と時間を返す
- 予定のタイトルと日付、時間を受け取って、予定を作成する
これらをVertex AI Agentのツールとして使用できるようにします。
Cloud Functionsの具体的な設定手順や関数の中身は今回は割愛させてください。
Agent BuilderでOpenAPIツールとして設定
ここから実際にエージェントの構築に入っていきます。
改めてですが、Vertex AI Agentsは主に「Agents」と「Tools」から構成されており、
まずは「Tools」から作っていきます。
最初に、エージェントのアプリを作成します。
「アプリを作成する」から、「エージェント」を選択します。
さきほど作成したCloud Functionsの関数をエージェントが使えるようにツールとして設定します。
エージェントが持てるツールは4種類あります。
- 用意されている組み込みツール
- 現在はCode Interpreterのみです。
- OpenAPIツール
- OpenAPIスキーマをツール内に定義することで外部APIに接続できます。
- データストアツール
- Cloud StorageやBigQueryにあるデータの情報についての知識を持ちます。
- 関数ツール
- エージェントが外部APIを呼び出す(実行はクライアントサイド)
今回はOpenAPIツールを使います。「Tools」から「+Create」をクリックします。
Typeで「OpenAPI」を選択し、Descriptionにツールの役割を記載します。
SchemaにOpenAPIのスキーマを記載します。
いずれも、今回作成した「カレンダー登録関数」の実例です。
同じ要領で、エージェントに持たせたいツールを登録していきます。
エージェントの構築
Vertex AI Agentsはいわゆるマルチエージェントで、複数エージェントの協働が可能です。
役割に応じた各エージェントに責務を分離することで、
単体のエージェントにすべてのタスクを任せるよりも
複雑なタスクの解決能力が高まると言われています。
そしてマルチエージェントにも様々なパターンがありますが、
Vertex AI Agentsは以下のようなイメージに近いです。
↑は、LangGraph: Multi-Agent Workflowsの図を参考に自作。
エントリーポイントとなるおおもとのエージェントから、
内容に応じて各エージェントにルーティングします。
今回は最終的なゴールが「予定の表示や登録」というシンプルなエージェントのため、
複数エージェントに分割すると構築の手間や挙動制御の複雑さが増すだけですが、
サービス理解のために分割します。
ここから実際にエージェントを構築していきます。
「Agents」のページを開くと「Default Generative Agent」という
起点となるエージェントデフォルトで設定されていて、
ユーザーからの入力を受け取ると、最初にこのエージェントが呼び出されます。
まず「Default Generative Agent」を編集します。
各エージェントは以下の要素から構成されています。
- Goal
- Instructions
- Examples
- Available Tools
以下で各要素の役割について解説しつつ、
今回作成したエージェントで実際に設定した内容をご紹介していきます。
Goal
- Goalは、エージェントが達成すべきゴールです。簡潔に記述すると良いです。
- 今回、Default Generative Agentは他のエージェントを呼び出すハブであるため、抽象的な内容です。
Instructions
- Instructionsはエージェントに対する具体的な指示です。
- ${AGENT:agent_name}とすることでエージェント呼び出しを指示できます。
- ${TOOL:tool_name}とすることでツール使用を指示できます。
- 以下を意識すると良いとのことです。
- エンドユーザーの問題を解決するための段階的なアプローチを反映する
- 大まかな指示で簡潔な自然言語の文
- 頑張って厳密に書こうとするよりも、次に紹介するExamplesの量と質が重要です
- 率直に、ツールの使用シナリオを指定する
[agent]
の箇所には、のちほど作成するエージェントを${AGENT:agent_name}の形式で入力します。
Examples
- 会話の例です。これはLLMに持たせるFew-shotのプロンプトとなります。
- 最低でも1つ。4つは以上あると良いとのことです。
- 実際、Exampleをいくつか登録しないと、特に以下のコントロールが難しそうでした。
- 最初に言ってほしいこと
- ツールの呼び出し方、ツールからのデータの受け取り方
- 実際、Exampleをいくつか登録しないと、特に以下のコントロールが難しそうでした。
特にツールの呼び出し方、ツールからのデータの受け取り方については重要だと感じます。
これは呼び出すタイミングの問題だけではありません。
設定しない場合、以下の画像を具体例として挙げると
"days": 4
というnumber型が欲しいところ、days: "4"
というstring型でツールに送ってしまう、などが起こります。
Basic Settings
Basic Settings > Selection strategyは、この例のプロンプトへの挿入をコントロールする設定です。
- Auto
- 入力トークンの上限に抵触しない限りはプロンプトに含める
- Always
- 常に含める
- Disabled
- 含めない
- この例の有無によるエージェントの挙動の変化をチェックするためにあります。
- 含めない
Input & Output
「Default Generative Agent」以外のエージェントでは必須の設定で、
分岐前のエージェントからどんな情報を引き継いで、どんな情報を次のエージェントに渡すか。というものです。
Input & Outputには以下を設定できます。
- 文字列
- Number
- ブール値
- ツール固有のパラメータタイプ
- 分岐前のエージェントで使用したツールからの情報など。
一通りの説明を「Default Generative Agent」を通じて行いました。
最後にAgents > Createから日程調整エージェントを作ります。
まず、基本的な設定は以下の通りです。
Examplesの設定は以下の通りです。
- Basic SettingsとInput & Output
指定した5名のメールアドレスをリスト形式で取得します。
指定した日付と先に取得したメールアドレスでGoogleカレンダーの共通する空き状況を取得します。
予定の登録という次のアクションへの誘導を促します。
チャット画面に表示してほしい形式も以下のように指定しないと、ツールから受け取ったまま表示してしまうなどが起こります。
メールアドレス、日付、予定のタイトルを使ってGoogleカレンダーに予定を登録します。
最後に、Default Generative AgentのInstructionsを修正し、
作成したエージェントを呼び出すようにすれば完成です。
Slackとの連携
まずSlackアプリを作成します。
具体的な方法はSlackが提供している入門ガイドをご覧ください。
Vertex AI AgentsのIntegrationからSlackを選択します。
Access tokenにはBot User OAuth Tokenを入力します。
Signing tokenにはSigning Secretを入力します。
青い「Start」ボタンをクリックすると以下のようなWebhook URLが発行されます。
これをEvent SubscriptionsのRequest URLに入力すれば完了です。
まとめ
Cloud Functionsの関数を作る際はコードを書く必要がありますが、
エージェントの構築自体はノーコードで完了します。非常にお手軽です。
この構築の簡単さと、LLMエージェントに関する(広く薄い)周辺知識が伝わっていれば幸いです。
ここから発展して学んでいく際は、
LangChain on Vertex AIであったり、フレームワークであるAutoGenなどを触ってみることなのかなと考えています。
なお、今回はVertex AI Agentsの理解を深めるために
シンプルな「日程調整エージェント」を作成しましたが、
この機能単体では以下の通りです。
- そもそも生成AIを使う必要がない
- Webアプリとして選択式のUIをとったほうが絶対に使いやすい
後者についてはチャットというUIを用いることで、
ユーザーとのインタラクティブなやりとりが無駄に必要になっています。
チャットである必然性みたいなものは常に意識していたいなと思いました。
a16zのブログから、究極的に目指すべきところは
「ボタンをポチっとしたら業務が終わる」みたいな世界観かー。そうだよなー。と感じています。
※本記事は、ジーアイクラウド株式会社の見解を述べたものであり、必要な調査・検討は行っているものの必ずしもその正確性や真実性を保証するものではありません。
※リンクを利用する際には、必ず出典がGIC dryaki-blogであることを明記してください。
リンクの利用によりトラブルが発生した場合、リンクを設置した方ご自身の責任で対応してください。
ジーアイクラウド株式会社はユーザーによるリンクの利用につき、如何なる責任を負うものではありません。