初めてRPAツールを触る方や基本的なプログラミング学習向けに、Power Automate Desktop(PAD)を使ってChatGPTのAPIを呼び出し、生成されたテキストデータを取得する方法について解説しています。ご自身の環境で動作可能なフローのテンプレートも共有して説明していますので、Power Automate Desktopを使った自動化フローを作る際の参考にしてみてください。
マイクロソフトの無償RPA(自動化ツール)である「Power Automate Desktop(PAD)」で、ChatGPTのAPIを呼び出し、ChatGPTが生成したテキストを主即する方法について解説します。
ChatGPTはOpenAI社の開発した大規模言語モデルで、自然な文書生成や作業の代行など幅広く活用されています。
プログラムによる機械的な変換作業とは異なり、指示の意図を汲んだ曖昧な作業などにも柔軟に答えることができるため、データの抽出や要約、変換や集計作業などにも方法次第で応用ができます。
今回は、Power Automate DesktopでChatGPTの機能の利用方法と、基本的なフローの作成方法についてご説明します。
無料自動化ツールの「Microsoft Power Automate Desktop」について、そもそもの解説や導入方法については「はじめてのPower Automate Desktop – 使い方・解説記事まとめ」からお読みいただくと基本的な使い方などが確認できます。
ChatGPTの機能について
ChatGPTは、無料で利用が可能なAIチャットサービスですが、同様の機能を自社サービスやツールなどで動作させるには、OpenAIの提供するプラットフォームのAPIを利用する必要があります。
APIを利用するためにはアカウントの登録やAPIキーの発行が必要になりますが、ここではAPIキーの取得が完了している段階から解説します。
APIについての基本知識や、OpenAIのAPIキーの取得手順については別途案内ページを参考にしてください。
OpenAIプラットフォームのAPIについて
OpenAIプラットフォームのAPIについて簡単に触れておくと、OpenAIではChatGPT以外にも複数の言語モデルが利用できるAPIが提供されています。
通常、これらのAPIは利用回数や利用時のデータ量、処理にかかったリソース(計算時間)などに応じて価格が設定されており、それによって使用料が発生します。
ChatGPTの最大の特長のひとつはその価格で、1,000トークンあたり「$0.002」という激安の価格設定となっています。この価格設定が現在ChatGPTが爆発的に普及している背景にあります。
トークンについて細かく算出することは難しいのですが、英語の場合1単語で1~3トークン、日本語1文字で4~8トークンくらいの目安になります。仮に、100文字前後の日本語データの処理を行わせる場合でも400トークン / 1,000トークン * $0.002 * ¥130 = 0.1円くらいの金額のため、正直びっくりするくらい利用量が安いです。
※トークンはChatGPTに送信される質問と、その返答の双方の文章量の合計で計算されます。
ちなみにChatGPTの場合、1回のAPIの呼び出しで利用できる最大のトークンが4096トークンとなっているので、このデータ量を最大に利用した場合でも、4096 / 1,000トークン * $0.002 * ¥130 = 1.06円なので、大規模なWebサービスなどではない限りお小遣いレベルの予算でテストや実運用ができてしまいます。
なお、前述のとおりOpenAIではChatGPT API以外にも利用できるAPIがありますが、これらのAPIがすべてChatGPT API並みの低価格設定ではないためご注意ください。内部に同じ言語モデルを利用しているDavinciは1,000トークンあたり$0.02、最新のGPT-4 APIの場合だと1,000トークンあたり$0.06と、ChatGPTとの価格差が30倍近くあるので、APIの利用を誤ると今度は一気に使用料が膨らんでしまいます。
ChatGPT APIについて
OpenAIのプロダクト紹介で「Chatモデル」と呼ばれているAPIの正式なモデル名は「gpt-3.5-turbo」といいます。このgpt-3.5-turboがChatGPTサービスでも使われているものであるため、一般的に「OpenAPIのチャットモデル」「ChatGPTのAPI」というと現在はこの「gpt-3.5-turbo」モデルのことを差しています。
ここでも便宜上、このモデルのことを「ChatGPT API」と表記しています。
PADでChatGPT APIを呼び出して返答を取得するサンプルフロー
今回はChatGPT APIを利用する基本のプロセスとして、ユーザーが入力したテキストをChatGPTに送信し、その返答をダイアログボックスで表示するフローをご紹介します。
APIの呼び出し方や取得データの取りだしかたはAPIを使ったあらゆる操作の基本になりますので、まずはこちらで実際にChatGPTが動作する様子を確認してみてください。
サンプルフローの動作例
フローを開始すると、テキストの入力画面が表示されます。ここにChatGPTに送信する指示(プロンプト)を入力します。
「OK」をクリックするとChatGPTのAPIが呼び出され、返信内容がダイアログボックスで表示されます。
指示の内容をChatGPTが解釈するので、質問の内容に応じた回答が可能です。
「イルカについて教えて」などと入力すると、以下のように細かい説明文が返答されました。
サンプルフロー
Robinソースコード
サンプルフローのRobin言語ソースコードです。
コピー&ペーストで貼り付けることで、お手元のPower Automate Desktopで動作を確認することができます。
Display.InputDialog Title: $'''プロンプトを入力''' InputType: Display.InputType.Multiline IsTopMost: False UserInput=> UserInput ButtonPressed=> ButtonPressed2
Web.InvokeWebService.InvokeWebService Url: $'''https://api.openai.com/v1/chat/completions''' Method: Web.Method.Post Accept: $'''application/json''' ContentType: $'''application/json''' CustomHeaders: $'''Authorization: Bearer %OPENAI_API_KEY%''' RequestBody: $'''{
\"model\": \"gpt-3.5-turbo\",
\"messages\": [{\"role\": \"user\", \"content\": \"%UserInput%\"}],
\"temperature\": 0.7
}''' ConnectionTimeout: 30 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=> JsonAsCustomObject
Display.ShowMessageDialog.ShowMessage Title: $'''ChatGPTの返答''' Message: JsonAsCustomObject.choices[0].message.content Icon: Display.Icon.None Buttons: Display.Buttons.OK DefaultButton: Display.DefaultButton.Button1 IsTopMost: False ButtonPressed=> ButtonPressed
Power Automate Desktopでフロー共有する方法、共有されたコードの利用の詳細については作成したフローを他のユーザーに共有する方法でも解説しているので、併せてご参照ください。
各アクションの解説
各アクションについて解説します。
事前準備
このフローを動作させるにはOpenAIプラットフォームのAPIキーの取得が必要になります。
OpenAIのWebサイトのプロダクト紹介ページにある「Get started」のリンクなどから、プラットフォームのユーザー登録、ログインができますので、こちらからアカウントを取得してAPIキーの取得を行ってください。
APIキーが取得できたら、初めにPADの入出力変数に登録しておきます。
「入出力変数」エリアにあるプラス(+)ボタンをクリックします。
表示されたウィンドウで、「変数名」ボックスに「OPENAI_API_KEY」、「規定値」ボックスに取得したAPIキーを入力します。
次に、「機密情報としてマーク」をオンにし、「保存」をクリックします。
APIキーは本来フロー内部に保存しない方が良いのですが、ここでは簡易的に入出力変数の規定値から取得する例として紹介しています。
外部に共有するフローなどの場合この方法ではセキュリティ上不適切な場合がありますのでご注意下さい。
ユーザーの入力を受け取る
ここからは具体的なフローの指定です。
まず、ChatGPTに送信するメッセージを取得するため「入力ダイアログを表示」アクションを配置します。
ここで入力されたテキストは%UserInput%
という変数に保管されますので、この変数を使って次の手順でChatGPTのAPIを呼び出します。
ChatGPTのAPIを呼び出し、結果を取得する
ChatGPTのAPIを呼び出し、結果を取得するには「Webサービスを呼び出します」アクションを配置します。
それぞれの項目については以下のように設定します。
- URL
https://api.openai.com/v1/chat/completions
- メソッド
POST
- 受け入れる
application/json
- コンテンツタイプ
application/json
- カスタムヘッダー
Authorization: Bearer %OPENAI_API_KEY%
- 要求本文
{
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": "%UserInput%"}],
"temperature": 0.7
}
上記で指定されている「%OPENAI_API_KEY%
」がAPIキー、「%UserInput%
」がダイアログで入力したテキストの内容に置き換わり、ChatGPTのAPIに送信されます。
さらに、「詳細」エリアをクリックし、以下のように設定します。
- 接続タイムアウト
30 - リダイレクトに追従します
オン - Cookieをクリアします。
オフ - エラー状態で失敗します
オフ - 要求をエンコードします
オフ - ユーザーエージェント
(変更なし) - エンコード
自動検出 - 信頼されていない証明書を受け入れます
オフ - HTTP認証
オフ
すべての設定が完了したら「保存」をクリックします。
APIの返答をカスタムオブジェクトに変換する
ChatGPT APIのデータは「JSON」をという形式でやり取りされます。これは他のWebサービスのAPIなどでも一般的に使われるものです。
Power Automate Desktopでは、このJSONデータをそのまま読み取ったり加工することなどは難しいのですが、「JSONをカスタムオブジェクトに変換」アクションを使うことで、PAD内部でも扱いやすいデータに変換することが可能です。
「JSONをカスタムオブジェクトに変換」アクションを配置し、「JSON」のボックスに「%WebServiceResponse%
」と入力し「保存」をクリックします。
これによって、ChatGPTの返答のデータを%JsonAsCustomObject%
という変数から簡単に取り出すことができるようになります。
ChatGPTの返答データを取り出し、表示する
ChatGPTの返答を表示するために「メッセージを表示」アクションを配置します。
ここで、「表示するメッセージ」ボックスに「%JsonAsCustomObject.choices[0].message.content%
」と入力します。
この、%JsonAsCustomObject%
変数が、ひとつ前の手順で変換されたカスタムオブジェクトです。
このデータの中にはChatGPT APIの応答内容がそのままの状態で格納されており、構造は以下のようなものとなっています。
{
"id": "chatcmpl-123",
"object": "chat.completion",
"created": 1677652288,
"choices": [{
"index": 0,
"message": {
"role": "assistant",
"content": "\n\nこんにちは!何かお手伝いできることはありますか?",
},
"finish_reason": "stop"
}],
"usage": {
"prompt_tokens": 9,
"completion_tokens": 12,
"total_tokens": 21
}
}
ChatGPTが答えたメッセージ以外にもシステムの状態などを記録したデータなどが一緒に含まれているため、メッセージだけを取得する場合はその部分を指定してあげる必要があります。
%JsonAsCustomObject.choices[0].message.content%
の指定は、この応答の中にある「ゼロ番目(先頭)のchoices」の中にある「message」の中にある「content」の内容を示しているため、下記の「\n\nこんにちは!何かお手伝いできることはありますか?」の部分を取得することができます。
{
"choices": [{
"message": {
"content": "\n\nこんにちは!何かお手伝いできることはありますか?",
}
}
}
このJSONからのデータの取りだしかたが少し複雑ですが、カスタムオブジェクトの読み取り方と、どの階層にどのデータがあるのかが分かれば、ChatGPTのAPIに限らず一般的なWeb APIを使ったあらゆるデータの取得をこの方法で行うことができます。
まとめ
今回のフローでは基本的なAPI呼び出しのみを行っていますが、ChatGPTの動作の指示(プロンプト)や、メッセージの履歴などを要求本文のJSONデータに加えることによってChatGPTと連続した会話を行ったり、自由なデータの加工など、いろいろ応用して利用することができます。
RPAによる自動化はどうしても機械的な処理に終始してしまいがちですが、このChatGPTは定形化されていない情報の扱いにも長けています。
例えば住所のテキストなどの場合「群の省略」「番地のハイフン表記」のような入力のゆれで同一のデータの比較が難しいようなテキストデータなども、ChatGPTであれば人間が読むように判定させることができます。
また、例えばCSVの書式で一部にカンマの抜けなどがあったような場合、単純なプログラムでは処理がそこで止まってしまいますが、ChatGPTなどのAIに中間処理を行わせることで、エラーがあったときにカンマを適正な位置に追加して自動処理を続行させるなど、これまで人間が一度フローを停止して目視で確認、修正しなければいけなかった部分などを補うことなどもできるようになります。
今回の例はChatGPT APIを使うための基本動作となりますが、PADの繰り返しフローや変数処理などと組み合わせることで更にAIを使った自動化処理のヒントが見えてくるかと思います。
是非実際にPower Automate Desktopで動作させてみて、ChatGPTの動作やAIを使った自動化処理の可能性などチェックしてみてください。