「モンスター社員の教科書」を作りました!

ChatGPT APIがPHPで動かない。動いたコードと試行錯誤メモ

ChatGPT
当サイトはアフィリエイト広告を利用しています

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のコードは確かそのまま使えず、サンプルコード探しました。

 

出てきたのが以下。

Using PHP to access ChatGPT API
I'm writing a simple PHP script with no dependencies to access the ChatGPT API, but it's throwing an error I don't under...

 

これを他のファイルから呼び出して、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は、

Create a ChatBot using AI, ChatGPT and PHP
Hello, welcome to this new guide with fresh and diverse content for our elegant, friendly, and always well-dressed audie...

 

書いてあるとおりに作業するも、やはり動かない。

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;

をコメントアウトしました。

タイトルとURLをコピーしました