Power Apps で AI Builder 経由で ChatGPT 連携する (会話履歴と文脈に基づいた回答を生成する)


# はじめに

これまで、Azure OpenAI の API をベースに Power Platform から ChatGPT を利用するアプローチについて沢山記事を書いてきました。

https://qiita.com/Takashi_Masumori/items/8a07fb6d1869967ce1f9

https://qiita.com/Takashi_Masumori/items/a2c716c8529aca9993ef

https://qiita.com/Takashi_Masumori/items/975ed38be5879e2ee5c8

https://qiita.com/Takashi_Masumori/items/12095390a633b8789522

ローコードのため手軽に実装できますが、Power Platform から Azure OpenAI Service への接続について、ネットワークセキュリティ周りで考慮が必要です。

もちろん、組織の要件を踏まえ、上記を参考にしつつ、実装していくことは可能ですが、今回は、AI Builder を利用してより簡単に実装する方法について紹介します。

# AI Builder による GPT 連携

まず、以下の通り、AI Builder から Azure Open AI GPT 機能にアクセスすることが可能です。

https://learn.microsoft.com/ja-jp/power-platform-release-plan/2022wave2/ai-builder/preview-access-openai-gpt-capabilities-ai-builder

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/9ad1ba51-9704-75b5-9eba-a8be004709d8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/a5d3df1e-cc82-4d89-b87b-ffd36b646c0b.png)

上記はテンプレートのため、テンプレートのプロンプトが勝手に入っていますが、例えば、いずれかのテンプレートを選択し、テンプレートの指示文を消してアプリを作成してみます。そうすると以下の通り自由記述で ChatGPT 連携することが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/ce7c4433-ee25-8d16-c24c-e8ada4644877.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/4847cee9-099c-73bf-1c8a-b1bdd41d2eff.png)

こちらの AI Builder を利用することのメリットは、以下のような Power Platform に閉じた構成となる点です。あくまで、裏で Azure OpenAI Service を利用しているという感じでしょうか。ただし、こちらのテナントでは、Azure 側で Azure OpenAI Service のリソースの作成やモデルのデプロイは行っていません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/0eafa1be-ec3c-677a-9d73-77c79cb9fce7.png)

そのため、こちらのアーキテクチャの場合、これまで紹介してきた以下のような構成において、Power Platform と Azure OpenAI Service 間のネットワークセキュリティや認証周りについての考慮が不要になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/b4c62b7a-32fe-3301-7188-57983a8203f0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/e47146ab-98c4-5e3f-4d82-586c9464ae7d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/044294ce-06d9-f79c-3710-73f22e3f8798.png)

ただし、構成がシンプルになる分、いくつか気になる点がございます。例えば、これまで紹介してきたアーキテクチャのように会話履歴と文脈に基づいた回答を生成することが出来るのかという点です。今回は、これまで紹介してきたアプリからそれほど変更はせずにこちらを実現する方法について紹介します。

# AI Builder [Create text with GTP] で会話履歴と文脈に基づいた回答を生成する

## Power Automate 側

まず、AI Builder を利用する Power Automate 側はこんな感じです。色々手段はあると思いますが、今回は、元々作っていたものをそれほど変えずに実装したたためこのような感じにしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/1eb8367e-6be6-7ac2-69e9-27161eb35c9d.png)

リクエスト部分は以下のような感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/7d17515f-2053-eff5-60ed-b63aa87e7a42.png)


実行してみると、以下のような感じの文言が入ります。

```
{"model":"gpt-3.5-turbo","messages":[{"content":"日本で一番高い山は？","role":"user"}]}
```

返答は以下のような感じになります。

■１回目

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/59034c07-f549-37fa-be76-387f7759897a.png)

■2回目

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/4b93afdf-5213-37a5-41e1-4222586eae2e.png)

二回目のリクエスト、レスポンスは以下のような感じです。

```
{
  "model": "gpt-3.5-turbo",
  "messages": [
    {
      "content": "日本で一番高い山は？",
      "role": "user"
    },
    {
      "content": "日本で最も高い山は富士山です。",
      "role": "assistant"
    },
    {
      "content": "二番目は？",
      "role": "user"
    }
  ]
}
```

```
{"messages":[{"content":"二番目に高い山は北アルプスの最高峰、白馬岳です。","role":"assistant"}]}
```


1回目はテキストで返ってくるため、JSON の解析を条件分岐しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/b14bf188-a99d-356d-61ce-2fb58e8b59b1.png)

JSON の解析は以下のような感じで、二度フローを実行し、二回目の応答内容をベースにサンプルから生成しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/ea2f84a1-8c84-9a8d-bb43-fd319c18e9a5.png)

```
{
    "type": "object",
    "properties": {
        "model": {
            "type": "string"
        },
        "messages": {
            "type": "array",
            "items": {
                "type": "object",
                "properties": {
                    "content": {
                        "type": "string"
                    },
                    "role": {
                        "type": "string"
                    }
                },
                "required": [
                    "content",
                    "role"
                ]
            }
        }
    }
}
```

応答部分の content 部分は以下のような感じです。一応、配列形式でレスポンスが返ってくるため、last 関数を利用しています。

```
last(body('JSON_の解析')?['messages'])['content']
```

## Power Apps 側

まず、こちらのアーキテクチャの場合も、上述のように Power Automate のフローを作成することで、以下の通り、一応、会話履歴と文脈に基づいた回答を取得することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/9d873240-9480-98fc-dccc-e13160575ab6.png)

送信ボタンを押した際の処理は以下の通りであり、Power Apps 側はこれまで紹介したものとほとんど変えておらず、連携する Power Automate フローが変わっただけです。

```
UpdateContext({locLoading: true});
Collect(
    colChat,
    {
        role: "user",
        content: txtChatMessage.Text
    }
);
ClearCollect(
    colManufacturedChat,
    colChat
);
If(
    gblTotalTokens > 3500,
    ClearCollect(
        colManufacturedChat,
        LastN(
            colChat,
            3
        )
    )
);
Set(
    gblChatGPTResponse,
    ChatGTPAIBuilder.Run(JSON(colManufacturedChat));
    
);
If(
    gblChatGPTResponse.result = "0",
    Collect(
        colChat,
        {
            role: gblChatGPTResponse.role,
            content: gblChatGPTResponse.content
        }
    );
    Set(
        gblTotalTokens,
        Value(gblChatGPTResponse.totaltokens)
    );
    Set(
        gblShowlblChat,
        true
    );
    
Select(
        galChat,
        CountRows(galChat.AllItems)
    );
    ,
    Set(
        gblShowErrorMessage,
        true
    );
    
);
Reset(txtChatMessage);
UpdateContext({locLoading: false});

```

:::note 
AI Builder を利用する際は、トークン数が返ってこないため、コレクションの行数をベースにコレクションを加工したり、入力文字数が多い場合に注意を促したりすると良いかと思います。
:::

# まとめ

今回は、Power Apps で AI Builder 経由で ChatGPT 連携する方法について、会話履歴と文脈に基づいた回答を生成するという観点で紹介しました。Power Automate 側で AI Builder と連携しているため、入口を Power Virtual Agents することも可能です。

Power PlatformとAzure OpenAI Service を連携させる際、HTTPコネクターやカスタムコネクターを利用するとネットワークセキュリティへの考慮が必要となります。しかしながら、AI Builder 経由の場合、これらの考慮が不要で、ローコードベースで簡便に実装できるため、一つの手段として参考にしていただければ幸いです。