كتابة مكونات Genkit الإضافية

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

import { genkit } from 'genkit';
import { vertexAI } from '@genkit-ai/vertexai';

const ai = genkit({
  plugins: [vertexAI({ projectId: 'my-project' })],
});

يأخذ المكوّن الإضافي Vertex AI الإعدادات (مثل رقم تعريف مشروع Google Cloud للمستخدم) ويُسجِّل مجموعة متنوعة من النماذج الجديدة وأدوات التضمين وغير ذلك في قاعدة بيانات مسجّلي Genkit. يشغِّل السجلّ واجهة المستخدم المحلية في Genkit لتشغيل النماذج والطلبات وغيرها من الإجراءات وفحصها، كما يعمل كخدمة بحث عن الإجراءات المُسمّاة أثناء التشغيل.

إنشاء مكوّن إضافي

لإنشاء مكوّن إضافي، عليك عادةً إنشاء حزمة جديدة في NPM:

mkdir genkitx-my-plugin
cd genkitx-my-plugin
npm init -y
npm i --save genkit
npm i --save-dev typescript
npx tsc --init

بعد ذلك، حدِّد المكوّن الإضافي وصدِّره من نقطة الدخول الرئيسية:

import { Genkit, z } from 'genkit';
import { GenkitPlugin, genkitPlugin } from 'genkit/plugin';

interface MyPluginOptions {
  // add any plugin configuration here
}

export function myPlugin(options?: MyPluginOptions) {
  return genkitPlugin('myPlugin', async (ai: Genkit) => {
    ai.defineModel(...);
    ai.defineEmbedder(...)
    // ....
  });
};

إرشادات حول خيارات المكوّنات الإضافية

بشكل عام، يجب أن يأخذ المكوّن الإضافي وسيطة options واحدة تتضمّن أي إعدادات على مستوى المكوّن الإضافي ضرورية لعمله. بالنسبة إلى أي خيار مكوّن إضافي يحتاج إلى قيمة سرية، مثل مفاتيح واجهة برمجة التطبيقات، يجب تقديم خيار ومتغيّر بيئة تلقائي لإعداده:

import { Genkit, z } from 'genkit';
import { GenkitPlugin, genkitPlugin } from 'genkit/plugin';
import { GenkitError } from '@genkit-ai/core';

interface MyPluginOptions {
  apiKey?: string;
}

export function myPlugin(options?: MyPluginOptions) {
  return genkitPlugin('myPlugin', async (ai: Genkit) => {
    if (!apiKey)
      throw new GenkitError({
        source: 'my-plugin',
        status: 'INVALID_ARGUMENT',
        message:
          'Must supply either `options.apiKey` or set `MY_PLUGIN_API_KEY` environment variable.',
      });

    ai.defineModel(...);
    ai.defineEmbedder(...)
    
    // ....
  });
};

إنشاء المكوّن الإضافي

يمكن أن يؤدي مكوّن إضافي واحد إلى تفعيل العديد من الميزات الجديدة في Genkit. على سبيل المثال، يفعّل المكوّن الإضافي Vertex AI العديد من النماذج الجديدة بالإضافة إلى أداة تضمين.

المكوّنات الإضافية للنماذج

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

يتألف النموذج المخصّص بشكل عام من ثلاثة مكوّنات:

  1. البيانات الوصفية التي تحدّد إمكانات النموذج
  2. مخطّط إعدادات يتضمّن أيّ مَعلمات محدّدة يتوافق معها النموذج
  3. دالة تنفِّذ النموذج الذي يقبل GenerateRequest ويُعرِضGenerateResponse

لإنشاء مكوّن إضافي لنموذج، عليك استخدام حزمة @genkit-ai/ai:

npm i --save @genkit-ai/ai

بشكل عام، قد يبدو مكوّن إضافي لنموذج على النحو التالي:

import { genkitPlugin, GenkitPlugin } from 'genkit/plugin';
import { GenkitError } from '@genkit-ai/core';
import { GenerationCommonConfigSchema } from '@genkit-ai/ai/model';
import { simulateSystemPrompt } from '@genkit-ai/ai/model/middleware';
import { z } from 'genkit';


export function myPlugin(options?: MyPluginOptions) {
  return genkitPlugin('my-plugin', async (ai: Genkit) => {
    ai.defineModel({
      // be sure to include your plugin as a provider prefix
      name: 'my-plugin/my-model',
      // label for your model as shown in Genkit Developer UI
      label: 'My Awesome Model',
      // optional list of supported versions of your model
      versions: ['my-model-001', 'my-model-001'],
      // model support attributes
      supports: {
        multiturn: true, // true if your model supports conversations
        media: true, // true if your model supports multimodal input
        tools: true, // true if your model supports tool/function calling
        systemRole: true, // true if your model supports the system role
        output: ['text', 'media', 'json'], // types of output your model supports
      },
      // Zod schema for your model's custom configuration
      configSchema: GenerationCommonConfigSchema.extend({
        safetySettings: z.object({...}),
      }),
      // list of middleware for your model to use
      use: [simulateSystemPrompt()]
    }, async request => {
      const myModelRequest = toMyModelRequest(request);
      const myModelResponse = await myModelApi(myModelRequest);
      return toGenerateResponse(myModelResponse);
    });
  });
};


تحويل الطلبات والردود

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

وقد يتطلّب ذلك أحيانًا تعديل البيانات أو التلاعب بها للتغلب على قيود النماذج. على سبيل المثال، إذا كان النموذج لا يتيح تلقّي رسالة system بشكلٍ تلقائي، قد تحتاج إلى تحويل رسالة نظام الطلب إلى زوج من رسائل المستخدم/النموذج.

مراجع النماذج

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

import { modelRef } from "@genkit-ai/ai/model";

export myModelRef = modelRef({
  name: "my-plugin/my-model",
  configSchema: MyConfigSchema,
  info: {
    // ... model-specific info
  },
})

عند استدعاء generate()، يمكن استخدام مراجع النماذج وأسماء نماذج السلاسل بالتبادل:

import { myModelRef } from 'genkitx-my-plugin';
import { generate } from '@genkit-ai/ai';

generate({ model: myModelRef });
// is equivalent to
generate({ model: 'my-plugin/my-model' });

نشر مكوّن إضافي

يمكن نشر مكوّنات Genkit الإضافية كحِزم NPM عادية. لزيادة إمكانية العثور على الحزمة وتعزيز اتساقها، يجب تسمية الحزمة باسم genkitx-{name} للإشارة إلى أنّها مكوّن إضافي في Genkit، ويجب تضمين أكبر عدد ممكن من keywords التالية في package.json بما يتناسب مع المكوّن الإضافي:

  • genkit-plugin: يجب تضمين هذه الكلمة الرئيسية في الحزمة دائمًا للإشارة إلى أنّها مكوّن إضافي من Genkit.
  • genkit-model: أدرِج هذه الكلمة الرئيسية إذا كانت حِزمك تحدِّد أي نماذج.
  • genkit-retriever: أدرِج هذه الكلمة الرئيسية إذا كانت حِزمك تحدّد أيّ أدوات استرجاع.
  • genkit-indexer: أدرِج هذه الكلمة الرئيسية إذا كانت حِزمك تحدّد أيّ برامج فهرسة.
  • genkit-embedder: أدرِج هذه الكلمة الرئيسية إذا كانت حِزمك تحدّد أيّ برامج فهرسة.
  • genkit-tracestore: يجب تضمين هذه الكلمة الرئيسية إذا كانت حِزمك تحدّد أيّ أماكن تخزين للسجلّات.
  • genkit-statestore: أدرِج هذه الكلمة الرئيسية إذا كانت حِزمك تحدّد أي ذاكرات تخزين للحالة.
  • genkit-telemetry: أدرِج هذه الكلمة الرئيسية إذا كانت حِزمك تحدِّد مقدّم خدمة إحصاءات.
  • genkit-deploy: أدرِج هذه الكلمة الرئيسية إذا كانت حِزمك تتضمّن أدوات مساعدة لنشر تطبيقات Genkit لدى موفّري خدمات السحابة الإلكترونية.
  • genkit-flow: أدرِج هذه الكلمة الرئيسية إذا كانت حِزمك تحسِّن مسارات Genkit.

قد يتضمّن المكوّن الإضافي الذي يقدّم ميزة استرجاع البيانات ودمجها وإنشاء النماذج package.json بالشكل التالي:

{
  "name": "genkitx-my-plugin",
  "keywords": ["genkit-plugin", "genkit-retriever", "genkit-embedder", "genkit-model"],
  // ... dependencies etc.
}