💻

Power Platform + Azure OpenAI で Adaptive Cards を自動生成する

2023/09/23に公開

はじめに

OpenAI の Function Calling は JSON スキーマ情報を入力として渡すことで生成 AI に JSON を生成させる機能です。これを利用して作るのが面倒な Adaptive Cards を作ってもらって作業の効率化をしてみます。

サンプル コード

ソリューション パッケージになっています。Azure OpenAI の各種パラメーターは環境変数になっているので各自でご準備ください。

https://github.com/karamem0/samples/tree/main/power-apps-adaptive-cards-generator

実装方法

Power Apps

アプリは以下のような感じになります。左側のテキスト入力にサンプルの JSON データを設定して Create Card from JSON ボタンをクリックするとフローを呼び出します。フローでは OpenAI を呼び出して Adaptive Cards を生成しアプリに返します。残念ながら Power Apps では Adaptive Cards をレンダリングできません。代わりにプレビューのために Send Card to Teams をクリックして Microsoft Teams で生成した Adaptive Cards を送信できるようにしています。

Power Automate

アプリから呼び出されるフローは単純に OpenAI を呼び出すだけです。

プロンプトは以下になります。JSON スキーマの description にどういうデータなのかを書いてあげると生成 AI が適切に判断してくれるようになります。特に固定値を指定したい場合は有効です。今回であれば Adaptive Cards のバージョンを 1.4 にするように指定しています。

{
  "messages": [
    {
      "role": "system",
      "content": "You are assistant that generates Adaptive Cards."
    },
    {
      "role": "user",
      "content": "@{triggerBody()['text']}"
    }
  ],
  "functions": [
    {
      "name": "AdaptiveCards",
      "description": "Adaptive Cards",
      "parameters": {
        "type": "object",
        "properties": {
          "$schema": {
            "type": "string",
            "description": "http://adaptivecards.io/schemas/adaptive-card.json"
          },
          "type": {
            "type": "string",
            "description": "AdaptiveCard"
          },
          "version": {
            "type": "string",
            "description": "1.4"
          },
          "body": {
            "type": "array",
            "items": {
              "type": "object"
            }
          }
        }
      }
    }
  ],
  "function_call": {
    "name": "AdaptiveCards"
  }
}

実行結果

サンプル データとして MSN Weather コネクタを使って取得できる天気の情報をソースとして Adaptive Cards を生成します。

これだけだとわからないので Microsoft Teams に送信してみます。サンプル データを使用して Adaptive Cards が生成されていることがわかります。今回は temperature を指定していないので結果はランダムになり、毎回異なるフォーマットの Adaptive Cards が生成されます。何回か実行してみてよさそうなフォーマットを選択できます。

おわりに

現在使っているのが GPT-3.5 だからなのかわかりませんが、JSON スキーマを細かく指定してもうまく解釈してくれないことがあります。GPT-4 であればもう少し結果が変わる可能性はあります。また Function Calling ではなく Semantic Kernel の skprompt.txt のようなテンプレートでの指定をしたほうが確実そうではあります。

Discussion