تم تصميم إمكانات 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
في دالة الإعداد.
يتألف النموذج المخصّص بشكل عام من ثلاثة مكوّنات:
- البيانات الوصفية التي تحدّد إمكانات النموذج
- مخطّط إعدادات يتضمّن أيّ مَعلمات محدّدة يتوافق معها النموذج
- دالة تنفِّذ النموذج الذي يقبل
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.
}