Vai al contenuto principale
Venice ha incluso gli output strutturati tramite “response_format” come campo disponibile nell’API. Questo campo ti consente di generare risposte ai tuoi prompt che seguono un formato specifico predefinito. Con questo nuovo metodo, è meno probabile che i modelli generino allucinazioni con chiavi o valori errati all’interno della risposta, fenomeno più frequente quando si tentava tramite manipolazione del system prompt o tramite function calling. Il campo “response_format” per gli output strutturati utilizza il formato dell’API OpenAI ed è descritto ulteriormente nella guida OpenAI qui. OpenAI ha anche pubblicato un articolo introduttivo sull’uso degli output strutturati all’interno dell’API specificamente qui. Trattandosi di funzionalità avanzata, ci sono alcune “gotcha” in fondo a questa pagina da seguire. Questa funzionalità non è disponibile nativamente per tutti i modelli. Consulta la sezione modelli qui e cerca “supportsResponseSchema” per i modelli applicabili.
    {
      "id": "venice-uncensored",
      "type": "text",
      "object": "model",
      "created": 1726869022,
      "owned_by": "venice.ai",
      "model_spec": {
        "availableContextTokens": 32768,
        "capabilities": {
          "supportsFunctionCalling": true,
          "supportsResponseSchema": true,
          "supportsWebSearch": true
        },

Come usare le risposte strutturate

Per utilizzare correttamente il campo “response_format”, puoi definire il tuo schema con varie “properties”, che rappresentano categorie di output, ciascuna con tipi di dati configurati individualmente. Questi oggetti possono essere annidati per creare strutture di output più avanzate. Ecco un esempio di chiamata API che usa response_format per spiegare il processo passo-passo della risoluzione di un’equazione matematica. Puoi vedere che le properties sono state configurate per richiedere sia “steps” sia “final_answer” all’interno della risposta. Nel nesting, la categoria steps consiste sia di una “explanation” sia di un “output”, entrambi stringhe.
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
      }
    }
  }
}

Ecco la risposta ricevuta dal modello. Puoi vedere che la struttura ha seguito i requisiti, fornendo prima gli “steps” con la “explanation” e l‘“output” di ciascuno step, e poi 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"
}

Sebbene questo sia un esempio semplice, può essere estrapolato a casi d’uso più avanzati come: estrazione dati, esercizi di chain of thought, generazione di UI, categorizzazione dati e molti altri.

Gotcha

Ecco alcuni requisiti chiave da tenere a mente quando usi gli output strutturati tramite response_format:
  • Le richieste iniziali che usano response_format possono impiegare più tempo a generare una risposta. Le richieste successive non avranno la stessa latenza della richiesta iniziale.
  • Per query più grandi, il modello può fallire il completamento se vengono raggiunti max_tokens o il timeout del modello, o se vengono violati i rate limit
  • Un formato di schema errato comporterà errori al completamento, solitamente per timeout
  • Sebbene response_format garantisca che il modello produca un output in un modo specifico, non garantisce che il modello fornisca le informazioni corrette al suo interno. Il contenuto è determinato dal prompt e dalle prestazioni del modello.
  • Gli output strutturati tramite response_format non sono compatibili con le chiamate parallele di funzioni
  • Importante: tutti i campi o parametri devono includere un tag required. Per rendere un campo opzionale, devi aggiungere un’opzione null all’interno del type del campo, in questo modo: "type": ["string", "null"]
  • È possibile rendere i campi opzionali fornendo opzioni null all’interno del campo required per consentire una risposta vuota.
  • Importante: additionalProperties deve essere impostato a false affinché response_format funzioni correttamente
  • Importante: strict deve essere impostato a true affinché response_format funzioni correttamente