private function function_calling()
{
$api_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // OpenAIのAPIキー
$prompts[] = ["role" => "user", "content" => "東京の天気を教えて下さい"];
$url = 'https://api.openai.com/v1/chat/completions';
$data = array(
'model' => 'gpt-4o-mini',
'max_tokens' => 300,
"messages" => $prompts,
"functions" => [
[
'name' => 'get_current_weater',
'description' => '現在の天気を取得します',
'parameters' => [
'type' => 'object',
'properties' => [
'location' => [
'type' => 'string',
'description' => '場所や地点',
],
],
],
],
],
);
$headers = array(
'Content-Type: application/json',
'Authorization: Bearer ' . $api_key
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
$result = json_decode($response, true);
dd($result);
}
結果
正しく関数が選択され、パラメータがセットされている。
array:7 [
"id" => "chatcmpl-xxxxxxxxxxxxxxxxxxxx"
"object" => "chat.completion"
"created" => 1727051678
"model" => "gpt-4o-mini-2024-07-18"
"choices" => array:1 [▼
0 => array:4 [▼
"index" => 0
"message" => array:4 [▼
"role" => "assistant"
"content" => null
"function_call" => array:2 [▼
"name" => "get_current_weater" // ←選択された関数
"arguments" => "{"location":"東京"}" // ←パラメーター
]
"refusal" => null
]
"logprobs" => null
"finish_reason" => "function_call"
]
]
"usage" => array:4 [▶]
"system_fingerprint" => "fp_1bb46167f9"
]
関連しない質問をした場合
全然関連しない質問をすると関数が選択されず返ってきた。
質問内容:今日の夕食は何ですか?
array:7 [
"id" => "chatcmpl-xxxxxxxxxxxxxxxxxxx"
"object" => "chat.completion"
"created" => 1727051823
"model" => "gpt-4o-mini-2024-07-18"
"choices" => array:1 [▼
0 => array:4 [▼
"index" => 0
"message" => array:3 [▼
"role" => "assistant"
"content" => "今日の夕食は何を作るかお考えですか?何か特別な料理や食材のアイデアがありますか?それとも、レシピの提案が必要ですか?"
"refusal" => null
]
"logprobs" => null
"finish_reason" => "stop"
]
]
"usage" => array:4 [▶]
"system_fingerprint" => "fp_1bb46167f9"
]
関数を複数にする
"functions" => [
[
'name' => 'get_current_weater',
'description' => '現在の天気を取得します',
'parameters' => [
'type' => 'object',
'properties' => [
'location' => [
'type' => 'string',
'description' => '場所や地点',
],
],
],
],
// ここから追加
[
'name' => 'get_current_temperature',
'description' => '現在の気温を取得します',
'parameters' => [
'type' => 'object',
'properties' => [
'location' => [
'type' => 'string',
'description' => '場所や地点',
],
],
],
],
// ここまで追加
],
質問:広島の気温を教えて下さい
array:7 [
"id" => "chatcmpl-xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
"object" => "chat.completion"
"created" => 1727052015
"model" => "gpt-4o-mini-2024-07-18"
"choices" => array:1 [▼
0 => array:4 [▼
"index" => 0
"message" => array:4 [▼
"role" => "assistant"
"content" => null
"function_call" => array:2 [▼
"name" => "get_current_temperature" // ←正しく気温を取得する関数が選択されている
"arguments" => "{"location":"広島"}"
]
"refusal" => null
]
"logprobs" => null
"finish_reason" => "function_call"
]
]
"usage" => array:4 [▶]
"system_fingerprint" => "fp_1bb46167f9"
]
パラメータが必要ない場合
‘parameters’部分を記述しなければOK
"functions" => [
[
'name' => 'get_hiroshima_weather',
'description' => '現在の広島天気を取得します',
// 'parameters'部分を記述しなければOK
// 'parameters' => [
// 'type' => 'object',
// 'properties' => [
// 'location' => [
// 'type' => 'string',
// 'description' => '場所や地点',
// ],
// ],
// ],
],
],
どの関数も選ばれなかった場合の処理
phpのswitch文のdefaultのような記述はできない。
しかし、どの関数も選ばれなかった場合はAPIレスポンスの[‘function_call’]が存在しないので以下のように判断することができる。
if (empty($result['choices'][0]['message']['function_call'])) {
// どの関数も選ばれなかった場合の処理をここに記述
}
また、$result[‘choices’][0][‘message’][‘content’]には通常のテキストとしての応答が入るので、それを使って会話を続けたら良いと思う。