ChatGPTの新機能 "GPTs" でCustom Actionsを使って住所から郵便番号を検索してみた

## はじめに
2023年11月7日OpenAIから数々のアップデートが発表されました。

そのアップデートの一つである GPTs と呼ばれる新しいツール。
これは、誰でも簡単にカスタムチャットボットを作成できるようにするものです。

簡単にチャットボットが作れるのはすごいと思いましたが、さらに革新的だなぁと思ったのがGPTsのCustom Actions（カスタムアクション）です。

Custom Actionsとは、ChatGPTが決められた特別な動きをするための機能です。例えば、天気の情報を取ってくるような動きをさせたり、特定のデータを探して答えを出したりすることができます。
この機能を使うことで、ただ話すだけではなく、実際に役立つ情報を提供したり、何かの手助けをすることが可能になります。

具体的には、もしあなたが「東京の明日の天気は？」とChatGPTに尋ねたとき、Custom Actionsを使って、天気予報の情報を集めてきて、その答えを教えてくれるようになります。これは単におしゃべりをするだけでなく、実際に必要な行動を取ることができるというわけです。

この記事では、郵便番号検索APIを使用して、住所から郵便番号を回答するチャットボットを作成する手順を説明します。

郵便番号検索API
https://postcode.teraren.com/
→個人利用・商用利用ともに無制限で無料

## GPTsでチャットボットを作成する
[こちら](https://qiita.com/iconss/items/50d04984317186e03b14)の記事を参照願います。

## 設定画面
### Configureの内容
Instructionsは何も設定しなくてOKです。
Name, Descriptionは適当に。
Conversation startersも設定しておくと親切かも。
Knowledge,Capabilitesは何も設定しません。
チャットの内容をOpenAIにシェアしたくない場合は、Addtionl SettingsのUse conversation...のチェックボックスをOFFにしましょう。
![スクリーンショット 2023-11-12 7.57.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496109/0c7202b0-4e1f-174e-e67b-208cfa6898bf.png)
Actionsの歯車のマークのボタンをクリック、次の項目で説明する設定を行います。
### Actionsの内容
Actionsの歯車のマークのボタンをクリックすると表示される画面（2023.11.12現在)
Schemaのところに次の項目で説明する関数の定義(JSON形式）を貼り付けます。
![スクリーンショット 2023-11-12 7.56.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496109/cab79c51-21c5-9b85-b7ce-c75a51c8d5bc.png)

## Custom Actions の Schema
Schemaのところに、こちらの関数の定義を貼り付けます。
~~~
{
  "openapi": "3.1.0",
  "info": {
    "title": "Get postal code data",
    "description": "Retrieves postal code data for a given address.",
    "version": "v1.0.0"
  },
  "servers": [
    {
      "url": "https://postcode.teraren.com"
    }
  ],
  "paths": {
    "/postcodes.json": {
      "get": {
        "description": "Get postal codes for a specific address",
        "operationId": "GetPostalCodeByAddress",
        "parameters": [
          {
            "name": "s",
            "in": "query",
            "description": "The address or part of the address to retrieve the postal codes for",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "deprecated": false
      }
    }
  },
  "components": {
    "schemas": {
      "PostalCodeResponse": {
        "type": "object",
        "properties": {
          "jis": {
            "type": "string"
          },
          "new": {
            "type": "string"
          },
          "prefecture_kana": {
            "type": "string"
          },
          "city_kana": {
            "type": "string"
          },
          "suburb_kana": {
            "type": "string"
          },
          "prefecture": {
            "type": "string"
          },
          "city": {
            "type": "string"
          },
          "suburb": {
            "type": "string"
          },
          "street_address": {
            "type": "string"
          },
          "is_separated_suburb": {
            "type": "integer"
          },
          "is_koaza": {
            "type": "integer"
          },
          "is_chome": {
            "type": "integer"
          },
          "is_include_area": {
            "type": "integer"
          },
          "postcode_type": {
            "type": "integer"
          },
          "office": {
            "type": "string"
          },
          "office_kana": {
            "type": "string"
          },
          "post_type": {
            "type": "string"
          },
          "multiple_numbers": {
            "type": "string"
          }
		}
      }
    }
  }
}
~~~
貼り付けて、数秒経ったらSchemaの下にエラーが表示されなければOKです。
![スクリーンショット 2023-11-12 9.21.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496109/b9f13eaf-2a60-64a8-68d0-88115d21ccca.png)
関数の定義に問題があるとエラーが表示されます。その場合は関数の定義を確認しましょう。
![スクリーンショット 2023-11-12 9.20.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496109/ecbee17c-c74d-2a70-1dfe-155de244a0be.png)

## ためしてみる
こちらからお試しください。

https://chat.openai.com/g/g-1mIt7HgOx-jiao-eteyou-bian-fan-hao-2

Custom Actionを実行していいか聞いてきますので、
Allow か Always allow をクリックします。
→Always allow をクリックすれば、再度聞いてきません。
![スクリーンショット 2023-11-12 9.26.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496109/f2fca1d0-985a-3a72-d81b-f60db74c7c1e.png)

![スクリーンショット 2023-11-12 9.34.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496109/ecf6a108-ebda-a8c3-a2c1-a62adb0b77bf.png)
Custom Actionsが、郵便番号検索APIに渡しているデータの内容を確認できます。
![スクリーンショット 2023-11-12 9.34.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496109/fce009e5-a7aa-dd3e-c3ef-e280bc0eb0c8.png)

苦手な住所のパターンがあるようです。
例えば郵便番号で設定していない番地とかが含まれているとNGです。
![スクリーンショット 2023-11-12 8.19.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496109/74e1316b-4aef-40f5-cdea-fdac234771d7.png)

## 考察
会話の内容によっては、郵便番号検索APIから郵便番号を取得せずに、直前の会話の内容から勝手に推測して回答すること（ハルシネーション）があるので要注意です。
![スクリーンショット 2023-11-12 8.56.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496109/c8a6aafe-2042-58a0-5362-d336a8cf6acc.png)
Custom Actionsで設定したAPIに接続して回答をすると、回答の前に
"Talked to （APIの名前）"
が表示されます。
ハルシネーションが発生すると、
"Talked to （APIの名前）"
が表示されません。

このスクリーンショットの例として、
APIから取得した川北一条から川北五条までの郵便番号から、
実在しない川北六条の郵便番号を推測して回答しています。
![スクリーンショット 2023-11-12 9.03.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496109/2ee4fee1-93ff-c3f5-c6f9-21ec3046b22c.png)
そもそも存在しない住所を質問する時点で、意地悪かもしれませんが😅

## おわりに
GPTsでオリジナルのチャットボットが、気軽に作れるようになりました。
気軽に作れるようになった反面、チャットボットの差別化には工夫が必要と考えます。

差別化の一つはプロンプト自体を磨き上げること、
もう一つはこのCustom Actionsではないでしょうか？

Custom Actionsを活用すれば、外部のサービスやアプリから情報を取得することができるので、アイディア次第でチャットボットの独自性を出すことができます。

実はこの記事で説明しているSchema（関数の定義）は、ChatGPTに生成してもらいました。一発でエラーなしの定義を生成することはできませんでしたが、叩き台やテンプレートとしては十分です。
APIの資料を見ながら、修正してなんとか動くようになりました。

完璧なSchemaではありませんが、この記事を参考にご自身でCustom Actionsを開発する際の一助になれば、幸いです。

最後までご精読いただき、ありがとうございました。

## 参考資料
郵便番号検索API　- 郵便番号の一覧を取得
https://postcode.teraren.com/doc/redoc#tag/Postcode/operation/getPostcodes

日本郵便株式会社　- 郵便番号検索
https://www.post.japanpost.jp/zipcode/index.html

OpenAI　- Chat Plugins
https://platform.openai.com/docs/plugins/introduction

OpenAI　- Creating a GPT
https://help.openai.com/en/articles/8554397-creating-a-gpt