Power Virtual Agents を使用して Azure OpenAI Service の ChatGPT と連携し、会話履歴と文脈に基づいた回答を生成する方法


# はじめに

早く社内業務で ChatGPT を利用したい、利用したいと迫られているという方も多いと思います。そして、この数か月だけで恐ろしいほど新しい技術、サービス、機能が生まれている状況であることから、短時間での実装が求められていると思います。

そのため、入力インターフェイス、チャットのエクスペリエンス、実装コストを抑える、短期での実装等、色々頭を悩ませている人もいると思います。

まず、入力インターフェイスやチャットエクスペリエンスという意味では、Microsoft Teams を業務で利用している場合、Teams に組み込めたら楽、使いやすいと思います。

そして、実装コストを抑える、短期での実装については、ローコードを活用することが解決策になると思います。

そのため、今回は、以下のように、Power Virtual Agents を使用して Azure OpenAI Service の ChatGPT と連携し、会話履歴と文脈に基づいた回答を生成する方法について紹介します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/76f51f03-7488-a8d9-f297-2e4b06bc1d01.png)

# 実装アプローチ

まず、私自身、Power Virtual Agents で Azure OpenAI Service の ChatGPT と連携すること自体はそれほど難しくないと思っていました。以下で紹介したように、Power Automate から HTTP コネクタを利用すれば簡単だからです。そして、Power virtual Agents 側で Power Automate を呼べばいいだけです。

https://qiita.com/Takashi_Masumori/items/96b9e0f1590762fd6fad


しかし、単発で質問したり依頼を出来るものの、過去の会話を保持し、会話履歴と文脈に基づいた回答を生成することは難しいのでは？と思っていました。

:::note
Power Apps は、Collection を利用することで簡単に実現できます
:::

少し頭を悩ませていたところ、以下のような情報を発見しました！！！

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

ソリューションで提供されているので、こちらを利用すれば簡単に実現できます。本当にありがとうございます！！！

:::note warn
現状、プレビューの方色々と制約もあるため、公開までやる場合は、以下のクラシック側を利用するのが良いと考えます。

**Power Virtual Agents (classic) integration example using Bot Framework Composer**

:::

https://learn.microsoft.com/en-us/power-virtual-agents/preview/limitations

インポート後、少し内容を変えています。まず、最終的に、フロー自体は、以下の通りかなりシンプルです。中身を簡単に解説します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/24885f80-c791-d1b7-68ee-aeb7f9a310d5.png)

以下の通り、二つのテキスト情報を受け取っています。片方はチャットから入力された情報、もう一つは過去のやり取りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/c5d63fe9-e115-ed55-e34d-5496cc1007e3.png)

システムプロンプトは変数で設定されているので、必要に応じて変えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/58f79f82-6323-0c05-7510-d4e99946878e.png)

ポイントは以下の箇所です。以下の通り、過去のやり取りとチャットから入力された情報をくっつけています。if 文で書かれているのは、初回は過去のやり取りがないためです。クォーテーションが多くてややこしいですが、上手くいかない時は、エラー内容を踏まえ、 ChatGPT に聞いたりしていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/b24bfb03-fd42-5461-5a53-e81fd2e6afed.png)

```
json(
  if(
    empty(triggerBody()?['text_1']),
    concat(
      '[{"role": "system","content": "', 
      variables('System Prompt'),
      '"}, {"role": "user","content": "', 
      triggerBody()?['text'],
      '"}]'
    ),
    concat(
      '[{"role": "system","content": "', 
      variables('System Prompt'),
      '"}, ', 
      triggerBody()?['text_1'],
      ' {"role": "user","content": "', 

      triggerBody()?['text'], 
      '"}]'
    )
  )
)

```
Power Virtual Agents 側は基本修正いりませんが、ポイントは、変数を使って、受け取った回答内容を追記している部分です。これを Power Automate 側で結合している感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/672180a3-aa5e-9c8d-4fea-6ffa097f83b5.png)


```
Global.FullDialog 
& "{""role"": ""user"", ""content"": """ & Topic.OriginalUnrecognizedTriggerPhrase & """},"
& "{""role"": ""assistant"", ""content"": """ & Topic.GeneratedAnswer & """},"
```

:::note warn
テストした際、以下のようなエラーになる場合は、Power Automate のフローを呼ぶ処理の部分を再作成 (同じアクションを作成して、元々のアクションを削除)ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/03852d3e-2667-b90c-8521-4d8303aecd1a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/42fda290-4f44-c494-8479-45fc89404eb7.png)

なお、Activity.Text は以下にございます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/ef81f62f-65e5-4284-60d7-c6b51e33010a.png)

:::


アーキテクチャとしては以下のような感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/bb5ab3b1-6fd2-948f-faa1-be38b1133575.png)

以下のようなアーキテクチャにも出来るとは思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/a96a3244-ff91-475b-d104-327706a83ebd.png)

# まとめ

今回、Power Virtual Agents を使用して Azure OpenAI Service の ChatGPT と連携し、会話履歴と文脈に基づいた回答を生成する方法について紹介しました。社内業務で ChatGPT を利用したい、利用したいと迫られているという方も多いと思いますので、一つのアプローチとして参考になれば幸いです。