Power Automate for desktop(PAD)からOpenAI APIを呼び出してみる
流行りの生成AIですが、PADでも使うことが出来ます。これによって、RPAのフローの一部に生成AIを取り込むことが可能です。
まずPADでは、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
フロー内の以下はご自分のニーズに合わせて変更してください。
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