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


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

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

למידע נוסף, מומלץ לקרוא את המאמר מבוא לקריאה לפונקציות.

הגדרת הפרויקט

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

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

במדריך הזה נציג למודל אינטראקציה עם ממשק API של המרת מטבעות היפותטית שתומך בפרמטרים הבאים:

פרמטר סוג חובה תיאור
currencyDate string כן התאריך של שליפת שער החליפין ל
(שחייב תמיד להיות בפורמט YYYY-MM-DD או הערך latest אם לא צוינה תקופת זמן)
currencyFrom string כן המטבע להמרה ממנו
currencyTo string no המטבע להמרה

דוגמה לבקשת API

{
  "currencyDate": "2024-04-17",
  "currencyFrom": "USD",
  "currencyTo": "SEK"
}

דוגמה לתגובת API

{
  "base": "USD",
  "date": "2024-04-17",
  "rates": {"SEK": 0.091}
}

שלב 1: יוצרים את הפונקציה ששולחת את בקשת ה-API

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

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

func exchangeRate(currencyDate string,
    currencyFrom string, currencyTo string) map[string]any {
    // This hypothetical API returns a JSON such as:
    // {"base":"USD","date":"2024-04-17","rates":{"SEK": 0.091}}
    return map[string]any{
        "base":  currencyFrom,
        "date":  currencyDate,
        "rates": map[string]any{currencyTo: 0.091}}
}

שלב 2: יוצרים הצהרה לגבי פונקציה

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

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

currencyExchangeTool := &genai.Tool{
    FunctionDeclarations: []*genai.FunctionDeclaration{{
        Name:        "exchangeRate",
        Description: "Lookup currency exchange rates by date",
        Parameters: &genai.Schema{
            Type: genai.TypeObject,
            Properties: map[string]*genai.Schema{
                "currencyDate": {
                    Type:        genai.TypeString,
                    Description: "A date that must always be in YYYY-MM-DD format" +
                        " or the value 'latest' if a time period is not specified",
                },
                "currencyFrom": {
                    Type:        genai.TypeString,
                    Description: "Currency to convert from",
                },
                "currencyTo": {
                    Type:        genai.TypeString,
                    Description: "Currency to convert to",
                },
            },
            Required: []string{"currencyDate", "currencyFrom"},
        },
    }},
}

שלב 3: מציינים את הצהרת הפונקציה במהלך אתחול המודל

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

// ...

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

// Use a model that supports function calling, like Gemini 1.0 Pro.
// See "Supported models" in the "Introduction to function calling" page.
model := client.GenerativeModel("gemini-1.0-pro")

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

שלב 4: יוצרים קריאה לפונקציה

עכשיו אפשר להריץ את המודל באמצעות הפונקציה המוגדרת.

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

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

prompt := "How much is 50 US dollars worth in Swedish krona?"

// 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, currencyExchangeTool.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{
    "base":  "USD",
    "date":  "2024-04-17",
    "rates": map[string]any{"SEK": 0.091}}

// 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:     currencyExchangeTool.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)
}