Laravel + openai-php/client を使ってAIを教育・質問する方法

目次

スポンサードリンク

やりたいこと

今回はOpenAIのAPIを使って関西弁で質問に答えてもらいます。教育というのはAIに簡単な制約(関西弁と文字数)与えることです。 質問を受け付ける部分はLaravelで作ります。OpenAIのAPIを呼び出す方法は複数ありますが、今回はOpenAIが公開しているライブラリ「openai-php/client」を使います。

OpenAIアカウントの作成とAPIキーの用意

まずは、OpenAIのサイトにアクセスしアカウントを作成しましょう。
https://platform.openai.com/overview

アカウントを作ったらクレジットカードや住所を登録して有料プランにアップグレードしましょう。

クレジットカード登録画面

最初に支払う金額を入力します。私は10ドルにしておきました。

初期のデポジット指定画面

https://platform.openai.com/account/billing/overview を見るとしっかり10ドル分利用できるようになってます。

デポジット結果

https://platform.openai.com/account/billing/limits では、利用上限を設定できます。デフォルトでは120ドルになってるので心配な人は調整しておきましょう。

OpenAIの決済上限を確認編集する画面

アカウントとクレジットの準備ができたら、APIキーを作成しましょう。 https://platform.openai.com/account/api-keys にアクセスし「Create new secret key」ボタンを押しましょう。APIキーが発行されます。このキーは大切に保管し漏洩しないよう注意して扱いましょう。

APIキーを発行する画面

Laravelアプリの作成

では質問を受け付ける画面を作っていきます。Windows上に構築したLaravel開発環境で試していきます。開発環境の構築がまだの場合はこちらの記事を参考にしてください。

コマンドプロンプトで以下コマンドを実行してLaravelのアプリを作成しましょう。

C:\apps>composer create-project laravel/laravel chatgpt-client
C:\apps>cd chatgpt-client
C:\apps\chatgpt-client> npm install

コントローラーの用意

画面からの質問を受け付け、OpenAIのAPIを呼び出す処理を用意します。処理を書くコントローラーを用意します。

C:\apps\chatgpt-client> php artisan make:controller ChatGptController

INFO  Controller [C:\apps\chatgpt-client\app/Http/Controllers/ChatGptController.php] created successfully.  

コントローラーは以下の様にしておきます。画面を初期表示する際と質問を する際のそれぞれの処理を記述する関数を用意しておきます。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ChatGptController extends Controller
{
    /**
     * index
     *
     * @param  Request  $request
     */
    public function index(Request $request)
    {
        return view('index');
    }

    /**
     * post
     *
     * @param  Request  $request
     */
    public function post(Request $request)
    {
    }
}

routes/web.php に以下を追記します。

use App\Http\Controllers\ChatGptController;

Route::get('/', [ChatGptController::class, 'index']);
Route::post('/', [ChatGptController::class, 'post']);

画面の用意

resources/views/index.blade.php にファイルを用意します。

<html>
<head>
    <meta charset='utf-8' />
</head>
<body>
    <form method="POST">
        @csrf
        <input type="text" name="sentence" value="{{ isset($sentence) ? $sentence : '' }}">
        <button type="submit">質問する</button>
    </form>
    {{-- 結果 --}}
    {{ isset($response_text) ? $response_text : '' }}
</body>
</html>

ライブラリのインストール

OpenAI公式のライブラリは以下で確認できます。

https://platform.openai.com/docs/libraries/php

2023年10月に確認したところ3つありました。今回は一番下のopenai-phpを使ってみます。

  • orhanerday/open-ai by orhanerday
  • tectalic/openai by tectalic
  • openai-php clinet by openai-php

composer でライブラリをインストールしておきます。

C:\apps\chatgpt-client> composer require openai-php/client

APIを実行しAIを教育・質問する

公式ドキュメントを見ながら処理を実装していきます。

https://github.com/openai-php/client

シンプルな呼び出し方は以下の二つがあるようでした。

$client->completions()->create
$client->chat()->create

今回は明示的にAIに役割をあたえられるchat()の方を使ってみることにします。コントローラーの処理を以下のように書き換えます。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;

use OpenAI;

class ChatGptController extends Controller
{
    /**
     * index
     *
     * @param  Request  $request
     */
    public function index(Request $request)
    {
        return view('index');
    }

    /**
     * chat
     *
     * @param  Request  $request
     */
    public function post(Request $request)
    {
        // バリデーション
        $request->validate([
            'sentence' => 'required',
        ]);

        // 画面で入力した質問
        $sentence = $request->input('sentence');

        // .env に設定したAPIキー
        // .env には OPENAI_API_KEY='' の形式でAPIキーを追加しておきます。
        $yourApiKey = getenv('OPENAI_API_KEY');
        $client = OpenAI::client($yourApiKey);

        $response = $client->chat()->create([
            'model' => 'gpt-3.5-turbo',
            'max_tokens' => 300,
            'messages' => [
                ['role' => 'system', 'content' => '関西弁で100文字程度で返答して'],
                ['role' => 'user', 'content' => $sentence],
            ],
        ]);

        $response_text = $response['choices'][0]['message']['content'];

        return view('index', compact('sentence', 'response_text'));
    }

}

クライアントに渡すオプション

‘model’
チャットの完成時に生成するトークンの最大数。入力トークンと生成トークンの合計は、モデルのコンテキストの長さに制限されます。

‘max_tokens’
会話で使用できるトークン数の上限を指定します。モデル自体にもトークンの上限がありその範囲内で指定します。トークンが少なすぎると途中で途切れた返答になります。以下のサイトに文字を入力するとトークン数がわかります。

https://platform.openai.com/tokenizer

‘messages’
role と content の連想配列です。roleには user、system、assistantのいずれかを指定します。userはAIとChatをする役割です。質問の本文を指定しています。systemはAIの返答に制約をあたえます。今回は方言の指定と返答文字数を指定しました。assistantはAIからのメッセージです。連続した会話をする際などこれまでのやり取りを指定する目的で使用します。

開発サーバーを起動して質問してみる

開発サーバーを実行してブラウザでアクセスしてみます。

C:\apps\chatgpt-client> php artisan serve

質問に端的に答えてくれる関西AIが出来上がりました!

関西AIに質問する画面のスクリーンショット

トラブルシューティング

You exceeded your current quota, please check your plan and billing details.
このメッセージが表示されたら有料プランの決済がうまくいってないかもしれません。決済が正常に完了しているか確認しましょう。

This is not a chat model and thus not supported in the v1/chat/completions endpoint. Did you mean to use v1/completions?
使用するモデルを変更してみると良いかも。 私の場合は、’model’ => ‘gpt-3.5-turbo-instruct’, を $client->chat()->create() で使用したらこのエラーメッセージが表示されました。’gpt-3.5-turbo’ に変更したらうまくいきました。

今回の検証は以上です。何度も繰り返してやり取りをするケースやAIに与える制約(前提条件)を指定すると応用が利きそうですね。

ChatGPT、Laravelを学ぶ際のおすすめ書籍

ChatGPT/LangChainによるチャットシステム構築[実践]入門
ChatGPTのAPIとLangChainを使って、大規模言語モデル(LLM)を本番レベルのシステムに組み込むための知識をステップバイステップで、手を動かしながら実践できる書籍です。入門から実践まで体系的に学べます。


独習PHP 第4版
PHP の基本から抑えたいときはこちら。解説が詳しい、練習問題で知識の定着も促せる。辞書のような一冊。手元にある安心感。とにかく分厚い。


Twitterもやってます。
Web開発やノーコード開発、趣味のお酒や家庭菜園についてつぶやいてます。

https://twitter.com/haradedede