מדריך להפעלת פונקציות

שליחת פונקציות מאפשרת לקבל בקלות פלט של נתונים מובְנים ממודלים גנרטיביים. לאחר מכן אפשר להשתמש בפלט הזה כדי לקרוא לממשקי API אחרים ולהחזיר למודל את נתוני התגובות הרלוונטיים. כלומר, קריאה לפונקציות עוזרת לחבר מודלים גנרטיביים למערכות חיצוניות, כדי שהתוכן שנוצר יכלול את המידע הכי עדכני ומדויק.

אתם יכולים להוסיף למודלים של Gemini תיאורים של פונקציות. פונקציות שכותבים בשפה של האפליקציה (כלומר, הן לא פונקציות של Google Cloud Functions). המודל עשוי לבקש מכם לקרוא לפונקציה ולשלוח חזרה את התוצאה כדי לעזור למודל לטפל בשאילתה.

אם עדיין לא עשית זאת, כדאי לעיין במאמר מבוא לקריאות פונקציות כדי לקבל מידע נוסף.

דוגמה לממשק API לבקרת תאורה

נניח שיש לכם מערכת בסיסית לבקרת תאורה עם ממשק תכנות יישומים (API) ואתם רוצים לאפשר למשתמשים לשלוט בתאורה באמצעות בקשות טקסט פשוטות. בעזרת התכונה 'קריאה לפונקציות' תוכלו לפרש בקשות לשינויי תאורה ממשתמשים ולתרגם אותן לקריאות ל-API כדי להגדיר את ערכי התאורה. המערכת ההיפותטית הזו לבקרת תאורה מאפשרת לשלוט בבהירות של האור ובטמפרטורת הצבע שלו, שמוגדרים כשני פרמטרים נפרדים:

פרמטר סוג נדרש תיאור
brightness number כן רמת האור מ-0 עד 100. אפס כבוי ו-100 מציג בהירות מלאה.
colorTemperature string כן טמפרטורת הצבע של גוף התאורה יכולה להיות daylight, cool או warm.

כדי לשמור על פשטות, למערכת התאורה הדמיונית הזו יש רק תאורה אחת, כך שהמשתמש לא צריך לציין חדר או מיקום. לפניכם דוגמה לבקשת JSON שאפשר לשלוח ל-API של בקרת התאורה כדי לשנות את רמת האור ל-50% באמצעות טמפרטורת הצבע של אור יום:

{
  "brightness": "50",
  "colorTemperature": "daylight"
}

במדריך הזה מוסבר איך להגדיר 'קריאת פונקציה' ל-Gemini API כדי לפרש בקשות של משתמשים ולמפות אותן להגדרות API כדי לשלוט בערכי הבהירות וטמפרטורת הצבע של האור.

לפני שמתחילים: מגדירים את הפרויקט ואת מפתח ה-API

לפני שליחת קריאה ל-Gemini API, צריך להגדיר את הפרויקט ואת מפתח ה-API.

הגדרה של פונקציית API

יוצרים פונקציה שיוצרת בקשת API. הפונקציה הזו צריכה להיות מוגדרת בקוד של האפליקציה, אבל היא יכולה להפעיל שירותים או ממשקי API מחוץ לאפליקציה. Gemini API לא קורא לפונקציה הזו באופן ישיר, כך שאפשר לקבוע איך ומתי הפונקציה תופעל דרך קוד האפליקציה. המדריך הזה מגדיר פונקציית API מדומה שמחזירה את ערכי התאורה המבוקשים:

func setLightValues(brightness: String,
                    colorTemp: String) -> JSONObject {
  // This mock API returns the requested lighting values
  return [
    "brightness": .string(brightness),
    "colorTemperature": .string(colorTemp)
  ]
}

יצירת הצהרות לגבי פונקציות

יוצרים את הצהרת הפונקציה שתעבירו למודל הגנרטיבי. כשמצהירים על פונקציה שהמודל משתמש בה, צריך לכלול כמה שיותר פרטים בתיאורי הפונקציות והפרמטרים. המודל הגנרטיבי משתמש במידע הזה כדי לקבוע איזו פונקציה לבחור ואיך לספק ערכים לפרמטרים בקריאה לפונקציה. הקוד הבא מסביר איך להצהיר על הפונקציה של בקרת התאורה:

let controlLightFunctionDeclaration = FunctionDeclaration(
  name: "controlLight",
  description: "Set the brightness and color temperature of a room light.",
  parameters: [
    "brightness": Schema(
      type: .string,
      description: "Light level from 0 to 100. Zero is off and 100 is full brightness."
    ),
    "colorTemperature": Schema(
      type: .string,
      description: "Color temperature of the light fixture which can be `daylight`, `cool` or `warm`."
    ),
  ],
  requiredParameters: ["brightness", "colorTemperature"]
)

הצהרה על פונקציות במהלך אתחול המודל

כשרוצים להשתמש בקריאות לפונקציות עם מודל, צריך לספק את הצהרות הפונקציות כשמאתחלים את אובייקט המודל. אתם מצהירים על פונקציות על ידי הגדרת הפרמטר tools של המודל:

// Use a model that supports function calling, like a Gemini 1.5 model
let generativeModel = GenerativeModel(
  name: "gemini-1.5-flash",
  apiKey: apiKey,
  // Specify the function declaration.
  tools: [Tool(functionDeclarations: [controlLightFunctionDeclaration])]
)

יצירת בקשה להפעלת פונקציה

אחרי שמאתחלים את המודל עם הצהרות הפונקציה, אפשר להציג את המודל באמצעות הפונקציה המוגדרת. כדאי להשתמש בקריאות לפונקציות באמצעות הצגת הנחיות בצ'אט (sendMessage()), כי שליחת פונקציות תועיל בדרך כלל מהקשר של הנחיות ותשובות קודמות.

let chat = generativeModel.startChat()

let prompt = "Dim the lights so the room feels cozy and warm."

// Send the message to the generative model
let response1 = try await chat.sendMessage(prompt)

// Check if the model responded with a function call
guard let functionCall = response1.functionCalls.first else {
  fatalError("Model did not respond with a function call.")
}
// Print an error if the returned function was not declared
guard functionCall.name == "controlLight" else {
  fatalError("Unexpected function called: \(functionCall.name)")
}
// Verify that the names and types of the parameters match the declaration
guard case let .string(brightness) = functionCall.args["brightness"] else {
  fatalError("Missing argument: brightness")
}
guard case let .string(colorTemp) = functionCall.args["colorTemperature"] else {
  fatalError("Missing argument: colorTemperature")
}

// Call the hypothetical API
let apiResponse = setLightValues(brightness: brightness, colorTemperature: colorTemp)

// Send the API response back to the model so it can generate a text response that can be
// displayed to the user.
let response = try await chat.sendMessage([ModelContent(
  role: "function",
  parts: [.functionResponse(FunctionResponse(
    name: functionCall.name,
    response: apiResponse
  ))]
)])

// Log the text response.
guard let modelResponse = response.text else {
  fatalError("Model did not respond with text.")
}
print(modelResponse)