🤖
ChatGPTのFunction Callingを使用してみた
はじめに
最近、英語の勉強を始めました。
英語の教師として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