Passer au contenu principal
Venice a désormais inclus les sorties structurées via le champ « response_format » disponible dans l’API. Ce champ vous permet de générer des réponses à vos prompts qui suivent un format pré-défini spécifique. Avec cette nouvelle méthode, les modèles sont moins susceptibles d’halluciner des clés ou valeurs incorrectes dans la réponse, ce qui était plus fréquent lors de tentatives via la manipulation du prompt système ou via les appels de fonction. Le champ « response_format » pour les sorties structurées utilise le format de l’API OpenAI, et est décrit plus en détail dans le guide OpenAI ici. OpenAI a également publié un article d’introduction à l’utilisation des sorties structurées dans l’API spécifiquement ici. Comme il s’agit d’une fonctionnalité avancée, il y a quelques « points à surveiller » en bas de cette page qui doivent être suivis. Cette fonctionnalité n’est pas nativement disponible pour tous les modèles. Veuillez consulter la section modèles ici, et rechercher « supportsResponseSchema » pour les modèles applicables.
    {
      "id": "venice-uncensored",
      "type": "text",
      "object": "model",
      "created": 1726869022,
      "owned_by": "venice.ai",
      "model_spec": {
        "availableContextTokens": 32768,
        "capabilities": {
          "supportsFunctionCalling": true,
          "supportsResponseSchema": true,
          "supportsWebSearch": true
        },

Comment utiliser les réponses structurées

Pour utiliser correctement « response_format », vous pouvez définir votre schéma avec diverses « properties », représentant des catégories de sorties, chacune avec des types de données configurés individuellement. Ces objets peuvent être imbriqués pour créer des structures de sortie plus avancées. Voici un exemple d’appel API utilisant response_format pour expliquer le processus étape par étape de résolution d’une équation mathématique. Vous pouvez voir que les propriétés ont été configurées pour exiger à la fois « steps » et « final_answer » dans la réponse. Au sein de l’imbrication, la catégorie steps se compose à la fois d’une « explanation » et d’un « output », chacun sous forme de chaîne.
curl --request POST \
  --url https://api.venice.ai/api/v1/chat/completions \
  --header 'Authorization: Bearer <api-key>' \
  --header 'Content-Type: application/json' \
  --data '{
  "model": "venice-uncensored",
  "messages": [
    {
      "role": "system",
      "content": "You are a helpful math tutor."
    },
    {
      "role": "user",
      "content": "solve 8x + 31 = 2"
    }
  ],
  "response_format": {
    "type": "json_schema",
    "json_schema": {
      "name": "math_response",
      "strict": true,
      "schema": {
        "type": "object",
        "properties": {
          "steps": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "explanation": {
                  "type": "string"
                },
                "output": {
                  "type": "string"
                }
              },
              "required": ["explanation", "output"],
              "additionalProperties": false
            }
          },
          "final_answer": {
            "type": "string"
          }
        },
        "required": ["steps", "final_answer"],
        "additionalProperties": false
      }
    }
  }
}

Voici la réponse qui a été reçue du modèle. Vous pouvez voir que la structure a suivi les exigences en fournissant d’abord les « steps » avec l’« explanation » et l’« output » de chaque étape, puis la « final answer ».
{
  "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"
}

Bien qu’il s’agisse d’un exemple simple, cela peut être extrapolé à des cas d’usage plus avancés comme : extraction de données, exercices de chaîne de pensée, génération d’UI, catégorisation de données et bien d’autres.

Points à surveiller

Voici quelques exigences clés à garder à l’esprit lors de l’utilisation des sorties structurées via response_format :
  • Les requêtes initiales utilisant response_format peuvent prendre plus de temps à générer une réponse. Les requêtes suivantes ne connaîtront pas la même latence que la requête initiale.
  • Pour les requêtes plus volumineuses, le modèle peut échouer à se terminer si soit max_tokens, soit le timeout du modèle est atteint, ou si des limites de débit sont dépassées
  • Un format de schéma incorrect entraînera des erreurs lors de la complétion, généralement dues à un timeout
  • Bien que response_format garantisse que le modèle produira une sortie d’une manière particulière, cela ne garantit pas que le modèle a fourni les informations correctes à l’intérieur. Le contenu est piloté par le prompt et la performance du modèle.
  • Les sorties structurées via response_format ne sont pas compatibles avec les appels de fonction parallèles
  • Important : Tous les champs ou paramètres doivent inclure une balise required. Pour rendre un champ optionnel, vous devez ajouter une option null dans le type du champ, comme ceci "type": ["string", "null"]
  • Il est possible de rendre les champs optionnels en donnant des options null dans le champ required pour permettre une réponse vide.
  • Important : additionalProperties doit être défini à false pour que response_format fonctionne correctement
  • Important : strict doit être défini à true pour que response_format fonctionne correctement