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

(1/1)
あらゆる分野を網羅し、日本語でも対話ができるAIチャット「ChatGPT」が話題である。開発しているOpenAIがAPIを公開しており、これを使ってPHPによるチャットボットを作ってみることにする。
OpenAIの利用は有料だが、最初、3ヶ月間18ドル分(2023年3月からは5ドル分)のチケットが付いてくる。これを使ってプログラムの試作ができる。
(2024年10月8日)openAI() -- WebAPI変更,エラー処理変更

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

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

目次

サンプル・プログラム

圧縮ファイルの内容
chatOpenAI.phpサンプル・プログラム
pahooInputData.phpデータ入力に関わる関数群。
使い方は「PHPでGET/POSTでフォームから値を受け取る」「数値入力とバリデーション」「文字入力とバリデーション」などを参照。include_path が通ったディレクトリに配置すること。
chatOpenAI.php 更新履歴
バージョン 更新日 内容
1.1.0 2024/10/08 openAI() -- WebAPI変更,エラー処理変更
1.0 2023/02/18 初版
pahooInputData.php 更新履歴
バージョン 更新日 内容
1.7.0 2024/10/09 validURL() validEmail() 追加
1.6.0 2024/10/07 isButton() -- buttonタグに対応
1.5.0 2024/01/28 exitIfExceedVersion() 追加
1.4.2 2024/01/28 exitIfLessVersion() メッセージ修正
1.4.1 2023/09/30 コメントの訂正

準備: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

  25: define('REFERENCE', 'http://www.pahoo.org/e-soul/webtech/php06/php06-77-01.shtm');
  26: define('TITLE', 'OpenAI GPT3を使ったチャットボット');
  27: 
  28: //データ入力に関わる関数群:include_pathに配置すること
  29: require_once('pahooInputData.php');
  30: 
  31: //PHPバージョン・チェック
  32: exitIfLessVersion(MINUMUM_VERSION);

chatOpenAI.php

  51: //表示幅(ピクセル)
  52: define('WIDTH', 600);
  53: 
  54: //入力テキスト(初期値)
  55: define('DEF_SOUR', '');

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

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

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

chatOpenAI.php

 118: // OpenAI API クラス =======================================================
 119: class pahooOpenAI {
 120:     var $webapi;        //直前に呼び出したWebAPI URL
 121:     var $errmsg;        //エラーメッセージ
 122: 
 123:     //OpenAI APIキー
 124:     //https://platform.openai.com/account/api-keys にて登録のこと.
 125:     var $OPENAI_API_KEY = '*****************************************';
 126: 
 127: /**

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

chatOpenAI.php

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

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

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

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

参考サイト

(この項おわり)
header