Copilot Studioの基礎知識_生成オーケストレーションモードのエージェントを作成する

みなさん、こんにちは。
日本マイクロソフトの佐々木です。

前回はCopilot Studioのクラシックオーケストレーションモードと生成オーケストレーションモードの概要について紹介させていただきました。

この記事は実装編ということで実際に作成していきたいと思います。

**生成オーケストレーションモードのエージェントの開発は全く新しい開発のフレームワークになると思います。柔軟な対話を実現するための思考が求められると思います**

こちらは下記の記事の続きとなります。

https://qiita.com/tomoyasasaki1204/items/ea106c3ead707a2846a5

# 生成オーケストレーションモードのエージェントとは
生成オーケストレーションモード：最適なアクション、ナレッジ、トピック を選択し、ユーザーのクエリに回答したりすることができるエージェントとなります。
また、エージェントにトリガーを追加することで、イベントトリガーに応答できる自律型エージェントを開発することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/efe06824-08ad-48fd-bedc-3e522f09b80e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/a3d9e6cf-9ddd-49a5-bdf6-d9d5a357b835.png)

https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/advanced-generative-actions


# 生成オーケストレーションモードのエージェントを作成してみる
では実際に実画面で説明していきたいと思います。
今回のエージェントでは、店舗の一般的な問合せに応対しつつ、予約対応をするようなエージェントを作成します。


1. 一般的な問合せについては自動的にナレッジを検索
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/c1f6f0d2-b1ee-4726-b6f7-29f9603f2685.png)


1. 予約依頼については自動的にアクションを実行させ、入力パラメーターを補完するよう**動的に**質問をする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/f28d0d8d-d63c-4e37-a729-d8870586d7aa.png)


## 手順１_エージェントを作成する
基本的な初期設定は通常のクラシックオーケストレーションモードのエージェントの作成方法と同一ですので、割愛します。
指示や説明は、ここでは空白で問題ないです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/7276f0b8-daba-40de-a889-fb77487f6655.png)

:::note info
2025年3月現在、言語が英語のエージェントのみ生成オーケストレーションモードのエージェントをサポートしています。
:::


## 手順２_生成オーケストレーションモードを有効にする
エージェントの設定より、生成オーケストレーションモードを有効にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/74717788-97a8-4dc0-b361-cde5a1c1333b.png)

有効にすると、概要ページのオーケストレーションも同様に有効になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/959c9265-2fb8-4bd5-9c62-6950ccedce99.png)


## 手順３_指示や説明を記載する
生成オーケストレーションモードのエージェント（自律型エージェントも同様）を開発する場合、**説明や指示が非常に重要**になります。
ここの説明や指示を自然言語でわかりやすく記載していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/0cd3e6b6-dac8-4718-8256-f28ea8177e2a.png)


例えば、今回のエージェントの場合、
ナレッジの検索：ユーザーからの一般的な質問に答える
アクション：ユーザーからの予約に対応する
など、それぞれどういったケースでどういった対応が必要なのかを明記していきます。


## 手順４_ナレッジを構成する
利用するナレッジを構成します。
今回は店舗情報が格納されたDataverseテーブルと営業時間が格納されたWordファイルを利用します。
Wordにはちょっとした意地悪をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/ecc45c31-cff3-4390-9393-e8df74583f81.png)

ナレッジが追加されたら、[編集]をクリックし、重要な作業をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/68f4c429-b154-46d6-927b-1494d9dfcff3.png)

それぞれのナレッジの説明を入力します。
生成オーケストレーションモードのエージェントは、ユーザーの入力内容に回答するため、積極的にナレッジを検索します。そのため、**どういったナレッジなのかを説明**します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/7207a823-19a0-414f-a201-26ceacc2efb2.png)


```ナレッジの説明
このナレッジ ソースは 店舗営業時間.docx に含まれる情報を検索します。

店舗に関する基本的な情報（営業時間）が格納されており、
ユーザーからの店舗に関する質問に対して、こちらのナレッジを用いて回答を生成します。
```

https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/knowledge-copilot-studio#generative-orchestration

## 手順５_アクションを構成する
つづいてアクションを構成していきますが、今回はPower Automate のクラウドフローを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/3034060b-cd65-4f5e-a336-c9e202b10719.png)

フローの中身はこういった形式にします。
エージェント側から入力パラメーターを受けて、Dataverseの予約テーブルにレコードを追加するフローとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/93e1b76b-7c90-48e0-af27-c3145a9610f6.png)

作成が終えると、アクションに追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/626902dc-ee3d-470c-957d-06f1c70cd684.png)


ここからも重要な作業があります。それは、アクションの詳細の説明や入力パラメーターの説明の追加です。

生成オーケストレーションモードのエージェントから実行されるアクションのパラメーターは、エージェントが自動的に対話形式や会話履歴から補完していきます。そのため、**アクションの実行タイミングや入力パラメーターの説明が重要**となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/7cbcc470-663e-49a1-a15a-a20bc8f0a633.png)


```アクションの説明
ユーザーから来店予約の依頼があった場合に実行されます。

ユーザーから明確に来店予約をしたい意思があった場合、
[来店予約対応]アクションを実行します。必要な情報をユーザーに質問し、入力情報を補完してください。
応答は日本語で対応する必要があります。
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/d2633ece-0389-4fcd-ad02-52a4ec933c76.png)

https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/advanced-plugin-actions


## 手順６_トピックを構成する
ここまできたら基本的には最適なナレッジ検索やアクションを動的に選択し、最適な応答を自動生成するエージェントは構成できているはずです。
仕上げとして、トピックも構成していきます。

今回はエージェントがナレッジ検索をしたいけれども抽象的な質問があった場合にもう少し深堀するためのサンプルトピックを作成します。あくまでトピックがどのように生成オーケストレーションモードで呼び出しされるかをテストする目的で構成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/8853f229-6148-4f42-b710-f427278acf7f.png)

生成オーケストレーションモードのトピック場合、初期設定は[エージェントによりトリガーされる]というトリガーで作成されますので、ここにも説明を追加します。

```トリガーの説明
店舗に関する質問 について、具体的な質問内容を補完するために、ユーザーに尋ねるためのトピックです。
ユーザーからの入力内容や質問が「店舗に関する質問」 など具体性に欠ける場合のみで呼び出されます。
具体的な質問内容が既に入力されている場合やナレッジから回答が生成された場合にはこちらのトピックは利用しません。
```

本トピック内で評価するための入力変数も設定しておきます。
こちらの変数の値も生成オーケストレーションモードで動的に作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/67b40b60-3d8e-445b-9fa5-7883b6b74497.png)


https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/advanced-managing-topic-inputs-outputs


## 手順７_テストする
ここまできたらいったん構成は完了です。それではテストしたいと思います。

テスト実行した場合、クラシックオーケストレーションモードにはなかった[活動マップ]というUIで思考の過程が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/2e3d9360-9a42-4193-baee-33f6afac9684.png)


### 具体的な質問があり、ナレッジ検索を積極的に利用されるケース
イメージ通り、ナレッジ検索をおこない、正しい回答が得られました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/ef9c5518-8357-4c2e-9f55-24591f19bb46.png)

### そのまま来店予約の依頼があるケース
このまま来店予約をしたかったのですが、入力補完が失敗しています。
このあたりは指示の書き方や日本語対応が待たれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/eeae0137-15cc-4513-b1a3-087bdf9c30ef.png)

### 改めて来店予約してみる
気を取り直して、新しいセッションで来店予約します。
来店予約をしたい旨を伝えると、なぜかナレッジ検索をした（積極的に検索する仕様のため）あとアクションが自動で呼び出されました。
加えて、**入力パラメーターを補完するかたちで自動的に質問**してきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/d9e06cfa-d1ae-46b2-8460-2ec188f51a57.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/1e16dac3-c00d-43a5-af5c-dfb78c490b55.png)

あれこれ質問してきて、アクションが完了しました。いったんは成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/ab211812-5192-4698-8c2f-06ed8903b4d2.png)


### あいまいな質問があり、トピックを呼び出されるケース
参考として作成したトピックが呼び出しされるか確認します。
具体的な質問が欠けていると評価されたため、トピックが呼び出しされました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/df5ce9dd-77b9-4a03-8b4d-f488aaee5efb.png)


# おわりに
以上で生成オーケストレーションモードのエージェントの作成について説明させていただきました。
基本的には**このエージェントに自律型トリガーを作成すると**自律型エージェントになります。
例えば、トリガーはOutlookメールなどにして、メールにも反応できるようにしてもいいです。

あたらしい開発手法のため馴染みづらい側面もあると思いますが、非常にわくわくするエージェント開発となります。柔軟な対応が必要なケースなどに向いているでしょう。