Brief IA : Outlines révolutionne la génération structurée avec les LLM

Outlines révolutionne la génération structurée avec les LLM

Brief IA
Tom Levy·5 min·2 vues

Outlines est une bibliothèque open-source qui améliore la structuration des sorties des modèles de langage, réduisant les erreurs et garantissant des résultats précis, notamment pour les objets JSON. En utilisant des contraintes syntaxiques, elle simplifie l'utilisation des LLM pour des applications nécessitant des données structurées, augmentant ainsi leur fiabilité et leur adoption.

En bref
1La bibliothèque open-source Outlines améliore la structuration des sorties des modèles de langage, réduisant les erreurs.
2Outlines utilise des contraintes syntaxiques pour garantir des résultats précis, notamment pour les objets JSON.
3Des cas pratiques illustrent son efficacité dans l'analyse de sentiment et la génération de données pour API REST.
💡Pourquoi c'est importantOutlines simplifie l'utilisation des LLM pour des applications nécessitant des données structurées, augmentant leur fiabilité et leur adoption.
Le brief IA que lisent les pros

Tu codes avec l’IA ?

Outils, agents et nouveautés dev IA décryptés, chaque soir en 5 min. Gratuit.

Inclus dès l'inscription : notre sélection des meilleurs guides & comparatifs IA.

Choisis ton rythme

Gratuit · Pas de spam · Désabonnement en 1 clic

📄
L'analyse en français

Une nouvelle ère pour les modèles de langage avec Outlines

Les modèles de langage de grande taille, ou LLM (Large Language Models), sont souvent sollicités pour produire des sorties structurées, telles que des objets JSON. Cependant, obtenir une structure parfaite nécessite généralement une formulation minutieuse des requêtes et un peu de chance. Cette difficulté persistait jusqu'à l'arrivée d'une bibliothèque open-source innovante : Outlines.

Outlines a été conçue pour résoudre les problèmes typiques rencontrés par les LLM lors de la génération de sorties structurées, notamment les hallucinations. Elle introduit un niveau de certitude déterministe dans le processus de génération, garantissant des résultats plus fiables.

Cet article explore les capacités d'Outlines à travers des exemples pratiques en Python, démontrant comment elle peut transformer l'interaction avec les LLM.

Analyse de sentiment : une classification précise

Avant de plonger dans le premier cas d'utilisation, il est essentiel de comprendre comment Outlines assure la précision des sorties structurées des modèles. Lors de l'inférence, elle masque les tokens "syntaxiquement illégaux" lors de la génération, plutôt que d'essayer de corriger un texte mal formulé une fois généré. Cela empêche le modèle de violer les règles du format de sortie souhaité.

Prenons l'exemple d'un pipeline d'analyse pour les tickets de support client, où l'objectif est de sélectionner une option parmi une liste limitée et approuvée. C'est un problème de classification, et la fonction generate.choice() d'Outlines force le modèle à choisir parmi des littérales prédéfinies.

Pour commencer, il faut installer Outlines avec les transformers pour accéder à des LLM pré-entraînés :

pip install outlines[transformers]

Le code suivant utilise outlines.from_transformers() pour charger un modèle pré-entraîné, aidé par les classes automatiques de Hugging Face. Le modèle et son tokenizer sont enveloppés dans un objet Outlines, qui guide le modèle sur les résultats attendus. Lors de l'inférence, la requête utilisateur est accompagnée d'un objet Literal définissant les contraintes de sortie :

from transformers import AutoTokenizer, AutoModelForCausalLM
from typing import Literal

# 1. Chargement du backend en utilisant des modèles basés sur Transformer
model_name = "microsoft/Phi-3-mini-4k-instruct"

# Nous utilisons outlines pour charger le modèle avec sa fonction from_transformers()
model = outlines.from_transformers(
    AutoModelForCausalLM.from_pretrained(model_name),
    AutoTokenizer.from_pretrained(model_name)
)

# 2. Appel du modèle directement, en passant nos chaînes approuvées comme contraintes de type
sentiment = model(
    "Classify the sentiment of this customer review: 'I've been waiting two weeks for my delivery and it's still missing.'",
    Literal["Positive", "Negative", "Neutral"]
)
print(sentiment)

Bien que le littéral soit une partie du module de typage intégré de Python, Outlines prend le contrôle du modèle, imposant des types Python standards et construisant une machine à états finis en arrière-plan qui limite la sortie uniquement aux options fournies.

Génération d'objets JSON : une structure garantie

Dans cet exemple, un objet Pydantic est d'abord défini pour spécifier la structure d'un objet JSON décrivant un personnage fictif avec un nom, une description et un âge. Le modèle Outlines, déjà enveloppé, est utilisé pour garantir que la sortie générée respecte cette structure :

from pydantic import BaseModel

# 1. Définir un modèle Pydantic pour la structure JSON souhaitée
class Character(BaseModel):
    description: str

# 2. Utiliser le modèle enveloppé par outlines pour générer une sortie JSON conforme au modèle Pydantic
json_output = model(
    "Generate a JSON object describing a fictional character named 'Anya'.",
    max_new_tokens=200
)
print(json_output)
{
    "name": "Anya",
    "description": "Anya is a young, adventurous woman with a passion for exploring new places and meeting new people. She has long, curly hair and bright green eyes that sparkle with curiosity. Anya is always eager to learn and loves to share her knowledge with others. She is kind-hearted and always willing to lend a helping hand to those in need. Anya's favorite hobbies include hiking, reading, and playing the guitar. She is a free spirit who values freedom and independence above all else.",
    "age": 25
}

Génération de JSON pour API REST : une précision accrue

Le troisième exemple, également axé sur JSON, se déroule dans un contexte différent. Imaginez la création d'une API nécessitant un payload JSON bien défini pour mettre à jour une base de données. Les LLM standards risquent de produire des caractères indésirables, comme des virgules, pouvant faire échouer un parseur JSON.

Avec Outlines, le schéma de payload JSON est défini à l'aide d'un objet de classe personnalisé basé sur Pydantic :

from pydantic import BaseModel
from typing import Literal

class ServerHealth(BaseModel):
    service_name: str
    uptime_seconds: int
    status: Literal["OK", "DEGRADED", "DOWN"]

# 1. Outlines devrait produire une chaîne brute garantie d'être un JSON valide
raw_json_string = model(
    "Report the current status of the main Auth database.",
    max_new_tokens=50
)
print(type(raw_json_string))  # Cela affichera juste :

# 2. Impression formatée
parsed_json = json.loads(raw_json_string)
print(json.dumps(parsed_json, indent=2))
{
    "service_name": "auth_db_status",
    "uptime_seconds": 1623456789
}

Conclusion : une avancée pour les sorties structurées

Les LLM, conçus pour imiter des conversations humaines, peuvent souvent briser la syntaxe ou produire des hallucinations pour sembler plus naturels. Obtenir des sorties fiables et structurées, comme des objets JSON propres, peut être un défi. Outlines, en tant que bibliothèque open-source, introduit une certitude déterministe dans le processus de génération de sortie des LLM, améliorant ainsi la fiabilité et la précision des outputs structurés. Cet article a illustré trois cas d'utilisation simples mais efficaces pour les débutants avec cet outil prometteur.

Iván Palomares Carrascosa est un expert en IA, apprentissage automatique, apprentissage profond et LLM. Il forme et guide les autres dans l'application de l'IA dans des contextes réels.

Suivez Brief IA

L'actu IA du jour, aussi dans votre fil.

Commentaires