devdev / in the loop

Come utilizzare OpenAI in Laravel

In questo articolo vedremo come integrare il modello di linguaggio GPT-3 di OpenAI in un’applicazione scritta in Laravel. Realizzaremo un semplice Writebot che utilizza l’intelligenza artificiale per generare le risposte alle domande dell’utente.

Prerequisiti

Se non abbiamo un progetto sul quale lavorare, creiamone uno vuoto e creiamo così lo scaffolding di Laravel. Possiamo farlo velocemente con il comando:

composer create-project --prefer-dist laravel/laravel my-project

Procuriamoci poi una API key di OpenAI. È possibile richiederne una gratuitamente qui https://beta.openai.com/signup e generarla all’indirizzo https://platform.openai.com/account/api-keys.

Installiamo il client PHP OpenAI

Utilizzeremo il client disponibile a questo repo Github; includiamolo nel progetto tramite Composer:

composer require openai-php/laravel

Ricordiamoci che è richiesta la versione 8.1 di PHP.

Aggiungiamo il Provider appena installato all’interno del nostro progetto con il comando:

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

Infine aggiungiamo la nostra API key nel file .env del nostro progetto:

OPENAI_API_KEY=your-api-key

Creiamo il controller

Finito il nostro “setup”, creiamo un controller per gestire l’interazione con GPT-3. Lo faremo nel modo “standard” di Laravel, e aggiungeremo poi il nostro codice:

php artisan make:controller WritebotController

Apriamo il file appena creato WritebotController.php presente nella directory Controller e aggiungiamo il metodo generateAnswer():

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use OpenAI;

class WritebotController extends Controller
{
    public function generateAnswer(Request $request)
    {
         // Validiamo l'input utente
        $validatedData = $request->validate([
            'prompt' => 'required|string|max:1024'
        ]);

        // Creiamo il OpenAI client
        $client = OpenAI::client(env('OPENAI_API_KEY'));

        // Prepariamo ed inviamo la richiesta
        $response = $client->completions()->create([
            'model' => 'text-davinci-002',
            'prompt' => $validatedData['prompt'],
            'max_tokens' => 2048,
            'temperature' => 0.5,
        ]);


        // Chiama la view e gli passa i dati
        return view('risposta', [
            'response' => $response->choices[0]->text
        ]);
    }
}

Il metodo accetta un input (prompt) inviato tramite POST e fa una chiamata ad OpenAI. La risposta sarà un JSON. Questo metodo restituisce una view, quindi una pagina pubblica, che andremo a realizzare da qui a breve.

Creiamo le route

A questo punto creiamo le route per utilizzare la nostra app di esempio. Apriamo il file routes/web.php e aggiungiamo due nuove route, una mostrerà il form per fare la domanda, l’altra sarà la pagina contenente la risposta:

Route::get('/domanda', function() { return view('domanda'); });
Route::post('/risposta', [WritebotController::class, 'generateAnswer']);

Questo farà in modo che all’indirizzo /risposta potremmo inviare richieste POST che saranno “girate” al metodo generateAnswer() del controller WritebotController creato in precedenza. All’indirizzo /domanda, invece mostreremo una semplice view con il form.

Facciamo un test

Prima di passare alla parte front-end, possiamo inviare delle richieste di test, giusto per capire se il nostro codice, la nostra API interna, funziona. Per inviare una richiesta POST di prova, possiamo utilizzare un tool come Postman o Insomnia. Ricordiamoci che il nome del campo (la key) dovrà essere “prompt”. Potremmo inviare, per esempio il testo “Qual è la capitale d’Italia?” e ricevere (si spera) una risposta testuale del tipo “La capitale di Italia è Roma”.

Creiamo una semplice UI

Adesso che la application logic è fatta, prepariamo due pagine, un piccolo form per creare in modo più pratico la richiesta e una semplice vista per visualizzare in modo più semplice la risposta. Per prima cosa creiamo un nuovo file in resources/view chiamato domanda.blade.php e aggiungiamo questo semplice codice:

<!DOCTYPE html>
<html>
<head>
    <title>Domanda</title>
</head>
<body>
    <form method="POST" action="/risposta">
       @csrf
       <label for="prompt">Prompt:</label><br>
       <textarea name="prompt" rows="4" cols="50"></textarea><br>
       <input type="submit" value="Submit">
    </form> 
</body>
</html>

Questo semplice form accetta un input in una textarea e lo invia come POST a /risposta, la route definita in precedenza. Fatta la domanda non resta quindi che creare la view per la risposta. Nel file risposta.blade.php aggiungiamo:

<!DOCTYPE html>
<html>
<head>
    <title>Riposta</title>
</head>
<body>
    <div id="answer">
        @if (isset($response))
            {{ $response }}
        @endif
    </div>
</body>
</html>

Da nota che abbiamo utilizzato qualche riga di Blade (un semplice if) per farlo. Blade è il template engine standard di Laravel. Anche se non fosse il nostro template engine di riferimento, non dovrebbe essere difficile interpretarlo e modificarlo.

Conclusioni

In questo breve tutorial abbiamo visto come integrare la tecnologia AI di OpenAI in una nostra applicazione, ricreando in sostanza quello che fa il celebre ChatGPT, basato appunto sulla tecnologia GPT-3. Grazie alla libreria messa a disposizione da OpenAI stessa.

Questo articolo ti è stato utile?
Laravel – LETTURA 4 MINUTI Aggiungere phpMyAdmin a Laravel Sail
Anche se a questo punto lo sapete già, è giusto dire che phpMyAdmin è sicuramente il tool dbms open  source…
Laravel – LETTURA 6 MINUTI Aggiungere gli UUID ad un Model esistente in Laravel
In alcuni progetti potremmo aver bisogno di aggiungere degli identificatori generici, non-numerici, che possano comportarsi da ID. Può essere utile,…
Laravel – LETTURA 4 MINUTI Come puntare un dominio alla directory public in Laravel
La struttura delle directory di Laravel è creata in modo che la directory public  contenga i file accessibili pubblicamente del…
Roba figa da
if (weekend) {
    relax();
}
la nostra newsletter, ogni tanto.