はじめに
本記事はプロもくチャット Adevent Calendar2023の24日目です
毎日の献立を決めるのがめんどくさいという主夫・主婦の方へ
ChatGPTに何個か要素入れて献立と作り方教えてもらおう
早速作っていく
Laravel使いましたがそこは割愛
ChatGPTのAPI設定
APIキーの作成 ※耳タコですがシークレットキーは適当に公開しないように
Laravel側の実装
ChatGPTが提供しているライブラリが合ったのでcomposerで入れてみる(今回だけのためなのでsailのパスは通してない)
https://platform.openai.com/docs/libraries/community-libraries
$ ./vender/bin/sail composer require openai-php/client
実際のプログラム
ルート
web.php
Route::get('/recommend', [RecommendController::class, 'index']);
Route::post('/recommend', [RecommendController::class, 'recommend']);
コントローラー
RecommendController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use OpenAI;
/**
* Class RecommendController
* @package App\Http\Controllers
*/
class RecommendController extends Controller
{
/**
* @param Request $request
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View
*/
public function index()
{
return view('recommend');
}
/**
* @param Request $request
* @return \Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View
*/
public function recommend(Request $request) {
// ChatGPTにリクエスト送信する
$chatGptApiSecretKey = env('CHAT_GPT_API_SECRET_KEY');
$client = OpenAI::client($chatGptApiSecretKey);
$prompt = $request->category . 'でおすすめの献立を' . $request->count . '人前での作り方を教えてください';
$result = $client->completions()->create([
'model' => 'text-davinci-003',
'prompt' => $prompt,
'max_tokens' => 1000
]);
// ChatGPTからのレスポンスを取得する
$response = $result['choices'][0]['text'];
return view('recommend', compact('response'));
}
}
recommend.blade.php
<html>
<head>
<meta charset='utf-8' />
</head>
<body>
<div>食べる人数と種類を選択してください</div>
<form method="POST">
@csrf
<select id="count" name="count">
<option value="1">1人前</option>
<option value="2">2人前</option>
<option value="3">3人前</option>
<option value="4">4人前</option>
</select>
<select id="category" name="category">
<option value="和食">和食</option>
<option value="中華">中華</option>
<option value="洋食">洋食</option>
</select>
<button type="submit">送信</button>
</form>
@if(isset($response))
<div>{{ $response }}</div>
@endif
</body>
</html>
ライブラリ入れたことでかなり簡単にAPI呼び出し出来ました。
max_tokensはリミット設定しておくことで膨大なデータが返却されないようになります。(今回はテスト用なので結構小さめに設定しました)
結果
入力画面
とりあえず1から4人前、和食・中華・洋食で選択出来るように作成
なんかちょっと見づらいけど結構美味しそうなやつ出てきた
まとめ
今回はデザインは全くやってないですが、機能はこんな感じでもう少し選択肢を増やしていけばより自分が望むような献立を返してくれそうなのでまた今度試してみます