Aller au contenu

Première rencontre avec Mistral Large

Notre licorne française Mistral AI a annoncé hier la sortie d’un nouveau modèle de langage Mistral Large dont les capacités s’approchent de GPT-4, ainsi qu’une application web de chatbot baptisée Le Chat.

L’annonce indique également une autre nouveauté qui m’intéresse particulièrement : les modes JSON format and function calling. Ces fonctionnalités déjà disponibles sur OpenAI permettent de contrôler le format de sortie du modèle de langage afin de pouvoir l’interfacer avec des outils externes (API, Code…). Et c’est ce qui me manquait pour pousser plus loin mes tests des modèles de Mistral AI. En effet, sans cette fonctionnalité, il était impossible d’utiliser Mistral AI dans des applications IA complexes (voir mon article sur les RAG).

J’ai donc pu tester Mistral Large et le mode function calling sur un exemple assez poussé et voici un premier résultat.

Description du test

Mon test consiste à extraire des informations structurées depuis des fiches techniques de produits (adhésifs industriels). Ce test est assez intéressant car :

  • Le modèle de JSON est assez costaud
  • Les données à extraire peuvent nécessiter des conversions (par exemple, je demande une grandeur en N/cm alors qu’elle est exprimée en N/25mm sur la fiche). Sans explication supplémentaire, le modèle doit comprendre qu’il est nécessaire de faire une conversion d’unité.

Voici un exemple de fiche technique et le modèle de JSON que je souhaite extraire (pour information OpenAI et Mistral AI attendent la description d’un JSON au format JSON Schema).

exemple-fiche-technique

Exemple de fiche technique à partir de laquelle les données seront extraite. Un traitement de donnée préalable sera réalisé sur le PDF afin qu’il soit digeste pour un LLM (voirTraitement de la donnée en amont)

Schema JSON décrivant la structure de donnée à extraire
{
    "type": "object",
    "properties": {
        "reference": {
            "type": "string",
            "description": "Référence of the product"
        },
        "longName": {
            "type": "string",
            "description": "Plain text name"
        },
        "description": {
            "type": "string",
            "description": "Plain text name"
        },
        "category": {
            "type": "string",
            "enum": [
                "adhésif simple face",
                "adhésif double face",
                "colle",
                "mastic",
                "accessoires"
            ]
        },
        "material": {
            "type": "string",
            "description": "Material of the product"
        },
        "main application": {
            "type": "array",
            "description": "Main applications for the product",
            "items": {
                "type": "string",
                "description": "application, use case (a few words)"
            }
        },
        "technicalData": {
            "type": "array",
            "description": "Technical data",
            "items": {
                "type": "object",
                "required": [
                    "key",
                    "value"
                ],
                "properties": {
                    "key": {
                        "type": "string",
                        "description": "Technical data",
                        "enum": [
                            "Adhésion sur acier (N/cm)",
                            "Résistance à la traction (N/cm)",
                            "Élongation (%)",
                            "Épaisseur totale sans liner (μm)",
                            "T° MAX en continu (°C)",
                            "T° MAX en continu (°C)",
                            "T° MAX en pointe (°C)"
                        ]
                    },
                    "value": {
                        "type": "number",
                        "description": "Value for the technical data in the unit given in the key property"
                    }
                }
            }
        }
    }
}

Résultats

J’ai donc fait tourner le même prompt pour 4 modèles et voici mes résultats :

  • json-results-mistral-small
  • json-results-gpt-35
  • json-results-mistral-large
  • json-results-gpt-4
Respect du format JSON demandé Conversion des unités à la volée
Mistral Small
GPT-3.5
Mistral Large
GPT-4

A noter

  • Les annonces de Mistral ont visiblement provoqué beaucoup d’enthousiasme les services sont difficilement joignables (erreur 500 Service Unavailable). Cela devrait s’améliorer dans les prochains jours.
  • Même en passant en paramètre mon JSON (paramètre tools), Mistral ne me retournait pas un JSON. J’ai du lui forcer la main en ajoutant le paramètre tool_choice: any (voir la documentation). OpenAI comprend plus facilement que j’attends un JSON sans qu’il soit nécessaire de toucher à ce paramètre.
  • Il me semble avoir vu une fois Mistral Large réussir le test mais je n’ai pas réussi à le reproduire pour le screenshot. Dans tous les cas, j’ai eu plus souvent des conversions erronées ou pas de conversions alors que GPT-4 réussit presque à tous les coups.

Ce test n’a pas vocation à faire office de benchmark puisqu’il est constitué d’un unique cas particulier et non d’un éventail de tests variés. Il s’agit seulement d’un exemple intéressant en rapport avec mes recherches du moment.

À ce stade, les modèles d’OpenAI demeurent plus robustes et prévisibles pour les extractions de JSON complexes, mais je suis ravi de voir que l’écart se réduit et j’espère que les modèles de Mistral AI deviendront bientôt mes modèles de prédilection sur ces cas d’usage.