Uporządkowane dane wyjściowe

Możesz skonfigurować Gemini tak, aby generował dane strukturalne zamiast tekstu bez struktury. Umożliwi to precyzyjne wyodrębnianie i standaryzowanie informacji do dalszego przetwarzania. Możesz na przykład użyć danych wyjściowych w formacie strukturalnym, aby wyodrębnić informacje z CV i ujednolicić je w celu utworzenia strukturalnej bazy danych.

Gemini może generować dane wyjściowe w formacie JSON lub wartości wyliczeniowe.

Generowanie kodu JSON

Aby ograniczyć model do generowania JSON, skonfiguruj responseSchema. Model będzie wtedy odpowiadać na wszystkie prompty danymi wyjściowymi w formacie JSON.

Python

from google import genai from pydantic import BaseModel  class Recipe(BaseModel):     recipe_name: str     ingredients: list[str]  client = genai.Client() response = client.models.generate_content(     model="gemini-2.5-flash",     contents="List a few popular cookie recipes, and include the amounts of ingredients.",     config={         "response_mime_type": "application/json",         "response_schema": list[Recipe],     }, ) # Use the response as a JSON string. print(response.text)  # Use instantiated objects. my_recipes: list[Recipe] = response.parsed 

JavaScript

import { GoogleGenAI, Type } from "@google/genai";  const ai = new GoogleGenAI({});  async function main() {   const response = await ai.models.generateContent({     model: "gemini-2.5-flash",     contents:       "List a few popular cookie recipes, and include the amounts of ingredients.",     config: {       responseMimeType: "application/json",       responseSchema: {         type: Type.ARRAY,         items: {           type: Type.OBJECT,           properties: {             recipeName: {               type: Type.STRING,             },             ingredients: {               type: Type.ARRAY,               items: {                 type: Type.STRING,               },             },           },           propertyOrdering: ["recipeName", "ingredients"],         },       },     },   });    console.log(response.text); }  main(); 

Przeczytaj

package main  import (     "context"     "fmt"     "log"      "google.golang.org/genai" )  func main() {     ctx := context.Background()     client, err := genai.NewClient(ctx, nil)     if err != nil {         log.Fatal(err)     }      config := &genai.GenerateContentConfig{         ResponseMIMEType: "application/json",         ResponseSchema: &genai.Schema{             Type: genai.TypeArray,             Items: &genai.Schema{                 Type: genai.TypeObject,                 Properties: map[string]*genai.Schema{                     "recipeName": {Type: genai.TypeString},                     "ingredients": {                         Type:  genai.TypeArray,                         Items: &genai.Schema{Type: genai.TypeString},                     },                 },                 PropertyOrdering: []string{"recipeName", "ingredients"},             },         },     }      result, err := client.Models.GenerateContent(         ctx,         "gemini-2.5-flash",         genai.Text("List a few popular cookie recipes, and include the amounts of ingredients."),         config,     )     if err != nil {         log.Fatal(err)     }     fmt.Println(result.Text()) } 

REST

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent" \ -H "x-goog-api-key: $GEMINI_API_KEY" \ -H 'Content-Type: application/json' \ -d '{       "contents": [{         "parts":[           { "text": "List a few popular cookie recipes, and include the amounts of ingredients." }         ]       }],       "generationConfig": {         "responseMimeType": "application/json",         "responseSchema": {           "type": "ARRAY",           "items": {             "type": "OBJECT",             "properties": {               "recipeName": { "type": "STRING" },               "ingredients": {                 "type": "ARRAY",                 "items": { "type": "STRING" }               }             },             "propertyOrdering": ["recipeName", "ingredients"]           }         }       } }' 2> /dev/null | head 

Dane wyjściowe mogą wyglądać tak:

[   {     "recipeName": "Chocolate Chip Cookies",     "ingredients": [       "1 cup (2 sticks) unsalted butter, softened",       "3/4 cup granulated sugar",       "3/4 cup packed brown sugar",       "1 teaspoon vanilla extract",       "2 large eggs",       "2 1/4 cups all-purpose flour",       "1 teaspoon baking soda",       "1 teaspoon salt",       "2 cups chocolate chips"     ]   },   ... ] 

Generowanie wartości typu wyliczeniowego

W niektórych przypadkach możesz chcieć, aby model wybrał jedną opcję z listy. Aby zaimplementować to działanie, możesz przekazać w schemacie wyliczenie. Opcji typu wyliczeniowego możesz używać wszędzie tam, gdzie w responseSchema można użyć string, ponieważ typ wyliczeniowy to tablica ciągów znaków. Podobnie jak schemat JSON, wyliczenie umożliwia ograniczenie danych wyjściowych modelu w celu spełnienia wymagań aplikacji.

Załóżmy na przykład, że tworzysz aplikację do klasyfikowania instrumentów muzycznych w jednej z 5 kategorii: "Percussion", "String", "Woodwind", "Brass" lub „"Keyboard"”. Możesz utworzyć wyliczenie, które ułatwi Ci to zadanie.

W poniższym przykładzie przekazujesz wyliczenie jako responseSchema, ograniczając model do wyboru najbardziej odpowiedniej opcji.

Python

from google import genai import enum  class Instrument(enum.Enum):   PERCUSSION = "Percussion"   STRING = "String"   WOODWIND = "Woodwind"   BRASS = "Brass"   KEYBOARD = "Keyboard"  client = genai.Client() response = client.models.generate_content(     model='gemini-2.5-flash',     contents='What type of instrument is an oboe?',     config={         'response_mime_type': 'text/x.enum',         'response_schema': Instrument,     }, )  print(response.text) # Woodwind 

JavaScript

import { GoogleGenAI, Type } from "@google/genai";  const ai = new GoogleGenAI({});  const response = await ai.models.generateContent({     model: "gemini-2.5-flash",     contents: "What type of instrument is an oboe?",     config: {       responseMimeType: "text/x.enum",       responseSchema: {         type: Type.STRING,         enum: ["Percussion", "String", "Woodwind", "Brass", "Keyboard"],       },     },   });  console.log(response.text); 

REST

curl "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent" \ -H "x-goog-api-key: $GEMINI_API_KEY" \     -H 'Content-Type: application/json' \     -d '{           "contents": [{             "parts":[               { "text": "What type of instrument is an oboe?" }             ]           }],           "generationConfig": {             "responseMimeType": "text/x.enum",             "responseSchema": {               "type": "STRING",               "enum": ["Percussion", "String", "Woodwind", "Brass", "Keyboard"]             }           }     }' 

Biblioteka Pythona przetłumaczy deklaracje typów dla interfejsu API. Interfejs API akceptuje jednak podzbiór schematu OpenAPI 3.0 (Schema).

Wyliczenie można określić na 2 inne sposoby. Możesz użyć tego symbolu:Literal:```

Python

Literal["Percussion", "String", "Woodwind", "Brass", "Keyboard"] 

Możesz też przekazać schemat jako JSON:

Python

from google import genai  client = genai.Client() response = client.models.generate_content(     model='gemini-2.5-flash',     contents='What type of instrument is an oboe?',     config={         'response_mime_type': 'text/x.enum',         'response_schema': {             "type": "STRING",             "enum": ["Percussion", "String", "Woodwind", "Brass", "Keyboard"],         },     }, )  print(response.text) # Woodwind 

Oprócz podstawowych zadań wielokrotnego wyboru możesz używać wyliczenia w dowolnym miejscu schematu JSON. Możesz na przykład poprosić model o listę tytułów przepisów i użyć wyliczenia Grade, aby przypisać każdemu tytułowi ocenę popularności:

Python

from google import genai  import enum from pydantic import BaseModel  class Grade(enum.Enum):     A_PLUS = "a+"     A = "a"     B = "b"     C = "c"     D = "d"     F = "f"  class Recipe(BaseModel):   recipe_name: str   rating: Grade  client = genai.Client() response = client.models.generate_content(     model='gemini-2.5-flash',     contents='List 10 home-baked cookie recipes and give them grades based on tastiness.',     config={         'response_mime_type': 'application/json',         'response_schema': list[Recipe],     }, )  print(response.text) 

Odpowiedź może wyglądać tak:

[   {     "recipe_name": "Chocolate Chip Cookies",     "rating": "a+"   },   {     "recipe_name": "Peanut Butter Cookies",     "rating": "a"   },   {     "recipe_name": "Oatmeal Raisin Cookies",     "rating": "b"   },   ... ] 

Informacje o schematach JSON

Konfigurowanie modelu pod kątem danych wyjściowych w formacie JSON za pomocą parametru responseSchema opiera się na obiekcie Schema, który definiuje jego strukturę. Ten obiekt reprezentuje wybrany podzbiór obiektu schematu OpenAPI 3.0 i dodaje pole propertyOrdering.

Oto pseudoreprezentacja JSON wszystkich pól Schema:

{   "type": enum (Type),   "format": string,   "description": string,   "nullable": boolean,   "enum": [     string   ],   "maxItems": integer,   "minItems": integer,   "properties": {     string: {       object (Schema)     },     ...   },   "required": [     string   ],   "propertyOrdering": [     string   ],   "items": {     object (Schema)   } } 

Pole Type schematu musi być jednym z typów danych OpenAPI lub sumą tych typów (przy użyciu anyOf). W przypadku każdego pola Type prawidłowy jest tylko podzbiór pól. Na poniższej liście znajdziesz przyporządkowanie każdego Type do podzbioru pól, które są prawidłowe w przypadku tego typu:

  • string -> enum, format, nullable
  • integer -> format, minimum, maximum, enum, nullable
  • number -> format, minimum, maximum, enum, nullable
  • boolean -> nullable
  • array -> minItems, maxItems, items, nullable
  • object -> properties, required, propertyOrdering, nullable

Oto przykładowe schematy pokazujące prawidłowe kombinacje typów i pól:

{ "type": "string", "enum": ["a", "b", "c"] }  { "type": "string", "format": "date-time" }  { "type": "integer", "format": "int64" }  { "type": "number", "format": "double" }  { "type": "boolean" }  { "type": "array", "minItems": 3, "maxItems": 3, "items": { "type": ... } }  { "type": "object",   "properties": {     "a": { "type": ... },     "b": { "type": ... },     "c": { "type": ... }   },   "nullable": true,   "required": ["c"],   "propertyOrdering": ["c", "b", "a"] } 

Pełną dokumentację pól schematu używanych w interfejsie Gemini API znajdziesz w dokumentacji schematu.

Zamawianie nieruchomości

Podczas pracy ze schematami JSON w interfejsie Gemini API kolejność właściwości ma znaczenie. Domyślnie interfejs API porządkuje właściwości alfabetycznie i nie zachowuje kolejności, w jakiej zostały zdefiniowane (chociaż pakiety SDK Google Gen AI mogą zachowywać tę kolejność). Jeśli podajesz przykłady do modelu ze skonfigurowanym schematem, a kolejność właściwości w przykładach nie jest zgodna z kolejnością właściwości w schemacie, dane wyjściowe mogą być niespójne lub nieoczekiwane.

Aby zapewnić spójne i przewidywalne sortowanie właściwości, możesz użyć opcjonalnego pola propertyOrdering[].

"propertyOrdering": ["recipeName", "ingredients"] 

propertyOrdering[] – nie jest standardowym polem w specyfikacji OpenAPI; jest to tablica ciągów znaków używana do określania kolejności właściwości w odpowiedzi. Określając kolejność właściwości, a następnie podając przykłady z właściwościami w tej samej kolejności, możesz potencjalnie poprawić jakość wyników. propertyOrdering jest obsługiwane tylko wtedy, gdy ręcznie tworzysz types.Schema.

Schematy w Pythonie

Jeśli używasz biblioteki Python, wartość response_schema musi być jedną z tych wartości:

  • Typ, którego używasz w adnotacji typu (patrz moduł Python typing).
  • Instancja genai.types.Schema
  • Równowartość genai.types.Schemadict

Najprostszym sposobem na zdefiniowanie schematu jest użycie typu Pydantic (jak w poprzednim przykładzie):

Python

config={'response_mime_type': 'application/json',         'response_schema': list[Recipe]} 

Gdy używasz typu Pydantic, biblioteka Pythona tworzy schemat JSON i wysyła go do interfejsu API. Więcej przykładów znajdziesz w dokumentacji biblioteki Python.

Biblioteka Pythona obsługuje schematy zdefiniowane za pomocą tych typów (gdzieAllowedType to dowolny dozwolony typ):

  • int
  • float
  • bool
  • str
  • list[AllowedType]
  • AllowedType|AllowedType|...
  • W przypadku typów strukturalnych:
    • dict[str, AllowedType]. Ta adnotacja deklaruje, że wszystkie wartości słownika są tego samego typu, ale nie określa, jakie klucze powinny być uwzględnione.
    • zdefiniowanych przez użytkownika modeli Pydantic. Takie podejście umożliwia określanie nazw kluczy i definiowanie różnych typów wartości powiązanych z poszczególnymi kluczami, w tym struktur zagnieżdżonych.

Obsługa schematu JSON

JSON Schema to nowsza specyfikacja niż OpenAPI 3.0, na której opiera się obiekt Schema. Obsługa schematu JSON jest dostępna w wersji podglądowej w polu responseJsonSchema, które akceptuje dowolny schemat JSON z tymi ograniczeniami:

  • Działa tylko z Gemini 2.5.
  • Można przekazywać wszystkie właściwości schematu JSON, ale nie wszystkie są obsługiwane. Więcej informacji o tym polu znajdziesz w dokumentacji.
  • Odwołania rekurencyjne mogą być używane tylko jako wartość właściwości obiektu, która nie jest wymagana.
  • Odniesienia rekurencyjne są rozwijane do skończonego stopnia na podstawie rozmiaru schematu.
  • Schematy zawierające $ref nie mogą zawierać żadnych właściwości innych niż te, które zaczynają się od $.

Oto przykład generowania schematu JSON za pomocą Pydantic i przesyłania go do modelu:

curl "https://generativelanguage.googleapis.com/v1alpha/models/\ gemini-2.5-flash:generateContent" \     -H "x-goog-api-key: $GEMINI_API_KEY"\     -H 'Content-Type: application/json' \     -d @- <<EOF {   "contents": [{     "parts":[{       "text": "Please give a random example following this schema"     }]   }],   "generationConfig": {     "response_mime_type": "application/json",     "response_json_schema": $(python3 - << PYEOF     from enum import Enum     from typing import List, Optional, Union, Set     from pydantic import BaseModel, Field, ConfigDict     import json      class UserRole(str, Enum):         ADMIN = "admin"         VIEWER = "viewer"      class Address(BaseModel):         street: str         city: str      class UserProfile(BaseModel):         username: str = Field(description="User's unique name")         age: Optional[int] = Field(ge=0, le=120)         roles: Set[UserRole] = Field(min_items=1)         contact: Union[Address, str]         model_config = ConfigDict(title="User Schema")      # Generate and print the JSON Schema     print(json.dumps(UserProfile.model_json_schema(), indent=2))     PYEOF     )   } } EOF 

Przekazywanie schematu JSON bezpośrednio nie jest jeszcze obsługiwane w przypadku korzystania z pakietu SDK.

Sprawdzone metody

Podczas korzystania ze schematu odpowiedzi pamiętaj o tych kwestiach i sprawdzonych metodach:

  • Rozmiar schematu odpowiedzi wlicza się do limitu tokenów wejściowych.
  • Domyślnie pola są opcjonalne, co oznacza, że model może je wypełnić lub pominąć. Możesz oznaczyć pola jako wymagane, aby wymusić podanie wartości przez model. Jeśli w powiązanym prompcie wejściowym jest niewystarczający kontekst, model generuje odpowiedzi głównie na podstawie danych, na których został wytrenowany.
  • Złożony schemat może spowodować błąd InvalidArgument: 400. Złożoność może wynikać z długich nazw właściwości, długich limitów długości tablic, wyliczeń z wieloma wartościami, obiektów z wieloma opcjonalnymi właściwościami lub kombinacji tych czynników.

    Jeśli ten błąd pojawi się w przypadku prawidłowego schematu, wprowadź co najmniej jedną z tych zmian, aby go rozwiązać:

    • skróć nazwy właściwości lub nazwy wyliczeń,
    • Spłaszcz zagnieżdżone tablice.
    • Zmniejsz liczbę właściwości z ograniczeniami, np. liczb z minimalnymi i maksymalnymi limitami.
    • Zmniejsz liczbę usług z złożonymi ograniczeniami, np. usług o złożonych formatach, takich jak date-time.
    • Zmniejsz liczbę właściwości opcjonalnych.
    • Zmniejsz liczbę prawidłowych wartości wyliczeń.
  • Jeśli nie widzisz oczekiwanych wyników, dodaj więcej kontekstu do promptów lub zmień schemat odpowiedzi. Na przykład sprawdź odpowiedź modelu bez danych strukturalnych, aby zobaczyć, jak model reaguje. Następnie możesz zaktualizować schemat odpowiedzi, aby lepiej pasował do danych wyjściowych modelu. Dodatkowe wskazówki dotyczące rozwiązywania problemów z danymi strukturalnymi znajdziesz w przewodniku rozwiązywania problemów.

Co dalej?

Teraz gdy już wiesz, jak generować dane wyjściowe w formacie strukturalnym, możesz wypróbować narzędzia interfejsu Gemini API: