Utiliser des modèles tiers via des API

Introduction

Nous savons à présent utiliser PHP pour résoudre des problématiques en créant nos propres modèles ou en récupérant des modèles existants que nous déploierons pour une exploitation en production.

Cependant, dans certaines situations, nous pourrons aussi décider de consommer des modèles tiers déjà performants pour les tâches qui nous intéressent, que cela soit dû à un manque de ressources pour créer et éduquer notre propre modèle ou simplement parce que notre modèle n’obtient pas des performances à la hauteur de notre besoin. Les librairies comme Rubix ML permettant de créer des modèles d’IA en PHP en sont encore à leurs débuts et n’offrent pas autant d’outils que Python, en particulier sur les algorithmes de Deep Learning avec des réseaux de neurones de type Long Short-Term Memory (LSTM) ou transformers. Par exemple, de grands modèles de langage (LLM) nécessitant des ressources extrêmement importantes ne pourraient pas, pour le moment, être créés en PHP.

L’intelligence artificielle étant actuellement un sujet important, de tels modèles consommables via des services web se multiplient avec des performances très intéressantes.

Grâce à des mises en situation, nous allons...

Création des accès à l’API OpenAI

Avant de pouvoir utiliser les services d’OpenAI, il convient de créer un compte. Cela ne devrait prendre que quelques minutes en suivant les étapes ci-dessous.

 Pour commencer, rendez-vous sur la plateforme d’OpenAI à l’adresse https://platform.openai.com/signup.

 Une fois sur la page d’inscription, choisissez de créer un compte avec une adresse courriel ou d’utiliser un compte existant, comme Google, Apple ou Microsoft.

 Après avoir entré les informations demandées et confirmé votre adresse courriel, il est possible que l’on vous demande de vérifier votre numéro de téléphone pour des raisons de sécurité. Cette vérification s’effectue via un code envoyé par SMS.

 Une fois connecté à la plateforme, vous accédez à votre profil à l’URL https://platform.openai.com/settings/organization/general. Là, vous devez configurer votre profil en ajoutant des détails tels que le nom de votre organisation.

 Ensuite, allez dans l’onglet Project du menu dans l’item General. Saisissez le nom de votre projet et précisez l’objectif d’utilisation de l’API. C’est également à partir de ce menu, dans API keys, que vous pouvez générer votre clé...

Consommation d’un LLM pour répondre à une question textuelle

Dans la liste des modèles mis à disposition via l’API par OpenAI, le plus célèbre est le LLM nommé GPT ou Generative Pre-trained Transformer. Celui-ci est capable de « comprendre » et de générer du langage naturel. Basée sur des réseaux neuronaux avancés, cette technologie excelle dans la génération de texte fluide et contextuellement pertinent, ce qui en fait un outil polyvalent pour de nombreuses applications.

Dans cet exemple pratique, tout comme nous pourrions le faire dans la mise en place d’un chatbot disponible sur un site internet, nous demanderons à GPT-4o mini, l’une des dernières versions disponibles du modèle allégée et rapide, de générer une réponse à notre question.

1. Génération d’une réponse à une question textuelle sans contexte spécifié

La première étape de notre mise en pratique est de poser une question à GPT sans lui spécifier de contexte particulier (lieu, contraintes, langue). La première question que nous allons lui poser n’est pas la moindre : nous allons lui proposer de répondre à la célèbre interrogation « Quel est le sens de la vie ? ».

Avant de débuter, assurez-vous que vous avez bien en votre possession une clé API valide pour consommer l’API OpenAI, comme expliqué dans la section précédente de ce chapitre.

Par ailleurs, veuillez installer la librairie PHP Guzzle si ce n’est pas déjà le cas, en exécutant la commande composer suivante :

composer require guzzlehttp/guzzle 

Cette librairie est optimisée pour faciliter la consommation des API en PHP.

Pour commencer, créons un fichier nommé textgen.php, contenant le code suivant pour inclure les librairies tierces et stocker dans une variable $apiKey la clé API que nous avons obtenue :

<?php 
 
require '../vendor/autoload.php'; 
use GuzzleHttp\Client; 
 
$apiKey = 'Put here the API Key provided by OpenAI'; 

Dans la suite de nos développements, nous aurons besoin de faire appel à l’API à plusieurs reprises....

Utilisation d’un modèle de vision par ordinateur couplé à un LLM pour récupérer des informations sur des images

Dans cet exemple, nous souhaitons effectuer une tâche de comparaison tarifaire sur un site e-commerce dont les offres nous intéressent. Partons d’une capture d’écran d’une page que nous aurions récupérée via un outil comme Playwright (JavaScript) présentant plusieurs produits. La voici ci-dessous, elle est également accessible sur le dépôt GitHub de cet ouvrage dans le dossier /openai/img/ :

images/09EI03.png

Figure 9.3 - capture d’écran d’une page catégorie de produits d’un site marchand

Le modèle que nous allons utiliser sera toujours gpt-4o mini. Il contient une brique de reconnaissance d’image et d’OCR. Nous allons demander à GPT d’analyser cette image pour trouver le tarif affiché de la « Couette écologique Mi-saison ».

En utilisant la méthodologie précédente, nous allons lui fixer en amont la contrainte suivante : « Les réponses ne sont délivrées qu’au format JSON avec un champ nommé price contenant la réponse en type float ».

Pour apporter une image en pièce jointe à une requête textuelle, il suffit d’ajouter un array dans le champ messages contenant un sous-array dans le champ content qui suit le prototype suivant :

[ 
   'type' => 'image_url', 
   'image_url' => [ 
       'url' => 'data:image/png;base64,' . $base64Image, 
   ] 
] 

La première clé type est égale à image_url, et la seconde clé image_url contient un sous-array avec un champ de clé url peuplé avec l’image codée en base64.

Notre requête sera codée comme suit en PHP :

$apiKey = 'Put...

Utilisation d’un modèle de transcription automatique d’un fichier audio en texte (Speech-To-Text) couplé à un LLM

OpenAI a mis au point un autre modèle performant nommé Whisper dont la vocation est d’effectuer de la reconnaissance vocale et donc aussi de la transcription.

Dans cet exemple, mettons-nous dans un cas métier très spécifique. Imaginons que nous ayons des échanges radio VHF entre un contrôleur aérien et un pilote d’avion à retranscrire et à analyser.

Dans le cas précis de cette application métier, chaque échange entre pilote et contrôleur est régi par un vocabulaire précis et sans ambiguïtés, commun aux deux professions avec des instructions précises.

Le plus souvent, un contrôleur aérien débute son instruction de manœuvre à un avion (appelée clearance dans le jargon) par l’indicatif de son destinataire. L’indicatif est soit le nom de la compagnie aérienne suivi du vol (par exemple, Air France 1234), soit l’immatriculation à cinq lettres de l’avion.

Très souvent, les lettres épelées le sont en alphabet aéronautique. A sera prononcé alpha, B béta, C charlie, D delta, etc.

Sans aller trop dans les détails, une instruction contiendra souvent aussi une instruction de montée ou de descente à une altitude (en pieds), un changement de direction (cap magnétique ou route), une donnée de référence de pression pour les altitudes (le QNH en hectopascals) qui permet d’étalonner les altimètres.

Par exemple, une telle instruction du contrôleur aérien pourrait être :

« ENI Editions Air 1234, montez altitude 2500 pieds, QNH 1024, tournez à...

Création d’un fichier audio à partir d’un texte à l’aide d’un modèle de génération de voix

Nous sommes maintenant coutumiers de l’API d’OpenAI. Nous connaissons GPT et Whisper, mais nous n’avons pas encore utilisé TTS qui est le service de génération de voix.

La proposition que nous faisons ici est de générer un fichier audio avec une voix définie parmi une liste proposée par OpenAI. Elle est disponible dans la documentation officielle à cette URL :

https://platform.openai.com/docs/guides/text-to-speech#voice-options

Étant donné que ce modèle est nouveau pour nous, voici ici les nouvelles valeurs à affecter pour nos variables de base :

<?php 
 
require '../vendor/autoload.php'; 
 
use GuzzleHttp\Client; 
 
$client = new Client(); 
$endpoint = 'https://api.openai.com/v1/audio/speech'; 
$apiKey = 'Put here the API Key provided by OpenAI'; 
$outputFile = 'sound/output.mp3'; 
 
$requestBody = [ 
   'model' => 'tts-1', 
   'input' => 'Mes enfants Tom et Noé sont mes rayons de soleil  
et je les aime très fort', 
   'voice' => 'nova', 
]; 

Dans le code précédent...

Utilisation d’un embedding pour vectoriser du texte

Un embedding est une représentation numérique dense et continue d’éléments tels que des mots, des phrases, des images ou des documents, sous forme de vecteurs dans un espace multidimensionnel. Contrairement aux représentations traditionnelles discrètes, comme l’encodage des mots via des identifiants numériques, les embeddings permettent de capturer les similarités sémantiques ou structurelles entre les entités représentées. Par exemple, dans un embedding bien entraîné, les vecteurs de deux mots ayant des significations proches, comme « chien » et « chat », seront proches dans cet espace.

En intelligence artificielle, les embeddings sont utilisés pour résoudre des problèmes impliquant des données complexes et non structurées, comme le traitement du langage naturel (Natural Language Processing - NLP), la recherche d’information, ou les systèmes de recommandation. Ils servent notamment à rapprocher des entités similaires (ex. documents pertinents pour une recherche donnée) ou à fournir des représentations compactes et exploitables pour l’entraînement de modèles de Machine Learning.

L’API d’OpenAI offre une solution prête à l’emploi pour générer ces vecteurs à partir de textes. Elle utilise le modèle GPT pour produire des embeddings qui capturent efficacement le contexte et la signification des entrées.

Ici, nous allons apprendre à utiliser ces embeddings sur des mots de vocabulaire courant de la langue française pour les vectoriser. Nous pourrons nous faire une idée simple des liens sémantiques entre les différents mots en comparant les distances entre eux.

Pour terminer, nous verrons comment les combinaisons de vecteurs ont une signification sémantique elles aussi.

1. Utilisation de l’embedding pour transformer du texte en vecteurs

Pour commencer, comme nous en avons maintenant l’habitude, nous allons définir la clé API, l’adresse de l’API d’embedding OpenAI et le client Guzzle que nous allons utiliser pour vectoriser nos éléments textuels :

$apiKey = 'Put here the API Key provided...