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

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

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

يمكنك الاطّلاع على مقالة مقدّمة حول استدعاء الدوالّ للتعرّف على مزيد من المعلومات، إذا لم يسبق لك ذلك.

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

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

المعلمة النوع مطلوب الوصف
brightness الرقم نعم مستوى الإضاءة من 0 إلى 100 القيمة 0 تعني إيقاف الإضاءة والقيمة 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)