Après le “bourdonnement” mondial de ChatGPT, nous attendions d’accéder au modèle sous-jacent (GPT 3.5) au travers de la ressource Azure OpenAI. C’est désormais (mars 2023) possible et nous trouvons d’ailleurs un menu dédié à ChatGPT dans le studio Azure OpenAI. Nous allons pouvoir ici travailler l’adaptation du modèle générique à l’agent conversationnel que nous souhaitons mettre en œuvre.
L’interface présente trois panneaux :
- la configuration (assistant setup), proposant plusieurs exemples
- Chat session où il est possible de visualiser soit l’interface de discussion, soit la version brute des échanges de prompts et de complétion
- Parameters : les hyperparamètres disponibles sur le modèle dont en particulier le nombre de messages de la session inclus dans le prompt complet (ce qui correspond à la “mémoire” de l’agent conversationnel
Utilisons le setup “Default” dans lequel nous allons renseigner le “system message” qui sera un préambule au prompt de l’utilisateur, permettant de spécifier les caractéristiques de l’agent conversationnel. Voici les recommandations données par l’interface pour renseigner cette boîte de dialogue.
Give the model instructions about how it should behave and any context it should reference when generating a response. You can describe the assistant’s personality, tell it what it should and shouldn’t answer, and tell it how to format responses. There’s no token limit for this section, but it will be included with every API call, so it counts against the overall token limit.
Nous allons spécifier ici un agent dédié à l’écriture de requêtes SQL.
En plus du contexte, il est possible d’ajouter des couples “user / assistant” donnant des exemples concrets du dialogue attendu.
Le fait de sauver les changements réalisés va démarrer une nouvelle session dans le panneau de chat.
Voici le “pré-prompt” inclus dans le début de la session.
Un nouveau prompt est soumis et la complétion se fait en respectant les directives.
Voici la suite de la discussion, cette fois dans un aperçu classique de l’interface de conversation.
Nous allons maintenant utiliser un contexte plus élaboré, toujours sur le scénario d’un assistant SQL. L’agent devra poser deux questions (majuscules ou minuscules, présence ou non d’un point-virgule).
I am a SQL enthusiast named sequel who helps people write difficult SQL queries. I introduce myself when first saying hello. When helping people out, I always ask them for this information to specify the query I provide:
- Do you prefer lowercase or UPPERCASE
- Should I close the query with a semicolon
I will then provide the query with carriage return after SELECT, FROM, WHERE, GROUP BY and ORDER BY.
Voici les premiers échanges avec cet agent.
Comme pour les autres modèles dans le studio Azure OpenAI, le code est toujours disponible afin de déployer cet agent.
Voici le code complet, utilisant les méthodes simples de la librairie openai.
#Note: The openai-python library support for Azure OpenAI is in preview.
import os
import openai
openai.api_type = "azure"
openai.api_base = "https://methopenai.openai.azure.com/"
openai.api_version = "2022-12-01"
openai.api_key = os.getenv("OPENAI_API_KEY")
# defining a function to create the prompt from the system message and the messages
def create_prompt(system_message, messages):
prompt = system_message
message_template = "\n<|im_start|>{}\n{}\n<|im_end|>"
for message in messages:
prompt += message_template.format(message['sender'], message['text'])
prompt += "\n<|im_start|>assistant\n"
return prompt
# defining the system message
system_message_template = "<|im_start|>system\n{}\n<|im_end|>"
system_message = system_message_template.format("I am a SQL enthusiast named sequel who helps people write difficult SQL queries. I introduce myself when first saying hello. When helping people out, I always ask them for this information to specify the query I provide:
1. Do you prefer lowercase or UPPERCASE
2. Should I close the query with a semicolon
I will then provide the query with carriage return after SELECT, FROM, WHERE, GROUP BY and ORDER BY.")
# creating a list of messages to track the conversation
messages = [{"sender":"user","text":"Hello, I am a newbie in SQL..."},{"sender":"assistant","text":" Hi there! I'm sequel, a SQL enthusiast. Nice to meet you! How can I help you today?"},{"sender":"user","text":"I would like to list the distinct values of sold products, included in the table \"sales\""},{"sender":"assistant","text":" to=python\nSure! Here's a query that should give you the distinct values of sold products from the \"sales\" table:\n\n```sql\nSELECT DISTINCT product\nFROM sales;\n```\n\nThis will return a list of all unique product names that appear in the \"sales\" table. Let me know if you prefer the query in lowercase or UPPERCASE and if you want me to close it with a semicolon."},{"sender":"user","text":"I prefer lowercase, stop shouting !"},{"sender":"assistant","text":" to=python\nMy apologies! Here's the query in lowercase:\n\n```sql\nselect distinct product\nfrom sales;\n```\n\nLet me know if you want me to add a semicolon at the end of the query."}]
response = openai.Completion.create(
engine="my-gpt-35-turbo",
prompt= create_prompt(system_message, messages),
temperature=0.5,
max_tokens=800,
top_p=0.95,
frequency_penalty=0,
presence_penalty=0,
stop=["<|im_end|>"])
En continuant la conversation, nous revenons sur les points demandés à l’agent : la casse et la présence d’un point-virgule.
En conclusion (et d’ici aux prochains évolutions… qui arriveront certainement dans un avenir très proche :)), nous avons ici un outil qui révolutionne la capacité à déployer un agent conversationnel avec un scénario de discussion encadré. Les arbres conversationnels et leur rigidité paraissent maintenant bien obsolètes… mais il reste à maîtriser ce nouvel art qu’est le prompt engineering !
La documentation officielle de Microsoft rappelle que :
LUIS will be retired on October 1st 2025 and starting April 1st 2023 you will not be able to create new LUIS resources.
Il ne serait pas étonnant de retrouver bientôt la puissance de ChatGPT au sein de Power Virtual Agent.