ChatGPT×UiPathでAPIを叩くワークフローを作成

# はじめに
ChatGPTがバズってる最近、UiPathのような自動化ツールとの連携でより便利に使える方法も増えて来てます。スプレッドシートとの連携や、VS Codeのアドオン機能としてさまざまな連携方法がある中、UiPath Studioではどのように連携するのか、具体的なワークフローの設定方法までをまとめてみたいと思います。

# 連携の概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133151/1889e2b8-2071-df36-59cb-eea45195beec.png)

ChatGPTのAPIですが、現在はWaiting Listとして公開されていません。ですので直接的にAPIをStudioから叩くことは出来ないのですが、ChatGPTを提供しているOpen AIは似たような言語モデルを複数持っています。今回はChatGPTのエンジンと限りなく近い、`text-davinci-003`を利用することにします。ChatGPTのエンジンと今回のダビンチの違いは以下を参照ください。

https://www.reddit.com/r/OpenAI/comments/zdrnsf/comment/iz3kfui/?context=3

今回の連携は、このOpen AIのCreate completionモデルのAPIをStudioから叩くまでをやってみたいと思います。

# ワークフローの設定方法
ワークフロー自体は、以下のステップで今回は作成していきます。

## Open AIにSign Upして、APIを取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133151/9389f484-51ba-65bf-6875-e25725a9f8d4.png)
以下のリンクより、Sign Upをします。
https://openai.com/api/

サイトへログイン後、プロフィールアイコンからAPI管理を開き、秘密鍵を作成し、コピーします。一度閉じると二度と秘密鍵を確認できないので、コピーした鍵を上書きしないように気を付ける必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133151/bb47c278-c9b4-82f9-3a43-399cce316d13.png)


## Studioにてダイアログ(質問のInput Form）を作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133151/6221fcbb-dd31-18d5-a8c7-cdfd73bc0cbf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133151/8f7a4c0e-9238-6e97-6622-24b4a8891f5a.png)

今回はこのようなダイアログに質問を記載できるフォームを作成します。そこで取得した値は、Questionとして定義した変数に格納し、後述するパラメーターに追加します。

## APIのパラメータ設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133151/944c71c8-5d3b-90df-c46b-445d97dd0666.png)
JsonInputDataとして、APIを叩くのに必要なパラメータをこちらに記載しています。
APIの各種パラメータは以下を参照してください。

https://beta.openai.com/docs/api-reference/completions

```
@"{
" + "\n" +
      @"""model"": ""text-davinci-003"",
" + "\n" +
      @"""prompt"": ""Q: "  + Question + @"?\nA:"",
" + "\n" +
      @"""temperature"": 0,
" + "\n" +
      @"""max_tokens"": 3000,
" + "\n" +
      @"""top_p"": 1,
" + "\n" +
      @"""frequency_penalty"": 0.0,
" + "\n" +
      @"""presence_penalty"": 0.0,
" + "\n" +
      @"""stop"" :""\n""
" + "\n" +
      @"}"
```

またHTTP Requestアクティビティはこのように記載しています。
AuthはBearer認証のため、`Bearer {API_KEY}`のように記載する必要があるのがポイントです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133151/2a592c03-35ab-c020-8280-15830c211f67.png)



## レスポンスを加工して表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133151/4caca167-39bb-3210-6e68-ee97adcb715b.png)
最後に、レスポンスのJSONをデシリアライズして、返答部分のテキストを抽出します。
レスポンスはこのようになっており、`JsonObjectOutput.SelectToken("$.choices.[0].text").ToString()`という式で返答部分のみ抽出しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133151/435716e0-a9cd-0019-7250-02fb1cfde62a.png)

最後にメッセージボックスを表示させて、終了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133151/bc433598-dfdd-ff8e-788e-ad22afbd5e74.png)


# おわりに
このように比較的簡単に、ChatGPT風の言語モデルを使い、APIを叩くことができるようになります。ループ処理を施すことで連続的にAPIを叩くようにしたり、UiPath Appsを用いてよりUIをリッチにすることも可能です。また例えば、社内用のワークフローとしてこちらを社員に提供し、投げられた質問を保存することで、社員がどのように利用しているのか、セキュリティ的な使い方は問題ないのか、などを分析する事も可能だと思います。今回は言語モデルで試してみましたが、次回は画像生成モデルなどを試してみたいと思います。