Zum Hauptinhalt springen
Venice unterstützt strukturierte Ausgaben über das Feld “response_format” in der API. Dieses Feld ermöglicht es Ihnen, Antworten auf Ihre Prompts in einem vordefinierten Format zu generieren. Mit dieser neuen Methode ist es unwahrscheinlicher, dass die Modelle falsche Schlüssel oder Werte in der Antwort halluzinieren, was bei der Manipulation über System-Prompts oder Function Calling häufiger vorkam. Das Feld “response_format” für strukturierte Ausgaben verwendet das OpenAI-API-Format und wird im OpenAI-Leitfaden hier näher beschrieben. OpenAI hat zudem hier einen Einführungsartikel speziell zur Verwendung von strukturierten Ausgaben in der API veröffentlicht. Da es sich um fortgeschrittene Funktionalität handelt, gibt es einige “Gotchas” am Ende dieser Seite, die beachtet werden sollten. Diese Funktionalität ist nicht nativ für alle Modelle verfügbar. Bitte schauen Sie in den Modell-Bereich hier und suchen Sie nach “supportsResponseSchema” für die anwendbaren Modelle.
    {
      "id": "venice-uncensored",
      "type": "text",
      "object": "model",
      "created": 1726869022,
      "owned_by": "venice.ai",
      "model_spec": {
        "availableContextTokens": 32768,
        "capabilities": {
          "supportsFunctionCalling": true,
          "supportsResponseSchema": true,
          "supportsWebSearch": true
        },

Verwendung von strukturierten Antworten

Um “response_format” korrekt zu verwenden, können Sie Ihr Schema mit verschiedenen “properties” definieren, die Kategorien von Ausgaben darstellen, jeweils mit individuell konfigurierten Datentypen. Diese Objekte können verschachtelt werden, um fortgeschrittenere Ausgabe-Strukturen zu erstellen. Hier ist ein Beispiel für einen API-Aufruf mit response_format, der den Schritt-für-Schritt-Prozess der Lösung einer mathematischen Gleichung erklärt. Sie können sehen, dass die Properties so konfiguriert wurden, dass sowohl “steps” als auch “final_answer” in der Antwort erforderlich sind. In der Verschachtelung besteht die Kategorie “steps” aus einer “explanation” und einem “output”, jeweils als Strings.
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
      }
    }
  }
}

Hier ist die Antwort, die vom Modell empfangen wurde. Sie können sehen, dass die Struktur den Anforderungen entspricht, indem zunächst die “steps” mit “explanation” und “output” jedes Schritts und dann die “final answer” bereitgestellt werden.
{
  "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"
}

Obwohl dies ein einfaches Beispiel ist, kann es auf fortgeschrittenere Use Cases wie Datenextraktion, Chain-of-Thought-Übungen, UI-Generierung, Datenkategorisierung und viele andere extrapoliert werden.

Gotchas

Hier sind einige wichtige Anforderungen, die Sie bei der Verwendung strukturierter Ausgaben über response_format beachten sollten:
  • Erste Anfragen mit response_format können länger dauern, bis eine Antwort generiert wird. Folgeanfragen erfahren nicht dieselbe Latenz wie die erste Anfrage.
  • Bei größeren Anfragen kann das Modell scheitern, wenn entweder max_tokens oder Modell-Timeout erreicht werden oder Rate-Limits verletzt werden
  • Ein falsches Schema-Format führt zu Fehlern bei der Completion, in der Regel aufgrund von Timeout
  • Obwohl response_format sicherstellt, dass das Modell auf eine bestimmte Weise ausgibt, garantiert es nicht, dass das Modell die korrekten Informationen darin bereitgestellt hat. Der Inhalt wird durch den Prompt und die Modellleistung bestimmt.
  • Strukturierte Ausgaben über response_format sind nicht kompatibel mit parallelen Function Calls
  • Wichtig: Alle Felder oder Parameter müssen ein required-Tag enthalten. Um ein Feld optional zu machen, müssen Sie eine null-Option innerhalb des type des Feldes hinzufügen, wie folgt: "type": ["string", "null"]
  • Es ist möglich, Felder optional zu machen, indem Sie eine null-Option innerhalb des required-Feldes angeben, um eine leere Antwort zuzulassen.
  • Wichtig: additionalProperties muss auf false gesetzt sein, damit response_format korrekt funktioniert
  • Wichtig: strict muss auf true gesetzt sein, damit response_format korrekt funktioniert