Alteryx から OpenAI API を試してみた
はじめに
2023/3に OpenAI より、「ChatGPT」と汎用音声認識モデル「Whisper」の API が公開されました。API が公開されたということは、Alteryxからもこれらの技術を利用できるということです。
プログラムから API を利用する場合、コードの記述が必要になってきます。Alteryx は、GUIの分析ツールとして、API からのデータ取得を行えるダウンロードツールを提供しています。これにより、基本的にコードを記述することなく API の利用が可能となります。
とはいえ、APIの利用にあたり、データの加工が必要となってくるので、その際に利用可能なツールとあわせて、ここでは「ChatGPT」の API 利用方法をご紹介します。
前提条件
下記の環境で検証しています。
- Windows 10 Pro
- Alteryx Designer 2022.3.1
主要なツール
Alteryx から OpenAI の API 利用にあたり下記のツールが便利で本記事でも使用しています。
- ダウンロードツール
- 指定した URL からデータを取得できるツールです。ツール内、またはツールの入力データセットから、HTTPリクエストヘッダ情報やペイロードを指定できます
ダウンロードツール | Alteryx Help
- 指定した URL からデータを取得できるツールです。ツール内、またはツールの入力データセットから、HTTPリクエストヘッダ情報やペイロードを指定できます
- JSONビルドツール
- ツールの入力データセットの指定フィールドを、JSON形式に変換します。
- ※このツールは、ツールパレットの「ラボラトリー」カテゴリに属しており、機能が未完成かつ、今後変更される可能性がある点にご注意ください。
JSONビルドツール | Alteryx Help
ラボラトリー | Alteryx Help
- JSONパースツール
- パース(解析)するJSON形式のフィールドを指定することで、テーブルで扱える形式に変換します。
JSONパースツール | Alteryx Help
- パース(解析)するJSON形式のフィールドを指定することで、テーブルで扱える形式に変換します。
使用方法は、ワークフローの内容とあわせて後述します。
事前準備
OpenAI API KEY の取得
OpenAI API の利用にあたり、OpenAI Platform のアカウント作成が必要です。アカウント作成からAPIキーの取得までの詳細は下記を参照ください。
OpenAI Platformことはじめ 〜Organizationメンバーに招待されたら | DevelopersIO
Overview - OpenAI API
モデル
ChatGPTは、GPT-3.5 シリーズというモデルがベースとなっています。
Introducing ChatGPT | OpenAI API
GPT-3.5 シリーズには、いくかのモデルが存在します。ここでは API 利用のコスト面でも優れており、チャット用に最適化された「gpt-3.5-turbo」というモデルの API を使用します。
Models referred to as "GPT 3.5" | OpenAI API
Models | OpenAI API
Chat vs Completions | OpenAI API
API 利用にあたり、GPT-3.5 シリーズ内であってもモデルによってリクエストを送るURL(エンドポイント)が異なる場合があるのでご注意ください。
Model endpoint compatability | OpenAI API
※「gpt-3.5-turbo」とチャットする場合/v1/chat/completions
を利用します。
API リクエストの内容
API の実行にあたり、必要な設定を確認しておきます。公式の API リファレンス(Create chat completion | OpenAI API)に、リクエストのサンプルやパラメータの説明があるのでこちらを参考にします。下記は、上記のリンク先のサンプルを引用したものです。
curl https://api.openai.com/v1/chat/completions \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer YOUR_API_KEY' \ -d '{ "model": "gpt-3.5-turbo", "messages": [{"role": "user", "content": "Hello!"}] }'
- リクエストヘッダー
- Content-Type
- POSTメソッドでデータを送信することになるので、
-d
オプションで送信するデータ形式を指定します。JSON形式でのPOSTとなる場合、Content-Type: application/json
となります。
- POSTメソッドでデータを送信することになるので、
- Authorization
- トークンを利用した認証・認可となり
Authorization: Bearer
ヘッダを使用します。 YOUR_API_KEY
の箇所を自分の OpenAI API KEY に置き換えます。
- トークンを利用した認証・認可となり
- Content-Type
- リクエストボディー
- ヘッダーで指定したフォーマット(サンプルではJSON)でパラメータを設定します。
model
,messages
は必須パラメータです。- model
gpt-3.5-turbo
またはgpt-3.5-turbo-0301
のいずれかを指定します。gpt-3.5-turbo-0301
:2023/3/1 からのgpt-3.5-turbo
のスナップショットです。gpt-3.5-turbo
とは異なり、アップデートは行われません。
GPT-3.5 | OpenAI API
- messages
- 配列として与えます。
- AIからの回答を含む、過去の会話内容を配列の要素に加えていくことで、文脈を意識した会話を行うことができます。この際、
role
で会話内容がユーザーによるものか、AIによるものかを指定します。 - role の種類
system
:AI側の前提条件を設定できます。user
:ユーザーの質問や回答を記述します。assistant
:AIの回答の場合、このロールを指定します。
- content
- 設定や質問、回答などの会話内容です。
その他のパラメータは、リクエスト内で明示的に指定しない場合、デフォルト値が使用されます。詳細は上記のAPI リファレンスを参照ください。
ワークフロー
ここでは、messages
の内容のみ変更し、他はサンプルと同じ設定の API リクエストを Alteryx 内で作成し、ダウンロードツールのインプットにすることとします。
作成したワークフローは下図の通りです。
構成はおおまかに3つの部分からなります。以降でそれぞれ詳細をみていきます。
1.API リクエストの作成
拡大すると下図のようになっています。それぞれみていきます。
エンドポイントの指定とリクエストヘッダーの作成
左上のテキスト入力ツール、フォーミュラツールでは、エンドポイントの指定と、リクエストヘッダーを作成しています。
- テキスト入力ツール
ここで、リクエストのヘッダ情報を与えています。- url:リクエストの送信先URL。
- Content-Type:ペイロード部のフォーマット。JSON形式を指定。
- フォーミュラツール
- 新規フィールドとして、「Authorization」を作成し、
Bearer
スキームを使用する記述を行います。 - ワークフロー変数として「OPENAI_API_KEY」を事前に作成し、リクエスト内容の形式とあうように、スキームと連結しています。
- 新規フィールドとして、「Authorization」を作成し、
※ワークフロー変数は、ワークフローの設定より「+」ボタンを押下すると定義でき、フォーミュラツール等で、変数として呼び出すことができます。
フォーミュラツールの出力は、下図の通りです。
ここで、ヘッダーとして指定する「Content-Type」「Authorization」のフィールド名は、ドキュメント記載の名称と一致している必要があるので、記入ミスなどないようご注意ください。
リクエストボディー: model の作成
真ん中のテキスト入力ツール、JSONビルドツールでは、リクエストボディーの内、model
パラメータの指定部分を作成しています。
- テキスト入力ツール
下図の通り、パラメータ名と値を入力しています。
- JSONビルドツール
下図の設定とすることで、名前フィールドに指定したフィールドをキー、文字列値フィールドに指定したフィールドをバリューとする文字列型の JSON データを出力します。
JSONビルドツール出力
※文字列値フィールドとして[value]列を指定したので、下図のgpt-3.5-turbo
はダブルクォーテーションで囲われています。
リクエストボディー: messages の作成
ここでは、ChatGPT に下記の質問をすることとしています。
- 会話形式ではなく、単一の質問を複数回投げかける。
messages
の値は、毎回長さ1の配列とします。 - 文脈や ChatGPT の設定は考慮しない
※role
はすべてuser
として与える。
この部分のワークフローを拡大すると下記になります。
ツールでの処理詳細を後述します。
- 行生成ツール
1から始まる9行の整数データを生成しています。
9行としている理由は、9種類の質問を送るためです。
また、以降はこの数値を文字列として扱いたいので、次のセレクトツールで、数値から文字列型への変換を行っています。
行生成ツールの出力は下図の通りです。
- フォーミュラツール
ここで、パラメータとなる2つのフィールド(role, content)を作成しています。
上述の通り、role
にはすべて同じ値(user
)を指定することとしています。
content
には、行生成ツールで作成した番号に応じた値が入る質問としました。
出力
- 転置ツール
下記の設定とし、縦持ちのデータに変換します。
出力は下図の通りとなります。
以降の処理で、[Name]列に文字列を連結するので、この転置ツールの次にあるセレクトツールでは、[Name]列のサイズを十分大きなサイズに変換しています。
- フォーミュラツール
リクエストボディーの形式は、"messages": [{"role": "user", "content": "Hello!"}]
となっており、messages
パラメータの値は、長さ1の配列形式で、その要素として2つの変数(role
, content
)があります。
このようなJSON形式のデータを、後のJSONビルドツールで作成するために、下図のように、.0.
という文字列を要素名の前に追加しています。
出力は下図のようになります。
- JSONビルドツール
フォーミュラツールの出力に対して、下図の設定とします。ここでは9種類のそれぞれの質問を配列形式と変換しています。
出力
※グループ化フィールドを指定したので、9レコードの出力となっています。
リクエストボディーの統合
ここまでで、リクエストボディーのそれぞれのパラメータとなる文字列データを作成しました。次に、リクエストボディー部分を統合していきます。
- フィールド付加ツール
真ん中のフィールド付加ツールは、次のデータを入力として与えています。
ターゲット:リクエストボディー(model
)の作成結果
ソース:リクエストボディー(messages
)の作成結果
この時点の出力は、下図の通りとなります。
- 転置ツール
次の転置ツールの設定と出力は下図の通りです。
設定
出力
- フォーミュラツール
フォーミュラツールでは、リクエストボディーの形式をサンプルとあわせるように、[Value]列に対してtrim関数を使用します。
- 集計ツール
集計ツールで、[Value]列を連結することで、リクエストボディーを一つの値として作成します。
この時、[Value]列の結合オプションとして、次の設定としておきます。
・開始:{
・区切り文字:,
・終了:}
次のソートツールでは、[RowCount]の昇順に並べ替えを行っています。
ここまでで、ようやくリクエストボディーの-d
オプション部分の文字列データを作成できたことになります。
※[Concat_Value]フィールドがその内容となります。
ダウンロードツールの入力データ作成
ダウンロードツール直前のフィールド付加ツールでは、次のデータを入力として与えています。
ターゲット:エンドポイントとリクエストヘッダー情報
ソース:ソートツールの出力(リクエストボディー)
出力は下図の通りです。こちらがダウンロードツールのインプットとなります。
2.ダウンロードツールの設定
ダウンロードツールには複数のタブがあり、それぞれで必要な設定を行います。
- 基本設定
URL欄には、エンドポイントを記述した[url]フィールド指定します。
- ヘッダー
ヘッダー情報として与えるContent-Type
とAuthorization
はそれぞれ同じ名称のフィールドにその値を格納しているので、図の通りチェックを入れます。
- ペイロード
アクションとしてPOST
を選択し、「フィールドからクエリ文字列/本文を取得する」オプションを選択し、リクエストボディーが格納された[Concat_Value]フィールドを指定します。
3.出力結果の整形
ダウンロードツールの出力結果には、「DownloadData」「DownloadHeaders」の2列が追加されます。
ChatGPT からの回答内容は、[DownloadData]列に格納されています。JSON形式となっており、このままでは扱いづらいので、JSONパースツールで表形式に変換します。
- JSONパースツール
設定は下記の通りです。
JSONパースツールの出力では、ツールで指定したJSONフィールドが、キー値である「JSON_Name」とその値を持つ「JSON_ValueString」に分割されます。
テーブル形式として扱えるようになるため、要素は縦に展開されます。その他のフィールドの値は複製されることになります。
回答の抽出
さいごに回答内容を抽出します。
以下はサンプルとして質問した際のレスポンスになります。
回答は、配列形式の値を持つchoices
の0番目の要素となります。
以降はさらに入れ子になっていますが、このうちcontent
の値を取ってこれればよいことになります。
{"id":"chatcmpl-xxxxx", "object":"chat.completion", "created":1678506555, "model":"gpt-3.5-turbo-0301", "usage":{"prompt_tokens":22,"completion_tokens":338,"total_tokens":360}, "choices":[{"message": {"role":"assistant", "content":"\n\n大谷翔平は、日本のプロ野球選手で、現在はMLBのロ サンゼルス・エンゼルスでプレーしています。1994年7月5日生まれで、 山梨県出身です。ポジションは、投手、外野手です。日本プロ野球での 名門・日本ハムファイターズでプロデビューし、投手としては、最速 165km/hの剛速球と、外野手としても、高いミート能力や長打力を持っ ています。在籍2年目の2016年には、リーグ最多の10勝を挙げ、最多 勝、最多本塁打、最高勝率の3冠を獲得して、「日本のベーブ・ルー ス」とも呼ばれました。2017年には、MLBのロサンゼルス・エンゼルス と契約し、2度目のオールスターゲームにも選ばれました。日本とアメ リカのプロ野球界で、異例の2WAYプレイヤーとして認知され、多くのフ ァンを魅了しています。"}, "finish_reason":"stop", "index":0}]}
JSONパースツールの出力は、各要素にアクセスできる形式となっているので、次のフィルタツールで下図の設定とすれば、回答部分を抽出できます。
それ以降のツールでは、不要列の削除と、回答は改行は含まれているので、クレンジングツールでクレンジングしています。
最終的な出力は次の通りです。
今回は前後の文脈は考慮しない設定なので、同じ名前の選手が出てきています。また、質問自体もあいまいな内容のため、実行する度に出力も変わります。
余談
こちらは完全に余談となりますが、ChatGPT に Alteryx から OpenAI API を利用する手順も聞いてみました。
curl -i https://api.openai.com/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -d '{"model":"gpt-3.5-turbo", "messages":[{"role":"user","content":"AlteryxからOpenAI APIを利用する方法を教えてください。"}]}'
回答は次の通りでした。
※見やすいように改行しています。
OpenAIのAPIを利用するには、以下の手順に従ってください。 1. OpenAIのWebサイトにアクセスして、APIキーを取得します。 2. Alteryx Designerを開いて、「Run Command」ツールを追加します。 3. コマンドラインに以下のコマンドを入力します。 curl -X POST https://api.openai.com/v1/engines/{engine}/completions \ -H "Content-Type: application/json" -H "Authorization: Bearer {api_key}" -d '{"prompt": "{prompt}", "max_tokens": "{max_tokens}", "temperature": "{temperature}","n":"{n}","stop": "{stop}"}' {engine}、{api_key}、{prompt}、{max_tokens}、{temperature}、{n}、および{stop}の各フィールドを適切な値に置き換えます。 たとえば、「{engine}」の値として「davinci」を指定すると、OpenAIの最も強力な言語モデル「GPT-3」が使用されます。 コマンドラインに入力したコマンドを実行すると、OpenAIのAPIから応答が返されます。 これで、Alteryx DesignerからOpenAIのAPIを利用することができます。
本記事では、ダウンロードツールを使用する方法のご紹介でしたが、コマンド実行ツールを用いる方法を、サンプルコマンドとあわせて教えてくれました。
※エンドポイントも異なる方法。
コマンド実行ツールの使用には、上記のようなコードを記述する必要がありますが、それによりワークフローで実現できることの幅が広がります。
コード記述部分を AI が補ってくれることで、今後は Alteryx の持つ機能をより幅広く活用できるようになっていくのかなと感じます。
さいごに
以上、Alteryx から OpenAI API を呼び出す手順でした。
Alteryx 内で リクエストボディー部分を生成したので、長い内容となってしまいましたが、JSON形式のリクエストであっても、コーディングなしで作成できるのは Alteryx の強みだと感じます。
なお、API の利用にはコストがかかるので、予め利用料金に制限をかけておくなど、ご注意いただければと思います。
こちらの内容が何かの参考になれば幸いです。