PHPで OpenAIを使ったチャットボットをつくる

(1/1)
あらゆる分野を網羅し、日本語でも対話ができるAIチャット「ChatGPT」が話題である。開発しているOpenAIがAPIを公開しており、これを使ってPHPによるチャットボットを作ってみることにする。
OpenAIの利用は有料だが、最初、3ヶ月間18ドル分(2023年3月からは5ドル分)のチケットが付いてくる。これを使ってプログラムの試作ができる。
(2026年1月11日)PHP8.5対応:curl_closeを使わない
(2025年9月6日).pahooEnv導入

サンプル・プログラムの実行例

PHPで OpenAIを使ったチャットボットをつくる

目次

サンプル・プログラム

圧縮ファイルの内容
chatOpenAI.phpサンプル・プログラム
.pahooEnvクラウドサービスを利用するためのアカウント情報などを記入する .env ファイル。
使い方は「各種クラウド連携サービス(WebAPI)の登録方法」を参照。include_path が通ったディレクトリに配置すること。
pahooInputData.phpデータ入力に関わる関数群。
使い方は「PHPでGET/POSTでフォームから値を受け取る」「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
chatOpenAI.php 更新履歴
バージョン 更新日 内容
1.3.0 2026/01/11 PHP8.5対応:curl_closeを使わない
1.2.0 2025/09/15 .pahooEnv導入
1.1.0 2024/10/08 openAI() -- WebAPI変更,エラー処理変更
1.0 2023/02/18 初版
pahooInputData.php 更新履歴
バージョン 更新日 内容
2.0.1 2025/08/11 getParam() bug-fix
2.0.0 2025/08/11 pahooLoadEnv() 追加
1.9.0 2025/07/26 getParam() 引数に$trim追加
1.8.1 2025/03/15 validRegexPattern() debug
1.8.0 2024/11/12 validRegexPattern() 追加

準備:PHP の https対応

クラウド連携や相手先サイトのデータを読み込むのに https通信を使うため、PHPに OpenSSLモジュールが組み込まれている必要がある。関数  phpinfo  を使って、下図のように表示されればOKだ。
OpenSSL - PHP
そうでない場合は、次の手順に従ってOpenSSLを有効化し、PHPを再起動させる必要がある。

Windowsでは、"php.ini" の下記の行を有効化する。
extension=php_openssl.dll
Linuxでは --with-openssl=/usr オプションを付けて再ビルドする。→OpenSSLインストール手順

これで準備は完了だ。

準備:pahooInputData 関数群

PHPのバージョンや入力データのバリデーションなど、汎用的に使う関数群を収めたファイル "pahooInputData.php" が同梱されているが、include_path が通ったディレクトリに配置してほしい。他のプログラムでも "pahooInputData.php" を利用するが、常に最新のファイルを1つ配置すればよい。

また、各種クラウドサービスに登録したときに取得するアカウント情報、アプリケーションパスワードなどを登録した .pahooEnv ファイルから読み込む関数 pahooLoadEnv を備えている。こちらについては、「各種クラウド連携サービス(WebAPI)の登録方法」をご覧いただきたい。

準備:OpenAI APIキーの取得

OpenAIは、2015年12月にイーロン・マスクをはじめとする複数の投資家により設立された人工知能研究所で、汎用人工知能(AGI:Artificial General Intelligence)が人類全体に利益をもたらすことを使命とし、非営利団体として設立された。2019年に営利企業のOpenAI LPを創設し、現在OpenAI LPとそれを管理する非営利団体OpenAI Nonprofitのハイブリッド体制で運営されている。
OpenAIアカウント作成
https://openai.com/api/login/ にアクセスし、サインアップを行う。
OpenAI APIキーの取得
アカウントができたら、https://openai.com/api/ にアクセスし、右上のPersonaアイコンをクリックし、メニューから、「View API keys」を選ぶ。
OpenAI APIキーの取得
左ペインにあるメニューから、「Billing > Overview」を選ぶ。
OpenAI APIキーの取得
画面が切り替わったら、「Setup paid account」をクリックし、クレジットカード番号や住所などを入力していく。
OpenAIの利用は有料だが、最初、3ヶ月間18ドル分(2023年3月からは5ドル分)のチケットが付いてくる。これを使ってプログラムの試作ができる。
OpenAI APIキーの取得
左ペインから「API Keys」を選び、クラウドサービスを利用するためのAPIキーを生成する。これは、後ほど紹介するプログラムで使うのでメモしておいてほしい。

以上で、API利用のための準備は終わりだ。

準備:定数など

chatOpenAI.php

chatOpenAI.php

  53: // 各種定数(START) ===========================================================
  54: 
  55: // 表示幅(ピクセル)
  56: define('WIDTH', 600);
  57: 
  58: // 入力テキスト(初期値)
  59: define('DEF_SOUR', '');
  60: 
  61: // 各種定数(END) ===============================================================

定数などは自由に変更できる。
データ入力に関わる関数群を含むファイル "pahooInputData.php" はinclude_pathが通ったディレクトリに配置すること。

準備:OpenAI API クラスと APIキー

OpenAIを利用する処理は、クラス pahooOpenAI として分離した。
プロパティ $OPENAI_API_KEY に、先ほど生成したAPIキーを代入する。

chatOpenAI.php

 124: // OpenAI API クラス =======================================================
 125: class pahooOpenAI {
 126:     public $webapi;     // 直前に呼び出したWebAPI URL
 127:     public $errmsg;     // エラーメッセージ
 128: 
 129:     // OpenAI APIキー
 130:     // https://platform.openai.com/account/api-keys にて登録のこと.
 131:     public $OPENAI_API_KEY = '';
 132: 
 133: /**

解説:OpenAI GPT-3を使ってチャットする

chatOpenAI.php

 182: /**
 183:  * 入力テキストを指定し,OpenAI GPT-3を使ってチャットする.
 184:  * 使用モデル,回答の自由度,コンテクスト長を指定できる.
 185:  * @param   string $text  入力テキスト
 186:  * @param   string $model 使用モデル
 187:  * @param   float  $temperature 回答の自由度(0~1:1に近いほど自由)
 188:  * @param   float  $max_tokens  コンテクスト長(入力と回答を足したトークン数)
 189:  * @return  string 返答テキスト/FALSE:失敗
 190: */
 191: function openAI($text, $model='gpt-3.5-turbo', $temperature=1.0, $max_tokens=400) {
 192:     $this->webapi = 'https://api.openai.com/v1/chat/completions';
 193:     $headers = array(
 194:         'Content-Type: application/json',
 195:         'Authorization: Bearer ' . $this->OPENAI_API_KEY,
 196:     );
 197:     $payload = array(
 198:         'model'         => $model,
 199:         'messages' => [
 200:             ['role' => 'user', 'content' => $text],
 201:         ],
 202:         'temperature'   => $temperature,
 203:         'max_tokens'    => $max_tokens
 204:     );
 205:     $ret = FALSE;
 206: 
 207:     $ch = curl_init();
 208:     curl_setopt($ch, CURLOPT_URL, $this->webapi);
 209:     curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
 210:     curl_setopt($ch, CURLOPT_POST, TRUE);
 211:     curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
 212:     curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
 213: 
 214:     curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
 215:     curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
 216:     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
 217:     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
 218: 
 219:     $data = curl_exec($ch);
 220:     // PHP8.5:非推奨関数
 221:     if (PHP_VERSION_ID < 80500) {
 222:         curl_close($ch);
 223:     }
 224: 
 225:     // エラー処理
 226:     if ($data == FALSE) {
 227:         $this->errmsg = 'OpenAI APIにアクセスできません';
 228:         $ret = FALSE;
 229:     } else {
 230:         $arr = json_decode($data, TRUE);
 231:         if ($arr == FALSE) {
 232:             $this->errmsg = 'OpenAI APIの応答が不正です';
 233:             $ret = FALSE;
 234:         } else if (isset($arr['error'])) {
 235:             $this->errmsg = $arr['error']['message'];
 236:         // 正常応答
 237:         } else if (isset($arr['choices'][0]['text'])) {
 238:             $ret = (string)$arr['choices'][0]['text'];
 239:         } else {
 240:             $this->errmsg = 'OpenAI APIの応答が不正です';
 241:             $ret = FALSE;
 242:         }
 243:     }
 244: 
 245:     return $ret;
 246: }

メソッド openAI は、入力テキストを指定し、OpenAI GPT-3を使ってチャットする。

OpenAI は複数の言語モデルを開発した。今回使用する GPT-3は、2018年に発表したTransformerと呼ばれる深層学習の手法を用いた言語モデルの第3世代だ。Wikipedia やWebサイトから収集したデータなどから抽出した45TBものテキストデータに対し、いくつかの前処理を行い、570GBのデータセットを学習に用いています。このデータセットに対して、1750億個のパラメータを持つ自己回帰型言語モデルを学習することで、これまでにない巨大な言語モデルを作成している。

じつは、cURLを使ってOpenAIにアクセスするPHPプログラムの作り方をChatGPTに質問し、このメソッドを仕上げた。便利な時代になったものだ。
ChatGPT

参考サイト

(この項おわり)
header