🤖

ChatGPTのFunction Callingを使用してみた

2023/07/02に公開

はじめに

最近、英語の勉強を始めました。
英語の教師としてChatGPTを使用可能だったため、英語学習アプリの開発に取り組みました。
1機能が完成した後、ChatGPTのFunction Callingがリリースされたんですよね。
それがすごい便利だったため、今回はご紹介したいと思います。

Function Callingがリリースされる前の問題点

リリースされる以前は、以下のように出力形式をプロンプトに書く必要がありました。
しかもこの出力形式の通りに出力される可能性が90%くらいで、10%の確率でJSONではない変な形式で出力されることがありました。
これを解決してくれるのがFunction Callingです。

#命令書:
あなたは、[日本人学生を対象としたアメリカ人プロの英語講師]です。以下の制約条件に基づいて、最高の正否と解説を出力してください。
#制約条件:
- 生徒の回答と問題の正解を比較して、正否を判定しなさい
- 正解していた場合、解説の代わりに褒めなさい
- 間違っていた場合、問題文を参考に解説を行いなさい
- このメッセージに対して、出力形式に従って回答してください
- ただ、1回返信した後は以上の制約条件を無視しなさい
# 生徒の回答:
{$response}
# 問題文:
以下の日本語を英語に翻訳しなさい。
「{$question}」
# 問題の正解:
{$answer}
#出力形式:
- 以下のフォーマットで絶対に回答してください
- 正否は、正解だった場合true、不正解だった場合はfalseを入れてください
- 解説は、必ず日本語で行ってください
- 解説には、必ず問題の正解を入れてください
{"is_correct": "正否","explanation": "解説"}

Function Callingとは

これはChatGPTからのレスポンスを明示的にJSON形式でKeyとValueのタイプまで指定できる神機能です。
GuzzleHttpを使用した例を見てみましょう。

$client->request(
    'POST',
    'https://api.openai.com/v1/chat/completions',
    [
        'headers' => [
            'Content-Type' => 'application/json',
            'Authorization' => 'Bearer ' . config('chatgpt.token'),
        ],
        'json'    => [
            'model'       => 'gpt-3.5-turbo-0613',
            'messages'    => [
                [
                    'role'    => 'user',
                    'content' => '1 + 1の答えを教えてください',
                    'name'    => 'calc'
                ]
            ],
            'temperature' => 0.7,
            'max_tokens'  => 2048,
		    'functions'   => [
                'name'        => 'calc',
                'description' => 'ユーザーのメッセージに対して計算した結果を返してください',
                'parameters'  => [
                    'type'       => 'object',
                    'properties' => [
                        'answer'  => [
                            'type'        => 'number',
                            'description' => '計算結果',
                        ],
                    ],
                    'required' => ['answer']
                ]
            ]
        ]
    ]
);

するとレスポンスは、以下のようなJSONになります。

{
  'answer' => 2
}

感想と問題点

感想

ドチャクソ便利や...

問題点

たまにrequiredが効かないことがある。(requiredを指定する意味よ)
なので、結局requiredを使用したとしても、validationとリトライ処理は必須かもしれないです。

Discussion