• Время чтения ~2 мин
  • 06.03.2023

OpenAI выпустила новый API, который позволяет использовать мощную модель ИИ, которая также поддерживает ChatGPT. Давайте посмотрим, как мы можем использовать его и создать клон ChatGPT с помощью Laravel 10. Если вы хотите перейти непосредственно к исходному коду, вы можете найти его на GitHub.

Новая модель AI называется gpt-3.5-turbo и в 10 раз (!) дешевле самой мощной модели DaVinci, что удивительно.

Подсказка для этой модели работает немного по-другому, так как она направлена на «чат» автозаполнений. Это означает, что вы не просто отправляете простую строку в качестве приглашения, а вместо этого отправляете разговор в чате, который модель ИИ затем автоматически заполняет.

Вот взгляд на готовую версию нашего клона ChatGPT:

Начало работы

Чтобы начать, мы собираемся создать новое приложение Laravel 10 с использованием laravel новый chatgpt-clone, а затем установить клиент OpenAI PHP с помощью composer require openai-php/laravel.

Следующее, что нам нужно сделать, это опубликовать файл конфигурации пакета и настроить наш ключ OPENAI API.

Чтобы опубликовать файл конфигурации, выполните следующую команду:

php artisan vendor:publish --provider="OpenAI\Laravel\ServiceProvider"

После этого вы можете установить ключ API OpenAI в файле .env следующим образом:

OPENAI_API_KEY=sk-...

Создание простого пользовательского интерфейса

Поскольку нам нужен пользовательский интерфейс в стиле чата, давайте добавим простое поле ввода в наш файл welcome.blade.php а также кнопку «Сбросить разговор», как у нас есть в ChatGPT для сброса текущего разговора. Мы также заворачиваем поле ввода в форму, которая просто отправляет сообщение на основной маршрут нашего приложения Laravel.

<form class="p-4 flex space-x-4 justify-center items-center" action="/" method="post">
    @csrf
    <label for="message">Laravel Question:</label>
    <input id="message" type="text" name="message" autocomplete="off" class="border rounded-md  p-2 flex-1" />
    <a class="bg-gray-800 text-white p-2 rounded-md" href="/reset">Reset Conversation</a>
</form>

Построение «подсказки»

Как я уже упоминал выше, подсказка в данном случае работает немного по-другому. Это смесь сообщений, которые приходят от пользователя, а также ответов, которые мы получаем от OpenAI. Это позволяет нам задавать вопросы, которые ссылаются на предыдущие сообщения и ответы.

Новый API чата также позволяет нам определить «системное» сообщение, которое является своего рода общей инструкцией для модели чата, чтобы сообщить ей, каково должно быть ее общее назначение.

Поскольку эти «сообщения» должны расти с течением времени, нам нужно где-то их хранить. Для этого простого клона мы просто будем хранить сообщения в сеансе. В качестве значения по умолчанию мы разместим туда наше «системное» сообщение:

Route::post('/', function (Request $request) {
    $messages = $request->session()->get('messages', [
        ['role' => 'system', 'content' => 'You are LaravelGPT - A ChatGPT clone. Answer as concisely as possible.']
    ]);
    
    $messages[] = ['role' => 'user', 'content' => $request->input('message')];
    
    // ...
});

Как вы можете видеть, мы также немедленно добавляем сообщение пользователя в этот $messages массив.

Далее мы можем использовать этот массив и выполнить запрос API.

$response = OpenAI::chat()->create([
    'model' => 'gpt-3.5-turbo',
    'messages' => $messages
]);

Это даст нам ответ в чате OpenAI, который мы также хотим добавить в наш массив сообщений.

$messages[] = ['role' => 'assistant', 'content' => $response->choices[0]->message->content];

Обратите внимание, что на этот раз мы добавили сообщение с ролью помощника в массив, чтобы указать, что это пришло от API, а не от пользователя.

Теперь наш массив $messages содержит все сообщения, которые нам нужны, и мы можем хранить их обратно в сеансе и перенаправлять обратно.

$request->session()->put('messages', $messages);

return redirect('/');

и... Ну вот! В следующий раз, когда пользователь отправит сообщение, мы собираемся повторно использовать сообщения из сеанса и добавить к нему новое сообщение - так же, как это делает ChatGPT.

 

Поскольку теперь у нас есть все сообщения (из ответа OpenAI и от пользователя) в сеансе, все, что нам нужно сделать, это передать их в представление и отобразить их пользователю.

Чтобы не показывать внутреннее «системное» сообщение, мы можем удалить его из нашего массива сообщений перед передачей его в наше представление.

Route::get('/', function () {
    $messages = collect(session('messages', []))->reject(fn ($message) => $message['role'] === 'system');

    return view('welcome', [
        'messages' => $messages
    ]);
});

В представлении я теперь просто зацикливаю сообщения, придавая им другой цвет фона в зависимости от того, исходит ли он от пользователя или от помощника, а затем использую парсер Markdown для контента:

@foreach($messages as $message)
    <div class="flex rounded-lg p-4 @if ($message['role'] === 'assistant') bg-green-200 flex-reverse @else bg-blue-200 @endif ">
        <div class="ml-4">
            <div class="text-lg">
                @if ($message['role'] === 'assistant')
                    <a href="#" class="font-medium text-gray-900">LaravelGPT</a>
                @else
                    <a href="#" class="font-medium text-gray-900">You</a>
                @endif
            </div>
            <div class="mt-1">
                <p class="text-gray-600">
                    {!! \Illuminate\Mail\Markdown::parse($message['content']) !!}
                </p>
            </div>
        </div>
    </div>
@endforeach

И это все, что вам нужно сделать, благодаря новому API завершения Чата OpenAI, чтобы создать клон ChatGPT самостоятельно. Довольно умопомрачительно, не так ли?

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Об авторе CrazyBoy49z
WORK EXPERIENCE
Контакты
Ukraine, Lutsk
+380979856297