خروجی‌های ساختاریافته

شما می‌توانید مدل‌های Gemini را طوری پیکربندی کنید که پاسخ‌هایی تولید کنند که به یک JSON Schema ارائه شده پایبند باشند. این امر نتایج قابل پیش‌بینی و ایمن از نظر نوع داده را تضمین می‌کند و استخراج داده‌های ساختاریافته از متن بدون ساختار را ساده می‌کند.

استفاده از خروجی‌های ساختاریافته برای موارد زیر ایده‌آل است:

  • استخراج داده‌ها: اطلاعات خاص مانند نام‌ها و تاریخ‌ها را از متن استخراج کنید.
  • طبقه‌بندی ساختاریافته: متن را در دسته‌های از پیش تعریف‌شده طبقه‌بندی می‌کند.
  • گردش‌های کاری عامل‌محور: ورودی‌های ساختاریافته برای ابزارها یا APIها تولید کنید.

علاوه بر پشتیبانی از JSON Schema در REST API، SDK های Google GenAI امکان تعریف طرحواره‌ها را با استفاده از Pydantic (پایتون) و Zod (جاوااسکریپت) فراهم می‌کنند.

این مثال نحوه استخراج داده‌های ساختاریافته از متن را با استفاده از انواع اولیه JSON Schema مانند object ، array ، string و integer نشان می‌دهد.

پایتون

from google import genai
from pydantic import BaseModel, Field
from typing import List, Optional

class Ingredient(BaseModel):
    name: str = Field(description="Name of the ingredient.")
    quantity: str = Field(description="Quantity of the ingredient, including units.")

class Recipe(BaseModel):
    recipe_name: str = Field(description="The name of the recipe.")
    prep_time_minutes: Optional[int] = Field(description="Optional time in minutes to prepare the recipe.")
    ingredients: List[Ingredient]
    instructions: List[str]

client = genai.Client()

prompt = """
Please extract the recipe from the following text.
The user wants to make delicious chocolate chip cookies.
They need 2 and 1/4 cups of all-purpose flour, 1 teaspoon of baking soda,
1 teaspoon of salt, 1 cup of unsalted butter (softened), 3/4 cup of granulated sugar,
3/4 cup of packed brown sugar, 1 teaspoon of vanilla extract, and 2 large eggs.
For the best part, they'll need 2 cups of semisweet chocolate chips.
First, preheat the oven to 375°F (190°C). Then, in a small bowl, whisk together the flour,
baking soda, and salt. In a large bowl, cream together the butter, granulated sugar, and brown sugar
until light and fluffy. Beat in the vanilla and eggs, one at a time. Gradually beat in the dry
ingredients until just combined. Finally, stir in the chocolate chips. Drop by rounded tablespoons
onto ungreased baking sheets and bake for 9 to 11 minutes.
"""

interaction = client.interactions.create(
    model="gemini-3-flash-preview",
    input=prompt,
    response_format={
        "type": "text",
        "mime_type": "application/json",
        "schema": Recipe.model_json_schema()
    },
)

recipe = Recipe.model_validate_json(interaction.steps[-1].content[0].text)
print(recipe)

جاوا اسکریپت

import { GoogleGenAI } from "@google/genai";
import { z } from "zod";
import { zodToJsonSchema } from "zod-to-json-schema";

const ingredientSchema = z.object({
  name: z.string().describe("Name of the ingredient."),
  quantity: z.string().describe("Quantity of the ingredient, including units."),
});

const recipeSchema = z.object({
  recipe_name: z.string().describe("The name of the recipe."),
  prep_time_minutes: z.number().optional().describe("Optional time in minutes to prepare the recipe."),
  ingredients: z.array(ingredientSchema),
  instructions: z.array(z.string()),
});

const client = new GoogleGenAI({});

const prompt = `
Please extract the recipe from the following text.
The user wants to make delicious chocolate chip cookies.
They need 2 and 1/4 cups of all-purpose flour, 1 teaspoon of baking soda,
1 teaspoon of salt, 1 cup of unsalted butter (softened), 3/4 cup of granulated sugar,
3/4 cup of packed brown sugar, 1 teaspoon of vanilla extract, and 2 large eggs.
For the best part, they'll need 2 cups of semisweet chocolate chips.
First, preheat the oven to 375°F (190°C). Then, in a small bowl, whisk together the flour,
baking soda, and salt. In a large bowl, cream together the butter, granulated sugar, and brown sugar
until light and fluffy. Beat in the vanilla and eggs, one at a time. Gradually beat in the dry
ingredients until just combined. Finally, stir in the chocolate chips. Drop by rounded tablespoons
onto ungreased baking sheets and bake for 9 to 11 minutes.
`;

const interaction = await client.interactions.create({
  model: "gemini-3-flash-preview",
  input: prompt,
  response_format: {
    type: 'text',
    mime_type: 'application/json',
    schema: zodToJsonSchema(recipeSchema)
  },
});

const recipe = recipeSchema.parse(JSON.parse(interaction.steps.at(-1).content[0].text));
console.log(recipe);

استراحت

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
    -H "x-goog-api-key: $GEMINI_API_KEY" \
    -H 'Content-Type: application/json' \
    -d '{
      "model": "gemini-3-flash-preview",
      "input": "Please extract the recipe from the following text.\nThe user wants to make delicious chocolate chip cookies.\nThey need 2 and 1/4 cups of all-purpose flour, 1 teaspoon of baking soda,\n1 teaspoon of salt, 1 cup of unsalted butter (softened), 3/4 cup of granulated sugar,\n3/4 cup of packed brown sugar, 1 teaspoon of vanilla extract, and 2 large eggs.\nFor the best part, they will need 2 cups of semisweet chocolate chips.\nFirst, preheat the oven to 375°F (190°C). Then, in a small bowl, whisk together the flour,\nbaking soda, and salt. In a large bowl, cream together the butter, granulated sugar, and brown sugar\nuntil light and fluffy. Beat in the vanilla and eggs, one at a time. Gradually beat in the dry\ningredients until just combined. Finally, stir in the chocolate chips. Drop by rounded tablespoons\nonto ungreased baking sheets and bake for 9 to 11 minutes.",
      "response_format": {
        "type": "text",
        "mime_type": "application/json",
        "schema": {
          "type": "object",
          "properties": {
            "recipe_name": {
              "type": "string",
              "description": "The name of the recipe."
            },
            "prep_time_minutes": {
                "type": "integer",
                "description": "Optional time in minutes to prepare the recipe."
            },
            "ingredients": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "name": { "type": "string", "description": "Name of the ingredient."},
                  "quantity": { "type": "string", "description": "Quantity of the ingredient, including units."}
                },
                "required": ["name", "quantity"]
              }
            },
            "instructions": {
              "type": "array",
              "items": { "type": "string" }
            }
          },
          "required": ["recipe_name", "ingredients", "instructions"]
        }
      }
      }
    }'

پاسخ نمونه:

{
  "recipe_name": "Delicious Chocolate Chip Cookies",
  "ingredients": [
    { "name": "all-purpose flour", "quantity": "2 and 1/4 cups" },
    { "name": "baking soda", "quantity": "1 teaspoon" },
    { "name": "salt", "quantity": "1 teaspoon" },
    { "name": "unsalted butter (softened)", "quantity": "1 cup" },
    { "name": "granulated sugar", "quantity": "3/4 cup" },
    { "name": "packed brown sugar", "quantity": "3/4 cup" },
    { "name": "vanilla extract", "quantity": "1 teaspoon" },
    { "name": "large eggs", "quantity": "2" },
    { "name": "semisweet chocolate chips", "quantity": "2 cups" }
  ],
  "instructions": [
    "Preheat the oven to 375°F (190°C).",
    "In a small bowl, whisk together the flour, baking soda, and salt.",
    "In a large bowl, cream together the butter, granulated sugar, and brown sugar until light and fluffy.",
    "Beat in the vanilla and eggs, one at a time.",
    "Gradually beat in the dry ingredients until just combined.",
    "Stir in the chocolate chips.",
    "Drop by rounded tablespoons onto ungreased baking sheets and bake for 9 to 11 minutes."
  ]
}

نتایج پخش زنده

شما می‌توانید خروجی‌های ساختاریافته را به صورت استریم (stream) ارسال کنید، که به شما امکان می‌دهد همزمان با تولید پاسخ، پردازش آن را شروع کنید. بخش‌های استریم‌شده، رشته‌های JSON جزئی معتبری هستند که می‌توانند برای تشکیل شیء JSON نهایی به هم متصل شوند.

پایتون

from google import genai
from pydantic import BaseModel
from typing import Literal

class Feedback(BaseModel):
    sentiment: Literal["positive", "neutral", "negative"]
    summary: str

client = genai.Client()
prompt = "The new UI is incredibly intuitive. Add a very long summary to test streaming!"

stream = client.interactions.create(
    model="gemini-3-flash-preview",
    input=prompt,
    response_format={
        "type": "text",
        "mime_type": "application/json",
        "schema": Feedback.model_json_schema()
    },
    stream=True
)
for event in stream:
    if event.event_type == "step.delta" and event.delta.text:
        print(event.delta.text, end="")

جاوا اسکریپت

import { GoogleGenAI } from "@google/genai";
import { z } from "zod";
import { zodToJsonSchema } from "zod-to-json-schema";

const client = new GoogleGenAI({});
const feedbackSchema = z.object({
  sentiment: z.enum(["positive", "neutral", "negative"]),
  summary: z.string(),
});

const stream = await client.interactions.create({
  model: "gemini-3-flash-preview",
  input: "The new UI is incredibly intuitive. Add a very long summary!",
  response_format: {
    type: 'text',
    mime_type: 'application/json',
    schema: zodToJsonSchema(feedbackSchema)
  },
  stream: true,
});

for await (const event of stream) {
  if (event.type === "step.delta" && event.delta?.text) {
    process.stdout.write(event.delta.text);
  }
}

خروجی‌های ساختاریافته با ابزارها

Gemini 3 به شما امکان می‌دهد خروجی‌های ساختاریافته را با ابزارهای داخلی، از جمله Grounding with Google Search ، URL Context ، Code Execution ، File Search و Function Calling، ترکیب کنید.

پایتون

from google import genai
from pydantic import BaseModel, Field
from typing import List

class MatchResult(BaseModel):
    winner: str = Field(description="The name of the winner.")
    final_match_score: str = Field(description="The final match score.")
    scorers: List[str] = Field(description="The name of the scorer.")

client = genai.Client()

interaction = client.interactions.create(
    model="gemini-3.1-pro-preview",
    input="Search for all details for the latest Euro.",
    tools=[{"type": "google_search"}, {"type": "url_context"}],
    response_format={
        "type": "text",
        "mime_type": "application/json",
        "schema": MatchResult.model_json_schema()
    },
)

result = MatchResult.model_validate_json(interaction.steps[-1].content[0].text)
print(result)

جاوا اسکریپت

import { GoogleGenAI } from "@google/genai";
import { z } from "zod";
import { zodToJsonSchema } from "zod-to-json-schema";

const client = new GoogleGenAI({});
const matchSchema = z.object({
  winner: z.string().describe("The name of the winner."),
  final_match_score: z.string().describe("The final score."),
  scorers: z.array(z.string()).describe("The name of the scorer.")
});

const interaction = await client.interactions.create({
  model: "gemini-3.1-pro-preview",
  input: "Search for all details for the latest Euro.",
  tools: [{type: "google_search"}, {type: "url_context"}],
  response_format: {
    type: 'text',
    mime_type: 'application/json',
    schema: zodToJsonSchema(matchSchema)
  },
});

const match = matchSchema.parse(JSON.parse(interaction.steps.at(-1).content[0].text));
console.log(match);

استراحت

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
  -H "x-goog-api-key: $GEMINI_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "gemini-3.1-pro-preview",
    "input": "Search for all details for the latest Euro.",
    "tools": [{"type": "google_search"}, {"type": "url_context"}],
    "response_format": {
      "type": "text",
      "mime_type": "application/json",
      "schema": {
        "type": "object",
        "properties": {
            "winner": {"type": "string"},
            "final_match_score": {"type": "string"},
            "scorers": {"type": "array", "items": {"type": "string"}}
        },
        "required": ["winner", "final_match_score", "scorers"]
      }
    }
  }'

پشتیبانی از طرحواره JSON

برای تولید یک شیء JSON، response_format با یک شیء (یا آرایه‌ای حاوی یک شیء) از نوع text پیکربندی کنید و mime_type آن را روی application/json تنظیم کنید. طرحواره باید در فیلد schema ارائه شود.

حالت خروجی ساختاریافته‌ی Gemini از زیرمجموعه‌ای از مشخصات JSON Schema پشتیبانی می‌کند.

مقادیر type زیر پشتیبانی می‌شوند:

  • string : برای متن.
  • number : برای اعداد اعشاری.
  • integer : برای اعداد صحیح.
  • boolean : برای مقادیر درست یا غلط.
  • object : برای داده‌های ساختاریافته با جفت‌های کلید-مقدار.
  • array : برای لیست آیتم‌ها.
  • null : برای اینکه یک ویژگی بتواند null باشد، "null" را در آرایه نوع قرار دهید (مثلاً {"type": ["string", "null"]} ).

این ویژگی‌های توصیفی به هدایت مدل کمک می‌کنند:

  • title : شرح مختصری از یک ملک.
  • description : شرح طولانی‌تر و مفصل‌تر یک ملک.

ویژگی‌های خاص نوع

برای مقادیر object :

  • properties : شیء‌ای که در آن هر کلید، نام یک ویژگی و هر مقدار، طرحواره‌ای برای آن ویژگی است.
  • required : آرایه‌ای از رشته‌ها که ویژگی‌های اجباری را فهرست می‌کند.
  • additionalProperties : کنترل می‌کند که آیا ویژگی‌هایی که در properties فهرست نشده‌اند، مجاز هستند یا خیر. می‌تواند یک مقدار بولی یا یک schema باشد.

برای مقادیر string :

  • enum : مجموعه‌ای خاص از رشته‌های ممکن برای وظایف طبقه‌بندی را فهرست می‌کند.
  • format : یک سینتکس برای رشته مشخص می‌کند، مانند date-time ، date ، time .

برای مقادیر number و integer :

  • enum : مجموعه‌ای خاص از مقادیر عددی ممکن را فهرست می‌کند.
  • minimum : حداقل مقدار شامل.
  • maximum : حداکثر مقدار شامل.

برای مقادیر array :

  • items : طرحواره (schema) را برای همه آیتم‌های موجود در آرایه تعریف می‌کند.
  • prefixItems : فهرستی از طرحواره‌ها را برای N مورد اول تعریف می‌کند و امکان ساختارهای تاپل‌مانند را فراهم می‌کند.
  • minItems : حداقل تعداد آیتم‌ها در آرایه.
  • maxItems : حداکثر تعداد آیتم‌ها در آرایه.

پشتیبانی مدل

مدل خروجی‌های ساختاریافته
پیش‌نمایش Gemini 3.1 Pro ✔️
پیش‌نمایش فلش جمینی ۳ ✔️
جمینی ۲.۵ پرو ✔️
فلش جمینی ۲.۵ ✔️
جمینی ۲.۵ فلش-لایت ✔️
فلش جمینی ۲.۰ ✔️*
جمینی ۲.۰ فلش-لایت ✔️*

* جمینی ۲.۰ به یک لیست صریح propertyOrdering نیاز دارد.

خروجی‌های ساختاریافته در مقابل فراخوانی تابع

ویژگی مورد استفاده اصلی
خروجی‌های ساختاریافته قالب‌بندی پاسخ نهایی. زمانی استفاده می‌شود که می‌خواهید پاسخ مدل در قالب خاصی باشد.
فراخوانی تابع اقدام کردن در حین مکالمه. زمانی استفاده می‌شود که مدل قبل از ارائه پاسخ نهایی، از شما بخواهد کاری را انجام دهید.

بهترین شیوه‌ها

  • توضیحات واضح: از فیلد description برای راهنمایی مدل استفاده کنید.
  • تایپ قوی: از انواع خاص ( integer ، string ، enum ) استفاده کنید.
  • مهندسی سریع: به طور واضح بیان کنید که می‌خواهید مدل چه کاری انجام دهد.
  • اعتبارسنجی: اگرچه خروجی از نظر نحوی JSON صحیح است، اما همیشه مقادیر را در برنامه خود اعتبارسنجی کنید.
  • مدیریت خطا: مدیریت خطای قوی را برای خروجی‌های سازگار با طرحواره اما از نظر معنایی نادرست پیاده‌سازی کنید.

محدودیت‌ها

  • زیرمجموعه Schema: همه ویژگی‌های JSON Schema پشتیبانی نمی‌شوند.
  • پیچیدگی طرحواره: طرحواره‌های بسیار بزرگ یا عمیقاً تودرتو ممکن است رد شوند.