Utiliser l’API de ChatGpt dans Symfony 6

U

Je ne sais pas si de votre côté c’est pareil, mais 3 tweets sur 4 de mon fil twitter parle de ChatGPT, je me devais donc de faire un petit article sur comment utiliser l’API de ChatGPT dans Symfony, d’autant que c’est relativement simple.

Nous allons développer un script qui permet de trier des commentaires clients d’un restaurant du plus sympa au plus méchant !

On va d’abord créer un nouveau projet, ça vous savez faire mais je remets la commande ici :

symfony new sf6-chatGPT

Comme d’hab je vais utiliser le maker bundle pour créer notre commande :

composer req symfony/maker-bundle --dev

On va aussi avoir besoin du bundle openai-php pour accéder à l’api de ChatGPT :

composer req openai-php/symfony

Vous devez ensuite renseigner dans votre fichier.env la clé API de ChatGPT :

###> openai-php/symfony ###
# Generate your own API credentials through the OpenAI Platform portal.
# https://platform.openai.com/account/api-keys
OPENAI_API_KEY=sk-...
OPENAI_ORGANIZATION=
###< openai-php/symfony ###

Nous allons maintenant créer la commande :

bin/console make:command

Nous allons nous créer un petit jeu d’essai de commentaires :

$commentairesClients = [
'J\'ai commandé une gaufre et j\'y ai trouvé un ongle et un cheveu. On m\'a dit que je devais attendre 1 heure pour en avoir une autre. On ne m\'a jamais remboursé. Je n\'enverrais même pas mon pire ennemi dans ce restaurant.',
'Service acceptable. Mais la nourriture n\'était pas bonne (le homard). On avait rdv à 19h, on est arrivé 10 min en retard et notre table avait été donné... alors qu\'il y avait plein de tables libres.',
'Excellent restaurant avec des produits de qualités et de très bons plats. Les serveurs sont adorables. Nous avons passés un super moment. Nous avons hâte de revenir.',
'Le cadre est superbe, depuis ce bâtiment très joliment restauré. Prometteur mais décevant. En terrasse, café servi froid ...malgré le prix. Repas avec entrée poir petits appetits, poisson pas ytrès cuit, service minimal. C\'est dommage, ce pourrait être beaucoup mieux.',
'Aucune fausse note, un lieu magique la nuit , un repas excellent, et une équipe attentive et de très bon conseil. Nous avons passé un très agréable moment ! Nous y retournerons certainement.',
'Très bon restaurant, service impeccable, cadre agréable, cuisine de qualité. Nous avons passé un très bon moment. Nous recommandons vivement ce restaurant.'
];

Et enfin nous allons demander à chatGpt de nous les trier du plus sympa au plus méchant :

$result = $this->openai->completions()->create([
    'model' => 'text-davinci-003',
    'prompt' => 'Trier les commentaires clients du plus sympa au plus méchant: \n\n'.implode('\n', $commentairesClients),
    'max_tokens' => 1000,
]);

On transforme d’abord notre tableau de commentaire en 1 seule chaîne de caractères séparée par des retour à la ligne.

Le paramètre max_tokens permet de limiter le nombre de caractère de la réponse, sachant que la facturation de l’API est basé sur ce nombre de tokens, donc plus c’est faible moins vous paierez cher, mais plus il y a de risque que la réponse soit incomplète.

Voici ce que nous donne la réponse triée :

  1. Nous avons passé un très agréable moment ! Nous y retournerons certainement.
  2. Très bon restaurant, service impeccable, cadre agréable, cuisine de qualité. Nous avons passé un très bon moment. Nous recommandons vivement ce restaurant.
  3. Excellent restaurant avec des produits de qualités et de très bons plats. Les serveurs sont adorables. Nous avons passés un super moment. Nous avons hâte de revenir.
  4. Le cadre est superbe, depuis ce bâtiment très joliment restauré. Prometteur mais décevant. En terrasse, café servi froid …malgré le prix. Repas avec entrée poir petits appetits, poisson pas ytrès cuit, service minimal. C’est dommage, ce pourrait être beaucoup mieux.
  5. J’ai commandé une gaufre et j’y ai trouvé un ongle et un cheveu. On m’a dit que je devais attendre 1 heure pour en avoir une autre. On ne m’a jamais remboursé. Je n’enverrais même pas mon pire ennemi dans ce restaurant.
  6. Service acceptable. Mais la nourriture n’était pas bonne (le homard). On avait rdv à 19h, on est arrivé 10 min en retard et notre table avait été donné… alors qu’il y avait plein de tables libres.

Et le code complet de la commande :

<?php

namespace App\Command;

use OpenAI\Client;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;

#[AsCommand(
    name: 'tri:commentaires',
    description: 'Tri les commentaires clients par degré de satisfaction',
)]
class TriCommentairesCommand extends Command
{
    public function __construct(
        private readonly Client $openai
    ) {
        parent::__construct();
    }

    protected function configure(): void
    {

    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $io = new SymfonyStyle($input, $output);

        $commentairesClients = [
            'J\'ai commandé une gaufre et j\'y ai trouvé un ongle et un cheveu. On m\'a dit que je devais attendre 1 heure pour en avoir une autre. On ne m\'a jamais remboursé. Je n\'enverrais même pas mon pire ennemi dans ce restaurant.',
            'Service acceptable. Mais la nourriture n\'était pas bonne (le homard). On avait rdv à 19h, on est arrivé 10 min en retard et notre table avait été donné... alors qu\'il y avait plein de tables libres.',
            'Excellent restaurant avec des produits de qualités et de très bons plats. Les serveurs sont adorables. Nous avons passés un super moment. Nous avons hâte de revenir.',
            'Le cadre est superbe, depuis ce bâtiment très joliment restauré. Prometteur mais décevant. En terrasse, café servi froid ...malgré le prix. Repas avec entrée poir petits appetits, poisson pas ytrès cuit, service minimal. C\'est dommage, ce pourrait être beaucoup mieux.',
            'Aucune fausse note, un lieu magique la nuit , un repas excellent, et une équipe attentive et de très bon conseil. Nous avons passé un très agréable moment ! Nous y retournerons certainement.',
            'Très bon restaurant, service impeccable, cadre agréable, cuisine de qualité. Nous avons passé un très bon moment. Nous recommandons vivement ce restaurant.'
        ];

        $result = $this->openai->completions()->create([
            'model' => 'text-davinci-003',
            'prompt' => 'Trier les commentaires clients de ce restaurant du plus sympa au plus méchant: \n\n'.implode('\n', $commentairesClients),
            'max_tokens' => 1000,
        ]);

        $commentairesClientsTri = explode('\n',trim($result['choices'][0]['text']));

        foreach($commentairesClientsTri as $commentaire) {
            $output->writeln($commentaire);
        }

        $io->success('Traitement terminé');

        return Command::SUCCESS;
    }
}

Voilà, c’est tout pour aujourd’hui, vous pouvez retrouver le code complet sur github : https://github.com/gponty/sf6-chatGPT

A propos de l'auteur

2 commentaires

Guillaume

Get in touch

Je suis un développeur web passionné par les technologies Symfony et ChatGPT. J'aime partager mes connaissances et mon expérience à travers des articles que j'écris sur ces sujets. Avec une solide expertise en développement web, je m'efforce de fournir des contenus utiles et instructifs pour aider les développeurs à créer des applications web de qualité supérieure.