見出し画像

Power Automate for desktop(PAD)からOpenAI APIを呼び出してみる

流行りの生成AIですが、PADでも使うことが出来ます。これによって、RPAのフローの一部に生成AIを取り込むことが可能です。

まずPADでは、AI Builder配下のGPTアクションがあるので、これを使っても良いです(ただしプレミアム機能です)。

AI Builderのアクション
GPTでテキストを作成するを配置すると簡単に出来る

ですが、このアクションだと後続に目視による結果確認アクションを挟まないと、エラーになっちゃうんですよね。これではやや使い勝手がよろしくないです。

エラーメッセージの例
メッセージ表示または入力ダイアログ表示が必要というエラーが出る

これを回避するために、標準アクションを使わず、OpenAIのAPI呼び出しを使うことも出来ます(Azure OpenAI ServiceでもOK)。今回はそのフローを共有します。

やり方はいろいろなところに書いてありますので、まずはOpenAI側でAPIキーを取得してください。取得したら、以下をPADに貼り付けて使ってみてください。

このサンプルフローは、GPTにより、テキストファイルから請求書の項目をJSON形式で抽出するフローです。

# 👇ファイルの読み取り
SET テキストファイルパス TO $'''C:\\temp\\test.txt'''
File.ReadTextFromFile.ReadText File: テキストファイルパス Encoding: File.TextFileEncoding.UTF8 Content=> FileContents
# 👇ダブルクォーテーションを削る
Text.Replace Text: FileContents TextToFind: $'''\"''' IsRegEx: False IgnoreCase: False ReplaceWith: $'''%''%''' ActivateEscapeSequences: False Result=> FileContents
# 👇GPTの設定、プロンプト
Display.InputDialog Title: $'''API Keyの入力''' Message: $'''API Keyはご自分で取得してください''' InputType: Display.InputType.Password IsTopMost: True UserInput=> UserInput ButtonPressed=> ButtonPressed
SET SystemPrompt TO $'''You are a document extraction tool designed to process JSON structure from the document. Your task is to identify and extract relevant information from each data and return this data as an array of JSON objects with accuracy.'''
SET Prompt TO $'''以下の情報をJSON形式で取り出してください。各項目が複数回出現する場合もすべて取り出してください。出力する前に、情報が完全であることを再確認してください。

###ルール###
- Customer: 文字列
- OrderDate: 日付型
- Items: 配列

以下はItems配列内の繰り返し項目です。
- Item: テキスト
- Tax Type: テキスト
- Total: 数値
- AccountCategory: テキスト

###本文###
%FileContents%

###追加指示###
出力する前に、すべての情報が完全であることを再確認してください。特に、項目が漏れていないか、データ形式や数値が正しいかをチェックしてください。'''
# 👇改行を別のものに置き換える
Text.Replace Text: Prompt TextToFind: $'''\\r\\n''' IsRegEx: True IgnoreCase: False ReplaceWith: $'''\\n''' ActivateEscapeSequences: False Result=> Prompt
SET GPTKey TO UserInput
# 👇API呼び出し。結果をパースする
Web.InvokeWebService.InvokeWebService Url: $'''https://api.openai.com/v1/chat/completions''' Method: Web.Method.Post Accept: $'''application/json''' ContentType: $'''application/json''' CustomHeaders: $'''Authorization: Bearer %GPTKey%''' RequestBody: $'''{
  \"model\": \"gpt-4o-mini\",
  \"messages\": [
    {
      \"role\": \"system\",
      \"content\": [
        {
          \"type\": \"text\",
          \"text\": \"%SystemPrompt%\"
        }
      ]
    },
    {
      \"role\": \"user\",
      \"content\": \"%Prompt%\"
    }
  ],
  \"temperature\": 0.3,
  \"max_tokens\": 4000,
  \"top_p\": 0.3,
  \"frequency_penalty\": 0,
  \"presence_penalty\": 0,
  \"response_format\": {
    \"type\": \"json_schema\",
    \"json_schema\": {
      \"name\": \"InvoiceDetail\",
      \"strict\": true,
      \"schema\": {
       \"type\" : \"object\",
      \"properties\": {
        \"Customer\": {
          \"type\": \"string\"
        },
        \"OrderDate\": {
          \"type\": \"string\"
        },
        \"Items\": {
          \"type\": \"array\",
          \"items\": {
            \"type\": \"object\",
            \"properties\": {
              \"Item\": {
                \"type\": \"string\"
              },
              \"Tax Type\": {
                \"type\": \"string\"
              },
              \"Total\": {
                \"type\": \"number\"
              },
              \"AccountCode\": {
                \"type\": \"string\"
              }
            },
            \"required\": [
              \"Item\",
              \"Tax Type\",
              \"Total\",
              \"AccountCode\"
            ],
            \"additionalProperties\": false
          }
        }
      },
      \"required\": [
        \"Customer\",
        \"OrderDate\",
        \"Items\"
      ],
      \"additionalProperties\": false
    }
  }
}
}''' ConnectionTimeout: 50 FollowRedirection: True ClearCookies: False FailOnErrorStatus: False EncodeRequestBody: False UserAgent: $'''Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.21) Gecko/20100312 Firefox/3.6''' Encoding: Web.Encoding.AutoDetect AcceptUntrustedCertificates: False ResponseHeaders=> WebServiceResponseHeaders Response=> WebServiceResponse StatusCode=> StatusCode
Variables.ConvertJsonToCustomObject Json: WebServiceResponse CustomObject=> GPTJsonAsCustomObject
BLOCK 'Error Block'
ON BLOCK ERROR all
    GOTO ブロックエラー発生時
END
    SET GPTResponse TO GPTJsonAsCustomObject['choices'][0]['message']['content']
END
Variables.ConvertJsonToCustomObject Json: GPTResponse CustomObject=> ResponseDetailJsonAsCustomObject
EXIT Code: 0
/# -------------------------------------------------------------------------
👇レスポンスがエラー時はこの地点に飛ばす
-------------------------------------------------------------------------#/
LABEL ブロックエラー発生時
ERROR => LastError
SET PADエラーメッセージ TO $'''%LastError.Location%
%LastError.Message%'''
Display.ShowMessageDialog.ShowMessage Title: $'''エラー発生''' Message: $'''%PADエラーメッセージ%
GPTレスポンス取り出しでエラー発生''' Icon: Display.Icon.ErrorIcon Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False
EXIT Code: 0


フローの例
14でcompletion APIを呼び出しています


フロー内の以下はご自分のニーズに合わせて変更してください。

  • 2:「変数の設定」 ➡ 処理対象のファイルパスを指定する

  • 7:「入力ダイアログの表示」 ➡  ご自身のAPIキーを入れてください

  • 8,9:「変数の設定」 ➡ 用途に即して、システムプロンプト、ユーザープロンプトを入れてください。難しければChatGPTなどに頼ると良いと思います。

  • 14:「Webサービスを呼び出します」 ➡ 要求本文内のmodel、temperature、response_formatのjson_schemaなどを用途に応じて調整してください

なお正確な情報は、公式ドキュメントを参照してください。https://platform.openai.com/docs/

やってみて気づいたポイントが2つありました。

1- 要求本文にダブルクォーテーションが混じっているとダメみたいです。なので、5番目の置換アクションで削っています。

ダブルクォーテーション削除
ダブルクォーテーションを削っている

2- 同じく要求本文に改行があるとダメみたいです。ということで、これも置換アクションで置き換えています。

改行の削除
改行を置き換える

このようにPADに生成AI機能を取り込むことで、一部の非定型的な判断や情報抽出なども対応可能になりそうです。宜しければお試しください。

今回は以上です。この記事が気に入ったら、フォローお願いします!
また、👇からKMDSホームページの記事も覗いてみてください。
#Power Automate for desktop | 株式会社KMDS