Skip to content
Snippets Groups Projects
Commit 570a1b89 authored by Pablo Ruiz Fabo's avatar Pablo Ruiz Fabo
Browse files

première version complète tp partie 2

parent 659800c7
No related merge requests found
# TP - Recherche d'information partie 2 : Assistant avec API Mistral et *function calling*
1. [Introduction](#intro)
1. [TODO](#teledem)
1. [TODO](#tele)
1. [TODO](#dem)
1. [TODO](#indexationEtc)
1. [TODO](#creatcore)
1. [TODO](#structureCore)
1. [Prérequis](#prerequis)
1. [Clé API Mistral](#cle-api-mistral)
1. [Clé API Méteo](#cle-api-meteo)
1. [Tâche à faire](#tache-a-faire)
1. [Autres informations](#autres-informations)
1. [Création d'un client Mistral pour génération de texte](#client-mistral)
1. [Function calling](#function-calling)
## Introduction <a name="intro"/>
<a name="intro"/>
## Introduction
Dans cette partie du TP il s'agit de travailler avec la fonctionnalité [*function calling*](https://docs.mistral.ai/capabilities/function_calling/) de l'API de Mistral. Cette fonctionnalité permet de définir des fonctions qui peuvent être appelées par l'API de Mistral lors d'un dialogue interactif avec un des modèles. Quand le texte saisi par l'utilistaeur·trice contient des informations pertinentes pour appeler une de ces fonctions, le besoin de déclencher la fonction et les valeurs des paramètres sont détectés par le modèle. L'API appelle ensuite la fonction.
Les informations retournées par la fonction peuvent être utilisées dans des tours de parole subséquents pour répondre à de nouvelles questions de l'utilisateur·trice. Nous combinons ainsi les capacités d'analyse et génération d'un LLM avec des informations externes qui ne pouvaient pas être disponibles lors de l'entraînement du modèle. P. ex. le modèle peut avoir une fonction pour détecter une demande sur la météo actuelle dans une ville, détecter la ville et l'échelle (celcius ou fahrenheit) et retourner la température actuelle. Ensuite il peut émettre par exemple un avis sur type commment s'habiller en fonction des informations sur la météo.
<a name="prerequis"/></a>
## Prérequis
<a name="cle-api-mistral"/></a>
### Clé API Mistral
Nous aurons besoin d'un clé (gratuit) pour utiliser Mistral. Pour obtenir une clé, il faut s'inscrire sur [https://console.mistral.ai/](https://console.mistral.ai/) et choisir le plan *Experimental*. En ce faisant, il ne sera pas nécessaire de fournir des informations de paiement. Suivez les instructions pour créer la clé depuis l'option *API Keys* dans le menu de gauche. La procédure est gratuite et demande la vérification d'une adresse mail, ainsi que par SMS la vérification d'un numéro de téléphone.
......@@ -30,6 +37,8 @@ Il faut donner la clé lors de l'instantation du client Mistral. P. ex., si la c
client = Mistral(api_key=os.getenv("MISTRAL_API_KEY"))
```
<a name="cle-api-meteo"/></a>
### Clé API méteo
Il est aussi nécessaire d'avoir une clé gratuite pour l'une des deux API utilisées dans le *function calling* :
......@@ -38,6 +47,7 @@ Il est aussi nécessaire d'avoir une clé gratuite pour l'une des deux API utili
La deuxième API ([Open Library](https://openlibrary.org/dev/docs/api/search)) ne demande pas de clé.
<a name="tache-a-faire"></a>
## Tâche à faire
Le client Mistral dans `assistant_mistral_a_completer.py` permet d'interagir avec un modèle Mistral de façon libre, jusqu'à la saisie de `###` par l'utilisateur·trice. Le modèle peut aussi répondre à des questions sur la météo actuelle dans une ville. Pour cela, il utilise la fonction `get_weather` qui est déjà implémentée dans le fichier `functions.py`. Cette fonction appelle l'API de [Weather API](https://www.weatherapi.com/) pour obtenir les informations sur la météo.
......@@ -52,11 +62,58 @@ Si vous travaillez à partir du script `assistant_mistral_a_completer.py`, il fa
- La définition de la gestion de `get_openlibrary_data` dans la liste de ressources définies dans la variable `tools`.
- La gestion de la réponse de `get_openlibrary_data` dans la boucle principale de l'assistant : Comment gérer la réponse de la fonction pour intégrer ses résultats à la conversation, une fos que le modèle a détecté la demande de l'utilisateur·trice et appelé la fonction.
Un exemple du type de conversation que cet assistant permet est ci-dessous. Les réponses sont précédées des mots suivants selon si le *function calling* s'est appliqué ou pas:
- Assistant (weather)
- Assisatant (openlibrary)
- Assistant (no function call)
```
In [1]: %run assistant_mistral.pyxed_without_api_key_mistral.py
This is the beginning of your chat with AI. [To exit, send "###".]
You: J'aimerais lire des ouvrages par Virginie Despentes en français
Assistant (openlibrary): Virginie Despentes (lang fre):
- King Kong théorie (2006)
- Baise-moi (1999)
- Vernon Subutex 1 (2015)
- Cher connard (2022)
- Apocalypse Bébé (2010)
- Teen Spirit (2002)
- Bye bye Blondie (2004)
- Les Chiennes savantes (1996)
- Les jolies choses (1998)
- Mordre au travers (2001)
- Mordre Au Travers (1998)
- Dix (1997)
You: What's the weather like in Montréal?
Assistant (weather): Montréal: 4.2 celsius.
You: Comment m'habiller là-bas?
Assistant (no function call): Il fait 4.2 degrés Celsius à Montréal. Je vous recommande de porter des vêtements chauds, comme un manteau, un pull, un pantalon et des bottes. N'oubliez pas de porter des gants et une écharpe pour vous protéger du froid.
You: How can I run Python one-liners on the command line?
Assistant (no function call): To run Python one-liners on the command line, you can use the Python interpreter directly from the terminal or command prompt. Here are a few methods to do this:
[...]
```
La conversation mélange l'anglais et le français, mais il est plus simple d'utiliser une seule langue pour ne pas avoir à gérer les codes de langue requis par l'API de Open Library.
<a name="autres-informations"></a>
## Autres informations
### Création d'un client Mistral pour génération de texte étant donné un prompt :
<a name="client-mistral"></a>
### Création d'un client Mistral pour génération de texte :
Le client utilise l'endpoint `chat` de l'API de Mistral :
Un client pour la génération de texte étant donné un prompt utilise l'endpoint `chat` de l'API de Mistral :
```python
import os
......@@ -83,7 +140,7 @@ Pour créer un client Mistral, il faut donner la clé API comme argument, ici la
La variable nommé ici `conversation` est une liste de dictionnaires qui sert à donner le prompt dans un dictionnaire dont la valeur de la clé `role` est `user`. La question posée au modèle est la valeur pour la clé `content` dans le même dictionnaire, ici *Where is the answer blowing?*. Le modèle va générer une réponse à cette question.
Il est optionnel d'inclure comme partie initiale du prompt une clé `role` avec la valeur `system` pour donner des informations au modèle sur la nature du sysstème. Un prompt neutre dans ce sens est quelque chose comme *You are a helpful assistant.*, mais on pourrait varier cette chaîne pour essayer d'obtenir un comportement différent du modèle.
Il est optionnel d'inclure comme partie initiale du prompt une clé `role` avec la valeur `system` pour donner des informations au modèle sur la nature du système. Un prompt neutre dans ce sens est quelque chose comme *You are a helpful assistant.*, mais on pourrait varier cette chaîne pour essayer d'obtenir un comportement différent du modèle.
La réponse est demandée ici dans la variable `response`. On appelle la méthode `complete` de `client.chat`, en donnant comme arguments le modèle (ici un modèle basique nommé `mistral-small-latest`) et le prompt complet comme la valeur de l'argument `messages`. La réponse générée par le modèle se trouvera dans `response.choices[0].message.content`.
......@@ -94,6 +151,44 @@ response = client.chat.complete(
)
```
Nous pouvons généraliser ce code pour créer un assistant qui lit le texte saisi par l'utilisateur·trice en boucle et génére des réponses, jusqu'à ce que l'utilisateur·trice écrit un texte de sortie. Ceci a été fait dans le script `assistant_mistral_a_completer.py`, avec `###` comme texte de sortie.
Nous pouvons généraliser ce code pour créer un assistant qui lit le texte saisi par l'utilisateur·trice en boucle et génére des réponses, jusqu'à ce que l'utilisateur·trice écrit un texte de sortie. Ceci a été fait dans le script [`assistant_mistral_a_completer.py`](02_assistant_mistral/assistant_mistral_a_completer.py), avec `###` comme texte de sortie.
<a name="function-calling"></a>
### Function calling
Cette fonctionalité est décrite sur https://docs.mistral.ai/capabilities/function_calling/. Elle permet de définir des fonctions qui peuvent être appelées par l'API de Mistral lors d'un dialogue avec un modèles. Quand le texte saisi par l'utilistaeur·trice contient des informations pertinentes pour appeler une de ces fonctions, le besoin de déclencher la fonction et les valeurs des arguments à utiliser dans l'appel sont détectés par le modèle. L'API appelle ensuite la fonction.
Un exemple est disponible dans [`assistant_mistral_a_completer.py`](02_assistant_mistral/assistant_mistral_a_completer.py) pour appeler l'API Wheather API.
Utiliser le function calling demande d'ajouter un argument `tools` à la méthode `complete` de `client.chat`.
```python
response = client.chat.complete(
model="mistral-small-latest",
messages=conversation,
tools=tools
)
```
L'argument `tools` fait référence à une liste de dictionnaires, chaque dictionnaire définissant une fonction à appeler. Dans le cas de `get_weather`, le dictionnaire est :
```python
{
"type": "function",
"function": {
"name": "get_weather",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string"},
"unit": {"type": "string"},
},
"required": ["location", "unit"],
"additionalProperties": False,
},
},
}
```
### Function calling
\ No newline at end of file
Sur la base de cela, vous pouvez définir une fonction `get_openlibrary_data` et compléter l'assistant dans [`assistant_mistral_a_completer.py`](02_assistant_mistral/assistant_mistral_a_completer.py) pour répondre à la tâche décrite dans [*Tâche à faire* ci-dessus](#tache-a-faire).
\ No newline at end of file
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment