2 points par GN⁺ 2024-12-09 | 1 commentaires | Partager sur WhatsApp

Sorties structurées

6 décembre 2024

Ollama prend désormais en charge les sorties structurées, qui permettent de contraindre la sortie du modèle à un format spécifique défini par un schéma JSON. Les bibliothèques Python et JavaScript d’Ollama ont été mises à jour pour prendre en charge les sorties structurées.

  • Cas d’usage des sorties structurées :
    • Analyse de données dans des documents
    • Extraction de données à partir d’images
    • Structuration de toutes les réponses des modèles de langage
    • Offre une fiabilité et une cohérence supérieures au mode JSON

Pour commencer

  • Télécharger la dernière version d’Ollama
  • Mettre à niveau la bibliothèque Python ou JavaScript d’Ollama vers la dernière version
cURL
  • Le paramètre format permet de transmettre une sortie structurée au modèle
Sortie
  • La réponse est renvoyée dans le format défini par le schéma JSON de la requête
Python
  • Utiliser la bibliothèque Python d’Ollama pour transmettre le schéma sous forme d’objet JSON au paramètre format
  • Il est recommandé d’utiliser Pydantic pour sérialiser le schéma
Sortie
  • name='Canada' capital='Ottawa' languages=['English', 'French']
JavaScript
  • Utiliser la bibliothèque JavaScript d’Ollama pour transmettre le schéma sous forme d’objet JSON au paramètre format
  • Il est recommandé d’utiliser Zod pour sérialiser le schéma
Sortie
  • { name: "Canada", capital: "Ottawa", languages: [ "English", "French" ] }

Exemples

Extraction de données

  • Définir un schéma représentant les informations afin d’extraire des données structurées à partir de texte
  • Le modèle extrait les informations et renvoie les données en JSON selon le schéma défini
Exemple de sortie
  • pets=[ Pet(name='Luna', animal='cat', age=5, color='grey', favorite_toy='yarn'), Pet(name='Loki', animal='cat', age=2, color='black', favorite_toy='tennis balls') ]

Description d’image

  • Les sorties structurées peuvent être utilisées avec des modèles de vision
  • Utiliser llama3.2-vision pour décrire une image et renvoyer une sortie structurée
Exemple de sortie
  • summary='A palm tree on a sandy beach with blue water and sky.'
  • objects=[ Object(name='tree', confidence=0.9, attributes='palm tree'), Object(name='beach', confidence=1.0, attributes='sand') ]
  • scene='beach', colors=['blue', 'green', 'white'], time_of_day='Afternoon', setting='Outdoor', text_content=None
Compatibilité OpenAI
  • Compatible avec les sorties structurées via le client OpenAI

Conseils

  • Pour utiliser les sorties structurées de manière fiable :
    • Définir le schéma de réponse avec Pydantic (Python) ou Zod (JavaScript)
    • Ajouter « renvoyer en JSON » dans le prompt pour aider le modèle à comprendre la requête
    • Régler la température sur 0 pour une sortie plus déterministe

Prochaines étapes

  • Exposition des logits pour une génération contrôlée
  • Amélioration des performances et de la précision des sorties structurées
  • Accélération GPU pour l’échantillonnage
  • Prise en charge de formats supplémentaires au-delà du schéma JSON

1 commentaires

 
GN⁺ 2024-12-09
Avis Hacker News
  • Il est possible de définir des contraintes de sortie plus fortes via la fonctionnalité gbnf de llama.cpp

  • C’est utile pour supprimer le texte inutile lors de la structuration d’un prompt classique afin de le convertir en données CSV

  • En utilisant gemma2:2b et en entrant du texte, on peut obtenir une sortie structurée au format JSON

    • Exemple d’entrée : "You have spent 190 at Fresh Mart. Current balance: 5098"
    • Exemple de sortie : {"amount": 190, "balance": 5098, "category": "Shopping", "place": "Fresh Mart"}
  • Certains se demandent comment les contraintes influencent la qualité de sortie d’un LLM

    • Selon les cas, parser du Markdown ou du texte brut peut offrir une meilleure qualité
  • Une question est posée sur la possibilité de l’utiliser avec les modèles pris en charge

    • Sur du matériel personnel, seuls les modèles 1b-3b peuvent être exécutés de manière fiable
  • Certains se demandent si llama.cpp et ollama exploitent la fonctionnalité native de sortie structurée de llama, ou si c’est implémenté autrement

    • La page Llama de Meta mentionne que les modèles prennent en charge nativement la sortie structurée
  • Une question porte sur la valeur ajoutée par rapport à outlines

  • La raison de continuer à utiliser oobabooga est la prise en charge d’exlv2, qui permet une inférence plus efficace sur deux 3090

  • Il vaudrait mieux commencer par un exemple curl

    • J’aime bien Pydantic, mais coder directement le schéma facilite davantage le passage du prototype vers Go
  • Une question est posée sur la meilleure manière de fournir une entrée structurée à un LLM

    • Exemple : entrer 100 phrases et classer chacune d’elles différemment
    • Obtenir des données structurées est facile, mais la méthode consistant à préfixer avec des numéros de ligne paraît maladroite