A vos prompts avec Azure Open AI !

Novembre 2022, nous commencions à entendre parler de GPT, et au travers de son outil ChatGPT, le grand public découvre alors ce que c’est que l’IA (enfin c’est ce qu’ils croient)…

Beaucoup de chose a été dit sur l’IA et je ne vais pas aujourd’hui revenir sur ces polémiques, mais je vais commencer ici à aborder un peu un élément que j’ai oublié (peut-être volontairement) dans ma Tribune sur ZDNet datant de Février 2023.

Pour ceux qui ne l’ont pas lu, suivez le lien, c’est gratuit : https://www.zdnet.fr/actualites/non-l-ia-ne-va-pas-tuer-le-metier-de-developpeur-39954470.htm

Aujourd’hui, je vais faire un tour d’horizon de Azure Open AI, expliquer les différents concepts que j’en retiens pour un développeur, afin de pouvoir aborder ensuite dans un second article une partie plus intéressante : Comment nous pouvons (nous, développeurs) utiliser cette technologie au seins de nos applications.

La sémantique ?

La sémantique est simplement ce qui concerne l’étude du sens dans les langages (naturels ou de programmation). Le but est ainsi d’analyser les mots, les phrases et les textes pour transmettre des idées, des concepts et des informations. Il n’est alors pas uniquement question de comprendre le sens des mots, mais bien de se concentrer sur l’interprétation des éléments linguistiques et des structures en tenant compte du contexte dans lequel ils sont utilisés.

Mais quoi cela sert dans l’informatique ? C’est tout simplement essentiel dans le traitement du langage naturel (NLP), la recherche d’information, et plus globalement dans tous les domaines où il est nécessaire de comprendre et d’analyser la signification des données textuelles.

Si jusque-là vous me suivez, vous comprenez alors que la sémantique c’est un domaine de l’IA et cela nous permet de réaliser des chat-bot… (nous voilà bien avancés). Alors oui et non.

Oui parce-que si je reviens au début de mon propos, les nouveaux modèles ont permis de mettre en évidence un Chat Bot très persuasif : Chat GPT.

Et non, parce-que c’est ce que je vais montrer ensuite, nous pouvons utiliser la sémantique pour exprimer notre attente (même complexe) et laisser les modèles l’interpréter et nous donner un résultat.

La complétion

GPT est l’acronyme de Generative Pretrained Transformers, ce sont des architectures de réseaux de neurones spécialisés dans la génération de contenu. En leur fournissant des données en input (que l’on appelle ici le prompt), ce type de réseau de neurones va produire une sortie correspondant à une suite probable prenant en compte ses données sur lesquelles il a été entraîné, le contexte et le prompt…

C’est donc au travers d’un prompt que nous allons pouvoir utiliser ces modèles pour nous aider à générer du contenu. C’est exactement ce principe qui est utilisé dans le ChatGPT !

Les tokens

Les tokens (ou jetons) sont une notion importante dans les modèles GPT. En effet pour traiter du contenu texte, les phrases et les mots sont décomposés sous la forme de token qui représentent une séquence de caractères courants. En moyenne, dans un texte anglais, un token correspond à environ 4 caractères.
En fonction du modèle utilisé vous pourrez demander à celui-ci de traiter un nombre maximal de jetons. Ainsi par exemple GPT 3.5 est capable de manipuler jusqu’à 4096 tokens alors que GPT 4-32K est comme son nom l’indique capable de traiter jusqu’à 32 768 tokens.

Vous devez aussi prendre en compte que le calcul du nombre de tokens nécessaires à votre requête prend en compte la somme des tokens envoyés au modèles et ceux que le modèle retourne.

Il est important aussi de noter que le nombre de tokens utilisés sera alors utilisé dans les modèles de facturation à l’utilisation de ces modèles.

Azure Open AI

Dans la suite de mon article je vais utiliser Azure Open AI. Il s’agit de la solution Microsoft Azure fournissant (as a service) la plateforme vous permettant de déployer différents modèles IA dont ceux de Open AI (GPT 3.5, GPT 4, …). Une fois ces modèles déployés, vous pourrez interagir avec eux au travers d’API ou d’un SDK.

Je précise que les données que vous transmettez au travers de vos prompt à Azure Open AI lors de vos interactions ne sont ni stockés ni réutilisés à des fins d’entraînements. Cela est très précieux lorsque vous voulez mettre en place ce genre de solution pour une utilisation avec des données privées ou sensibles.

Dans mes exemples je vais alors utiliser le modèle text-davinci-003, ce modèle produit par OpenAI est le modèle utilisé à la base de ChatGPT. Il permet de réaliser des tâches très complexes autours de la compréhension de contenu, de la classification et de la génération. C’est aussi le plus gourmand en terme de ressources nécessaires pour l’inférence. Il existe aussi d’autres modèles moins performants qui peuvent répondre suffisamment bien en consommant bien moins de ressource et avec des temps de réponses plus faibles. Je vous laisserai faire l’expérience.

Completion Playground

Une fois vos modèles déployés dans Azure Open AI, vous pouvez utiliser le Completion Playground pour tester vos prompts :

Avec cette interface, vous aurez donc la possibilité d’entrer votre prompt, et d’utiliser les différents paramètres envoyés au modèles afin de customiser la sortie comme (ce sont ceux que l’on touche le plus souvent) :

  • Température : Permet de d’augmenter ou de diminuer la possibilité que le modèle soit créatif
  • Top probabilities : Très semblable à la température, ce paramètre permet d’augmenter ou de réduire la possibilité d’avoir des jetons moins probables dans votre réponse.

Avec ces différents paramètres, nous allons pouvoir alors tester un premier prompt assez simple. à gauche vous retrouvez mon prompt et à droite le résultat de la génération de mon modèle :

Consignes: 
- Utiliser un format Markdown, 
- Mettre les 10 premiers résultats
Liste des pays de l'OCDE: 
1. Allemagne
2. Australie
3. Autriche
4. Belgique
5. Canada
6. Corée du Sud
7. Danemark
8. Espagne
9. États-Unis
10. Finlande

Remarquez ici, que dans mon prompte, je précise au modèle les consignes de ce que j’attends. C’est ici que tout se joue dans l’utilisation de ces modèles. Plus le prompt est explicite et donnant suffisamment d’exemples de ce que vous attendez, plus le modèle sera efficace.

Consignes: 
- Donner la liste des pays de l'OCDE,
- Utiliser un format Markdown, 
- Ajouter le liens de la page Wikipedia du pays,
- Ajoute en icone le drapeau du pays,
- Mettre les 5 premiers résultats dans l'ordre de l'année d'entrée.

Essayez-le et rendez-vous compte du résultat !

Donner des informations dans vos prompts

Une chose que vous avez peut-être remarqué, ou sinon cela mérite d’être redit : GPT n’est pas une encyclopédie. Il semble que souvent on fasse la confusion, mais comprenez-bien que GPT possède effectivement des informations en mémoire, mais cela ne concerne que les données que nous lui avons fournis lors de son entraînement.

Prenez par exemple :

Si jamais vous en doutiez, GPT ayant été créé en 2022, il est évident que je ne peux que avoir raison quand je dis qu’il a tort.

En lui fournissant un peu d’information, il est cependant capable d’avoir juste (ou presque):

Je dis presque, puisque en fait il se trompe dans le calendrier, nous sommes en fait un samedi (si, si vérifiez-vous même !)

Tout cela pour dire quoi ?

Et bien si vous vous rappelez, GPT permet de comprendre de façon très fine le contenu d’un corpus de texte (la sémantique) et ensuite il réalise une complétion du contenu à partir des éléments statistiquement les plus probables, c’est à partir de là que cela devient rigolo, puisqu’il a été conçu pour être créatif, il invente la suite des mots (en prenant en compte le contexte que vous lui avez donné).

Il est alors possible d’utiliser cette capacité pour lui donner suffisamment d’informations pour qu’il puisse vous donner des résultats justes. Si dans mon exemple je lui ajoute le jours de la semaine, il saura alors me donner la date exacte.

C’est aussi cette fonctionnalité que ChatGPT utilise. En fait lorsque vous interagissez avec ChatGPT dans le contexte est également envoyé votre conversation précédente, cela permet à GPT d’avoir une partie de vos dernier échanges pour tenter de répondre de manière plus pertinente, mais j’y reviendrais plus tard.

Dans l’exemple ci-dessous, j’ai récupéré une partie de mes informations publiques diffusés sur le réseau social LinkedIn pour lui fournir dans mon prompt:

Profile LinkedIn: 
{
  "public_identifier": "kbeaugrand",
  "profile_pic_url": "https://s3.us-west-000.backblazeb2.com/proxycurl/person/kbeaugrand/profile?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=0004d7f56a0400b0000000001%2F20230407%2Fus-west-000%2Fs3%2Faws4_request&X-Amz-Date=20230407T085203Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=88a7a487057f86c642f11be2d3573cd858cd2081e728b20195a8d9f51b9aec63",
  "background_cover_image_url": null,
  "first_name": "Kévin",
  "last_name": "BEAUGRAND",
  "full_name": "Kévin BEAUGRAND",
  "follower_count": null,
  "occupation": "Solutions Architect at CGI",
  "headline": "☁️🤖Developer and craftsman in the field of information technology 🚀☕️ - Microsoft MVP Azure",
  "summary": "I'm passionate about innovation, new technologies and technical challenges.",
  "country": "FR",
  "country_full_name": "France",
  "city": "Clermont-Ferrand",
  "state": "Auvergne-Rhône-Alpes",
  "experiences": [
    {
      "starts_at": {
        "day": 1,
        "month": 5,
        "year": 2020
      },
      "ends_at": null,
      "company": "CGI",
      "company_linkedin_profile_url": "https://www.linkedin.com/company/cgi/",
      "title": "Solutions Architect",
      "description": "As an Azure Cloud Solutions Architect, I'm working for a Michelin subsidiary to define and implement a turnkey solution for the management of zero-emission vehicles. \n\nThe missions entrusted to me include expertise in Cloud Azure technologies, the definition and implementation of the technical building blocks necessary for the integration of the various partner solutions of the offer provided and finally the support of the Full Stack development teams.\n\nTechnologies: Azure, Terraform, Azure WebApps, Container WebApps, Azure EventHub, Java, jHipster",
      "location": "Clermont Ferrand",
      "logo_url": "https://media.licdn.com/dms/image/C4E0BAQErzXWSFkn9tQ/company-logo_400_400/0/1663664110409?e=1689206400&v=beta&t=uyAP--d-Gnlq6k_KpRNm8ne29QFmiplg-fTJ_O63214"
    },
    {
      "starts_at": {
        "day": 1,
        "month": 11,
        "year": 2019
      },
      "ends_at": {
        "day": 1,
        "month": 3,
        "year": 2020
      },
      "company": "CGI",
      "company_linkedin_profile_url": "https://www.linkedin.com/company/cgi/",
      "title": "Azure Solutions Architect",
      "description": "As part of a project to evaluate an IoT platform, I am participating as Azure Cloud Solutions Architect in the definition and implementation of an operational management platform for the management of connected objects (IoT) providing telematics solutions for connected vehicles/valves and on-site diagnostics.\n\nTechnologies: Azure, IoT Hub, Python, Azure Stream Analytics",
      "location": "Clermont-Ferrand, Auvergne-Rhône-Alpes, France",
      "logo_url": "https://media.licdn.com/dms/image/C4E0BAQErzXWSFkn9tQ/company-logo_400_400/0/1663664110409?e=1689206400&v=beta&t=uyAP--d-Gnlq6k_KpRNm8ne29QFmiplg-fTJ_O63214"
    }
]
}

Et lorsque je lui demande de me faire un résumé de ce profile voici ce qu’il me répond :

Bon et si vous êtes assez mégalo, vous pouvez également tenter le (je vous passe le résultat) :

A la façon d'un impresario, présente moi ce profile.

C’est effectivement assez marrant comme utilisation. Du coups, vous pouvez aisément imaginer qu’il est maintenant possible de lui poser tout un tas de question en lui fournissant toujours ce même contexte. GPT aura alors la capacité de vous répondre sur des données que vous lui fournissez au moment de la question.

A quoi cela sert en fait ?

En utilisant les APIs de Azure Open AI, vous serez alors en capacité de réaliser rapidement un moteur pour un ensemble de tâches cognitives assez poussées comme :

  • Créer des résumés,
  • Traduire en plusieurs langues,
  • Extraire les compétences techniques,

Je peux également lui demander de me reformater les informations dans un autre format json:

Là nous commençons à toucher du doigt quelque chose d’intéressant, je n’ai jamais appris à GPT comment lire le contenu json, ni même je ne lui apprend pas comment l’écrire. En revanche il a été capable de comprendre ce que je lui ai demandé, et de transformer l’entrée dans le format de la sortie en remplissant les champs demandés de manière efficace.

Le modèle est finalement très permissif, je peux changer le format d’entrer sans le lui préciser en amont et le résultat sera toujours le même. Effectivement bien plus tolérant que les langages déterministes tels que Java ou le C#. Cela peut donc m’être très utile si je veux enregistrer mes données dans ma propre base, sans avoir à me soucier du format initiale ni des risques de changements dans ce format non-prévus.

Utiliser au runtime

Je pense que au travers de ces différents exemples d’utilisation de la complétion de GPT, vous commencez à imaginer des scénarios où il serait intéressant de rendre une application « intelligente » en tirant bénéfices de ces modèles. Mais vous devez vous demander, où sont les APIS ? comment je les utilise ?

Si vous avez été attentifs à l’utilisation du completion playground, vous avez sans-doute remarqué la présence d’un petit bouton en haut à droite de votre playground nommé « View code ».

En cliquant sur ce bouton, vous pourrez retrouver un écran, vous permettant de récupérer les samples d’appels de ces APIs sous différents langages :

Et puisque je suis un développeur C#, je vais maintenant regarder un peu de plus près ce que je peux réaliser avec le SDK correspondant.

En effet, après avoir téléchargé le package nuget Azure.AI.OpenAI, vous pourrez :

  • Utiliser les APIs de complétion,
  • Utiliser les APIs de chat
  • Utiliser les APIs d’incorporation

Sans revenir sur les capacités de complétion, ni sur ceux de l’incorporation (les embeddings, que je vais détailler dans un autre billet), faisons un tour sur le chat completion.

Chat completion

Le chat completion, c’est l’API utilisé lorsque vous souhaitez créer une interaction avec votre modèle GPT. Comme je vous le disais, GPT n’est pas une base de données et lorsque vous souhaitez créer une interaction avec lui et que vous lui posez des questions sur des choses qui ont étés dites plus tôt, il faudra lui envoyer l’historique des conversations pour qu’il puisse vous répondre correctement.

Ceci aurait pu se faire avec l’API de complétion, mais Azure OpenAI et Open AI (en fait), fournissent une API dédié au cat prenant en considération cette interaction spécifique.

Dans cet API, l’idée est de fournir un ensemble de messages de l’historique, avec le dernier message ainsi que le rôle de l’émetteur de ce message :

  • User : assez simple à comprendre c’est l’utilisateur en face du chat bot
  • Assistant : c’est le bot qui répond,
  • System : Il s’agit là d’instructions ou d’informations que votre application peut envoyer à l’assistant, pour spécifier comment répondre. C’est aussi par-là que vous pouvez fournir des données que l’assistant va utiliser pour répondre.

Dans cet exemple, je vais reprendre l’idée présentée par Paul PETON avec Philippe PAIOLA dans la vidéo ChatGPT : L’ère de l’IA a commencé !, où ils montraient comment transformer chatGPT en coach pour votre apprentissage en vue du passage de certification Microsoft Azure :

using Azure;
using Azure.AI.OpenAI;
OpenAIClient client = new OpenAIClient(
	new Uri("https://weu-jarvis-ai.openai.azure.com/"),
	new AzureKeyCredential(Environment.GetEnvironmentVariable("AZURE_OPENAI_API_KEY")));
Response<StreamingChatCompletions> response = await client.GetChatCompletionsStreamingAsync(
	deploymentOrModelName: "gpt-35-turbo",
	new ChatCompletionsOptions()
	{
		Messages =
		{
			new ChatMessage(ChatRole.System, @"Je suis un coach d'apprentissage. J'aide les utilisateurs en leur posant des questions sur un sujet technique en vue d'un passage d'examen de certification. 
Pour les aider, je leur demande : 
- Quel est le nom de l'examen qu'ils souhaitent préparer,
- Les compétences acquis qu'ils souhaitent que je vérifie
Après avoir obtenu ces informations, je propose une question à choix multiple à laquelle l'utilisateur doit répondre.
Lorsqu'il a répondu je lui pose une autre question. 
Au bout de 5 je calcule son score.
A la fin je mesure le score de l'utilisateur."),
			new ChatMessage(ChatRole.User, @"Bonjour"),
			new ChatMessage(ChatRole.Assistant, @"Bonjour ! Comment puis-je vous aider ?"),
			new ChatMessage(ChatRole.User, @"Je souhaite me préparer à l'examen de certification Microsoft Certified: Azure Developer Associate"),
			new ChatMessage(ChatRole.Assistant, @"Très bien, je peux vous aider à vous préparer pour cet examen. Quelles compétences spécifiques souhaitez-vous que nous abordions pour vous aider à réussir cet examen ?"),
			new ChatMessage(ChatRole.User, @"Develop Azure compute solutions
Develop for Azure storage
Implement Azure security
Monitor, troubleshoot, and optimize Azure solutions
Connect to and consume Azure services and third-party services"),
		},
		Temperature = (float)0.5,
		MaxTokens = 800,
		NucleusSamplingFactor = (float)0.95,
		FrequencyPenalty = 0,
		PresencePenalty = 0,
	});
using StreamingChatCompletions streamingChatCompletions = response.Value;

Dans cet exemple, je fournit au système l’instructtion suivante:

Je suis un coach d'apprentissage. J'aide les utilisateurs en leur posant des questions sur un sujet technique en vue d'un passage d'examen de certification. 
Pour les aider, je leur demande : 
- Quel est le nom de l'examen qu'ils souhaitent préparer,
- Les compétences acquis qu'ils souhaitent que je vérifie
Après avoir obtenu ces informations, je propose une question à choix multiple à laquelle l'utilisateur doit répondre.
Lorsqu'il a répondu je lui pose une autre question. 
Au bout de 5 je calcule son score.

A partir de cela, je peux laisser le chatbot réaliser son travail. Il va interagir avec l’utilisateur afin de lui demander les informations nécessaires pour pouvoir poser les questions et attendre les réponses.

Lors de l’utilisation de l’API au travers du SDK, je n’aurai qu’à enrichir les messages avec le message utilisateur et les réponses de l’assistant pour que l’interaction soit bien suivie.

Attention cela dit: comme je vous l’avait expliqué, GPT ne peut traiter qu’un certain nombre de tokens (4096 en GPT 3.5) et l’ensemble des messages est comptabilisé dans ces tokens. Plus votre interaction sera longue plus il faudra retirer de l’historique vos anciens messages. Vous comprenez rapidement l’intérêt que nous pourrions à utiliser le modèle GPT 4 32K qui lui permet de traiter jusqu’à 8x plus de tokens que son prédécesseur…

Conclusions

Les modèles GPT sont impressionnants, de par leur construction, nous nous rendons compte qu’ils sont extrêmement polyvalents en ce qui concerne la sémantique. Aussi bien capables de comprendre les intentions, parler dans différents langages, reformuler du contenu, résumer, …

Plus que l’utilisation dans un chatbot, je suis particulièrement intéressé à l’utilisation que nous pouvons faire de ces modèles au seins de nos applications. Afin de pouvoir les rendre plus « intelligentes », et je ne pense pas galvauder pas ce mot en montrant que en utilisant ces modèles pour réaliser des tâches complexes d’analyse de texte, de rédaction ou même de résolution de problèmes où le code statique n’e permet pas du tout ‘est que déterministe et ne peut s’adapter aux conditions qu’à coups de développements longs et couteux…

Loin de moi l’idée de dire que nous pouvons remplacer notre code par de la sémantique, cela est particulièrement faux pour tous ce qui est traitements opérationnels où nous avons besoins d’une réponse précise, sûre, où seul un code impératif nous apporte ces garanties. Mais le champs d’application est tout de même assez large.

Je vous invite vivement à tirer bénéfice de la plateforme Azure Open AI, en plus de la possibilité de privatiser les échanges et les données que vous lui soumettez, vous aurez également la possibilité de l’entraîner avec votre propre jeux de données. Sans nul doute, cette plateforme s’étoffera avec d’autres fonctionnalités additionnels interconnectée avec vos propres données où encore d’autres services cognitifs pour rendre l’usage encore plus pertinent. Stay in touch…

Restez aussi à l’écoute de mes billets, je vous prépare une suite à cet article pour aller encore plus loin dans l’utilisation des modèles LLM au cœur de vos applications…

Laisser un commentaire