أداة استدعاء الأدوات

استدعاء الأداة، المعروف أيضًا باسم استدعاء الدالة، هو طريقة منظمة لمنح المعالجة اللغوية الآلية (LLM) إمكانية إرسال طلبات إلى التطبيق الذي استدعاها. يمكنك تحديد الأدوات التي تريد إتاحتها للنموذج، وسيقدّم النموذج طلبات أدوات إلى تطبيقك حسب الحاجة لتلبية الطلبات التي تقدّمها له.

تندرج حالات استخدام استدعاء الأداة بشكل عام ضمن بضعة مواضيع:

منح نموذج محاكاة المحامين إذن الوصول إلى معلومات لم يتم تدريبه عليها

  • المعلومات التي تتغيّر بشكل متكرّر، مثل سعر الأسهم أو الطقس الحالي
  • معلومات خاصة بنطاق تطبيقك، مثل معلومات المنتجات أو ملفّات تعريف المستخدِمين

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

إدخال درجة من الحتمية في سير عمل النموذج اللغوي الكبير

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

تنفيذ إجراء عند بدء نموذج تعلُّم ضخم للغات

  • تشغيل الأضواء وإطفاؤها في جهاز مساعدة منزلي مزوّد بنموذج لغوي كبير
  • حجز طاولات في موظّف دعم مطعم يستند إلى نموذج لغوي كبير

قبل البدء

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

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

نظرة عامة على استدعاء الأداة

على مستوى عالٍ، في ما يلي شكل التفاعل المعتاد بين الأداة ونموذج اللغة الضخم:

  1. يوجّه التطبيق المُرسِل طلبًا إلى النموذج اللغوي الكبير، ويتضمن أيضًا في الطلب قائمة بالأدوات التي يمكن للنموذج اللغوي الكبير استخدامها لإنشاء ردّ.
  2. ينشئ النموذج اللغوي الكبير إما استجابة كاملة أو ينشئ طلبًا للاتصال بأداة بتنسيق معيّن.
  3. إذا تلقّى المتصل ردًا كاملاً، يتم تنفيذ الطلب وينتهي التفاعل. أما إذا تلقّى المتصل مكالمة من أداة، فينفّذ النموذج اللغوي الكبير أي منطق مناسب ويرسل طلبًا جديدًا إلى النموذج يحتوي على الطلب الأصلي أو بعض الصيغ المتغيرة منه بالإضافة إلى نتيجة مكالمة الأداة.
  4. يعالج نموذج "التعلم الآلي للغة" الطلب الجديد كما هو موضّح في الخطوة 2.

لكي تعمل هذه الميزة، يجب استيفاء عدة متطلبات:

  • يجب تدريب النموذج على تقديم طلبات أدوات عند الحاجة لإكمال طلب. يمكن لمعظم النماذج الأكبر حجمًا التي يتم توفيرها من خلال واجهات برمجة تطبيقات الويب، مثل Gemini وClaude، تنفيذ ذلك، ولكن في المقابل، لا يمكن للنماذج الأصغر حجمًا والأكثر تخصصًا في كثير من الأحيان تنفيذ ذلك. سيُظهر Genkit رسالة خطأ إذا حاولت توفير أدوات ل نموذج لا يتوافق معها.
  • يجب أن يقدّم التطبيق المُرسِل تعريفات الأدوات إلى النموذج بال التنسيق الذي يتوقّعه.
  • يجب أن يطلب التطبيق المُرسِل من النموذج إنشاء طلبات استدعاء الأداة بالتنسيق الذي يتوقّعه التطبيق.

الاتصال بالأدوات باستخدام Genkit

توفّر أداة Genkit واجهة واحدة لاستدعاء الأدوات مع النماذج المتوافقة معها. يضمن كل مكوّن إضافي للنموذج استيفاء المعيارَين الأخيرَين من المعايير المذكورة أعلاه، ويقوم generate() في مثيل Genkit تلقائيًا بتنفيذ حلقة استدعاء الأداة الموضّحة سابقًا.

إتاحة النموذج

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

  • سيُظهر Genkit خطأً إذا حاولت توفير أدوات لنموذج لا يتوافق معها.
  • إذا كان المكوّن الإضافي يصدّر إشارات إلى النماذج، سيشير info.supports.tools إلى ما إذا كان يتيح استدعاء الأداة.

تحديد الأدوات

استخدِم الدالة defineTool() في مثيل Genkit لكتابة تعريفات الأدوات:

import { genkit, z } from 'genkit';
import { googleAI, gemini15Flash } from '@genkit-ai/google-ai';

const ai = genkit({
  plugins: [googleAI()],
  model: gemini15Flash,
});

const getWeather = ai.defineTool(
  {
    name: 'getWeather',
    description: 'Gets the current weather in a given location',
    inputSchema: z.object({ 
      location: z.string().describe('The location to get the current weather for')
    }),
    outputSchema: z.string(),
  },
  async (input) => {
    // Here, we would typically make an API call or database query. For this
    // example, we just return a fixed value.
    return 'The current weather in ${input.location} is 63°F and sunny.';
  }
);

تبدو بنية العبارة هنا مشابهة لبنية defineFlow()، ولكن يجب استخدام المَعلمات الأربعة التالية: name وdescription وinputSchema وoutputSchema. عند كتابة تعريف أداة، يجب الانتباه بشكل خاص إلى الصياغة و الوصف لهذه المَعلمات، لأنّها ضرورية لكي تتمكّن تكنولوجيات الذكاء الاصطناعي اللغوي (LLM) من الاستفادة بفعالية من الأدوات المتاحة.

استخدام الأدوات

يمكنك تضمين أدوات محدّدة في طلباتك لإنشاء المحتوى.

إنشاء

const response = await ai.generate({
  prompt: 'What is the weather in Baltimore?',
  tools: [getWeather],
});

definePrompt

const weatherPrompt = ai.definePrompt(
  {
    name: 'weatherPrompt',
    tools: [getWeather],
  },
  'What is the weather in {{location}}?'
);

const response = await weatherPrompt({ location: 'Baltimore' });

ملف الطلب

---
system: "Answer questions using the tools you have."
tools: [getWeather]
input:
  schema:
    location: string
---

What is the weather in {{location}}?

بعد ذلك، يمكنك تنفيذ الطلب في الرمز البرمجي على النحو التالي:

// assuming prompt file is named weatherPrompt.prompt
const weatherPrompt = ai.prompt('weatherPrompt');

const response = await weatherPrompt({ location: 'Baltimore' });

دردشة

const chat = ai.chat({
  system: 'Answer questions using the tools you have.',
  tools: [getWeather],
});

const response = await chat.send('What is the weather in Baltimore?');

// Or, specify tools that are message-specific 
const response = await chat.send({
  prompt: 'What is the weather in Baltimore?',
  tools: [getWeather],
});

سيتولى Genkit تلقائيًا طلب الأداة إذا كان نموذج اللغة الضخمة يحتاج إلى استخدام أداة getWeather للإجابة عن الطلب.

معالجة طلبات الأداة صراحةً

بشكلٍ تلقائي، يطلب Genkit من LLM بشكلٍ متكرّر حلّ كل طلب أداة. إذا كنت تريد التحكّم بشكل أكبر في حلقة استدعاء الأداة هذه، على سبيل المثال لتطبيق منطق أكثر تعقيدًا، اضبط المَعلمة returnToolRequests على true. تقع الآن على عاتقك مسؤولية التأكّد من استيفاء جميع طلبات الأداة:

const getWeather = ai.defineTool(
  {
    // ... tool definition ...
  },
  async ({ location }) => {
    // ... tool implementation ...
  },
);

const generateOptions: GenerateOptions = {
  prompt: "What's the weather like in Baltimore?",
  tools: [getWeather],
  returnToolRequests: true,
};

let llmResponse;
while (true) {
  llmResponse = await ai.generate(generateOptions);
  const toolRequests = llmResponse.toolRequests;
  if (toolRequests.length < 1) {
    break;
  }
  const toolResponses: ToolResponsePart[] = await Promise.all(
    toolRequests.map(async (part) => {
      switch (part.toolRequest.name) {
        case 'specialTool':
          return {
            toolResponse: {
              name: part.toolRequest.name,
              ref: part.toolRequest.ref,
              output: await getWeather(part.toolRequest.input),
            },
          };
        default:
          throw Error('Tool not found');
      }
    })
  );
  generateOptions.messages = llmResponse.messages;
  generateOptions.prompt = toolResponses;
}