GPTsのActionsを使って外部APIをコールしてみる
はじめに
2023年11月6日、OpenAIの開発者向けイベント「DevDay」で、個人のニーズに合わせてカスタマイズができる「GPTs」を発表しました。
GPTsでは、会話形式で作成することができるため、エンジニアでなくても誰でも簡単に独自のGPTを作成することができます。
※GPTsを利用するには、ChatGPT Plusのユーザである必要があります。
GPTsで外部APIをコールする機能「Actions」
GPTsには、外部APIを呼び出すことができる「Actions」という機能が備わっています。ChatGPT公式のページにもActionsのドキュメントが公開されているのですが、読んだだけでは実際どのようなものかイメージがつかなかったので、実際に使ってみることにしました。
今回実装するもの
今回は、The Dog APIという外部APIを利用して、犬の画像を表示するGPTを作ります。
The Dog APIを利用するには、APIキーが必要です。
APIキーの取得方法については公式サイトに記載がありますので、ここでは割愛します。
実装する機能は3つ
- 好きな犬種を指定してその画像を表示させる
- ランダムな犬の画像を表示させ、さらにその犬の解説を行わせる
- 表示した犬の画像のイラストを作成する
GPTの作成を開始する
新しいGPTの作成
ChatGPTのページにある左のメニューから、「Create a GPT」を選択します。
まずは会話形式で作りたいものを伝える
質問は基本的に英語で聞かれますが、日本語で答えて問題はありませんでした。ここでは、犬の画像を表示する3つの機能を持ったGPTを作成するため、その内容を伝えました。
犬の画像を表示するGPTを作りたいです。
備える機能は以下の3つです。
- ユーザが好きな犬種を指定して、その犬の画像を表示します
- ユーザが犬種を指定しない場合は、ランダムな犬の画像を表示し、さらにその犬の解説を行います
- ユーザが希望すれば、表示した画像をイラストにします。イラストは印象派の技法に基づいて作成します
犬の画像データおよびその犬の情報は全て`The Dog API`(https://www.thedogapi.com/)より取得します。
すると、以下のようにレスポンスが返されました。
今回は日本語でプロンプトを書きましたが、指示した内容をきちんと理解していました。
同時にここで、名前の提案が行われたので採用しました。
(名前は後から変更できます)
名前の次に、アイコンも自動で作成して提案してくれます。
正直あまり気に入りませんでしたが、今回は検証なのでこれで進めることにしました(笑)
(アイコンも後から変更できます)
アイコンの次は、GPTの話し方について質問されます。これはバグなのか、私が答える余地もなく勝手にフレンドリーで設定されてしまいました。とはいえ、問題ないので進めます。
以上で大まかな設定は終わりです。
会話形式で作成するため、非常に簡単に作成できました。
これだけでも、指示した内容に基づいて十分に機能するGPTが完成します。
実際に、画面右側に表示されているボードから指示を出してみます。
指示通り、チワワの画像を出してくれましたが、最初に設定した機能とは少し挙動が違いますね。
また、The Dog APIを使うように設定したはずですが、ここではいきなりイラストを生成して表示しています。
GPTをさらに細かく設定する
Configureページの確認
作成したGPTをさらに細かく設定するには、Configure
のページに移動します。
名前や説明、指示、質問セットに関しては、最初に行なった会話から自動的に記入されます(自身が指示した内容と相違がないか確認をしてください)。
必要な機能の選択
Configureページの下部に、Capabilities
という項目があります、ここではGPTで用いる機能の取捨選択を行うことができます。
ActionsでAPIを用いてレスポンスを生成する場合は、Web Browsing
の機能は必要ありません。むしろ、APIからデータを取得して欲しいの勝手にWebから参照することがあるため、APIのみのデータを用いる場合はオフにした方が良いです。
今回は、APIから取得した画像をイラスト化する必要があるため、DALL·E
のみオンにしました。
Actionsの設定
ここからが本題となりますが、同様にConfigureページの下部にある、Actions
からAPIの設定を行うことができます。
Authenticationの設定
APIキーが必要な場合はAuthentication
から設定する必要があります。
The Dog APIでは、公式ドキュメントに記載されている通り、追加のデータフィールドにアクセスする場合は、APIキーが必要です。
また、APIキーはHTTPリクエストのヘッダーにx-api-key
として追加することができるみたいなので、Authentication
では以下のように設定しました。
スキーマの設定
右上の「例子」(例子ってなんですかね?中国語?)から、「天気 (JSON)」を選択すると、記述例を見ることができます。こちらのスキーマはダミーのAPIであるため、実際に使うことはできません。
記述例に倣って、実際に以下のようなスキーマを記述してみました。
{
"openapi": "3.1.0",
"info": {
// Actionsの情報を追加します
// この情報はGPTがAPI利用すべきかを判断する際に利用されます
"title": "Get dog images",
"description": "Retrieves dog data from the dog api",
"version": "v1.0.0"
},
"servers": [
{
// APIのベースURL
"url": "https://api.thedogapi.com/v1"
}
],
"paths": {
// エンドポイント(指定した犬種の画像を取得する)
"/images/search": {
"get": {
"description": "Get dog images by breed",
"operationId": "getDogImagesByBreed",
"parameters": [
{
"name": "breed_ids",
"in": "query",
"description": "It is used to filter the dog images by breed with the breed id. If you want a random image, you should pass this parameter as empty.",
"required": false,
"schema": {
"type": "integer"
}
}
],
"deprecated": false
}
},
// エンドポイント(犬種情報のリストを取得する)
"/breeds": {
"get": {
"description": "Get dog breeds",
"operationId": "getDogBreeds",
"deprecated": false
}
},
// エンドポイント(ランダムな1枚の犬の画像を取得する)
// random用のエンドポイントがなかったため、パラメータごと指定
"/images/search?limit=1&has_breeds=1": {
"get": {
"description": "Get a random dog image",
"operationId": "getRandomDogImage",
"deprecated": false
}
}
},
"components": {
"schemas": {}
}
}
きちんとJsonが記入できていれば、Available actions
に表示され、テストも行うことができます。
実際にテストを行い、APIが叩けるか確認します。
うまくいってそうですね。
一番初めに設定した、「ランダムな表示を行なった際に説明を加える」とうことも対応できています(サルーキかわいいですね)。
GPTs Actionsのすごいところ
実は、GPTsに関係なく、The Dog APIで犬種を指定して画像を取得する際、ひと手間加える必要があります。それは、APIで犬種を指定する際はbreed_ids
というint型の「特定の犬種を指すID」をパラメータとして追加する必要となります。
つまり、実際の手続きとしては、以下のようになります。
-
https://api.thedogapi.com//v1/breeds
から犬種情報のリストを取得 - 取得した犬種リストから欲しい犬種の情報を探し、
breeds_ids
を取得 -
breeds_ids
をパラメータに加えて、https://api.thecatapi.com/v1/images/search?breed_ids=<breed_ids>
を叩く - 受け取ったJsonから画像のパスを取得して表示
しかし、GPTsのすごいところは、目的達成のための必要な情報(今回ならbreeds_ids
)を取得できる環境さえ与えておけば、たとえ今回のような段階的にAPIを踏む必要があったとして、自分自身で考え、よしなに振る舞ってくれます。
(もちろん、Json内のdescription
はきちんと定義しておく必要はあります)
実際に動かしてみる
それでは、さっそく秋田犬の画像を表示してみましょう。
見事、秋田犬の画像が表示されましたね。
GPTsの挙動を確認すると、まず初めにbreeds_ids
を取得し、それをパラメータに追加して適切な画像を取得しています。
イラスト化はどうでしょうか?
一度エラーとなったものの、問題なく表示されていますね。
しかも最初に指示した、印象派のテイストにも則って生成されています。
まだミスやエラーは多い
- 日本語だと間違った犬種を引っ張ってくることがある
- APIを叩く際にエラー落ちてしまうことが多い
Discussion