تسهِّل عليك طريقة استدعاء الدوال الحصول على نتائج بيانات منظَّمة من نماذج الإنشاء. يمكنك بعد ذلك استخدام هذه النتائج لاستدعاء واجهات برمجة تطبيقات أخرى وعرض بيانات الاستجابة ذات الصلة بالنموذج. بعبارة أخرى، تساعدك عملية استدعاء الدوال في ربط النماذج التوليدية بالأنظمة الخارجية لكي يتضمّن المحتوى الذي يتم إنشاؤه أحدث المعلومات وأكثرها دقة.
يمكنك تزويد نماذج 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 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{"brightness", "colorTemperature"},
},
}},
}
تحديد الدوالّ أثناء بدء تشغيل النموذج
عندما تريد استخدام استدعاء الدالة مع نموذج، عليك تقديم
تعريفات الدوالّ عند بدء عنصر النموذج. يمكنك تحديد الدوالّ
من خلال ضبط المَعلمة 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)
}