Laravel10 OpenAI Function callingコール雛形

    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’]には通常のテキストとしての応答が入るので、それを使って会話を続けたら良いと思う。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です