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

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

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

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

  • المعلومات التي تتغير باستمرار، مثل قائمة الطعام اليومية في مطعم أو حالة مخزون المتجر.
  • معلومات خاصة بنطاق تطبيقك، مثل معلومات المنتجات

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

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

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

تنفيذ إجراء عند بدء النموذج من خلال نموذج لغوي كبير (LLM)

  • تشغيل الأضواء وإيقافها في مساعد منزلي مستنِد إلى النموذج اللغوي الكبير (LLM)
  • حجز حجوزات الطاولات في وكيل مطعم يستند إلى النموذج اللغوي الكبير

قبل البدء

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

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

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

على المستوى العام، هذا ما يشبه التفاعل المعتاد مع النموذج اللغوي الكبير (LLM) عن طريق استدعاء الأدوات. يشبه:

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

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

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

استخدام أداة Genkit

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

دعم النموذج

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

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

أدوات التعريف

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

const specialToolInputSchema = z.object({ meal: z.enum(["breakfast", "lunch", "dinner"]) });
const specialTool = defineTool(
  {
    name: "specialTool",
    description: "Retrieves today's special for the given meal",
    inputSchema: specialToolInputSchema,
    outputSchema: z.string(),
  },
  async ({ meal }): Promise<string> => {
    // Retrieve up-to-date information and return it. Here, we just return a
    // fixed value.
    return "Baked beans on toast";
  }
);

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

تضمين الأدوات في طلباتك

بعد تحديد الأدوات، حددها في معلمة الأدوات generate():

const llmResponse = await generate({
  model: gemini15Flash,
  prompt,
  tools: [specialTool],
});

يمكنك إتاحة أدوات متعددة؛ ستحدّد النموذج اللغوي الكبير الأدوات حسب الضرورة لإكمال المطالبة.

التعامل مع طلبات الأدوات بوضوح

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

let generateOptions: GenerateOptions = {
  model: gemini15Flash,
  prompt,
  tools: [specialTool],
  returnToolRequests: true,
};
let llmResponse;
while (true) {
  llmResponse = await 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 specialTool(specialToolInputSchema.parse(part.toolRequest?.input)),
            },
          };
        default:
          throw Error('Tool not found');
        }
      }));
    generateOptions.history = llmResponse.toHistory();
    generateOptions.prompt = toolResponses;
}