nouvelles

Précis et 0 erreur, entrez le prix et ça cassera ! L'API d'annonce officielle d'OpenAI prend en charge la sortie structurée, la précision JSON est de 100 %

2024-08-07

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina



  Nouveau rapport de sagesse

Editeur : Service éditorial
[Introduction à la nouvelle sagesse] Bonne nouvelle pour les programmeurs ! L'API modèle récemment lancée par OpenAI prend en charge la sortie structurée, le taux de correspondance du schéma JSON peut atteindre 100 % et le coût est immédiatement réduit de moitié.
Vous vous creusez toujours la tête pour penser à un tas de mots d'invite et vous avez mal à la tête à cause des différents résultats de sortie après une seule opération ?
OpenAI a enfin entendu la voix du grand public et a fourni aux développeurs la fonctionnalité n°1 tant attendue.
OpenAI a annoncé aujourd'hui le lancement de nouvelles fonctionnalités et l'API ChatGPT prend désormais en charge la sortie structurée JSON.
JSON (JavaScript Object Notation) est la norme industrielle pour les formats d'échange de fichiers et de données, car il est à la fois facile à lire pour les humains et à analyser pour les machines.
Cependant, LLM fonctionne souvent contre JSON, produisant souvent des hallucinations, soit en générant des réponses qui ne suivent que partiellement les instructions, soit en générant un tas de « livres célestes » qui ne peuvent pas du tout être entièrement analysés.
Cela oblige les développeurs à utiliser plusieurs outils open source, à essayer différentes invites ou à répéter des requêtes pour générer le résultat souhaité, ce qui prend du temps et demande beaucoup de main d'œuvre.
La fonctionnalité de sortie structurée, publiée aujourd'hui, résout les problèmes épineux ci-dessus et garantit que la sortie générée par le modèle correspond au schéma spécifié dans JSON.
La fonction de sortie structurée a toujours été la fonctionnalité numéro un demandée par les développeurs. Ultraman a également déclaré dans son tweet que cette version avait été publiée en réponse aux demandes des utilisateurs.
Les nouvelles fonctionnalités publiées par OpenAI ont en effet touché le cœur de nombreux développeurs, et ils sont tous d'accord pour dire que « c'est une grosse affaire ».
De nombreuses personnes ont laissé des messages exprimant leurs éloges, qualifiant « Excellent ! »
Certains sont heureux et d’autres sont tristes. Cette mise à jour d’OpenAI fait craindre aux gens qu’elle engloutisse les startups.
Cependant, pour les utilisateurs plus ordinaires, la question qui les préoccupe le plus est de savoir quand GPT-5 sera publié. Quant au schéma JSON, « Qu'est-ce que c'est ?
Après tout, sans la nouvelle de GPT-5, le DevDay d’OpenAI cet automne pourrait être beaucoup plus calme que l’année dernière.

Assurez facilement la cohérence du schéma

Avec une sortie structurée, il vous suffit de définir un schéma JSON, et l'IA ne sera plus « volontaire » et ne produira plus docilement des données conformément aux instructions.
De plus, la nouvelle fonction rend non seulement l’IA plus obéissante, mais améliore également considérablement la fiabilité du contenu de sortie.
Lors de l'évaluation de suivi d'un schéma JSON complexe, le nouveau modèle gpt-4o-2024-08-06 avec sortie structurée a reçu un score parfait de 100 %. En comparaison, gpt-4-0613 a obtenu un score inférieur à 40 %.
En fait, la fonction JSON Schema a été lancée par OpenAI lors du DevDay l'année dernière.
Désormais, OpenAI a étendu cette fonctionnalité dans l'API, garantissant que la sortie générée par le modèle correspond exactement au schéma JSON fourni par le développeur.
La génération de données structurées à partir d’entrées non structurées est l’un des principaux cas d’utilisation de l’intelligence artificielle dans les applications actuelles.
Les développeurs utilisent l'API OpenAI pour créer des assistants puissants capables d'obtenir des données et de répondre aux questions via des appels de fonction, d'extraire des données structurées pour la saisie de données et de créer des flux de travail agents en plusieurs étapes, permettant à LLM d'agir.

Principes techniques

OpenAI adopte une approche à deux volets pour améliorer la correspondance entre la sortie du modèle et le schéma JSON.
Bien que les performances du modèle se soient considérablement améliorées, atteignant une précision de 93 % dans les tests de référence, une incertitude inhérente demeure.
Afin de garantir la stabilité des applications créées par les développeurs, OpenAI fournit une méthode de plus grande précision pour limiter la sortie du modèle, atteignant ainsi une fiabilité de 100 %.

Décodage de contraintes

OpenAI utilise une technique appelée échantillonnage contraint ou décodage contraint. Par défaut, le modèle génère des sorties totalement sans contrainte, sélectionnant potentiellement n'importe quel jeton du vocabulaire comme sortie suivante.
Cette flexibilité peut entraîner des erreurs, telles que l'insertion aléatoire de caractères non valides lors de la génération d'un JSON valide.
Afin d'éviter de telles erreurs, OpenAI utilise une méthode de décodage de contraintes dynamiques pour garantir que le jeton de sortie généré est toujours conforme au schéma fourni.
Pour y parvenir, OpenAI convertit le schéma JSON fourni en une grammaire sans contexte (CFG).
Pour chaque schéma JSON, OpenAI calcule une syntaxe qui représente le schéma et accède efficacement aux composants prétraités lors de l'échantillonnage.
Cette approche rend non seulement le résultat généré plus précis, mais réduit également les retards inutiles. La première demande de nouveau schéma peut nécessiter un temps de traitement supplémentaire, mais les demandes suivantes reçoivent une réponse rapide via le mécanisme de mise en cache.

Possibilités

En plus de la méthode CFG, d'autres méthodes utilisent généralement des machines à états finis (FSM) ou des expressions régulières pour le décodage des contraintes.
Cependant, ces méthodes ont des capacités limitées en matière de mise à jour dynamique des jetons valides. Surtout pour les structures de données complexes imbriquées ou récursives, FSM est souvent difficile à gérer.
La méthode CFG d'OpenAI fonctionne bien lors de l'expression de schémas complexes. Par exemple, le schéma JSON prenant en charge les schémas récursifs est implémenté sur l'API OpenAI mais ne peut pas être exprimé via les méthodes FSM.

Économisez la moitié du coût des intrants

La sortie structurée est disponible pour tous les modèles prenant en charge les appels de fonction, y compris les derniers modèles GPT-4o et GPT-4o-mini, ainsi que les modèles affinés.
Cette fonctionnalité est disponible sur l'API Chat Completions, l'API Assistants et l'API Batch et est compatible avec la saisie visuelle.
Par rapport à la version gpt-4o-2024-05-13, la version gpt-4o-2024-08-06 est également plus rentable. Les développeurs peuvent économiser 50 % du coût d'entrée (2,50 $/1 million de jetons). , économisant 33 % du coût à la fin de la sortie (jeton de 10,00 $/1 M).

Comment utiliser la sortie structurée

Deux formulaires peuvent être utilisés pour introduire une sortie structurée dans l'API :

appel de fonction

Une sortie structurée via des outils peut être obtenue en définissant strict: true dans la définition de la fonction.
Cette fonctionnalité est disponible sur tous les modèles dotés d'outils pris en charge, y compris tous les modèles gpt-4-0613 et gpt-3.5-turbo-0613 et supérieurs.
Lorsque la sortie structurée est activée, la sortie du modèle correspondra à la définition de l'outil fournie.
Exemple de demande :
Exemple de sortie :
{
  "table_name": "orders",
  "columns": ["id", "status", "expected_delivery_date", "delivered_at"],
  "conditions": [
    {
      "column": "status",
      "operator": "=",
      "value": "fulfilled"
    },
    {
      "column": "ordered_at",
      "operator": ">=",
      "value": "2023-05-01"
    },
    {
      "column": "ordered_at",
      "operator": "<",
      "value": "2023-06-01"
    },
    {
      "column": "delivered_at",
      "operator": ">",
      "value": {
        "column_name": "expected_delivery_date"
      }
    }
  ],
  "order_by": "asc"
}

Nouvelles options pour le paramètre Response_format

Les développeurs peuvent désormais choisir d'exiger ou non une sortie formatée via la nouvelle option json_schema de Response_format.
Cette fonctionnalité est utile lorsque le modèle n'appelle pas d'outils, mais répond à l'utilisateur de manière structurée.
Cette fonctionnalité est disponible pour les derniers modèles GPT-4o : gpt-4o-2024-08-06 et gpt-4o-mini-2024-07-18 publiés aujourd'hui.
Lorsque Response_format est défini sur strict:true, la sortie du modèle correspondra au schéma fourni.
Exemple de demande :
Exemple de sortie :
{
  "steps": [
    {
      "explanation": "Subtract 31 from both sides to isolate the term with x.",
      "output": "8x + 31 - 31 = 2 - 31"
    },
    {
      "explanation": "This simplifies to 8x = -29.",
      "output": "8x = -29"
    },
    {
      "explanation": "Divide both sides by 8 to solve for x.",
      "output": "x = -29 / 8"
    }
  ],
  "final_answer": "x = -29 / 8"
}
Les développeurs peuvent générer des réponses étape par étape en utilisant une sortie structurée pour guider le résultat souhaité.
Selon OpenAI, les développeurs n'ont pas besoin de valider ou de réessayer les réponses mal formées, et la fonctionnalité permet des invites plus simples.

Prise en charge du SDK natif

OpenAI indique que ses SDK Python et Node ont été mis à jour pour prendre en charge nativement la sortie structurée.
Fournir un schéma ou un format de réponse à un outil est aussi simple que de fournir un objet Pydantic ou Zod. Le SDK d'OpenAI peut convertir les types de données en schémas JSON pris en charge, désérialiser automatiquement les réponses JSON en structures de données typées et analyser les rejets.
De plus, la prise en charge native de la sortie structurée est également disponible pour Response_format.

Autres cas d'utilisation

Les développeurs utilisent souvent les modèles d'OpenAI pour générer des données structurées pour divers cas d'utilisation.
Voici quelques autres exemples :
-Générer dynamiquement une interface utilisateur en fonction de l'intention de l'utilisateur
Les développeurs peuvent utiliser une sortie structurée pour créer des applications de génération de code ou d'interface utilisateur.
En utilisant le même format de réponse, différentes interfaces utilisateur peuvent être générées en fonction des entrées de l'utilisateur.
Par exemple, créez une « Interface de connexion du jardinier » :
Il est généré avec le code suivant :
{
  "type": "div",
  "label": "",
  "children": [
    {
      "type": "header",
      "label": "",
      "children": [
        {
          "type": "div",
          "label": "Green Thumb Gardening",
          "children": [],
          "attributes": [{ "name": "className", "value": "site-title" }]
        },
        {
          "type": "div",
          "label": "Bringing Life to Your Garden",
          "children": [],
          "attributes": [{ "name": "className", "value": "site-tagline" }]
        }
      ],
      "attributes": [{ "name": "className", "value": "header" }]
    },
    {
      "type": "section",
      "label": "",
      "children": [
        {
          "type": "div",
          "label": "",
          "children": [
            {
              "type": "div",
              "label": "About Us",
              "children": [
                {
                  "type": "div",
                  "label": "At Green Thumb Gardening, we specialize in transforming your outdoor spaces into beautiful, thriving gardens. Our team has decades of experience in horticulture and landscape design.",
                  "children": [],
                  "attributes": [
                    { "name": "className", "value": "about-description" }
                  ]
                }
              ],
              "attributes": [{ "name": "className", "value": "about-section" }]
            }
          ],
          "attributes": [{ "name": "className", "value": "content" }]
        }
      ],
      "attributes": [{ "name": "className", "value": "about-container" }]
    },
    {
      "type": "section",
      "label": "",
      "children": [
        {
          "type": "div",
          "label": "",
          "children": [
            {
              "type": "div",
              "label": "Our Services",
              "children": [
                {
                  "type": "div",
                  "label": "Garden Design",
                  "children": [],
                  "attributes": [
                    { "name": "className", "value": "service-item" }
                  ]
                },
                {
                  "type": "div",
                  "label": "Plant Care & Maintenance",
                  "children": [],
                  "attributes": [
                    { "name": "className", "value": "service-item" }
                  ]
                },
                {
                  "type": "div",
                  "label": "Seasonal Cleanup",
                  "children": [],
                  "attributes": [
                    { "name": "className", "value": "service-item" }
                  ]
                },
                {
                  "type": "div",
                  "label": "Custom Landscaping",
                  "children": [],
                  "attributes": [
                    { "name": "className", "value": "service-item" }
                  ]
                }
              ],
              "attributes": [{ "name": "className", "value": "services-list" }]
            }
          ],
          "attributes": [{ "name": "className", "value": "content" }]
        }
      ],
      "attributes": [{ "name": "className", "value": "services-container" }]
    }
  ],
  "attributes": [{ "name": "className", "value": "landing-page" }]
}
- Séparer les réponses finales du raisonnement à l'appui ou des commentaires supplémentaires
Fournir au modèle un champ de chaîne de pensée distinct peut améliorer la qualité finale de la réponse.
demander:
Sortie structurée :
{
  "reasoning_steps": [
    "First step is to compare the numbers 9.11 and 9.9.",
    "Both numbers have the same whole number part, which is 9.",
    "To compare the decimal parts, convert them to the same number of decimal places.",
    "9.11 has two decimal places: it is 9.11.",
    "9.9 has one decimal place: it can be rewritten as 9.90.",
    "Now, compare 9.11 and 9.90 by looking at the decimal parts.",
    "Compare 11 with 90.",
    "90 is greater than 11, so 9.90 is greater than 9.11."
  ],
  "answer": "9.9 is bigger than 9.11."
}
- Extraire des données structurées à partir de données non structurées
Par exemple, demandez au modèle d'extraire des éléments tels que des tâches, des délais et des tâches à partir des notes de réunion.
demander:
Sortie structurée :
{
  "action_items": [
    {
      "description": "Collaborate on optimizing the path planning algorithm",
      "due_date": "2024-06-30",
      "owner": "Jason Li"
    },
    {
      "description": "Reach out to industry partners for additional datasets",
      "due_date": "2024-06-25",
      "owner": "Aisha Patel"
    },
    {
      "description": "Explore alternative LIDAR sensor configurations and report findings",
      "due_date": "2024-06-27",
      "owner": "Kevin Nguyen"
    },
    {
      "description": "Schedule extended stress tests for the integrated navigation system",
      "due_date": "2024-06-28",
      "owner": "Emily Chen"
    },
    {
      "description": "Retest the system after bug fixes and update the team",
      "due_date": "2024-07-01",
      "owner": "David Park"
    }
  ]
}
Sortie structurée sécurisée
La sécurité est une priorité absolue pour OpenAI – la nouvelle fonctionnalité de sortie structurée respectera les politiques de sécurité existantes d’OpenAI tout en permettant aux modèles de rejeter les demandes non sécurisées.
Pour faciliter le développement, il existe une nouvelle valeur de chaîne de refus dans les réponses de l'API qui permet aux développeurs de détecter par programme si un modèle génère des rejets au lieu d'une sortie correspondant au schéma.
Lorsque la réponse ne contient pas de rejet et que la réponse du modèle n'est pas interrompue prématurément (comme indiqué par finish_reason), la réponse du modèle produira de manière fiable un JSON valide qui correspond au schéma fourni.
Les références: