Teamsから社内利用できるGPTボットをPowerVirtualAgentsとAzure OpenAI Serviceでさくっと作る

## はじめに

今回は表題の通り、Teamsから社内利用できるGPTボットについて、簡単に紹介していきたいと思います。

個人的な利用においてはChatGPTを既に使っている方も多いと思いますが、社内や業務での利用においては、ChatGPTへの社内情報等の入力はNGという企業が多く、基本的にはAzure OpenAI Serviceを使う事になるかと思います。

独自データをどう持たせてどの領域で活用していくか(Azure Cognitive Search, ベクトルストア等へのデータの蓄積と検索)という大きな論点はあるものの、とりあえず日常業務で使いたいからUIを早く解放して欲しいという声も多いのではないでしょうか？

生成AIは、もはや影響しない領域はないと言っていいテクノロジーであるため、IT領域の一部のメンバーだけがユースケースを考えるというより、全社員が日常業務で利用しつつ(リテラシーを上げつつ)、各業務ドメインでのユースケースを考えていくというのが正しいアプローチではないかと思います。

とりあえずUIだけ解放するという意味では、Azure OpenAI ServiceのPlaygroundからデプロイするのが最も楽かつ速いと思います。
数クリックでデプロイまで済む上に、アクセス時にAzure AD認証付きでブラウザから簡単にアクセスできます。

一方で、業務の中心のUIが既にTeamsになっているという企業も多く、GPTが業務に馴染んでいく程、いちいちブラウザへアクセスせずに、チャットツールからそのまま使いたいというケースも出てくるかと思います。

今回は社内でのGPT利用の1つのパターンとして、Teams経由でのPowerVirtualAgentsとAzure OpenAI Serviceを使ったデモを紹介したいと思います。

## アーキテクチャ
今回のアーキテクチャの概要は以下です。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431306/b0412eb5-9fb8-0b73-423e-207aeea3a5ee.png)

Teams上でPowerVirtualAgentsを使ってユーザーとやり取りし、PowerVirtualAgentsからPowerAutomateを呼び出し、Azure OpenAI ServiceのAPIを叩いてレスポンスを同じ流れで返すという形になります。

単純にユーザーからの問合せ内容をそのままAzure OpenAI Serviceに流してレスポンスを返すというのが最も簡単ではありますが、そうなるとそれぞれが独立したやり取りになるため、これまでの会話の文脈を無視した回答になってしまいます。

そこで、会話の履歴をPowerVirtualAgentsの変数に持たせておき、会話の履歴情報を順次加えながらクエリする事で、GPTから会話の文脈に応じた回答を引き出す事ができます。

Teamsから利用した実際のデモは以下です。
(以下はテスト用の画面ですが、ボットを公開すればTeamsの通常のチャットのように使えます)

■デモ1
![demo1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431306/3b1c46e3-7ff1-a9d9-18ae-aa08fcb3e24c.gif)

■デモ2
![demo2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431306/03385bf3-c95b-cc92-3aa3-78f0ccfb1afe.gif)

どちらも文脈を踏まえた回答ができている事がわかるかと思います。

デモ1の最後のGPTへのクエリは以下のようになっており、会話の文脈を合わせて渡しているので、文脈に応じた回答が実現できています。
```
{"role": "user", "content": "日本で一番高い山は？"},
{"role": "assistant", "content": "日本で一番高い山は富士山です。"},
{"role": "user", "content": "その高さは？"},
{"role": "assistant", "content": "富士山の高さは3,776メートルです。"},
{"role": "user","content": "二番目は？"}
```

PowerVirtualAgentsだけでユーザーとのUIの提供と会話履歴の保持も完結できるのは非常に楽ですね。

本構成はこちらで提供されているソリューションを参考にしています。

https://powerusers.microsoft.com/t5/Power-Platform-Integrations/Integrate-a-PVA-chatbot-with-Azure-OpenAI-ChatGPT-using-the-Chat/m-p/2146180#M249

ソリューションとして提供されているので、PowerPlatformとAzure OpenAI Serviceを一定触った事がある方ならすぐに実装できると思います。
(ちなみにデフォルトのプロンプトは友達の設定になっており、絵文字付きで回答が返って来るため、この辺りは適宜調整頂くと良いかと思います)

## 本構成についての補足

今回は非常にシンプルなユースケースでしたが、ここから色々と拡張していく際にUIのPowerVirtualAgentsと後ろのPowerAutomateが活きてくるかと思います。

質問内容によらず、全てGPTに聞くのはナンセンスなので、社内の基本ルールなど、答えが決まっているような問いの場合は、PowerVirtualAgentsでそのまま返してしまったり、GPT利用においても、メールドラフト作成やアイディア出しなど一般的なユースケースなのか(そのままGPTに流すのか)、社内の独自データを検索したいのか(Azure Cognitive Searchやベクトル検索に流すのか)を振り分ける事もできるかと思います。

NGワードのチェックや、入力プロンプトを綺麗にするために選択肢の入力形式にしたり等もできるため、バックエンド側で全部吸収するという形より、UI側で一定ロジックを含めたコントロールができる利点は大きいでしょう。

またPowerAutomateはiPaaSとしてのコネクタが豊富なため、明らかに関連する社内情報を先にシステムからAPIで取ってきて、GPTにユーザーからの問合せと合わせてクエリする(コンテキスト付きのプロンプトを作る)という事もできるかと思います。

プロンプトエンジニアリング観点でのテンプレートを用意しておいて、ユーザーの入力をこのタイミングで一部整形するというのも一つでしょう。

PowerAutomateでやれるところはPowerAutomateでやってしまって、独自データの検索等、LangChainやLlamaIndex等を使った深い処理をやりたい場合は、AzureFunctions等へ流すという拡張も容易にできるかと思います。

Playgroundのように、完全ノーコードだとかゆい所に手が届かない事が多く、一方で全てコードベースだと属人性が高くなるため、PowerVirtualAgentsとPowerAutomateを使ってローコードで処理できるところは任せてしまうというのが、選択と集中の観点でも良いバランスになるのではないかと感じました。

## まとめ
いかがだったでしょうか。

今回はTeamsから社内で簡単にGPTボットを利用するユースケースを紹介しました。

色々と検討軸はありますが、まずはTeams等から簡単に社内で利用できるとなれば社内の風向きも変わって来るのではないでしょうか？

実際に業務で利用するようになると、関係者間でのディスカッションも含め、面白いアイディアや要望がどんどん出てくるのではないかと思います。


■参考
Qiita記載記事
・[AIで遊べるデモサイト「AI World」](https://qiita.com/jw-automation/items/5cbb1c1cad08010dd823)
・[ChatGPTとRPAの関係性](https://qiita.com/jw-automation/items/1cbe2f39a549e1a5ba3f)
・[Deep Metric Learning](https://qiita.com/jw-automation/items/7bbe1c872fcec7fa6c1d)
・[ホテル暮らしはクラウドである](https://qiita.com/jw-automation/items/2fcd6f6e15e470196646)