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

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

يمكنك تقديم أوصاف للوظائف لنماذج 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 int, colorTemp string) map[string]any {
    // This mock API returns the requested lighting values
    return map[string]any{
        "brightness":       brightness,
        "colorTemperature": colorTemp}
}

إنشاء بيان دالة

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

lightControlTool := &genai.Tool{
    FunctionDeclarations: []*genai.FunctionDeclaration{{
        Name:        "controlLight",
        Description: "Set the brightness and color temperature of a room light.",
        Parameters: &genai.Schema{
            Type: genai.TypeObject,
            Properties: map[string]*genai.Schema{
                "brightness": {
                    Type:        genai.TypeString,
                    Description: "Light level from 0 to 100. Zero is off and"+
                        " 100 is full brightness.",
                },
                "colorTemperature": {
                    Type:        genai.TypeString,
                    Description: "Color temperature of the light fixture which" +
                        " can be `daylight`, `cool` or `warm`.",
                },
            },
            Required: []string{"currencyDate", "currencyFrom"},
        },
    }},
}

تعريف الدوال أثناء إعداد النموذج

عندما تريد استخدام استدعاء الدالة مع نموذج، يجب تقديم إعلانات الدوال عند إعداد كائن النموذج. يمكنك التعريف عن الدوال من خلال ضبط معلَمة Tools للنموذج:

// ...

lightControlTool := &genai.Tool{
    // ...
}

// Use a model that supports function calling, like a Gemini 1.5 model
model := client.GenerativeModel("gemini-1.5-flash")

// Specify the function declaration.
model.Tools = []*genai.Tool{lightControlTool}

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

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

// Start new chat session.
session := model.StartChat()

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

// Send the message to the generative model.
resp, err := session.SendMessage(ctx, genai.Text(prompt))
if err != nil {
    log.Fatalf("Error sending message: %v\n", err)
}

// Check that you got the expected function call back.
part := resp.Candidates[0].Content.Parts[0]
funcall, ok := part.(genai.FunctionCall)
if !ok {
    log.Fatalf("Expected type FunctionCall, got %T", part)
}
if g, e := funcall.Name, lightControlTool.FunctionDeclarations[0].Name; g != e {
    log.Fatalf("Expected FunctionCall.Name %q, got %q", e, g)
}
fmt.Printf("Received function call response:\n%q\n\n", part)

apiResult := map[string]any{
    "brightness":  "30",
    "colorTemperature":  "warm" }

// Send the hypothetical API result back to the generative model.
fmt.Printf("Sending API result:\n%q\n\n", apiResult)
resp, err = session.SendMessage(ctx, genai.FunctionResponse{
    Name:     lightControlTool.FunctionDeclarations[0].Name,
    Response: apiResult,
})
if err != nil {
    log.Fatalf("Error sending message: %v\n", err)
}

// Show the model's response, which is expected to be text.
for _, part := range resp.Candidates[0].Content.Parts {
    fmt.Printf("%v\n", part)
}