ChatGPT APIをPHPで動かしたい。
でもウェブ上の記事のコードをコピペしても、なんか動かない。
動いたコードと、動かなかった原因のざっくりしたメモを残します。
当時の記憶があまりない
ChatGPT PHPで動いたコード
gpt.php
<?php function gpt($input){ $apiKey = "apiKey"; $url = 'https://api.openai.com/v1/chat/completions'; $headers = array( "Authorization: Bearer {$apiKey}", //"OpenAI-Organization: Personal", "Content-Type: application/json" ); // Define messages $messages = array(); $message = array(); $message["role"] = "user"; $message["content"] = $input; $messages[] = $message; // Define data $data = array(); $data["model"] = "gpt-3.5-turbo"; $data["messages"] = $messages; $data["max_tokens"] = 50; // init curl $curl = curl_init($url); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($curl); if (curl_errno($curl)) { echo 'Error:' . curl_error($curl); } else { $decoded_json = json_decode($result, true); $answer = $decoded_json['choices'][0]['message']['content']; return $answer; } curl_close($curl); } ?>
test.php
gpt.phpを他のphpファイルから利用するとき、こう書く。
<?php require_once 'gpt.php'; $input="空はなぜ青いの?"; $result = gpt($input); echo "gpt:"; echo $result; ?>
ChatGPTがPHPで動かない原因
前述の動くコードにたどり着くまでに引っかかり、直したこと。
ファイルの文字コード
まず、古いバージョンのGPT3を動かそうとした。
以下のサイトを参考に進めましたが、なんか動かない。
しばらく悩みましたが、原因はファイル自体の文字コードでした。
コードを保存したファイルの文字コードを変えたらなんか動きました。
呼び出す側と呼び出される側の文字コードが不一致だとダメ、とかだった気がする。
拾ったコードを関数化
次はモデル:gpt-3.5-turboを使いたい。
GPT3のコードは確かそのまま使えず、サンプルコード探しました。
出てきたのが以下。
これを他のファイルから呼び出して、ChatGPTの応答を返させたい。
それっぽく書き換えたが、動かない。
さらに2か所、改変したらうまくいった。
1つ目は、
//"OpenAI-Organization: Personal",
のようにコメントアウト。
もう1つは
echo $result;
の部分を
$decoded_json = json_decode($result, true); $answer = $decoded_json['choices'][0]['message']['content']; return $answer;
に書き換える改変。
正直、
return $answer;
以外、意味は理解していない。
ChatGPTに質問しまくってなんとか出してもらったコードです。
ChatGPT+PHPでチャットボットも
チャットボットも作ってみました。
参考にしたURLは、
書いてあるとおりに作業するも、やはり動かない。
Chromeのデベロッパーツールで
index.html:72 Error: SyntaxError: Unexpected token ‘?’, “?{“respons”… is not valid JSON
のエラー。
応答が正しいJSONじゃないよ、と言ってる。
どう間違ってるのかわからないので、JSONではなく文字列で応答を返却させました。
index.html
応答を受け取る部分(変更前)
}).then(response => response.json())
.then(data => {
let currHour = new Date();
data.responseMessage = data.responseMessage.replace("\n", "<br>");
let aiMsgTemplate = `<div class="columns">
<div class="column">
<div class="notification is-info">
<h6 class="subtitle is-6">${currHour.getHours() + ":" + currHour.getMinutes()}</h6>
${data.responseMessage}
</div>
</div>
<div class="column is-one-third"></div>
</div>`
chatBox.innerHTML += aiMsgTemplate;
chatBox.scrollIntoView(false);
})
応答を受け取る部分(変更後)
}).then(response => response.text())
.then(data => {
let currHour = new Date();
//data.responseMessage = data.responseMessage.replace("\n", "<br>");
let aiMsgTemplate = `<div class="columns">
<div class="column">
<div class="notification is-info">
<h6 class="subtitle is-6">${currHour.getHours() + ":" + currHour.getMinutes()}</h6>
${data}
</div>
</div>
<div class="column is-one-third"></div>
</div>`
chatBox.innerHTML += aiMsgTemplate;
chatBox.scrollIntoView(false);
})
requestmanager.php
応答を出力する部分を以下のように改変。
// Send the message to our AI. $resMessage = $ChatBot->sendMessage($paramsFetch["message"]); echo $resMessage; // Next, we return the response in JSON format and exit the execution. //$jsonResponse = json_encode(array("responseMessage" => $resMessage)); //echo $jsonResponse; exit;
echo $resMessage;
を追加し、
//$jsonResponse = json_encode(array("responseMessage" => $resMessage)); //echo $jsonResponse;
をコメントアウトしました。