はじめに
筆者が所属する部署で「生産性向上に関する取り組み」をテーマにしたプレゼン大会を開催することになり、上長との会話の中で 「Copilot の自律型エージェントの実力をみんなに魅せたい」 という話になりました。日ごろから Copilot(AI アシスタント)にはたくさん助けられていますが、「自律型エージェント?それって結局チャットボットの進化版みたいなもの?」くらいの認識でした。
自然言語で指示を出すだけで、自ら判断してタスクを進める──そんな未来的なイメージに、正直ピンときていなかったのです。しかし、実際に調べて構築していくうちに、「本当に、ただ文章を書いただけなのにロジカルに動作する」のが不思議でならず、気づけばその挙動にワクワクするようになっていました。
エージェントがまるで "考えている" かのように振る舞う様子に衝撃を受け、「これは何としても形にして、誰かと共有したい」と強く思うようになりました。この投稿では、実現を目指した内容、参考にした学習コンテンツ、実際に試行錯誤したプロセスなどを紹介していきます。
プレゼンで取り上げるシナリオ
まずは、Copilot の自律型エージェントを使ってどのような業務を自動化させるかについて紹介します。
シナリオ
自部署では、検証環境として Azure や Microsoft 365 などのサブスクリプションを所持しています。入場された方がこれらの環境を利用できるようにするため、Microsoft Entra ID アカウントの登録とライセンスの割り当てを行います。また、退場時にはそのアカウントからライセンスの割り当てを解除し、削除します。1
プレゼンでは、「入場時の作業」を Copilot の自律型エージェントを使って自動化してみようと思います。
|д゚) ...素直に Power Platform などで自動化すればいいじゃんって筆者も思いますが...
ここは、魅せてもらおうか「Copilot の自律型エージェント」の実力とやらを という心構えでチャレンジしてみます!
Copilot の自律型エージェントとは
Microsoft Copilot というとチャットボットのイメージが強く、どのような違いがあるのか、ぼんやりしているところがあったので、まずは Copilot に教えてもらいました。
- 自律型エージェントとは?
Microsoft Copilot における自律型エージェントは、ユーザーの指示を待たずに、事前に設定されたルールやリアルタイムのデータに基づいて自動的に行動する AI であり、Copilot が「対話型の AI アシスタント」であるのに対し、「自ら判断して動く AI のスペシャリスト (専門家)」 として機能します。Power Automate のトリガーやアクションを活用することで、チャットベースではなく業務を自動化するエージェントを構築することができます。
- Copilot との主な違い
項目 Copilot (AI アシスタント) 自律型エージェント 主な役割 ユーザーの指示に応じて支援 自ら判断してタスクを実行 操作 対話ベース イベントやルールに基づく自動実行 カスタマイズ性 限定的 高度にカスタマイズ可能 利用例 Word や Excel での支援 業務プロセス全体の自動化
指示を待たずにリアルタイムデータやルールに基づいて自律的に行動できる点が驚きですね。まるで AI に意思があるかのような機能性を持ち、より高度な業務の自動化できるとは。 とても驚きですね。また、この自律型エージェントは「待つ」のではなく「先回りして行動する」ことができるということ。作業の効率化だけでなく、業務フローの変革も期待できますね。
学習コンテンツ
自律型エージェントの基本的な性質 (自律性、自動化)、どのように作成するか、そしてどのように動作するのかについてなんとなくイメージできました。次に、実際の作り方について、次に紹介する先人のナレッジやトレーニング モジュールから学びました。
- 実際の操作を動画で確認できるだけでなく、解説も操作に合わせて丁寧になされているため、まずはこちらの動画をご覧いただくのが良いでしょう。 筆者自身も理解を深めるために、何度も繰り返し視聴しました。
- こちらのブログでは、先ほどの動画で紹介されていた Copilot Studio の自律型エージェントの作成方法 を、丁寧に解説しています。動画を見ながら「この部分をもう少し詳しく知りたい」と思った方にとって、参考になる内容です。
- このトレーニング モジュールは、Copilot Studio を活用して自律型エージェントを構築する方法 を学ぶためのものです。初心者から中級者向けに設計されており、ルーチン業務をインテリジェントな自動化ワークフローへと変換 するためのステップを詳しく解説しています。
エージェントの構築イメージ
これまでの学びを踏まえて、シナリオを実現するために必要なこと、エージェントをどのように構築すれば良いのかを下図のように整理しました。
- 利用者とのインターフェースは Teams チャネルとし、メッセージにアカウント登録で必要な情報を書いて投稿してもらう
- アカウント登録で必要な情報
※今回は必要最低限- エイリアス: "@" より前の文字列で、これを基に「ユーザープリンシパル名 (UPN)」などにセット
- 氏名: 「表示名」にセットする文字列
- 所属: 「部署」にセットする文字列
- アカウント登録で必要な情報
- 「新しいメッセージが投稿されたとき」を エージェントのトリガー とする
- 「アカウント登録」「ライセンス割り当て」「メッセージへの返信」は、エージェントのツール (アクション) とする
- 吹き出し (1) ~ (4) は エージェントの指示 (振る舞い) とする
エージェント構築の具体的な手順
それでは、「エージェントの構築イメージ」を基に構築していきます。
設定
自律型エージェントを作るためには、「生成オーケストレーション」をオンにしますが、執筆時点では日本語サポートはまだプレビュー段階であるため、プライマリ言語は「英語」を選択しました。
そして「生成オーケストレーション」をオンしました。
トリガー
ユーザーが Teams チャネルに投稿したメッセージを受け取りたいので、「チャネルに新しいメッセージが追加されたとき」を選択します。そして、トリガー名 (フロー名) や対象の Teams チャネルなどを入力していきます。
すると、下図のように Power Automate クラウドフローが作成されました。
「Sends a prompt to the specified copilot for processing (Execute Copilot)」アクションでエージェントが呼び出され、「body/message」パラメーターには triggerBody()
がセットされています。このパラメーター値がプロンプトとして送信されるようです。今回は、「指示」でこのプロンプトから「アカウント登録で必要な情報」を抽出させようと思うので、このフロー自体は手を加えずこのままにします。
ツール (アクション)
「エージェントの構築イメージ」で整理したように、「アカウント登録」「ライセンス割り当て」「メッセージへの返信」の操作に当たる Power Automate クラウドフローを作成します。
エージェントと連携させるため、フローは「Copilot からフローを実行 (When an agent calls the flow)」トリガーから始め、「Copilot に応答 (Respond to Copilot)」アクションを追加します。
「Copilot からフローを実行」トリガーのパラメーターにはエージェントから受け取る情報、「Copilot に応答」アクションのパラメーターにエージェントへ渡す (つもり) 情報を追加します。
- 「アカウント登録」フローの場合
ツールに各フローを追加する際、「名前」は「指示」で記述した名前と同じものに揃えます。
ナレッジ
ナレッジは、エージェントが回答を生成するために使用する情報源で、パブリックな Web サイト、SharePoint サイト、Dataverse にアップロードされたファイル、Dataverse テーブルなどを追加することができます。
今回は、トリガーやアクションとのやり取りで入手する情報 (エイリアス、氏名、UPN など) のみを取り扱うので、ナレッジは定義しません。
ナレッジについて、詳しくはこちらの Qiita 投稿でいろいろ検証されているので、参考になると思います。
指示
自律型エージェントを設計する際、「指示」はエージェントの行動の枠組みを定める重要な要素です。これを適切に記述することで、作成者の期待に沿った動きを生成し、タスクを適切に遂行できるようになります。
とはいえ、どのように書けば良いか迷うので、Copilot にアドバイスしてもらいました。
「指示」には、エージェントの動作や応答の方針を記述します。通常、プレーンテキストで記述し、必要に応じて箇条書きや改行を活用して整理すると良いでしょう。
もし、強調や構造化が必要な場合は、簡潔な文章と箇条書き を活用し、エージェントの動作を明確に定義するのがベストです。
もらったアドバイスを踏まえて、筆者なりに「指示」を書いては Copilot に添削してもらうことを繰り返しました。その際、どういったところを改善したかを付け加えて質問すると、以下のように教えてくれました。
文章の 統一性・明確性 を向上させるために、表記の統一や読みやすさを改善しました。
- 改善点
- 表記の統一
- 各ステップを統一した形式で整理
- 「次に」「そして」などの接続詞を削減し、明快な構造に変更
- 明確な処理フロー
- 「何をするか」が一目でわかるよう、アクション名の前に簡単な説明を追加
- 「登録済みユーザープリンシパル名」などの値処理部分を簡潔化
- 視認性向上
- 箇条書きを適切に活用し、より視覚的にわかりやすく調整
最終的に「指示」は、このように記述しました。
ご参考までに、筆者なりに以下のような点を気をつけました。
- どこからどこまでがひとつのタスクなのかを明確にする
一気にすべてを読み込むと勘違いされそうな気がする (あくまでイメージ) ので、タスクごとに区切りをつけることで、そのタスクで「何をするか」が明確になると思います- 箇条書きでタスクごとに番号を付ける
- タスクで取り扱う値を明確に示す
文中に「取り扱う情報」も書くとわかりづらいので、「やって欲しいこと」と「取り扱う情報」を分けて書き、さらに「引き渡す情報」と「受け取る情報」も分けました- 引き渡す情報 → 「渡すパラメーター」
- 受け取る情報 → 「受け取る返却値」
- 一文を短くして、シンプルにする
「○○して、××して、...」と書くと複雑になりそうなので、「○○します。××します。...」とすることでわかりやすくなると思います - あいまいな「名前」を使わない
たとえば「ユーザープリンシパル名 (UPN)」と言うと、Teams でのメッセージ投稿者の UPN だったり、登録したアカウントの UPN だったりと、意図したものとは異なるものを取り扱われることがありましたので、それぞれ的確に特定できる名前を付けて呼ぶようにしました
次から、それぞれのタスクについて説明します。
タスク 1. メッセージから情報を取得する
1.トリガー "アカウントリクエスト" の実行時に、受信したボディから以下の「受け取る返却値」を取得します。
1-1.受け取る返却値
・エイリアス
・氏名
・所属
・メッセージID
タスク 1.では、トリガー "アカウントリクエスト" が送信したプロンプトから、必要な情報「受け取る返却値」をエージェントが下図のように識別して抽出してくれることを期待しています。
- 活動マップ: アカウントリクエスト
タスク 2. アカウントを登録する
2.アクション "アカウント登録" に以下の「渡すパラメーター」を渡し、Microsoft Entra ID テナントに新規アカウントを登録します。登録後、以下の「受け取る返却値」を取得します。
2-1.渡すパラメーター
・エイリアス
・氏名
・所属(取得できなかった場合は、空文字 "" をセット)
2-2.受け取る返却値
・登録済みユーザープリンシパル名
・登録済み表示名
・登録済みパスワード
タスク 2.では、タスク 1.で取得した情報を基にアカウントを登録します。そのためには、「指示」に書いた内容だけでなく、ツール "アカウント登録" の入力パラメーターの [次を使用して入力する2] 項目で「AI で動的に入力する3」を選択し、[値] 項目 > [説明] 欄にもどのような値をセットするのかを記述します。
- ツールの構成: アカウント登録
このように促すことで、下図のように入力パラメーターに想定した値が引き渡されます。
また、後続処理で必要な情報を出力パラメーターから取得するように求めます。
- 活動マップ: アカウント登録
タスク 4. ライセンスを割り当てる
4.アクション "ライセンス割り当て" に以下の「渡すパラメーター」を渡し、アカウントにライセンスを割り当てます。
4-1.渡すパラメーター
・登録済みユーザープリンシパル名
タスク 4.では、タスク 2.でアカウント登録後に入手した UPN (登録済みユーザープリンシパル名) を引き渡してライセンスを割り当てます。タスク 2.と同じように、ツール "ライセンス割り当て" の入力パラメーターの [説明] 欄にもどのような値をセットするのかを記述します。4
- ツールの構成: ライセンス割り当て
- 活動マップ: ライセンス割り当て
タスク 3./タスク 5. メッセージに返信する
3.アクション "アカウント登録完了のメッセージ" に以下の「渡すパラメーター」を渡し、リクエスト元のメッセージに対してアカウント登録の完了通知を返信します。
3-1.渡すパラメーター
・メッセージID
・登録済みユーザープリンシパル名
・登録済み表示名
・登録済みパスワード
5.アクション "ライセンス割り当て完了のメッセージ" に以下の「渡すパラメーター」を渡し、リクエスト元のメッセージに対してすべての処理が完了したことを返信します。
5-1.渡すパラメーター
・メッセージID
タスク 3. とタスク 5. では、Team チャネルに投稿されたメッセージへ返信します。他と同じようにツールのフローに必要な値を引き渡して実行します。
- ツールの構成: アカウント登録完了のメッセージ
- 活動マップ: アカウント登録完了のメッセージ
- Power Automate フロー: アカウント登録完了のメッセージ
エージェントの動作確認と結果
それでは、これまでに構築したエージェントを発行して、動作確認してみます。
- Teams チャネルのメッセージ
利用者とエージェントのやり取りは、下図のように Teams チャネルにメッセージを投稿してもらいます。しばらくすると、アカウント登録後 (タスク 3.)、ライセンス割り当て後 (タスク 5.) にメッセージが返ってきます。5
「エイリアス」「氏名」「所属」を箇条書きや表などを用いてわかりやすく書いても、下図のように文中に書いても、ちゃんと識別して抽出してくれます。
- エージェントの活動マップ
エージェントの活動マップを確認すると、想定どおりにトリガーから始まり、タスクが最後まで実行されたことがわかります。
- 登録されたアカウントのプロパティとライセンス
登録されたアカウントは、Teams チャネルに投稿されたメッセージから必要な情報を抽出して(タスク 1.)、各プロパティにセットされています(タスク 2.)。ライセンスも割り当てられています(タスク 4.)。
まとめ
Copilot の自律型エージェントを使って業務を自動化させてみました。その過程での学習 (先人の方々に感謝) や実装したこと、実施したことなどを書いてみました。
C# などのプログラミング言語を使用せずに、アカウント登録やライセンスの割り当てなどの個々の処理は Power Automate クラウドフローで作成し、業務の主となる流れを自然言語 (しかも日本語) で書いただけで自動化を実現できた ことに非常に驚きました。冒頭でも書きましたが、エージェントがまるで "考えている" かのように振る舞う 様子を目の当たりにして、ホントに衝撃を受けました!これにより、技術的なハードルを大幅に下げ、より多くの人が自律型エージェントの力を活用できると実感しました。
今回は自律型エージェントを試してみましたが、自律型エージェントは私たちの期待を超えるものであり、今後のさらなる発展が楽しみです。