概要
ChatGPT APIを、PHPから動かすためのスクリプトです。
※ 一人用です。会話のログが残る仕様のため、複数ユーザで利用するには向いていません。
※ ストリームには対応していません。回答が一度に出力されるため、長文の場合はレスポンスに5〜10秒程度かかる事があります。
※ また、OpenAIサーバの混雑具合などによりレスポンスに遅延が発生する場合があります。
▼ トップページ画面
フォームに質問を入力してEnterキーを押すと、APIに質問が送られ、以下の様にフォームの下にレスポンスが表示されます。
会話は「会話をリセット」でクリアしない限り、これまでの話題はそのまま続きます。
事前準備
PHP7が動作するWebサーバと、ChatGPT APIのAPIキーを取得しておいてください。
APIキーはこちらからSign upすることで、取得が可能です。
詳しい方法が不明な場合は「ChatGPT API APIキー取得」などで検索していただければ、方法を画像つきで説明しているサイトがヒットするかと思います。
ローカル環境でもPHP7がインストールされていれば動作します。XAMPPがおすすめです。
ダウンロード
PHPスクリプト一式は以下からダウンロード可能です。
https://aokikotori.com/download/chatgpt_api_php.zip
zipファイルを解凍し、マニュアルに沿ってインストールしてください。
インストール
-
php/chatapi.phpの6行目API_KEYを、取得したAPIキーに書き換える
修正前: define('API_KEY', 'sk-');
修正後: define('API_KEY', 'sk-*************************'); -
すべてのファイルをアップロード
-
アップロードしたユーザとPHPの実行権限が異なる場合、data/data.txtに書き込み権限を与える
-
https://(アップロードした場所)/index.phpにアクセス
Q&A
質問を送信しても、回答が表示されない
data/data.txtに書き込み権限が与えられていない可能性があります。
FTPのアカウントとPHPの実行アカウントが異なる事が多いので、不明な場合は data/data.txtのパーミッションを 0666に 設定しておくと良いでしょう。
他の人の質問も見えてしまうのですが…。
このチャットボットは一人用です。data.txtに質問と回答がすべて入る様になっています。
前の会話を維持できますか?
はい。「会話をリセット」するまでの会話はAPIに送信されますので、
任意の話題での会話や、しりとりなどのゲームを楽しむことが出来ます。
このPHPを使うとAPIの利用料金が物凄いのですが…。
ChatGPT APIでは、文字数に応じて料金が高くなる仕様です。
適度に「会話をリセット」を実行しないと、表示されている内容をすべて送信するので、料金はご注意ください。(APIの料金ページなどを随時確認のうえ、上限設定などをご利用ください)
APIにキャラクターを設定して、ロールプレイを楽しみたい!
php/chatapi.phpの39行目の contentの中身を書き換えてください。
修正前
$data["messages"][] = array('role' => 'system', 'content' => "");
修正後
$data["messages"][] = array('role' => 'system', 'content' => "関西弁で喋りなさい");
APIに送信するパラメータをいじってみたい
APIでは、生成されるレスポンスのトークンの最大数や、サンプリング温度など、細かく設定できる様です。
php/chatapi.phpの34行目を下の様に追記してください。
修正前
$data = array('model' => 'gpt-3.5-turbo');
修正後
// top_p(サンプリング温度)を0.5、max_tokens(レスポンスのトークン)をmax300に設定
$data = array('model' => 'gpt-3.5-turbo', 'top_p' => 0.5, 'max_tokens' => 300);
ソースコードの書き方がなってない!
どこで何を処理しているのかを分かりやすくするために、あえてこうしています。
詳しい方は適宜書き換えていただければ幸いです。
動きが違うよね? だって本家のChatGPTだともっとレスポンスが速くて、1文字ずつチャカチャカ出てくるんですけど?
レスポンスが出力されるまでの時間は、こちらの方法が若干速いです。
本家では回答が1文字ずつ出力されるので、速く見えるのです。
もちろん、本家の様にストリーミングで出力させることも出来ます。
ただ出力にはPHPだけでなく、JavaScriptが必要になりますので、以下のページ上で解説しております。
https://qiita.com/kotonoha0109/items/52e73d500b19363b388f