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

שליחת פונקציות מאפשרת לקבל בקלות פלט של נתונים מובְנים ממודלים גנרטיביים. לאחר מכן אפשר להשתמש בפלט הזה כדי לקרוא לממשקי 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 int, colorTemp string) map[string]any {
    // This mock API returns the requested lighting values
    return map[string]any{
        "brightness":       brightness,
        "colorTemperature": colorTemp}
}

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

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

lightControlTool := &genai.Tool{
    FunctionDeclarations: []*genai.FunctionDeclaration{{
        Name:        "controlLight",
        Description: "Set the brightness and color temperature of a room light.",
        Parameters: &genai.Schema{
            Type: genai.TypeObject,
            Properties: map[string]*genai.Schema{
                "brightness": {
                    Type:        genai.TypeString,
                    Description: "Light level from 0 to 100. Zero is off and"+
                        " 100 is full brightness.",
                },
                "colorTemperature": {
                    Type:        genai.TypeString,
                    Description: "Color temperature of the light fixture which" +
                        " can be `daylight`, `cool` or `warm`.",
                },
            },
            Required: []string{"currencyDate", "currencyFrom"},
        },
    }},
}

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

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

// ...

lightControlTool := &genai.Tool{
    // ...
}

// Use a model that supports function calling, like a Gemini 1.5 model
model := client.GenerativeModel("gemini-1.5-flash")

// Specify the function declaration.
model.Tools = []*genai.Tool{lightControlTool}

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

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

// Start new chat session.
session := model.StartChat()

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

// Send the message to the generative model.
resp, err := session.SendMessage(ctx, genai.Text(prompt))
if err != nil {
    log.Fatalf("Error sending message: %v\n", err)
}

// Check that you got the expected function call back.
part := resp.Candidates[0].Content.Parts[0]
funcall, ok := part.(genai.FunctionCall)
if !ok {
    log.Fatalf("Expected type FunctionCall, got %T", part)
}
if g, e := funcall.Name, lightControlTool.FunctionDeclarations[0].Name; g != e {
    log.Fatalf("Expected FunctionCall.Name %q, got %q", e, g)
}
fmt.Printf("Received function call response:\n%q\n\n", part)

apiResult := map[string]any{
    "brightness":  "30",
    "colorTemperature":  "warm" }

// Send the hypothetical API result back to the generative model.
fmt.Printf("Sending API result:\n%q\n\n", apiResult)
resp, err = session.SendMessage(ctx, genai.FunctionResponse{
    Name:     lightControlTool.FunctionDeclarations[0].Name,
    Response: apiResult,
})
if err != nil {
    log.Fatalf("Error sending message: %v\n", err)
}

// Show the model's response, which is expected to be text.
for _, part := range resp.Candidates[0].Content.Parts {
    fmt.Printf("%v\n", part)
}