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

שליחת פונקציות מאפשרת לקבל בקלות פלט של נתונים מובְנים ממודלים גנרטיביים. לאחר מכן אפשר להשתמש בפלט הזה כדי לקרוא לממשקי 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 מדומה שמחזירה את ערכי התאורה המבוקשים:

Future<Map<String, Object?>> setLightValues(
  Map<String, Object?> arguments,
) async =>
    // This mock API returns the requested lighting values
    {
      'brightness': arguments['brightness'],
      'colorTemperature': arguments['colorTemp'],
    };

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

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

final lightControlTool = FunctionDeclaration(
    'setLightValues',
    'Set the brightness and color temperature of a room light.',
    Schema(SchemaType.object, properties: {
      'brightness': Schema(SchemaType.number,
          description: 'Light level from 0 to 100. '
              'Zero is off and 100 is full brightness.'),
      'colorTemperature': Schema(SchemaType.string,
          description: 'Color temperature of the light fixture, '
              'which can be `daylight`, `cool` or `warm`.'),
    }, requiredProperties: [
      'brightness',
      'colorTemperature'
    ]));

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

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

final model = GenerativeModel(
  model: 'gemini-1.5-flash',
  apiKey: apiKey,

  // Specify the function declaration.
  tools: [
    Tool(functionDeclarations: [lightControlTool])
  ],
);

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

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

final chat = model.startChat(); final prompt =
  'Dim the lights so the room feels cozy and warm.';

// Send the message to the generative model.
var response = await chat.sendMessage(Content.text(prompt));

final functionCalls = response.functionCalls.toList();
// When the model response with a function call, invoke the function.
if (functionCalls.isNotEmpty) {
  final functionCall = functionCalls.first;
  final result = switch (functionCall.name) {
    // Forward arguments to the hypothetical API.
    'setLightValues' => await setLightValues(functionCall.args),
    // Throw an exception if the model attempted to call a function that was
    // not declared.
    _ => throw UnimplementedError(
        'Function not implemented: ${functionCall.name}')
  };
  // Send the response to the model so that it can use the result to generate
  // text for the user.
  response = await chat
      .sendMessage(Content.functionResponse(functionCall.name, result));
}
// When the model responds with non-null text content, print it.
if (response.text case final text?) {
  print(text);
}