GPTのfunction callingを活用した関数呼び出し入門
2023.11.23
error この記事は最終更新日から1年以上が経過しています。
GPTに関数呼び出しをさせる function calling の使い方。
function の指定
まず、APIを叩く際に、使える関数を指定する。
function putCompletions($prompts,$temperature = 0.8)
{
$functions = array();
// ここでGPTが呼び出せる関数の仕様を指定
$functions[0] = array(
'type' => 'function',
'function' => array(
'name' => 'create_diary',
'description' => '日記を作成します',
'parameters' => array(
'type' => 'object',
'properties' => array(
'body' => array(
'type' => 'string',
'description' => '日記の本文',
),
'title' => array(
'type' => 'string',
'description' => '日記のタイトル',
),
),
'required' => array('body','title'),
),
),
);
// APIを叩く
$data = array(
'model' => 'gpt-3.5-turbo-1106',
'messages' => $prompts,
'tools' => $functions,
'temperature' => $temperature,
'tool_choice' => 'auto', // autoでなく関数名create_diaryを指定すると必ず関数を呼び出す
);
$json_data = json_encode($data);
$url = 'https://api.openai.com/v1/chat/completions';
$headers = array(
'Content-Type: application/json',
"Authorization: Bearer ".OPENAI_API_KEY
);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$apiresult = json_decode($response);
return $apiresult;
}
上記の例では、GPTに自分の判断で日記を投稿する関数 create_diary を指定。
関数に渡す値として、 body と title をGPTが生成できるようにする。
tool_choice の値を auto にすることで、GPTが必要に応じて関数を呼び出してくれる。特定の関数を指定して、必ず関数を実行してもらうようにもできる。
GPTのレスポンスを取得
GPTがレスポンスを返した際の処理。
function sendGPT($prompts)
{
// 前述のコード putCompletions を呼び出して結果を取得
$result = $this->putCompletions($prompts);
// finish_reasonがtool_callsの場合以下の処理を行なう
if($result->choices[0]->finish_reason == 'tool_calls'){
foreach($result->choices[0]->message->tool_calls as $function){
$called_function = $function->function->name;
$arguments = json_decode($function->function->arguments);
if($called_function == 'create_diary'){
// create_diary関数を呼び出して処理
$message = $this->create_diary($arguments);
}else{
continue;
}
// 処理結果をログに保存するあれこれの処理
$row = array(
'message' => $message,
'role' => 'tool',
'tool_call_id' => $function->id,
);
$prompts = $this->saveLogs($message);
}
// 関数の結果を元に再度送信
$this->sendGPT($prompts);
}
}
レスポンス内の finish_reason が tool_calls だった場合、関数呼び出しとなる。
呼び出された関数の中身は以下のサンプルみたいな感じ。
function create_diary($arg)
{
// $arg に title と bodyが含まれているかチェックする処理
$err = $this->errorCheckDiary($arg);
if($err){
return "{'success':'false','error':'{$err->message}'}";
}
// 日記をDBに保存する処理
$result = $this->saveDiary($arg->title,$arg->body);
if($result->object == 'error'){
return "{'success':'false','error':'{$result->message}'}";
}
return "{'success':'true','diary_url':'{$result->url}'}";
}
レスポンスをJSON形式の配列として渡して、
- role = 'tool'
- tool_call_id = GPTが指定したid
をつけて、 messages の中に含んで再度GPTを呼び出すことで、GPTは関数の結果を取得してさらにテキストを生成したりとかの処理を行なう。
関数A の処理結果を受けて、関数Bの処理を投げる、みたいな挙動も行なってくれる。
OpenAI画像生成APIをPHPで試してみる
2023.04.14
OpenAIの画像生成APIをPHPで利用する方法を解説します。基本的なリクエスト方法から、APIレスポンスの扱いまでをシンプルなサンプルコードとともに紹介。
PHPとOpenAI APIで簡単なチャットシステムのコードを書いてみた
2023.04.13
PHPとOpenAI APIを使ってチャットボットを作成し、ユーザーとAIが対話できる基本的なプログラムを紹介します。サーバーに保存したチャット履歴を基に、APIから取得したレスポンスをデータベースに記録し、チャット形式で対話を進めていくサンプルコードを用意しました。
PHPからOpenAI APIを使ってみる—cURLでチャット機能を試す
2023.04.02
PHPを使ってOpenAIのAPIにリクエストを送信し、GPT-3.5を使った簡単なチャット機能を実装する方法を紹介します。cURLを使用してAPIリクエストを作成し、レスポンスとして得られるデータの構造や意味についても解説。
PHPで扱う日付と時刻の基礎:DateTimeImmutableの活用例
2024.12.07
PHPで日付や時刻を操作する際、DateTimeImmutableクラスを使用することで、データの安全性と効率的な処理が実現します。本記事では、基本的な使い方から日付の加減算、フォーマット指定、時刻比較まで、実践的な例を通じて解説します。