【AI Builder】プロンプトビルダーを利用して、GPTモデルを利用したアプリを作成する w/Dataverse

みなさん、こんにちは。日本マイクロソフトの佐々木です。
本日はPower Platform の AI Builderの一機能であるプロンプトビルダーを利用して、GPTモデルを利用したアプリを作成してみたいと思います。

# はじめに
前置きとして、AI Builderとプロンプトビルダーの概要をご紹介します。

## AI Builderとは
簡単にいうとPower Platformの中でAIモデルを利用したり、カスタムで作成できる機能です。

シナリオに応じて、あらゆるモデルを提供しており、本日紹介させていただくのは、下記の画像でいうと[プロンプト]の部分で、生成AIであるGPTモデルをネイティブで利用できる機能です。
他のモデルの利用方法などは、先人がブログ等で紹介しているので、ご参考ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/480ce6af-47a8-cde5-1f49-b666c5a0e7fd.png)

## プロンプロビルダー（AI プロンプト）とは
先述のとおり、Power Platform内でGPTのモデルを呼び出すことができ、プロンプトを構築、設計、テストするためのインターフェースです。裏ではAzure OpenAIのモデルを呼び出しており、性能は同等となります。
よく使われる生成AIのプロンプトはテンプレートして提供している一方で、カスタムで生成AIを利用するプロンプトを作成することが可能です。


これまで、生成AIをPower Platform内で利用する場合、一般的にはAzure OpenAIのAPIを利用し呼び出すことになっており、開発難易度や企業インフラ含めてハードルの高いケースが多々あったかと思います。
プロンプロビルダーを利用することによって、ネイティブに連携できるため、諸々の問題を解決したうえで、生成AIを市民開発者が自由に利用することが可能となりました。

https://learn.microsoft.com/ja-jp/power-platform/release-plan/2024wave1/ai-builder/gpt-prompt-builder

### プロンプロビルダーの特徴
1. モデルの種類
Azure OpenAI GPT-turbo (3.5) 
Azure OpenAI GPT4（プレビュー）


1. 入力データ
・動的入力をサポートしているため、Power Platform内での引数を動的コンテンツとして取り扱うことが可能です。
・また、入力データとして、Dataverseのテーブルを参照することが可能です（プレビュー）これにより、プロンプトに幅を持たせることができ、簡易的なRAGも実現することが可能です。

1. 出力フォーマット
生成AIからのアウトプットをテキストあるいはJSON形式のいずれか、設定レベルで定義することができます。そのため、後続のフローやアプリにおいて、取り扱いやすい形式で出力されるのは大変うれしいところです。

https://learn.microsoft.com/ja-jp/power-platform/release-plan/2024wave1/ai-builder/define-specific-output-formats-prompt-builder

https://learn.microsoft.com/ja-jp/power-platform/release-plan/2024wave1/ai-builder/use-own-enterprise-data-gpt-actions


### プロンプロビルダーのシナリオ
生成AIを利用するシナリオ全般に対応可能となります。よくある例ですと、要約、テキスト分類、情報抽出、キーワード生成、感情分析、データに関するQAなど、プロンプトをカスタマイズすることによって、様々なシナリオに応用することが可能となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/b224d17a-afb9-8ef7-1e4d-9193f5e111ca.png)


# 実際にさわってみる
実際に簡単なシナリオを想定してで利用してみます。

## プロンプロビルダーにアクセス
プロンプロビルダーへは[Power Apps]から[AI プロンプト]として、アクセスすることができます。
カスタムプロンプトとして、1から作成することもできますし、テンプレートも複数用意されているのがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/ce226062-295c-c4e5-abe9-d75a66f0e660.png)

## デモ
カスタムプロンプトを作成してみたいと思います。
生成AIのシナリオでよくある、校正、要約、キーワード抽出あたりを試してみたいと思います。

ただ、Dataverseのデータを参照している箇所については、情報が少なくブラックボックス的な要素があり、プロンプトの書き方が正確ではない情報も含む可能性があります。要勉強・要検証です。

### 今回想定するシナリオ
今回、フロントワーカーが設備の不具合を報告するアプリを想定します。
作業員が利用するため、極力入力作業などは省力化し、生成AIが文章を校正し、報告作業を簡略化させたいです。
流れは下記のとおりです。
1. ユーザーがアプリに不具合内容やトラブルシューティングの内容を記入（音声入力が望ましいですが、今回は割愛）
1. 【生成AI①】文章を校正します。その際に、専門用語や不要な用語を訂正します。専門用語はユーザー辞書のようなテーブルをDataverseに作成します。
1. 【生成AI②】キーワードを抽出します。こちらもDataverseのテーブルを参照させつつ、設備名、件名、対処内容など報告業務に必要な情報を抽出していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/7e0eae38-94ec-ef83-86ad-56a5626b8468.png)

### AIプロンプトの作成 - 文章校正
まず、ユーザーからの入力を校正するプロンプトを作成していきます。
今回は下記のようなプロンプトを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/24fc007e-ed11-faa6-4ff6-fe5400c0902e.png)

また、出力はJSON形式で受け取ったほうが、のちのち扱いやすいので、JSONをしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/1a232b04-bef2-c3a1-69fe-65f5d449fe9a.png)

プロンプロビルダー内でテストすることも可能です。うまく動いています。
誤用例としては、
間 -> AIDA
直停 -> チョコ停（ちょこっと停止という意味みたいです）
など、音声入力での変換ミスであろう内容を想定して、ユーザー辞書テーブルを作成・参照させています。文脈を鑑みて変換してくれていそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/c6e12cf4-b01c-7fab-7d09-e05d0e01a785.png)


モデルはGPT4を利用しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/8423682f-4af6-58a6-1fd3-22ba2761f3ce.png)


### AIプロンプトの作成 - キーワード抽出
うえと同じ要領でキーワード抽出のプロンプトも作成していきます。
プロンプトを作成する専門ではないのでざっくりですが、それっぽく作成しました。
ユーザーからの入力に対して、設備を抽出するときに、設備テーブルを参照させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/1d93df92-b8fb-3801-c541-21837f164fe5.png)

テストした結果も良好です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/a4907993-0570-c315-3592-5375cae21b93.png)



### アプリから呼び出す
あとはアプリから呼び出すだけです。呼び出し方はAI Builderと同じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/46fa59c3-8a12-623d-ee7d-79f9fb2d7525.png)

今回は、出力はJSONを定義したためParseJSON関数を利用して、取り扱います。
（このケースであればテキストでも全く問題ないですが）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/9c3f9459-3322-987b-3cd8-e05eeb2371c9.png)

同じ要領で、キーワード抽出のプロンプトもアプリから呼び出してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/0a5291ae-3e9a-db45-6af1-99c90829c00b.png)


### もうちょっと頑張ると
（なんちゃって）RAG的な利用、過去の同一の設備内で発生した事象に対して、生成AIが対処方法をアドバイスしてくれるところまで行けるかなと思います。実際に作成してみたところ、それなりの回答は得ることができましたので、お試しください。
（ただ、検索手法などブラックボックスな要素が多いので、プロンプトの調整＆精度面は確認が必要です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/53cde4e5-5778-f0a2-3cd2-a0967ce7f8c3.png)

↓アプリから呼び出してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975138/2b5f9cec-d78e-5f6e-7c1c-46018adc20bd.png)



# おわりに
AI Builderのプロンプトビルダーの紹介は以上です。
これまで、GPTを呼び出す場合、基本的にはAzure OpenAIのAPIを利用する方法が一般的でしたが、ネイティブに連携でき、市民開発者が圧倒的に利用しやすくなったことがお分かりいただけたかと思います。
ぜひチャレンジしてみてください。