OpenAIのAPIは、基本的にはシンプルなのでPHPからCURL経由でも取得できます。
ChatGPTのAPIをPHPから使うには?
事前に有料APIの利用を申し込み、クレジットカードなどを設定しておきましょう。
APIの利用にあたっては個別キーを発行しておきましょう。
PHPでのサンプル例がいくつかネットに上がっています。
ライブラリを特に使わなくても、PHPでCURLで対応できます。
PHP | OpenAIのAPIを実装するサンプルコード | ONE NOTES (1-notes.com)
ChatGPT-PHP/Index.php at main · p4us/ChatGPT-PHP · GitHub
上記サンプルをうちでためしたところ、エラーにはならいなものの文章が返ってきませんでした。
いろいろしらべたところ、CURLに以下の一文を付け加えればちゃんと文章が返ってきました。
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);
上記サンプルにこの一文を加えて試してみてください。
What am I doing wrong? (PHP, API OpenAI) - Prompt Assistance - OpenAI API Community Forum
上記サンプルを改変し、うちで実際に動いたPHPのサンプルコードは以下になります。
$prompt = "空はなぜ青いの?";
$OPENAI_API_KEY = "{ここにAPIキー}";
$ch = curl_init();
$headers = array(
'Accept: application/json',
'Content-Type: application/json',
'Authorization: Bearer ' . $OPENAI_API_KEY . ''
);$postData = array(
'model' => "text-davinci-003",
'prompt' => str_replace('"', '', $prompt),
'temperature' => 0.9,
'max_tokens' => 512,
'top_p' => 0.5,
'frequency_penalty' => 0.0,
'presence_penalty' => 0.0,
'stop' => '[" Human:", " AI:"]',
);curl_setopt($ch, CURLOPT_URL, 'https://api.openai.com/v1/completions');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData));
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);$result = curl_exec($ch);
if($result === false){
$this->pErr = curl_error($ch);
return false;
}
$decoded_json = json_decode($result, true);
print_r($decoded_json['choices'][0]['text']);
ChatGPTのAPIの不具合
サーバーにつながらない?
ChatGPTへのアクセスはかなり多いようで、サーバ障害が起きる場合があります。
サーバのステータス情報は以下に公開されているのでチェックしてみましょう。
返答の文字が途中で途切れるんだけど?
返答文字数は、APIのmax_tokens数で指定されます。
max_tokens数を多くすると返ってくる文字数が増えます。
ただtoken数が多いと、APIの利用料金は増えていくものと思われます。
改行をするには?
返答に改行が入る場合は、「\n」を「<BR>」へ変換すると、改行されたHTMLとして表示できます。
$pDat = str_replace("\n", "<BR>", $pDat);
回答内容を変えたい?
回答内容はtemperature、top_pといったパラメータの影響を受けます。
temperatureが0なら毎回同じ回答となります。2になると完全にランダムとなります。
top_pは、出現率の高いものから選択するので小さい数値ほど高頻度の単語が選択されます。
返答内容に繰り返しの文言が多い?
presence_penalty、frequency_penaltyといったパラメータで指定します。
presence_penaltyが-2なら繰り返しが多く、2なら少ないです。
frequency_penaltyが-2なら繰り返しが多いほどペナルティを加算します。