ChatGPTのAPIには、不適切な表現を入力された時に、これを検知して排除する機能があります。
今回は、前回Laravelで作ったWebアプリに、どのようにこの機能を搭載するかを解説します。
わたし自身も、先日作成したWebアプリ【今日のメニュー】に性的表現を入れられてしまったので、この機能を搭載しました。

実際にどんなふうにエラーが出るか、ご興味あれば、下記をクリックして実際のWebアプリを試してみてください。あまり不適切な表現を使って頂きたくない気もしますが。
前提条件
前回は、LaravelとChatGPTをAPIで連携させてWebアプリを作りました。このコードに、手を加えていくことにします。
コードの作り方は、下記を参考にしてください。
不適切な表現を検知するコードを追加
まずはコントローラに手を加えます。
前回作成したImageController.phpを開き、generateResponseメソッドに下記コードを追加します。
【ImageController.php】
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |    public function generateResponse($inputText) {         // コードを追加         $response = OpenAI::moderations()->create([             'model' => 'text-moderation-latest',             'input' => $inputText,         ]);         foreach ($response->results as $result) {             $flag=$result->flagged;              if($flag===true) {                 return true;             }         }         // 追加箇所終了         $result = OpenAI::completions()->create([             'model' => 'text-davinci-003',             'prompt' => $inputText.'を使った料理名を1個考えて。',             'temperature' => 0.8,             'max_tokens' => 30,         ]);         return $result['choices'][0]['text'];     } | 
これによって、不適切な表現が入るとフラグがたちます。
テストとして、ddを使って$responseの結果を表示させてみましょう。
| 1 2 3 4 5 6 7 8 9 10 |     public function generateResponse($inputText) {         // コードを追加         $response = OpenAI::moderations()->create([             'model' => 'text-moderation-latest',             'input' => $inputText,         ]);         // dd追加         dd($response);         (省略)         } | 
不適切な表現を用いた場合には、下記のように ‘violated’【違反】 が true になります。

なお上記テストでは、性的な表現を用いたので、[sexual]の違反がtrueとなっています。スコアも出ます。
違反結果をビュー側に反映させる
違反があった場合に、ビュー側にメッセージを表示させていきます。ImageController.phpのimageメソッドに、下記コードを追加します。
【ImageController.php】
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |     public function image(Request $request)     {         $inputText=$request->food;         if($inputText!=null) {             $responseText = $this->generateResponse($inputText);             // コードを追加             if($responseText===true) {                 $error = '不適切な表現です。';                 return view('image', compact('error'));             }             // 追加箇所終了             $messages = [                 ['title' => '食材', 'content' => $inputText],                 ['title' => 'メニュー', 'content' => $responseText]             ];             $image=$this->generateImage($responseText);             return view('image', compact('messages', 'image'));         }         return view('image');     } | 
さらにビューファイル(resources/views/image.blade.php)にも、下記のように、エラーがあった場合にエラーを表示するコードを追加します。
【image.blade.php】
| 1 2 3 4 | {{-- エラー表示用コード --}} @if(isset($error)) {{ $error }} @endif | 
テストしてみましょう。
不適切な表現を入れると、エラーが返ってきます。

違反の種類によってメッセージを変える
なお今回は性的な表現違反でしたが、今回加えたコードによって、他にも下記の7点の違反をチェックしてくれます。
【ChatGPTが検知できる違反項目】
| hate | 憎悪的 | 
| hate/threatening | 憎悪的・脅迫的 | 
| self-harm | 自傷的 | 
| sexual | 性的 | 
| sexual/minors | 性的・未成年 | 
| violence | 暴力的 | 
| violence/graphic | 暴力的/グラフィック | 
違反の種類によってエラーメッセージを変えることも可能です。
たとえば、violenceやsexualの時だけ違反メッセージを変えたいときには ImageController.phpのgenerateResponseメソッドを下記のように変更します。
【ImageController.php】
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public function generateResponse($inputText) {         $response = OpenAI::moderations()->create([             'model' => 'text-moderation-latest',             'input' => $inputText,         ]);         // 違反項目を表示するためのコード         foreach ($response->results as $result) {             foreach ($result->categories as $category) {                 $name=$category->category->value;                  if($name=='violence') {                     return 'violence';                 }elseif($name='sexual') {                     return 'sexual';                 }             }         }         $result = OpenAI::completions()->create([             'model' => 'text-davinci-003',             'prompt' => $inputText.'を使った料理名を1個考えて。',             'temperature' => 0.8,             'max_tokens' => 30,         ]);         return $result['choices'][0]['text'];     } | 
imageメソッドも、下記のように変更を加えます。
| 1 2 3 4 5 6 7 8 9 10 11 |             $responseText = $this->generateResponse($inputText);             // 追加コード             if($responseText==='violence') {                 $error = '暴力表現が含まれています。';                 return view('image', compact('error'));             }elseif($responseText==='sexual') {                 $error = '性的表現が含まれています。';                 return view('image', compact('error'));             }             // 追加ここまで | 
なぜ、違反ワード検出機能が必要なのか
以上、不適切な表現が含まれているときにエラーにする方法でした。
最後に、なぜこの機能が必要か、わたし自身の体験をふまえてお伝えします。
わたしは先日、LaravelとChatGPTを連携させたWebアプリ【今日のメニュー】を作りました。
材料を入れるとChatGPTがメニューを考えてくれるWebアプリです。
楽しく使って頂けていて、嬉しく思います。が、ある日データベースを見てみると、性的な表現を何度も入れる方がいました。男性の性器に関連する表現です。
わたしのWebアプリの場合は、エンジニアの方向けでもあるので、「こういった表現を入れるとどうなるか?」確かめてみたのかもしれません。
ただ普通のWebアプリの場合には、こういうことをされると困りますよね。そこで、今回のコードを追加するに至ったわけです。

解説したとおり、ChatGPT側ですでに機能を用意してくれているので、これを使えばOKでした。
あなたがWebアプリを作る時の参考になれば嬉しいです。
参考サイト
OpenAIのAPIの下記ページが参考になります。
今回はライブラリを使用してLaravelとChatGPTを連携させましたが、ライブラリのページも参考になります。
最後に
今回もLaravelを使ってChatGPTとの連携方法を解説しました。
ある程度Laravelを使えれば、API連携によって、色々と可能性が広がります。
ChatGPTに聞けばコードを教えてくれますし、色々と参考となるコンテンツがたくさんあるので、ぜひ活用していってください。
本ブログも参考にしてもらえると嬉しいです。
ただ、LaravelやWebアプリの開発方法自体に慣れていない場合には、参考コードをアレンジするのが大変だと思います。
そういった場合には、まず基本部分を習得されることをおすすめします。
Laravelについては、わたしのほうで学習サイト【Laravelの教科書】を運営しているので、よかったらご利用ください。
フォーラムサイトを作りながら、実際のWebサイトを作っていく実践的な内容です。
【Laravelの教科書を通じて作成するWebアプリの画面例】


基礎編は無料です♪
ご興味あれば、上記ボタンをクリックして詳細をご覧ください。
 
  
  
  
  


