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

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

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

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

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

لنفترض أنّ لديك نظامًا أساسيًا للتحكّم في الإضاءة مع واجهة لبرمجة التطبيقات (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)
}