🐕

GPTsのActionsを使って外部APIをコールしてみる

2023/12/15に公開

はじめに

2023年11月6日、OpenAIの開発者向けイベント「DevDay」で、個人のニーズに合わせてカスタマイズができる「GPTs」を発表しました。

GPTsでは、会話形式で作成することができるため、エンジニアでなくても誰でも簡単に独自のGPTを作成することができます。

※GPTsを利用するには、ChatGPT Plusのユーザである必要があります。

GPTsで外部APIをコールする機能「Actions」

GPTsには、外部APIを呼び出すことができる「Actions」という機能が備わっています。ChatGPT公式のページにもActionsのドキュメントが公開されているのですが、読んだだけでは実際どのようなものかイメージがつかなかったので、実際に使ってみることにしました。

今回実装するもの

今回は、The Dog APIという外部APIを利用して、犬の画像を表示するGPTを作ります。

https://www.thedogapi.com/

The Dog APIを利用するには、APIキーが必要です。
APIキーの取得方法については公式サイトに記載がありますので、ここでは割愛します。

実装する機能は3つ

  1. 好きな犬種を指定してその画像を表示させる
  2. ランダムな犬の画像を表示させ、さらにその犬の解説を行わせる
  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」をパラメータとして追加する必要となります。

つまり、実際の手続きとしては、以下のようになります。

  1. https://api.thedogapi.com//v1/breedsから犬種情報のリストを取得
  2. 取得した犬種リストから欲しい犬種の情報を探し、breeds_idsを取得
  3. breeds_idsをパラメータに加えて、https://api.thecatapi.com/v1/images/search?breed_ids=<breed_ids>を叩く
  4. 受け取ったJsonから画像のパスを取得して表示

しかし、GPTsのすごいところは、目的達成のための必要な情報(今回ならbreeds_ids)を取得できる環境さえ与えておけば、たとえ今回のような段階的にAPIを踏む必要があったとして、自分自身で考え、よしなに振る舞ってくれます。
(もちろん、Json内のdescriptionはきちんと定義しておく必要はあります)

実際に動かしてみる

それでは、さっそく秋田犬の画像を表示してみましょう。

見事、秋田犬の画像が表示されましたね。
GPTsの挙動を確認すると、まず初めにbreeds_idsを取得し、それをパラメータに追加して適切な画像を取得しています。

イラスト化はどうでしょうか?

一度エラーとなったものの、問題なく表示されていますね。
しかも最初に指示した、印象派のテイストにも則って生成されています。

まだミスやエラーは多い

  • 日本語だと間違った犬種を引っ張ってくることがある
  • APIを叩く際にエラー落ちてしまうことが多い

Discussion