まえがき
GPTにjsonを作ってもらいたい時とかあるよね。俺はある。
でもGPTにJSONを出力させようとこんな感じになるよね
たとえば天気予報:
以下は天気予報のデモデータを書き込んだJSONデータです。私の知識データは2021年9月でが最後ですので、
最新の天気予報を取得するには、検索エンジンなどを用いてお調べください。
{
"temperature" : 22
"rainy": 0
"location": "Chiyoda, Tokyo, JP"
}
そう。JSONだけを出力してくれる保証がないわけです。
そこでFunction calling。どうやらJSONだけを出力させる保証があるらしい。試してみようじゃないか
Code
※プロンプトの動作は未検証
const requests = [
{
role: 'system',
content: 'you are a helpful assistant.',
},
{
role: 'user',
content: `generate math test questions. `,
},
];
const math_test_generate_schema = {
type: 'object',
properties: {
question: { type: 'string' },
answer: { type: 'float' },
},
required: ['question', 'answer'],
};
const response = await openai.createChatCompletion({
model: 'gpt-3.5-turbo-0613',
messages: requests,
functions: [{ name: 'set_definition', parameters: math_test_generate_schema }],
function_call: { name: 'set_definition' },
});
const result = response.data.choices[0].message;
console.log(JSON.parse(result.function_call.arguments));
解説
math_test_generate_schemaでは、function callingの概要を設定している。返答がObject(JavaScript Object)であることを指定し、帰ってくるべきなプロパティを設定している。questionではstringで数式を張ってもらい、answerはfloatで正解をセットしてもらおうとしている。(この辺りはstring,整数だけならintでも良いと思う)
requiredの部分で必須のプロパティを設定している。requiredに入っていないものは返答は保証されないが、基本的に試した限りではrequiredに入っているものは無理矢理にでも代入されている。
つまったところ
関数名がGPTの動作に関係する、というところ、今回はmath_test_generate_schemaだが、たとえば英語の問題を出してもらおうとした時、english_test_generate_schemaなどと、内容に関係する名前にしないと、function_callの部分で必ず関数を呼び出すように設定しているところから、変な返答が返ってきてしまう事象が発生する。
おわり
結構GPTからjsonを生成させたいときはあるので、自分のためのメモとしても残しておこうと思います。
ご覧いただきありがとうございました。
参考文献
GPT-4, GPT-3.5 の API を利用して JSON だけ生成する (Function calling)
[OpenAI] Function callingで遊んでみたら本質が見えてきたのでまとめてみた
Native JSON Output From GPT-4