FileMakerでChatGPT APIを呼び出す方法

2023/03/15に公開
23

はじめに

先日(2023年3月1日)、ChatGPTのAPIであるgpt-3.5-turboが発表され、話題となっています。従来のモデルより価格が10分の1くらい安くなり、使いやすくなりました。筆者が業務で使っているFileMakerにも簡単に組み込むことができたので、使い方をご紹介します。なお、この記事を書いている3月15日にはGPT-4が発表されました。日本語でもGPT-3.5の英語版より賢いそうなので、APIが提供されるのが楽しみです。

サンプルアプリのダウンロード

GitHubにサンプルアプリを載せました。ダウンロードしてご利用ください。

https://github.com/sikkimtemi/FileMakerGPT

初期画面
サンプルアプリの初期画面

サンプルアプリの使い方

APIキーの設定

次のURLにアクセスしてOpenAIのAPIキーを生成しましょう。OpenAIのアカウントがない場合は登録してください。現在はクレジットカード不要で登録でき、最大で18ドル、90日までの試用枠がもらえるようです。

(2023年3月24日追記)試用枠はもうもらえなくなったようです。You exceeded your current quota, please check your plan and billing details.というエラーが出たらアップグレードしてください。

https://platform.openai.com/account/api-keys

APIキーを生成したらFileMakerサンプルアプリの設定ボタンをクリックして、APIキーを設定してください。

APIキーの設定
APIキーの設定

ChatGPT APIの呼び出し

APIキーを設定したら、とりあえず動かしてみましょう。事前にプロンプトをいくつか用意してみたので、興味のあるものを選択してください。

プロンプト一覧
プロンプト一覧

例えば、「システム管理者への問い合わせ」を選んで、「BYOD誓約書の雛形をください」と頼むと、次のように出力してくれます。

「システム管理者への問い合わせ」の例
「システム管理者への問い合わせ」の例

「レシピ提案」を選んで食材を入力すると、その食材を使用したレシピを提案してくれます。

「レシピ提案」の例
「レシピ提案」の例

プロンプトの設定

「プロンプト編集」をクリックするとプロンプトの追加や変更ができます。

プロンプトの編集画面
プロンプトの編集画面

既存のプロンプトを編集したり、追加したりして、どんな出力が得られるか試してみてください。

サンプルアプリの解説

ここからはサンプルアプリの実装について解説していきます。OpenAIのAPIはとても素直な形式なので、実装はシンプルです。公式ドキュメントに載っているサンプルコードをベースに、「システム管理者への問い合わせ」の例をcurlコマンドで記述すると次のようになります。

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": [{"content":"あなたはシステム管理者です。\r次の質問に日本語で答えてください。","role":"system"},{"content":"BYOD誓約書の雛形をください","role":"user"}]
}'

これをFileMakerスクリプトで実装すると次のようになります。

API呼び出しスクリプト
API呼び出しスクリプト

汎用性を持たせるために少し長くなっていますが、単純にcurlコマンドと同じ処理をするだけなら20行目の「URLから挿入」だけで可能です。

送信するJSONデータは次のような形式になっています。

{
  "model": "gpt-3.5-turbo",
  "messages": [
    {
      "content": "事前に設定したプロンプト。例)あなたはシステム管理者です。次の質問に日本語で答えてください。",
      "role": "system"
    },
    {
      "content": "ユーザーが入力した内容。例)BYOD誓約書の雛形をください",
      "role": "user"
    }
  ]
}

サンプルアプリでは2段階に分けてJSONを組み立てています。1段階目は13行目の「メッセージの組み立て」で、次のようにJSONSetElementを駆使してJSONを生成しています。

JSONSetElement ( $messages ;
 [ "[0].role" ; "system" ; JSONString ];
 [ "[0].content" ; Prompt::prompt ; JSONString ];
 [ "[1].role" ; "user" ; JSONString ];
 [ "[1].content" ; FileMakerGPT::input_text ; JSONString ]
)

2段階目は17行目で、実装は次のとおりです。

JSONSetElement ( $json ;
 [ "model" ; $model ; JSONString ];
 [ "messages" ; $messages ; JSONRaw ]
)

このようにして組み立てたJSONを20行目の「URLから挿入」に渡しています。「cURLオプションの指定」が重要なポイントです。

"-H \"Content-Type: application/json\"
 -H \"Authorization: Bearer " & $api_key & "\"
 -d @$json"

このように-d @$jsonと記述すると$json変数に格納したJSONデータを送信できます。cURLオプションにJSONデータをベタ書きするとエラーになることがあるので、必ず変数に格納して利用しましょう。

まとめ

FileMakerでChatGPT APIを呼び出す方法をご紹介しました。生成AIの進歩はとても速くて追いかけるが大変ですが、プロダクトに組み込むだけならとても簡単です。活用してみてはいかがでしょうか。

賢い黒猫のキャラクター
賢い黒猫のキャラクターを作って会話を楽しむこともできる(かわいい)

Discussion

taroutarou

こんばんは、とても使いやすいですね、どうもありがとうございます。

本家のような長い答えをつづきを表示するようにしたいのですが、どのようにすればいよいでしょうか?
続きボタンを押すと新しいレコードに続きが書かれるようなスクリプトです。
教えていただけますか?

TAKAHASHI TaroTAKAHASHI Taro

コメントとバッジをいただきありがとうございます!

サンプルアプリにチャットモードを追加してみました。
こちらからダウンロードし直してみてください。

https://github.com/sikkimtemi/FileMakerGPT

途中の履歴を反映させる仕組みは単純で、それまでのやり取りをすべてmessagesに格納するだけです。ChatGPTの回答はroleassistantに設定します。こちらも参考にしてください。

FileMakerで実装するのは少し面倒ですが、今回はポータルを用いてみました。チャットモードに切り替えてデバッガで追いかけていただくと、変数$messagesにそれまでのやり取りがすべて格納されているのがわかると思います。

過去の履歴をすべて送るので、やり取りが増えるにつれてリクエストのサイズが肥大化していきます。実際に業務アプリに組み込む場合は、リクエストサイズを抑える工夫が必要になるのでご注意ください。

taroutarou

早速のバージョンアップとご返信ありがとうございます。

使いやすいですね!
チャットモードにもプロンプトをかましたいのですが、それも可能ですか?出来ればお願いしたいです。

$messegeにpronptの追加でいけるかとおもい、関数に入れたら怒られて、+だと、変な回答が出て、&だと返答がありませんでした。

>過去の履歴を全て送るとのことですが、新規レコードの場合は大丈夫そうなのですが、その認識であっていますか?

TAKAHASHI TaroTAKAHASHI Taro

早速試していただき、ありがとうございます。

チャットモードでプロンプトを設定したい場合は、下図のように「履歴を保持したChatGPT APIの呼び出し」スクリプトに2行追加してみてください。

14行目と15行目の値はそれぞれ次のとおりです。

JSONSetElement ( $messages ; 
 [ "[" & $index & "].role" ; "system" ; JSONString ]; 
 [ "[" & $index & "].content" ; Prompt::prompt ; JSONString ]
)
$index + 1

途中でプロンプトを変更されると整合性が取れなくなるので、サンプルアプリではあえて外しています。
チャットの1行目をプロンプトにすれば同じことですし。

$messegeにpronptの追加でいけるかとおもい、関数に入れたら怒られて、+だと、変な回答が出て、&だと返答がありませんでした。

確かに$messageに追加すればよいのですが、JSONの配列として追加する必要があるので、単純に文字列を結合しただけではうまくいきません。詳しくは下記のドキュメントを参考にしてください。

https://help.claris.com/ja/pro-help/content/json-functions.html

過去の履歴を全て送るとのことですが、新規レコードの場合は大丈夫そうなのですが、その認識であっていますか?

はい、その認識であっています。

taroutarou

JSONも勉強します。
どうもありがとうございます!

takalovenetakalovene

使わせて頂きました。ありがとうございます。
とても扱いやすく、ファイルメーカーの書き方も勉強になりました。
あと、トークンの計算機能などあると嬉しいです。
意外といくら請求くるのか不安で。。。

gapigapi

ありがたく使わせて頂いていたのですが、最近動かなくなりました。
もう一度ダウンロードしてAPI設定したのですがやはり動きません。
outputに出力されません。
原因分かりますでしょうか?

gapigapi

ありがとうございます。

APIキーを発行し直しても動かないみたいです。
チャットモードに書き込んでスクリプトデバッガで40行まで来た状態でデータビューアにchatGPTからの回答が返ってこない状態です。

試しにAPIキーを間違えた状態にすると「認証に失敗しました」というエラーが返ってきます。
chatGPTが有料アカウントなのは原因になりますか?

よろしくお願いいたします。

TAKAHASHI TaroTAKAHASHI Taro

もし、単発モードでは正常に動いて、チャットモードだけで発生しているなら、リクエストが肥大化しているのかもしれませんね。
チャットモードでは会話の履歴をすべて送信するので、会話が進むとOpenAIのリクエストサイズ上限に達してエラーになります。
その場合は新規レコードを作成して、最初からチャットを始めれば動くはずです。

無限にチャットをしてもエラーにならないようにする方法はいくつか存在します。
時間があったら記事を書くかもしれません。

gapigapi

お返事ありがとうございます。

新規チャットでも単発モードでも同じ状態でchatGPTの返信が返ってこない状況です。
お手隙の時に見ていただけると嬉しいです。

よろしくお願いいたします。

TAKAHASHI TaroTAKAHASHI Taro

単発モードでもエラーになるなら、APIの無料利用分が失効しているのかもしれません。
私のAPIキーでは正常に動作しています。

ChatGPT PlusとOpenAIのAPIは別系統なので、ChatGPTを有料版にしていても、APIは無料版を使用している可能性があります。
確かめるには、こちらにアクセスしてみてください。
https://platform.openai.com/account/billing/overview

「Billing overview」の次の行に「Free trial」と表示されていたら無料の試用期間中で、「Pay as you go」と表示されていたら有料版を利用中です。

gapigapi

ありがとうございます。

Free trialになっていたのですが、支払い情報を入力してAPIを取得し直したら直りました。
お騒がせいたしました。

takalovenetakalovene

ありがたく継続して使用しておりました。
最近プロンプトを2個以上だと、うまく実行してくれないようです。
何か、表記の仕方などCHAT GPT側での変更などありましたでしょうか。
ちなみに、APIで接続しないで通常のブラウザで実行するとプロンプトが反映されます。

こちらがプロンプトです。

以下の条件を実行して下さい。
①などの特殊文字や機種依存文字があれば削除してください。
改行部分に
と改行を挿入してください。

こちらがうまく動作しませんでした。

TAKAHASHI TaroTAKAHASHI Taro

プロンプトを試してみましたが、問題なく動作しました。
おそらくAPIキーが失効しているのではないでしょうか。
上のコメントを参考に、確認してみてください。

takalovenetakalovene

お返事ありがとうございます。
APIキーが失効はしていないみたいで大丈夫でした。
ちなみにこちらのプロンプトの内容を教えて頂けないでしょうか。

takalovenetakalovene

お返事遅くなってすいません。
プロンプトは、同じものを入力しても流動的にようでした。
色々、工夫してみたいと思います。

ちなみに、モデルはGPT4など指定可能なのでしょうか。
モデルの指定方法はどんなルールがあるんでしょうか。

takalovenetakalovene

ご回答ありがとうございました!
試してみたいと思います。