Utiliser l’API Azure OpenAI en Python

Nous avons vu dans un précédent post les possibilités des modèles basés sur GTP au travers du studio et du playground. Ce bac à sable n’est bien sûr destiné qu’à de premiers tests et une utilisation de l’inférence au sein d’une application se fera de manière programmatique, à l’aide de l’API de service disponible. (Il existe également une API dite de gestion pour la création, mise à jour ou suppression de la ressource Azure.)

Mais avant de nous lancer dans le code, nous allons réaliser un premier appel dans l’outil Postman.

Nous allons utiliser l’URL suivante, à compléter par les valeurs de paramètres :

  • YOUR_RESSOURCE_NAME : le nom de la ressource Azure OpenAI provisionnée
  • YOUR_DEPLOYMENT_NAME : le nom du déploiement de modèle (réalisé en amont dans le studio)
  • la version de l’API, exprimée sous forme de date (en février 2023, nous utilisons la version 2022-12-01)
POST https://YOUR_RESOURCE_NAME.openai.azure.com/openai/deployments/YOUR_DEPLOYMENT_NAME/completions?api-version=YYYY-MM-DD

Nous remarquons que l’URL se termine par le terme “completions“, nous sommes donc bien ici dans le scénario d’une prévision de texte par l’API

Il existe deux manières de s’authentifier :

  • clé d’API
  • jeton Azure Active Directory

Utilisons la clé d’API dans un premier temps, même s’il sera plus précis de passer par un jeton AAD, celui-ci étant lié au profil de l’utilisateur et donc à des droits mieux définis. Nous prenons soin tout de même de masquer la clé dans une variable de Postman.

Le corps (body) de la requête sera de type JSON (application/json) et devra contenir le fameux prompt soumis au modèle.

Au texte soumis “Postman is a tool for…“, nous obtenons une complétion “building APIs faster“, en quatre tokens (valeur précisée dans le body par le paramètre max_tokens). Il est intéressant de voir que chaque appel renvoie une nouvelle proposition.

Voici la syntaxe Curl correspondante.

curl --location 'https://methopenai.openai.azure.com/openai/deployments/davinci-summarize/completions?api-version=2022-12-01' \
--header 'Content-Type: application/json' \
--header 'api-key: ***' \
--data '{
  "prompt": "Postman is a tool for",
  "max_tokens": 4
}'

En Python, avec la librarie Request, nous obtenons le code ci-dessous.

import requests
import json

url = "https://methopenai.openai.azure.com/openai/deployments/davinci-summarize/completions?api-version=2022-12-01"

payload = json.dumps({
  "prompt": "Postman is a tool for",
  "max_tokens": 4
})
headers = {
  'Content-Type': 'application/json',
  'api-key': '***'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)

Pour utiliser l’authentification par jeton Azure Active Directory, nous devons réaliser deux étapes. Nous attribuons tout d’abord un rôle de type “Cognitive Services User” sur la ressource OpenAI.

Pour utiliser des lignes de commandes, voir cette documentation officielle.

Le token peut être obtenu par cette commande az cli :

az account get-access-token --resource https://cognitiveservices.azure.com | jq -r .accessToken

Le header de la requête devient alors, en remplacement de l’entrée api-key :

'Authorization': 'Bearer ***'

Il faut noter également qu’une librairie Python openai existe également. Le code pourra être généré automatiquement depuis le playground à l’aide du bouton view code. Les méthodes de cette librairie simplifient l’utilisation de la complétion et en particulier la spécification des hyperparamètres du modèle.

Peut-on utiliser ChatGPT pour Power BI ?

En ce début d’année 2023, l’intelligence artificielle est sur toutes les lèvres, avec l’apparition de ChatGPT, déclinaison sous forme d’agent conversationnel du modèle GPT 3.5, élaboré par la société OpenAI.

Il faut garder à l’esprit que ce modèle prédit les prochains mots probables mais son corpus d’entrainement est tel qu’il est possible d’imaginer des usages, en particulier avec les langages de programmation, comme peut le faire l’assistant GitHub Copilot dans Visual Studio Code.

ChatGPT pour le langage DAX

Nous pouvons imaginer deux usages autour du langage dédié aux mesures et aux colonnes calculées.

Faire expliquer une formule DAX complexe

L’exemple suivant est tiré d’une page de l’excellent site SQLBI.

Il faut noter que le modèle a été entrainé avant l’apparition de cette formule dans Power BI mais l’explication reste cohérente, sans doute grâce à la proximité de cette fonction avec sa version Excel.

Faire écrire une formule DAX à partir d’une description

Nous allons ici écrire un prompt avec un maximum d’informations sur le modèle sémantique : noms de tables, noms de champs, valeurs…

Réponse obtenue le 4 février 2023

En re-générant la réponse, suite à l’évolution du modèle, nous obtenons la formule suivante.

Si nous connaissons la famille de fonctions TIME INTELLIGENCE, nous pouvons réorienter la réponse.

Sur ces deux exemples, l’agent conversationnel ChatGPT se montre plutôt performant, et un très bon accompagnateur pour des personnes débutant dans le langage DAX. Toutefois, il faudra se méfier des syntaxes proposées, être critique et s’appuyer sur l’expérience… d’êtres humains, formateur.ices Power BI !

Nous pourrions nous prendre à rêver que les visuels Q&A ou smart narrative soient boostés par ChatGPT et donnent alors des performances très élevées dans l’élaboration de visuels ainsi que dans leur interprétation.

ChatGPT pour le langage M ?

Dans l’interface Power Query, le langage M s’écrit déjà automatiquement grâce aux actions réalisées dans l’interface visuelle. Pour autant, il peut être efficace d’écrire ses propres fonctions qui pourront ensuite être utilisées pour générer de nouvelles colonnes.

Dans l’exemple suivant, nous allons écrire une fonction permettant de remplacer toutes les lettres accentuées par leur équivalent, sans accent. Posons la question de cette fonction à ChatGPT.

Wahou, cela semble très impressionnant ! Essayons tout de suite cette fonction dans Power Query.

Attention, la fonction Text.ReplaceEach() n’existe pas, ce que nous confirmera la documentation officielle ! ChatGPT est un outil créatif, cette fonction est donc une très bonne suggestion pour les équipes de développement du produit !

Nous pouvons faire part de cette erreur à ChatGPT et voir ce qu’il nous propose maintenant.

Essayons cette seconde proposition. Le code est bien validé mais l’appel à la fonction va déclencher une nouvelle erreur.

Mauvaise pioche à nouveau, il semble que l’exercice soit trop difficile, en l’état actuel des performances du modèles ChatGPT.

Une simple recherche sur le Web nous amère assez rapidement à cet échange sur StackOverflow.

Le code de la fonction est donc :

= (textToConvert) =>let
textBinary = Text.ToBinary (textToConvert, 1251),
textASCII = Text.FromBinary(textBinary , TextEncoding.Ascii)
in
textASCII

En conclusion, en ce début d’année 2023, nous pouvons dire que l’association formateur.ice + forum + ChatGPT est une excellente combinaison pour progresser dans la maîtrise des deux principaux langages de Power BI.

Découvrir Azure OpenAI et son studio

Lorsque votre souscription Azure aura été autorisée à déployer le service OpenAI (voir ce précédent article), vous pourrez accéder à l’écran ci-dessous.

Au cours de cet article, nous allons donner un premier aperçu des fonctionnalités disponibles et insister sur les différences entre le service OpenAI directement disponible et son intégration au sein du cloud Microsoft Azure.

Playground de OpenAI (hors Azure)

Afin d’expérimenter les différents modèles, nous allons tout d’abord nous connecter au studio Azure OpenAI sur l’URL https://oai.azure.com/

Studio Azure OpenAI

La page d’accueil fournit de nombreux liens d’exemples et de documentation.

Nous retrouvons le playground de OpenAI et la possibilité d’expérimenter des prompts dans différents scénarios :

  • résumé
  • classification
  • génération de code
  • etc.

Nous ne retrouvons toutefois pas, pour l’instant (février 2023), l’intégralité des exemples proposés dans le playground d’OpenAI.

Déployer un modèle

C’est la première opération à réaliser afin de pouvoir utiliser les différents services : déployer l’un des modèles disponibles. Par défaut, aucun modèle n’est déployé dans le studio.

Il faut tout d’abord sélectionner l’un des modèles de base.

Une description rapide des différents modèles est donnée, afin d’aider à la sélection. Les modèles dédiés au langage naturel, dérivant de GPT-3, sont décrits dans cette partie de la documentation officielle.

Il est alors possible de retourner dans le playground et de sélectionner le déploiement réalisé.

Complétion de texte

C’est ici que l’expérience avec un modèle GPT-3 peut s’avérer déstabilisante. En effet, nous sommes face à un outil destiné à traiter le langage naturel et également à interagir de la sorte. Nous n’avons donc d’un simple prompt pour exprimer notre demande. Attention à l’angoisse de la page blanche !

Le résultat généré est identifié par un surlignage vert. On remarquera l’indicateur du nombre de tokens, correspondant à la longueur du texte contenu dans le prompt.

Le paramètre de température permet de gérer l’aspect stochastique du modèle (comprendre que les prévisions peuvent changer même avec un prompt similaire). Dans l’exemple ci-dessous, le résultat est généré trois fois, avec une température de valeur 1.

Write a original prompt for image generation with DALL-E 2

What would DALL-E draw if you asked it to generate an image of a "perfect day"?

What if DALL-E was asked to generate an image of a world where everyone was happy and there was no conflict?

What if the world was made of candy?

Premiers scénarios d’utilisation

Approprions-nous maintenant le terrain de jeu !

Résumé

On soumet un texte long afin d’obtenir un résumé.

L’intention est ici exprimée par le terme “Tl;dr:” (“trop long; n’a pas lu) mais pourrait être formulée d’une autre façon, par exemple en précisant le public cible.

Les guillemets encadrent ici la partie de texte à résumer.

Classification

Nous donnons tout d’abord l’intention, celle d’établir un classifieur. La dizaine d’exemples ci-dessous est issue d’un jeu de données connu sur le sujet.

Il s’agit bien d’un spam !

Avec si peu de données d’entrainement, le résultat peut paraitre impressionnant mais n’oublions pas qu’il y a une chance sur deux de trouver la bonne réponse (pile ou face) ! Contrairement à un classifieur issu par exemple du framework Scikit-Learn, nous ne pouvons pas accéder à la probabilité d’appartenance à la classe.

Génération

Nous demandons une liste, donnons un exemple puis débutons la suite de la liste par le chiffre 2.

Attention, tous ces produits ne sont pas réellement Open Source !

Parsing de données non structurées

Peut-être l’illustration la plus surprenante, le moteur va réussir à mettre en tableau un texte donné en langage naturel.

Seul le premier exemple a été soumis.

Extraction d’information

A nouveau, nous donnons une description du document qui sera soumis entre guillemets.

Toutefois, en essayant le même prompt dans ChatGPT (basé sur GPT 3.5), nous obtenons une réponse tout à fait correcte !

Code view

Prenons maintenant l’exemple d’un résumé de texte, avec pour objectif d’utiliser cette fonctionnalité en dehors du studio Azure OpenAI.

Le code correspondant à cet appel dans le playground est disponible (en Python).

Ce code utilise la librairie Python openai (à installer avec la commande pip install) et nécessitera de connaître une des clés du service.

Pourquoi ne pas demander au modèle de générer un code Python appelant cette API ? Voici le résultat obtenu.

Nous ne disposons pas ici d’un quota suffisant pour que le code s’écrive en entier. L’utilisation de GitHub Copilot sera plus adaptée dans ce cas de figure.

En résumé (et sans l’aide de GPT-3 !), nous pouvons successivement déployer un modèle, l’expérimenter à l’intérieur du terrain de jeu (playground) puis déployer une application qui s’appuiera sur l’API mise à disposition par Azure OpenAI.

Avantages d’Azure pour OpenAI

Utiliser OpenAI au travers d’Azure donne accès à trois pratiques d’entreprise :

  • la disponibilité régionale
  • la mise en réseau privé
  • le filtrage de contenu d’IA responsable

Une logique d’accès par RBAC (Role Based Access Control) pourra également être mise en place, tout comme l’authentification par identité managée (MSI).

Le portail Azure permet également une gestion des clés d’API par rotation.

Bien sûr, l’utilisation au travers d’Azure engendre une facturation dont les modalités sont détaillées sur cette page. Les coûts seront engendrés par l’inférence (utilisation prédictive) des modèles ainsi que par leur personnalisation (entrainement de type transfer learning).

Cette réponse n’est pas juste ! N’oubliez pas que GPT-3 ne scanne pas le web pour répondre.

Veuillez également prendre en compte les quotas et limites appliquées. Une demande au support permettra de lever certaines de ces limites.

Choix de la région

A ce jour (février 2023), seules trois régions Azure sont disponibles.

L’utilisation de deux régions différentes permet d’assurer une continuité d’activité. Ainsi, si un datacenter vient à être indisponible dans une région, il est possible de basculer (par modification du endpoint) vers une autre région Azure.

Utilisation dans un réseau privé

L’utilisation d’un réseau privé sécurise l’accès au studio Azure OpenAI, qui devra par exemple se faire au travers d’un VPN.

Il est également possible d’enclencher le pare-feu Azure (firewall) et de n’autoriser qu’une liste d’adresses IP à accéder au studio OpenAI.

IA responsable

Outre les engagements pris au travers du formulaire de demande du service, la documentation de Microsoft nous incite à respecter les points suivants lors d’une intégration des services Azure OpenAI :

  • Mettre en œuvre une surveillance humaine significative.
  • Mettre en place des limites techniques strictes sur les entrées et les sorties afin de réduire la probabilité d’une utilisation abusive au-delà de l’objectif prévu de l’application.
  • Tester les applications de manière approfondie afin de détecter et d’atténuer les comportements indésirables.
  • Établir des canaux de feedback.
  • Mettre en œuvre des mesures d’atténuation (bias mitigation) supplémentaires propres à chaque scénario.

A termes (ce n’est pas aujourd’hui le cas), un filtrage de contenu supplémentaire sera mis en place par Microsoft. Celui-ci est décrit dans la documentation. Concrètement, un utilisateur proposant un prompt avec un contenu inapproprié recevra, à l’appel de l’API, un code erreur HTTP 400 et une description “content_filter” dans le corps de la réponse. Une demande au support permet d’activer dès à présent ce filtrage.

EDIT : le filtrage de contenu sera activé le 13 février 2023.

With our latest update we’re providing content filters with significant quality and precision improvements. We have adjusted the system to filter at higher severity levels with each category (Hate and Fairness, Sexual, Violence, Self-harm) and expanded coverage across other languages. 

Once the filters are turned back on, the system will resume blocking harmful prompts and model generations.

email Azure OpenAI Support