برنامج تعليمي حول استدعاء الدوال

يسهّل عليك استدعاء الدوال الحصول على مخرجات البيانات المنظَّمة من النماذج التوليدية. يمكنك بعد ذلك استخدام هذه المخرجات لاستدعاء واجهات برمجة تطبيقات أخرى وعرض بيانات الاستجابة ذات الصلة إلى النموذج. بعبارة أخرى، يساعدك استدعاء الدوال في ربط النماذج التوليدية بالأنظمة الخارجية بحيث يشتمل المحتوى الذي يتم إنشاؤه على أحدث المعلومات وأكثرها دقة.

يمكنك تقديم أوصاف للوظائف لنماذج Gemini. هذه هي الدوال التي تكتبها بلغة تطبيقك (أي أنها ليست وظائف Google Cloud). قد يطلب منك النموذج استدعاء دالة وإرسال النتيجة لمساعدة النموذج في التعامل مع استعلامك.

لمزيد من المعلومات، اطّلِع على مقدّمة حول استدعاء الدوال لمزيد من المعلومات.

مثال على واجهة برمجة تطبيقات للتحكّم في الإضاءة

لنفترض أنّ لديك نظامًا أساسيًا للتحكّم في الإضاءة مع واجهة لبرمجة التطبيقات (API) وتريد السماح للمستخدمين بالتحكّم بالإضاءة من خلال طلبات نصية بسيطة. يمكنك استخدام ميزة "استدعاء الدوال" لشرح طلبات تغيير الإضاءة التي يرسلها المستخدمون وترجمتها إلى طلبات بيانات من واجهة برمجة التطبيقات لضبط قيم الإضاءة. يتيح لك نظام التحكم الافتراضي في الإضاءة هذا التحكم في سطوع الضوء ودرجة حرارة ألوانه، ويتم تعريفهما على معلمتين منفصلتين:

المَعلمة النوع مطلوبة الوصف
brightness الرقم نعم مستوى الإضاءة من 0 إلى 100 القيمة "صفر" غير مفعّلة والقيمة 100 "سطوع كامل".
colorTemperature سلسلة نعم درجة حرارة ألوان تجهيز الإضاءة يمكن أن تكون daylight أو cool أو warm.

ولتبسيط الأمر، يحتوي نظام الإضاءة الوهمي هذا على ضوء واحد فقط، لذلك لا يضطر المستخدم إلى تحديد غرفة أو موقع جغرافي. في ما يلي مثال على طلب JSON يمكنك إرساله إلى واجهة برمجة التطبيقات للتحكّم في الإضاءة لتغيير مستوى الإضاءة إلى %50 باستخدام درجة حرارة ألوان ضوء النهار:

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

يشرح لك هذا الدليل التوجيهي كيفية إعداد استدعاء الدوال في Gemini API لتفسير طلبات الإضاءة للمستخدمين وربطها بإعدادات واجهة برمجة التطبيقات للتحكّم في مستوى سطوع الضوء وقيم درجة حرارة الألوان.

قبل البدء: عليك إعداد مشروعك ومفتاح واجهة برمجة التطبيقات.

قبل طلب Gemini API، عليك إعداد مشروعك وضبط مفتاح واجهة برمجة التطبيقات.

تعريف دالة واجهة برمجة التطبيقات

إنشاء دالة تؤدي إلى طلب واجهة برمجة التطبيقات. يجب تحديد هذه الوظيفة داخل رمز التطبيق، ولكن قد تطلب خدمات أو واجهات برمجة تطبيقات من خارج التطبيق. لا تستدعي Gemini 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)