Laravelを使って、OpenAIのChatGPTとDALL·E 2 を使ったWebアプリを開発してみました。
食材を入れると、メニューを考えてくれて、さらにメニューに合った画像を作ってくれるWebアプリです。
今回のコードを元にした実際のWebアプリ【今日のメニュー】もこちら にあります。
サンプル動画は、下記をご覧ください。
それでは早速始めてみましょう♪
初期設定
まずは、OpenAIのAPIキーを取得して、Laravelに設定します。
また必要なライブラリもインストールしておきましょう。
手順は、下記記事の「ChatGPT APIを使ってLaravelでWebアプリを作成:APIキー設定」をご覧ください。
コントローラ作成
下記コマンドでコントローラを作ります。
1 |
php artisan make:controller ImageController |
app/Http/Controllersの中のChatController.phpを開きます。
use宣言には、次の通りいれておきましょう。
【app/Http/Controllers/ChatContoller.php】
1 |
use OpenAI\Laravel\Facades\OpenAI; |
最初にimageメソッドを作ります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public function image(Request $request) { $inputText=$request->food; if($inputText!=null) { // generateResponseメソッドに処理を受け渡す $responseText = $this->generateResponse($inputText); $messages = [ ['title' => '食材', 'content' => $inputText], ['title' => 'メニュー', 'content' => $responseText] ]; // generateImageメソッドに処理を受け渡す $image=$this->generateImage($responseText); return view('image', compact('messages', 'image')); } return view('image'); } |
$request->foodがnullではない、つまり、フォームから処理を受け渡されていれば、if($inputText!=null) 以下のコードを実行します。
まずgenerateResponseメソッドに処理を受け渡します。ここでは、ChatGPTにフォームから送信された値を受け渡して、これを元にメニューを作ってもらいます。
次にgenerateImageメソッドに処理を受け渡します。ここでは、DALL·E 2にChatGPTが考えたメニューを受け渡して、これを元に画像を作ってもらいます。
generateResponseメソッドは、下記のように入れます。
1 2 3 4 5 6 7 8 9 10 |
// メニューを作成 public function generateResponse($inputText) { $result = OpenAI::completions()->create([ 'model' => 'text-davinci-003', 'prompt' => $inputText.'を使った料理名を1個考えて。', 'temperature' => 0.8, 'max_tokens' => 30, ]); return $result['choices'][0]['text']; } |
- temperatureは、多様性を制御するためのパラメータとなります。高い(例:0.8)と、ランダムで多様性に富んでいる回答が得られ、低い(例:0.2)と、より保守的な回答が得られます。
- max_tokensは、最大トークンとなります。今回はメニュー名なので、少な目に30までとしました。30トークンは大体30文字程度ですが、文字によると1トークン1文字以上でカウントされます。また、漢字が入ったりすると増えます。
日本語の場合は、英語よりも多めにトークンが使われます。
トークンがどれだけ使われたか知るには、openAIのPlaygroundページでテストができます。右下に、やりとりに使われたトークン数が表示されます。
generateImageメソッドは、下記のように入れます。
1 2 3 4 5 6 7 8 9 10 |
// 画像を作成 openai API public function generateImage($responseText) { $response = OpenAI::images()->create([ 'prompt' => $responseText, 'n' => 1, 'size' => '256x256', 'response_format' => 'url', ]); return $response['data'][0]['url']; } |
- sizeは、画像のサイズです。512*512、1024*1024のサイズ指定も可能です。ただ、大きい画像にすると、それだけAPIの利用料金も高くなります。
- response_formatは、画像のフォーマットです。今回はurlにしました。他にもb64_jsonが選択可能です。b64_jsonの場合は、base64によって変換されたデータが得られます。表示の際には、デコードが必要です。
ルート設定作成
次にルート設定を作ります。routes/web.phpファイルを開き、下記ルートを追加しましょう。
【routes/web.php】
1 2 3 4 |
use App\Http\Controllers\ImageController; (省略) Route::get('/image', [ImageController::class, 'image'])->name('image.create'); Route::post('/image', [ImageController::class, 'image'])->name('image.post'); |
ビュー作成
最後にビュー部分です。resources/viewsの中にimage.blade.phpファイルを作り、下記のコードを追記します。
【resources/views/image.blade.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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<!DOCTYPE html> <html lang="ja"> <head> <title>今日のメニュー</title> @vite(['resources/css/app.css', 'resources/js/app.js']) <meta name="viewport" content="width=device-width, initial-scale=1.0"> </head> <body> <div class="mx-auto px-2 pt-8 pb-4 md:w-full lg:max-w-5xl xl:max-w-7xl"> <div class="bg-white rounded-lg shadow-lg p-6"> <h1 class="text-2xl font-bold mb-6">Today's Menu 今日のメニュー</h1> {{-- 材料を入力するためのフォーム --}} <form action="{{route('image.post')}}" method="POST"> @csrf <input name="food" type="text" class="w-full px-4 py-2 mb-2 border border-gray-200 rounded-lg"> <button type="submit" class="w-full px-4 py-2 bg-blue-500 text-white font-semibold rounded-lg mt-2"> 送信する </button> <button id="clearChatButton" class="w-full px-4 py-2 bg-red-500 text-white font-semibold rounded-lg mt-2"> 履歴削除 </button> </form> {{--メニューを表示 --}} @isset($messages) @foreach($messages as $message) <div class="text-align"> {{ $message['title'] }}: {{ $message['content'] }} </div> @endforeach @endisset {{--画像を表示 --}} @isset($image) <img src="{{ $image }}" alt="画像" class="mx-auto"> @endisset </div> </div> </body> </html> |
サイトにアクセスして、画像をチェックしてみましょう。
こちらは良い画像ですが、時々、変な画像が生成されたりします。
$responseText の値を変更したりして、調整してみてください。
APIの利用料金について
以上がChatGPTとDALL·E 2 APIを使ったコード例です。
APIの利用料金や注意点については、下記記事の 「ChatGPTのAPIを使う時の料金について」をご覧ください。
今回は新たに画像を使ってみました。今回使用したDALL·E 2 APIは、256*256サイズの画像で、1個につき0.016ドルかかります。
100回使われると1.6ドル。今日のレートでは1ドル133円だったので、213円程となります。
正直、希望通りの画像が作れるわけではないので、このお値段は安くはないかなという印象です。
APIの利用料金は、ログイン後、右上のユーザー名をクリックして【Manage account】を選択すると分かります。
実際のWebアプリ
なお、今回のコードを元にした実際のWebアプリ【今日のメニュー】も公開しています。
上記ボタンをクリックして、ぜひ遊んでみてくださいね♪
なお、画像生成APIは、DALL·E 2ではなく、Pexelsを使っています。最初は、DALL·E 2を使っていたのですが、画像生成に時間がかかる・関係のない画像ができる・そのわりに安くはない、という理由から、変更しました。
ちなみに、DALL·E 2にりんごと肉でメニューを作ってもらうと、こんな画像ができたりしました。
これはこれで面白いのですが。AI画像生成は、また後日、試してみたいと思います。
さいごに
今回は、OpenAI社のChatGPTとDALL·E 2 をLaravelと連携させて、Webアプリを作る方法を解説しました。
AI系のAPIを使うと、Webアプリ開発の幅が広がってきますよね。
参考にしたOpenAI社の公式ドキュメントはこちらです。アレンジしたい時に参考にしてください。
ただ、コードのアレンジは。Laravelやプログラミングについて、ある程度の知識がないと難しいかと思います。
もし
「参考記事をコピペするだけじゃなく、自分でコードを編集できるようになりたい」
と思ったら、まずは基本からひとつずつ、学んでいきましょう♪
Laravelについては、わたしが運営している学習サイト【Laravelの教科書】で、基本的な使い方を習得していただけます。
【Laravelの教科書を通じて作成するWebアプリの画面例】
Laravelを学びつつ、フォーラムサイトを学んでいく実践的な教材です。ご興味あれば、下記ボタンをクリックしてください。
基礎編は無料です♪