Je ne sais pas si de votre côté c’est pareil, mais 3 tweets sur 4 de mon fil Twitter parlent 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 !
Création d’un nouveau projet
Pour commencer, créez un nouveau projet Symfony :
symfony new sf6-chatGPT
Ajoutez le Maker Bundle pour simplifier la création de commandes :
composer req symfony/maker-bundle --dev
Ensuite, installez le bundle openai-php pour accéder à l’API de ChatGPT :
composer req openai-php/symfony
Ajoutez votre clé API OpenAI dans le fichier .env :
###> openai-php/symfony ###
# Générer vos propres identifiants API via le portail OpenAI :
# https://platform.openai.com/account/api-keys
OPENAI_API_KEY=sk-...
OPENAI_ORGANIZATION=
###< openai-php/symfony ###
Création de la commande
Créez une nouvelle commande Symfony :
bin/console make:command
Voici un exemple de jeu d’essai pour les commentaires clients :
$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ée... alors qu'il y avait plein de tables libres.",
"Excellent restaurant avec des produits de qualité et de très bons plats. Les serveurs sont adorables. Nous avons passé 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 pour petits appétits, poisson pas trè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."
];
Appel à l’API ChatGPT
Pour demander à ChatGPT de trier les commentaires :
$result = $this->openai->completions()->create([
'model' => 'text-davinci-003',
'prompt' => 'Trier les commentaires clients de ce restaurant du plus sympa au plus méchant:
' . implode("
", $commentairesClients),
'max_tokens' => 1000,
]);
La réponse est récupérée et transformée en liste :
$commentairesClientsTri = explode("
", trim($result['choices'][0]['text']));
Exemple de commande complète
Voici le code final 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ée... alors qu'il y avait plein de tables libres.",
"Excellent restaurant avec des produits de qualité et de très bons plats. Les serveurs sont adorables. Nous avons passé 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 pour petits appétits, poisson pas trè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:
' . implode("
", $commentairesClients),
'max_tokens' => 1000,
]);
$commentairesClientsTri = explode("
", trim($result['choices'][0]['text']));
foreach ($commentairesClientsTri as $commentaire) {
$output->writeln($commentaire);
}
$io->success('Traitement terminé');
return Command::SUCCESS;
}
}
Conclusion
C’est tout pour aujourd’hui ! Vous pouvez retrouver le code complet sur GitHub : https://github.com/gponty/sf6-chatGPT
