استدعاء الأداة، المعروف أيضًا باسم استدعاء الدالة، هو طريقة منظمة لمنح النماذج اللغوية الكبيرة إمكانية إرسال طلبات إلى التطبيق الذي استدعاها. يمكنك تحديد الأدوات التي تريد إتاحتها للنموذج، وسيقدّم النموذج طلبات أدوات إلى تطبيقك حسب الحاجة لتلبية الطلبات التي تقدّمها له.
تندرج حالات استخدام استدعاء الأداة بشكل عام ضمن بضعة مواضيع:
منح نموذج LLM إذن الوصول إلى معلومات لم يتم تدريبه عليها
- المعلومات التي تتغيّر بشكل متكرّر، مثل سعر الأسهم أو الطقس الحالي
- معلومات خاصة بنطاق تطبيقك، مثل معلومات المنتجات أو ملفّات تعريف المستخدِمين
يُرجى ملاحظة التداخل مع الإنشاء المعزّز لاسترداد المعلومات (RAG)، وهو أيضًا طريقة للسماح لنموذج اللغة الضخمة بدمج المعلومات الوقائعية في عمليات الإنشاء. يُعدّ RAG أحد الحلول الثقيلة التي تناسبك بشكلٍ أفضل عندما يكون لديك قدر كبير من المعلومات أو عندما تكون المعلومات الأكثر صلة بالطلب غير واضحة. من ناحية أخرى، إذا كان استدعاء دالة أو البحث في قاعدة البيانات هو كل ما هو ضروري ل retrieving the information the LLM needs، يكون استدعاء الأداة أكثر ملاءمةً.
إدخال درجة من الحتمية في سير عمل الذكاء الاصطناعي اللغوي
- إجراء عمليات حسابية لا يمكن للنموذج اللغوي الكبير إكمالها بأمان بنفسه
- إجبار "النموذج اللغوي الكبير" على إنشاء نص حرفي في ظروف معيّنة، مثل عند الردّ على سؤال حول بنود خدمة أحد التطبيقات
تنفيذ إجراء عند بدءه من خلال نموذج لغوي كبير
- تشغيل الأضواء وإطفاؤها في جهاز مساعدة منزلي مزوّد بنموذج لغوي كبير
- حجز طاولات في موظّف دعم مطعم مزوّد بتكنولوجيا تعلُّم الآلة
قبل البدء
إذا كنت تريد تنفيذ أمثلة الرموز البرمجية الواردة في هذه الصفحة، عليك أولاً إكمال الخطوات الواردة في دليل البدء. تفترض جميع الأمثلة أنّه سبق لك إعداد مشروع تم تثبيت تبعيات Genkit فيه.
تتناول هذه الصفحة إحدى الميزات المتقدّمة لتبسيط نماذج Genkit، لذا قبل التعمّق في التفاصيل، يجب أن تكون على دراية بالمحتوى المعروض في صفحة إنشاء محتوى باستخدام نماذج الذكاء الاصطناعي. يجب أن تكون أيضًا على دراية بنظام Genkit لتحديد مخطّطات الإدخال والإخراج، والذي تتم مناقشته في صفحة العمليات.
نظرة عامة على استدعاء الأداة
على مستوى عالٍ، في ما يلي شكل التفاعل النموذجي لطلب أداة مع نموذج لغوي كبير (LLM):
- يوجّه التطبيق المُرسِل طلبًا إلى النموذج اللغوي الكبير، ويتضمن أيضًا في الطلب قائمة بالأدوات التي يمكن للنموذج اللغوي الكبير استخدامها لإنشاء ردّ.
- ينشئ النموذج اللغوي الكبير إما استجابة كاملة أو ينشئ طلبًا لطلب استخدام أداة بتنسيق معيّن.
- إذا تلقّى المتصل ردًا كاملاً، يتم تنفيذ الطلب وينتهي التفاعل. أما إذا تلقّى المتصل مكالمة من أداة، فينفّذ النموذج اللغوي الكبير أي منطق مناسب ويرسل طلبًا جديدًا إلى النموذج يحتوي على الطلب الأصلي أو بعض الصيغ المتغيرة منه بالإضافة إلى نتيجة مكالمة الأداة.
- يعالج نموذج "التعلم الآلي للغة" الطلب الجديد كما هو موضّح في الخطوة 2.
لكي تعمل هذه الميزة، يجب استيفاء عدة متطلبات:
- يجب تدريب النموذج على تقديم طلبات أدوات عند الحاجة لإكمال طلب. يمكن لمعظم النماذج الأكبر حجمًا التي يتم توفيرها من خلال واجهات برمجة تطبيقات الويب، مثل Gemini، تنفيذ ذلك، ولكن لا يمكن غالبًا للنماذج الأصغر حجمًا والأكثر تخصصًا تنفيذ ذلك. سيُظهر Genkit خطأً إذا حاولت توفير أدوات لنموذج لا يسمح باستخدامها.
- يجب أن يقدّم التطبيق المُرسِل تعريفات الأدوات إلى النموذج بال التنسيق الذي يتوقّعه.
- يجب أن يطلب التطبيق المُرسِل من النموذج إنشاء طلبات طلب استخدام الأداة بالتنسيق الذي يتوقّعه التطبيق.
الاتصال بالأدوات باستخدام Genkit
توفّر أداة Genkit واجهة واحدة لاستدعاء الأدوات مع النماذج المتوافقة معها.
يضمن كلّ مكوّن إضافي للنموذج استيفاء المعيارَين الأخيرَين المذكورَين في القسم السابق، وتعمل الدالة genkit.Generate()
تلقائيًا على تنفيذ حلقة استدعاء الأداة الموضّحة سابقًا.
إتاحة النموذج
يعتمد توفّر ميزة الاتصال بالأدوات على النموذج وواجهة برمجة التطبيقات الخاصة بالنموذج ومكوّن Genkit الإضافي. راجِع المستندات ذات الصلة لتحديد ما إذا كان من المحتمل أن يكون استخدام الأداة متاحًا. بالإضافة إلى ذلك:
- سيُظهر Genkit خطأً إذا حاولت توفير أدوات لنموذج لا يتوافق معها.
- إذا كان المكوّن الإضافي يصدّر إشارات إلى النماذج، سيشير
ModelInfo.Supports.Tools
السمة إلى ما إذا كان يتيح استدعاء الأداة.
تحديد الأدوات
استخدِم الدالة genkit.DefineTool()
لكتابة تعريفات الأدوات:
import (
"context"
"log"
"github.com/firebase/genkit/go/ai"
"github.com/firebase/genkit/go/genkit"
"github.com/firebase/genkit/go/plugins/googlegenai"
)
func main() {
ctx := context.Background()
g, err := genkit.Init(ctx,
genkit.WithPlugins(&googlegenai.GoogleAI{}),
genkit.WithDefaultModel("googleai/gemini-2.0-flash"),
)
if err != nil {
log.Fatal(err)
}
getWeatherTool := genkit.DefineTool(
g, "getWeather", "Gets the current weather in a given location",
func(ctx *ai.ToolContext, location string) (string, error) {
// Here, we would typically make an API call or database query. For this
// example, we just return a fixed value.
return fmt.Sprintf("The current weather in %s is 63°F and sunny.", location);
})
}
يشبه بناء الجملة هنا بناء جملة genkit.DefineFlow()
، ولكن عليك
كتابة وصف. يجب الانتباه بشكل خاص إلى الصياغة والوصف العميق
للوصف، لأنّه من المهم أن يقرر نموذج اللغة المحوسبة (LLM) استخدامه بشكل مناسب.
استخدام الأدوات
أدرِج أدوات محدّدة في طلباتك لإنشاء المحتوى.
إنشاء
resp, err := genkit.Generate(ctx, g,
ai.WithPrompt("What is the weather in San Francisco?"),
ai.WithTools(getWeatherTool),
)
DefinePrompt
weatherPrompt, err := genkit.DefinePrompt(g, "weatherPrompt",
ai.WithPrompt("What is the weather in {{location}}?"),
ai.WithTools(getWeatherTool),
)
if err != nil {
log.Fatal(err)
}
resp, err := weatherPrompt.Execute(ctx,
with.Input(map[string]any{"location": "San Francisco"}),
)
ملف الطلب
---
system: "Answer questions using the tools you have."
tools: [getWeather]
input:
schema:
location: string
---
What is the weather in {{location}}?
بعد ذلك، يمكنك تنفيذ الطلب في الرمز البرمجي على النحو التالي:
// Assuming prompt file named weatherPrompt.prompt exists in ./prompts dir.
weatherPrompt := genkit.LookupPrompt("weatherPrompt")
if weatherPrompt == nil {
log.Fatal("no prompt named 'weatherPrompt' found")
}
resp, err := weatherPrompt.Execute(ctx,
ai.WithInput(map[string]any{"location": "San Francisco"}),
)
سيتولى Genkit تلقائيًا طلب الأداة إذا كان نموذج اللغة الضخمة يحتاج إلى استخدام أداة
getWeather
للإجابة عن الطلب.
معالجة طلبات الأداة صراحةً
إذا كنت تريد التحكّم بشكل كامل في حلقة استدعاء الأداة هذه، على سبيل المثال لتطبيق منطق أكثر
تعقيدًا، اضبط الخيار WithReturnToolRequests()
على true
. تقع الآن
على عاتقك مسؤولية ضمان استيفاء جميع طلبات الأداة:
getWeatherTool := genkit.DefineTool(
g, "getWeather", "Gets the current weather in a given location",
func(ctx *ai.ToolContext, location string) (string, error) {
// Tool implementation...
})
resp, err := genkit.Generate(ctx, g,
ai.WithPrompt("What is the weather in San Francisco?"),
ai.WithTools(getWeatherTool),
ai.WithReturnToolRequests(true),
)
if err != nil {
log.Fatal(err)
}
parts := []*Part{}
for _, req := range resp.ToolRequests() {
tool := genkit.LookupTool(g, req.Name)
if tool == nil {
log.Fatalf("tool %q not found", req.Name)
}
output, err := tool.RunRaw(ctx, req.Input)
if err != nil {
log.Fatalf("tool %q execution failed: %v", err)
}
parts = append(parts,
ai.NewToolResponsePart(&ai.ToolResponse{
Name: req.Name,
Ref: req.Ref,
Output: output,
}))
}
resp, err = genkit.Generate(ctx, g,
ai.WithMessages(resp.History()..., NewMessage(ai.RoleTool, nil, parts...)),
)
if err != nil {
log.Fatal(err)
}