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;
をコメントアウトしました。



コメント