Microsoft Copilot Studio で作成した Teams GPT ボットでドキュメント検索する

## 更新情報
2024/03/15 
現在、Copilot Studio では「会話プラグイン」機能にて SharePoint を参照した回答得る機能をノーコードで作成できます。ただ現在プレビュー段階なので動きは保証できませんので、下記の実装をおすすめします。
参考：[Microsoft Copilot 向け会話プラグインを作成する (プレビュー)](https://learn.microsoft.com/ja-jp/microsoft-copilot-studio/copilot-conversational-plugins)

おすすめの実装としては、トピック機能で行う方法です。
通常のトピック機能でも「生成型の回答を作成する」ステップを追加できるようにアップデートされたため、こちらを使用することで以下に長々と解説している開発をせずに済みます。
SharePoint URL を入れ、ボットの認証設定をすることで、Teams で SharePoint を参照した回答を得ることができます。こちらの方が断然シンプルかつ簡単です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/29b2a8ae-1e9c-3733-0664-5bdf1c3dcd68.png)


## はじめに
行ったこととしては、Teams 上に SharePoint からドキュメントを検索してくれるボットを作成しました。

GPTと打つと起動し、質問内容からドキュメントを参照し、回答してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/f81f9bb1-ca03-21a0-af7a-8fd9b4f181fa.png)

## 必要なリソース
作成に必要なリソースを列挙します。

**・Azure Cognitive Search（Azure AI Search）**
→ SharePoint のドキュメントライブラリの検索インデックスを作るのに必要です。

**・Azure Functions**
→ Azure Cognitive Search（Azure AI Search）からドキュメント内容を取得し、要約する機能を Semantic Kernel で実装します。

**・Copilot Studio で作成したボット**
→ Teams から質問に対して回答をします。

## 処理のフロー
処理の流れを書きます。

ボットへ質問する
↓
Azure Functions 起動
↓
Azure Functions が質問内容に近いドキュメントを Cognitive Search（Azure AI Search）へ検索しにいく
↓
Azure Functions が取得したドキュメント内容をもとに要約する
↓
要約した文章を返す（ボットが回答する）:tada:
## Cognitive Search（Azure AI Search）の実装方法
以下記事に方法を記載しましたので、参考にしてください。
[Azure Cognitive Search（Azure AI Search）で SharePoint ドキュメントのインデックスを作成する](https://qiita.com/kkubo124/items/9d510091480073feee7a)

## Azure Functions の実装方法
以下記事に方法を記載しましたので、参考にしてください。
[Azure Cognitive Search（Azure AI Search）× Semantic Kernel でドキュメントの内容を要約する](https://qiita.com/kkubo124/items/c171c228f2fec2a4c476)

## ボットの実装方法
① Teams で Power Virtual Agent をインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/bbddafd9-3ce7-fab9-d1d5-74dc2a1460e6.png)

② Copilot タブから新しい Copilot を作ります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/c56a4c24-24af-c6b7-f6a1-5f4c1c5cc962.png)

③ 作成したい場所のチームを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/7e570722-01ed-791b-25ee-7a6919b92aaa.png)

④ 作成する Copilot の名前を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/c4bcc13e-11e5-7a0e-7ef1-6c4f6c48ebfd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/fa512924-0563-88f8-916c-6d5361a8b5d7.png)

⑤ トピックメニューから新しいトピックを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/6a6afd10-b54a-018c-b244-2da6d1c39abd.png)

⑥ Copilot 起動する際のフレーズを決めます。何でもよいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/993b1d7f-a978-1e73-96f3-115633d2daee.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/255703c3-b095-3b5a-1307-3bf805767af7.png)

⑦ フローを作成します。まず質問ステップを追加し、Copilot が起動した際のメッセージを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/a6e5f296-380e-0593-23ac-a51c3f923e9e.png)

⑧ その下にアクションステップを追加し、PowerAutomate を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/091f3dc8-68a3-bc15-caa7-507d16c70d32.png)

⑨ PowerAutomate 内のフローを編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/55895a6e-c7ba-b2ab-7faf-1fc60e4f4de4.png)

全体としてはこんな形になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/483c18d1-4d03-e3d0-812e-50beb6e079b5.png)

質問内容を変数化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/792d0b88-c972-9216-f9bb-859b1f905dc6.png)

作成しデプロイした Azure Functions の API を呼び出します。Azure Functions 内で定義したリクエストパラメータの形に合わせて、リクエストボディを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/a56aae19-5914-30b9-6e8f-e931570a0b86.png)

Azure Functions のレスポンスに合わせて、得たい Json を定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/9efa63b2-acb9-8df3-6b3f-b1cbb613691e.png)

Azure Functions のレスポンスから最終的にボットに回答させたい情報を変数として定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/b59f1c31-ec23-80e2-291c-cee958514caf.png)

⑩元のフローに戻り、最終的にボットに回答させたい文章の形を作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/961c0645-94bb-06ae-3670-1b2e2e80f8b2.png)

⑪これで完成したので、テストします。チャットエリアで、呼び出しフレーズから入力しテストしてみましょう。上手く回答が得られれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/b0a97b00-a302-fa5f-6371-308a6b7d4aaa.png)



## ボットの公開
実際の Temas チャットでボットを使うためには公開する必要がありますので、公開します。

公開メニューから公開できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/c598171f-553b-046e-1359-86529a99b2a8.png)

Teams にボットを追加しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/61d72cb0-e487-d8ef-f664-e15b2914f946.png)

追加完了すると、利用できるようになります:tada:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409268/ff4a4163-a88a-36b6-107c-eacf1632fc18.png)

## おわりに
社内情報などを ChatGPT に聞きたいとき、普段使用している Teams から聞けたら便利ですよね。それが実現できるのが、Power Virtual Agent（Microsoft Copilot Studio）です。
Copilot に参照させたいデータはカスタマイズ可能です。Cognitive Search のデータソースとインデックスを変更するだけです。取得したデータを元に様々なタスクができるのが Semantic Kernel です。これらを組み合わせたのが今回の検証になります。ぜひ参考にしてみてください。