Strukturierte Ausgabe für offene Modelle

Mit strukturierten Ausgaben kann ein Modell Ausgaben generieren, die immer einem bestimmten Schema entsprechen. Einem Modell kann beispielsweise ein Antwortschema zur Verfügung gestellt werden, um sicherzustellen, dass die Antwort gültiges JSON erzeugt. Alle offenen Modelle, die auf der Gemini Enterprise Agent Platform Model as a Service (MaaS) verfügbar sind, unterstützen strukturierte Ausgaben.

Weitere konzeptionelle Informationen zur Funktion für strukturierte Ausgaben finden Sie unter Einführung in strukturierte Ausgaben.

Strukturierte Ausgaben verwenden

Im folgenden Anwendungsfall wird ein Antwortschema festgelegt, das sicherstellt, dass die Modellausgabe ein JSON-Objekt mit den folgenden Eigenschaften ist: Name, Datum und Teilnehmer. Der Python-Code verwendet das OpenAI SDK und Pydantic-Objekte, um das JSON-Schema zu generieren.

from pydantic import BaseModel
from openai import OpenAI

client = OpenAI()

class CalendarEvent(BaseModel):
    name: str
    date: str
    participants: list[str]

completion = client.beta.chat.completions.parse(
    model="MODEL_NAME",
    messages=[
        {"role": "system", "content": "Extract the event information."},
        {"role": "user", "content": "Alice and Bob are going to a science fair on Friday."},
    ],
    response_format=CalendarEvent,
)

print(completion.choices[0].message.parsed)

Die Modellausgabe entspricht dem folgenden JSON-Schema:

{ "name": STRING, "date": STRING, "participants": [STRING] }

Wenn die Eingabeaufforderung „Alice and Bob are going to a science fair on Friday“ (Alice und Bob gehen am Freitag zu einer Wissenschaftsmesse) lautet, könnte das Modell die folgende Antwort generieren:

{
  "name": "science fair",
  "date": "Friday",
  "participants": [
    "Alice",
    "Bob"
  ]
}

Detailliertes Beispiel

Der folgende Code ist ein Beispiel für ein rekursives Schema. Die Klasse UI enthält eine Liste von children, die auch zur Klasse UI gehören können.

from pydantic import BaseModel
from openai import OpenAI
from enum import Enum
from typing import List

client = OpenAI()

class UIType(str, Enum):
  div = "div"
  button = "button"
  header = "header"
  section = "section"
  field = "field"
  form = "form"

class Attribute(BaseModel):
  name: str
  value: str

class UI(BaseModel):
  type: UIType
  label: str
  children: List["UI"]
  attributes: List[Attribute]

UI.model_rebuild() # This is required to enable recursive types

class Response(BaseModel):
  ui: UI

completion = client.beta.chat.completions.parse(
  model="MODEL_NAME",
  messages=[
    {"role": "system", "content": "You are a UI generator AI. Convert the user input into a UI."},
    {"role": "user", "content": "Make a User Profile Form"}
  ],
  response_format=Response,
)

print(completion.choices[0].message.parsed)

Die Modellausgabe entspricht dem Schema des Pydantic-Objekts, das im vorherigen Snippet angegeben wurde. In diesem Beispiel könnte das Modell das folgende UI-Formular generieren:

Form
  Input
    Name
    Email
    Age

Eine Antwort könnte so aussehen:

ui = UI(
    type=UIType.div,
    label='Form',
    children=[
        UI(
            type=UIType.div,
            label='Input',
            children=[],
            attributes=[
                Attribute(name='label', value='Name')
            ]
        ),
        UI(
            type=UIType.div,
            label='Input',
            children=[],
            attributes=[
                Attribute(name='label', value='Email')
            ]
        ),
        UI(
            type=UIType.div,
            label='Input',
            children=[],
            attributes=[
                Attribute(name='label', value='Age')
            ]
        )
    ],
    attributes=[
        Attribute(name='name', value='John Doe'),
        Attribute(name='email', value='john.doe@example.com'),
        Attribute(name='age', value='30')
    ]
)

JSON-Objektantworten abrufen

Sie können das Modell so einschränken, dass nur syntaktisch gültige JSON-Objekte ausgegeben werden, indem Sie das response_format Feld auf { "type": "json_object" } setzen. Dies wird oft als JSON-Modus bezeichnet. Der JSON-Modus ist nützlich, wenn Sie JSON für die Verwendung mit Funktionsaufrufen oder anderen nachgelagerten Aufgaben generieren, die JSON-Eingabe erfordern.

Wenn der JSON-Modus aktiviert ist, kann das Modell nur Strings generieren, die in gültige JSON-Objekte geparst werden. In diesem Modus wird zwar sichergestellt, dass die Ausgabe syntaktisch korrektes JSON ist, aber es wird kein bestimmtes Schema erzwungen. Wenn Sie sicherstellen möchten, dass das Modell JSON ausgibt, das einem bestimmten Schema folgt, müssen Sie in der Eingabeaufforderung Anweisungen angeben, wie im folgenden Beispiel gezeigt.

In den folgenden Beispielen wird gezeigt, wie Sie den JSON-Modus aktivieren und das Modell anweisen, ein JSON-Objekt mit einer bestimmten Struktur zurückzugeben:

Python

Folgen Sie der Python Einrichtungsanleitung in der Kurzanleitung zur Agent Platform mit Clientbibliotheken, bevor Sie dieses Beispiel anwenden.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei der Agent Platform zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

Legen Sie vor dem Ausführen dieses Beispiels die Umgebungsvariable OPENAI_BASE_URL fest. Weitere Informationen finden Sie unter Authentifizierung und Anmeldedaten.

from openai import OpenAI
client = OpenAI()

response = client.chat.completions.create(
  model="MODEL",
  response_format={ "type": "json_object" },
  messages=[
    {"role": "user", "content": "List 5 rivers in South America. Your response must be a JSON object with a single key \"rivers\", which has a list of strings as its value."},
  ]
)
print(response.choices[0].message.content)

Ersetzen Sie MODEL durch den gewünschten Modellnamen, z. B. meta/llama3-405b-instruct-maas.

REST

Ersetzen Sie diese Werte in den folgenden Anfragedaten:

  • PROJECT_ID: Ihre Google Cloud-Projekt-ID.
  • LOCATION: Eine Region, die offene Modelle unterstützt.
  • MODEL: Der Modellname, den Sie verwenden möchten, z. B. meta/llama3-405b-instruct-maas.

HTTP-Methode und URL:

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/endpoints/openapi/chat/completions

JSON-Text der Anfrage:

{
  "model": "MODEL",
  "response_format": {
    "type": "json_object"
  },
  "messages": [
    {
      "role": "user",
      "content": "List 5 rivers in South America. Your response must be a JSON object with a single key \"rivers\", which has a list of strings as its value."
    }
  ]
}

Wenn Sie die Anfrage senden möchten, wählen Sie eine der folgenden Optionen aus:

curl

Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json und führen Sie den folgenden Befehl aus:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/endpoints/openapi/chat/completions"

PowerShell

Speichern Sie den Anfragetext in einer Datei mit dem Namen request.json und führen Sie den folgenden Befehl aus:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/endpoints/openapi/chat/completions" | Select-Object -Expand Content

Sie sollten eine JSON-Antwort ähnlich wie diese erhalten:

Nächste Schritte