FileMakerでChatGPT APIを呼び出す方法

2023/03/15に公開約3,100字7件のコメント

はじめに

先日(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データを送信できます。単純なデータならベタ書きしても動くことがありますすが、複雑なJSONデータを送信する場合は、いったん変数に格納しないとエラーになる可能性が高いです。

まとめ

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

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

Discussion

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

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

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

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

https://github.com/sikkimtemi/FileMakerGPT

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

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

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

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

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

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

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

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

チャットモードでプロンプトを設定したい場合は、下図のように「履歴を保持した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

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

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

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

ログインするとコメントできます