פלט מובנה מאפשר למודל ליצור פלט שתמיד תואם לסכימה ספציפית. לדוגמה, אפשר לספק למודל סכימת תשובה כדי לוודא שהתשובה תהיה JSON תקין. כל המודלים הפתוחים שזמינים בפלטפורמת הסוכנים של Gemini Enterprise בתור Model as a Service (MaaS) תומכים בפלטפוטים מובנים.
מידע נוסף על היכולת של פלט מובנה זמין במאמר מבוא לפלט מובנה.
שימוש בפלט מובנה
בתרחיש השימוש הבא מוגדרת סכימת תגובה שמבטיחה שהפלט של המודל יהיה אובייקט JSON עם המאפיינים הבאים: name, date ו-participants. קוד ה-Python משתמש ב-OpenAI SDK ובאובייקטים של Pydantic כדי ליצור סכימת JSON.
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)
פלט המודל יהיה בהתאם לסכימת ה-JSON הבאה:
{ "name": STRING, "date": STRING, "participants": [STRING] }
אם תספקו את ההנחיה 'אליס ובוב הולכים ליריד המדע ביום שישי', המודל עשוי להפיק את התשובה הבאה:
{
"name": "science fair",
"date": "Friday",
"participants": [
"Alice",
"Bob"
]
}
דוגמה מפורטת
הקוד הבא הוא דוגמה לסכימה רקורסיבית. הכיתה UI מכילה רשימה של children, שיכולים להיות גם מהכיתה UI.
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)
פלט המודל יתאים לסכימה של אובייקט Pydantic שצוין בקטע הקוד הקודם. בדוגמה הזו, המודל יכול ליצור את טופס ממשק המשתמש הבא:
Form
Input
Name
Email
Age
התגובה יכולה להיראות כך:
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
כדי להגביל את המודל כך שיפיק רק אובייקטים של JSON שתקפים מבחינת התחביר, צריך להגדיר את השדה response_format לערך { "type": "json_object" }. האפשרות הזו נקראת לעיתים קרובות מצב JSON. מצב JSON שימושי כשיוצרים JSON לשימוש בקריאה לפונקציות או במשימות אחרות בהמשך התהליך שדורשות קלט JSON.
כשמצב JSON מופעל, המודל מוגבל ליצירת מחרוזות בלבד שניתנות לניתוח לאובייקטים תקינים של JSON. במצב הזה, הפלט הוא JSON עם תחביר תקין, אבל לא מוגדרת סכימה ספציפית. כדי לוודא שהמודל יפיק פלט JSON לפי סכימה ספציפית, צריך לכלול הוראות בהנחיה, כמו בדוגמה הבאה.
בדוגמאות הבאות מוסבר איך להפעיל את מצב JSON ולהנחות את המודל להחזיר אובייקט JSON עם מבנה ספציפי:
Python
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Pythonההוראות להגדרה במאמר מדריך למתחילים של Agent Platform באמצעות ספריות לקוח.
כדי לבצע אימות ב-Agent Platform, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.
לפני שמריצים את הדוגמה הזו, צריך להגדיר את משתנה הסביבה OPENAI_BASE_URL.
למידע נוסף, ראו אימות ופרטי כניסה.
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)
מחליפים את MODEL בשם המודל שרוצים להשתמש בו, לדוגמה meta/llama3-405b-instruct-maas.
REST
לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:
- PROJECT_ID: מזהה הפרויקט ב-Google Cloud.
- LOCATION: אזור שתומך במודלים פתוחים.
- MODEL: שם המודל שרוצים להשתמש בו, לדוגמה
meta/llama3-405b-instruct-maas.
ה-method של ה-HTTP וכתובת ה-URL:
POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/endpoints/openapi/chat/completions
גוף בקשת JSON:
{
"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."
}
]
}
כדי לשלוח את הבקשה עליכם לבחור אחת מהאפשרויות הבאות:
curl
שומרים את גוף הבקשה בקובץ בשם request.json ומריצים את הפקודה הבאה:
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
שומרים את גוף הבקשה בקובץ בשם request.json ומריצים את הפקודה הבאה:
$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
אתם אמורים לקבל תגובת JSON שדומה לזו: