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

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

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

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

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

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

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

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

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

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

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

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

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

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

suspend fun setLightValues(
    brightness: Int,
    colorTemp: String
): JSONObject {
    // This mock API returns the requested lighting values
    return JSONObject().apply {
        put("brightness", brightness)
        put("colorTemperature", colorTemp)
    }
}

إنشاء تعريفات الدوالّ

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

val lightControlTool = defineFunction(
  name = "setLightValues",
  description = "Set the brightness and color temperature of a room light.",
  Schema.int("brightness", "Light level from 0 to 100. Zero is off and 100" +
    " is full brightness."),
  Schema.str("colorTemperature", "Color temperature of the light fixture" +
    " which can be `daylight`, `cool` or `warm`.")
) { brightness, colorTemp ->
    // Call the function you declared above
    setLightValues(brightness.toInt(), colorTemp)
}

تحديد الدوالّ أثناء بدء تشغيل النموذج

عندما تريد استخدام استدعاء الدالة مع نموذج، عليك تقديم تعريفات الدوالّ عند بدء عنصر النموذج. أنت تعلن عن الدوال من خلال ضبط معلَمة tools للنموذج:

val generativeModel = GenerativeModel(
    modelName = "gemini-1.5-flash",

    // Access your API key as a Build Configuration variable
    apiKey = BuildConfig.apiKey,

    // Specify the function declaration.
    tools = listOf(Tool(listOf(lightControlTool)))
)

إنشاء استدعاء دالة

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

val chat = generativeModel.startChat()

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

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

// Check if the model responded with a function call
response.functionCall?.let { functionCall ->
  // Try to retrieve the stored lambda from the model's tools and
  // throw an exception if the returned function was not declared
  val matchedFunction = generativeModel.tools?.flatMap { it.functionDeclarations }
      ?.first { it.name == functionCall.name }
      ?: throw InvalidStateException("Function not found: ${functionCall.name}")

  // Call the lambda retrieved above
  val apiResponse: JSONObject = matchedFunction.execute(functionCall)

  // Send the API response back to the generative model
  // so that it generates a text response that can be displayed to the user
  response = chat.sendMessage(
    content(role = "function") {
        part(FunctionResponsePart(functionCall.name, apiResponse))
    }
  )
}

// Whenever the model responds with text, show it in the UI
response.text?.let { modelResponse ->
    println(modelResponse)
}