Dùng thử API OpenAI bằng Laravel v9.19

TN Duoc

Updated on:

Giới thiệu

ChatGPT đã trở nên phổ biến gần đây.
Mọi người đều có thể sử dụng được ChatPGT.

Ngoài chát GPT, OpenAI còn cung cấp cho chúng ta phiên bản API.
Vì API cho phép bạn sử dụng một số mô hình AI, bao gồm cả GPT4(Phiên bản phải trả phí mới có thể sử dụng), nên tôi quyết định thử tạo 1 ứng dụng web sử dụng API.

Ứng dụng tô tạo lần này sử dụng Laravel. Nó có chức năng đơn giản như sau
1. Nhập văn bản từ màn hình
2. Gọi API OpenAI dựa trên nội dung tôi đã nhập
3. Xuất kết quả ra màn hình

Môi trường

  • Máy chủ: CentOS 7.9
  • Môi trường ảo: Docker v23.0.2
  • Laravel v9.19
  • Cơ sở dữ liệu MySQL v8.0

Tôi xây dựng nó bằng docker-compose.yml và Dockerfile

docker-compose.yml


version: '3.9'

services:
  app:
    build:
      context: <Dockerfile directory path>
    container_name: breeze_app
    volumes:
      - <Laravel project path>:/var/www/html
    ports:
      - "8000:80"
    environment:
      - TZ=Asia/Ho_Chi_Minh
    depends_on:
      - db

  db:
    image: mysql:8.0
    container_name: breeze_db
    command: --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_DATABASE: laravel_breeze
      MYSQL_ROOT_PASSWORD: <password>
      MYSQL_USER: laravel_breeze
      MYSQL_PASSWORD: <パスワード>
      TZ: Asia/Ho_Chi_Minh
    volumes:
      - db_data:/var/lib/mysql
    expose:
      - 3306

volumes:
  db_data:

Dockerfile


FROM php:8.0-fpm

RUN apt-get update && apt-get upgrade -y && apt-get install -y unzip libzip-dev

RUN docker-php-ext-install pdo_mysql zip
RUN docker-php-ext-enable pdo_mysql zip
RUN docker-php-ext-install pdo_mysql
RUN docker-php-ext-enable pdo_mysql

RUN curl -sL https://deb.nodesource.com/setup_16.x | bash -
RUN apt-get install -y nodejs

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html

ENV COMPOSER_ALLOW_SUPERUSER=1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin

RUN echo "Asia/Ho_Chi_Minh" > /etc/timezone
RUN dpkg-reconfigure -f noninteractive tzdata

RUN apt-get install -y locales
RUN sed -i -e 's/# ja_JP.UTF-8 UTF-8/ja_JP.UTF-8 UTF-8/' /etc/locale.gen
RUN locale-gen

ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8

EXPOSE 80

Đăng ký OPENAI và Cài đặt Laravel

Trước tiên chúng ta cần tạo 1 tài khoản tại OpenAI sau đó truy cập vào API

OpenAI

Tiếp theo chúng ta sẽ tạo một SECRET KEY. Sau khi tạo chúng ra sẽ được cung cấp 1 secret key

OpenAPI secret key

Ok. Tiếp tục chúng ta sẽ tạo môi trường cho laravel sau khi đã tạo docker-compose.yml và Dockerfile ở trên

$ docker-compose up -d --build

Sau khi qua trình cài đặt đã hoàn tất, hãy kiểm tra xem nó đã chạy chưa bằng cách sử dụng lệnh sau

$ docker ps

Tiếp theo chúng ta tạo 1 dự án Laravel bằng cách chạy lệnh dưới đây

$ docker exec -it breeze_app bash


$ composer global require laravel/installer
$ composer create-project --prefer-dist laravel/laravel .
$ chmod -R a+w storage bootstrap/cache public

Tiếp theo là sử cấu hình mặc định của Laravel để có thể truy cập vào db trong file .env và chung cấp secret key chúng ta mới tạo ở phần trên

DB_HOST=db
DB_DATABASE=laravel_breeze
DB_USERNAME=laravel_breeze
DB_PASSWORD=<password>

OPEN_AI_API_KEY=<OpenAI secret key >

Công việc tiếp theo là chạy dự án bằng cách sử dụng lệnh Laravel

$ php artisan serve --host 0.0.0.0 --port 80

Code

Đầu tiên chúng ta tạo ra cách view sau

resources/
  ├── views/
      ├── layouts/
      │   └── navigation.blade.php
      ├── open_ai/
          ├── partials/
          │   └── chat-gpt-form.blade.php 
          └── gpt.blade.php

File navigation.blade.php sẽ được viết như sau.

<div class="hidden space-x-8 sm:-my-px sm:ml-10 sm:flex">
    <x-nav-link :href="route('dashboard')" :active="request()->routeIs('dashboard')">
        {{ __('Trang chủ') }}
    </x-nav-link>
    <x-nav-link :href="route('open_ai.gpt')" :active="request()->routeIs('gpt')">
        {{ __('Chat GPT') }}
    </x-nav-link>
</div>

chat-gpt-form.blade.php

<section>
    <header>
        <h2 class="text-lg font-medium text-gray-900 dark:text-gray-100">
            {{ __('ChatGPT') }}
        </h2>

        <p class="mt-1 text-sm text-gray-600 dark:text-gray-400">
            {{ __("Vui lòng nhập câu hỏi của bạn và nhấn nút gửi.") }}
        </p>
    </header>

    <form id="gptForm" method="post" action="{{ route('open_ai.send') }}" class="mt-6 space-y-6">
        @csrf

        <div>
            <x-input-label for="question" :value="__('Câu hỏi')" />
            <textarea class="mt-1 block w-full" rows="5" name="question" required>{{old('question', '')}}</textarea>
            <x-input-error class="mt-2" :messages="$errors->get('question')" />
        </div>

        <div>
            <x-input-label for="answer" :value="__('Câu trả lời')" />
            @if(session('answer'))
                <textarea id="answerTextArea" class="mt-1 block w-full" rows="5" name="answer" oninput="autoResizeTextarea()" disabled>{{ session('answer') }}</textarea>
            @else
                <textarea id="answerTextArea" class="mt-1 block w-full" rows="5" name="answer" disabled></textarea>
            @endIf
            <x-input-error class="mt-2" :messages="$errors->get('answer')" />
        </div>

        <div class="flex items-center gap-4">
            <x-primary-button>{{ __('Gửi') }}</x-primary-button>

             @if(session('answer'))
                <p
                    x-data="{ show: true }"
                    x-show="show"
                    class="text-sm text-gray-600 dark:text-gray-400"
                >{{ __('Vui lòng đọc câu trả lời') }}</p>
            @endif
        </div>
    </form>
</section>

<script>
function autoResizeTextarea() {
    const textarea = document.getElementById('answerTextArea');
    textarea.style.height = 'auto';
    textarea.style.height = (textarea.scrollHeight) + 'px';
}

document.addEventListener('DOMContentLoaded', () => {
    autoResizeTextarea();
});
</script>

gpt.blade.php

<x-app-layout>
    <x-slot name="header">
        <h2 class="font-semibold text-xl text-gray-800 dark:text-gray-200 leading-tight">
            {{ __('Chat GPT') }}
        </h2>
    </x-slot>

    <div class="py-12">
        <div class="max-w-7xl mx-auto sm:px-6 lg:px-8 space-y-6">
            <div class="p-4 sm:p-8 bg-white dark:bg-gray-800 shadow sm:rounded-lg">
                <div class="max-w-xl">
                    @include('open_ai.partials.chat-gpt-form')
                </div>
            </div>
        </div>
    </div>
</x-app-layout>

Tiếp chúng ta sẽ xử lý phần API của OpenAI .
Cấu trúc sẽ như sau

app/
  ├── Http/
      ├── Controllers/
          └── GptController.php

config/
  └── services.php

routes/
  └── web.php

web.php

Route::middleware('auth')->group(function () {
    Route::get('/gpt', [GptController::class, 'index'])->name('open_ai.gpt');
    Route::post('/gpt', [GptController::class, 'send'])->name('open_ai.send');
});

services.php


'open_ai' => [
    'api_key' => env('OPEN_AI_API_KEY', ''),
],

GptController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Http;
use Illuminate\View\View;

class GptController extends Controller
{
    /**
     * @param  Request  $request
     * @return View
     */
    public function index(Request $request): View
    {
        return view('open_ai.gpt', [
            'user' => $request->user(),
        ]);
    }

    /**
     * send message
     * 
     * @param  Request  $request
     * @return View
     */
    public function send(Request $request): RedirectResponse
    {

        $url = "https://api.openai.com/v1/chat/completions";

        $apiKey = config('services.open_ai.api_key');
        $headers = array(
            "Content-Type" => "application/json",
            "Authorization" => "Bearer $apiKey"
        );

        $data = array(
            "model" => "gpt-3.5-turbo",
            "messages" => [
                [
                    "role" => "user",
                    "content" => $request->question,
                ]
            ]
        );

        $response = Http::withHeaders($headers)->timeout(60)->post($url, $data);
        if ($response->json('error')) {
            info('Đã xảy ra lỗi');
        }

        return Redirect::route('open_ai.gpt')
            ->with('answer', $response->json('choices')[0]['message']['content'];)
            ->withInput();
    }
}

Ok. Như thế là chúng ta đã hoàn tất việc cài đặt và code. Sau đó chạy thử và kiểm tra thành quả mình mới tạo ra.

Hảy thử hỏi GPT một số câu hỏi bạn muốn hỏi nhé.
Đây là ví dụ đơn giản về việc kết hợp Laravel và API của OpenAI

Bạn có thể đọc thêm về OpenAI API
https://platform.openai.com/docs/api-reference/introduction

Tài liệu về Laravel
https://laravel.com/docs/9.x/readme

Viết một bình luận