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.

Author: methodidacte

Passionné par les chiffres sous toutes leurs formes, j'évolue aujourd'hui en tant que consultant senior dans les différents domaines en lien avec la DATA (décisionnel self service, analytics, machine learning, data visualisation...). J'accompagne les entreprises dans une approche visant à dépasser l'analyse descriptive pour viser l'analyse prédictive et prescriptive. J'ai aussi à coeur de développer une offre autour de l'analytics, du Machine Learning et des archictectures (cloud Azure principalement) dédiées aux projets de Data Science.