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

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

قبل البدء

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

تعريفات النماذج

وبشكل عام، سيُجري المكوّن الإضافي للنموذج طلبًا واحدًا أو أكثر من استدعاءات ai.DefineModel في Init: مرة واحدة لكل نموذج يوفّر المكوّن الإضافي واجهة إليه.

يتألف تعريف النموذج من ثلاثة مكونات:

  1. البيانات الوصفية التي تحدد إمكانيات النموذج.
  2. يشير ذلك المصطلح إلى نوع ضبط يتضمّن أي مَعلمات محدَّدة يدعمها النموذج.
  3. دالة إنشاء تقبل ai.GenerateRequest وتعرض ai.GenerateResponse، من المفترض أن يستخدم نموذج الذكاء الاصطناعي (AI) لإنشاء المحتوى الأخير.

على مستوى عالٍ، إليك كيف يبدو ذلك في الرموز البرمجية:

type MyModelConfig struct {
	ai.GenerationCommonConfig
	CustomOption int
	AnotherCustomOption string
}
ai.DefineModel(
	providerID, "my-model",
	&ai.ModelMetadata{
		Label: "my-model",
		Supports: ai.ModelCapabilities{
			Multiturn:  true,  // Does the model support multi-turn chats?
			SystemRole: true,  // Does the model support syatem messages?
			Media:      false, // Can the model accept media input?
			Tools:      false, // Does the model support function calling (tools)?
		},
	},
	func(ctx context.Context,
		genRequest *ai.GenerateRequest,
		_ ai.ModelStreamingCallback,
	) (*ai.GenerateResponse, error) {
		// Verify that the request includes a configuration that conforms to
		// your schema .
		if _, ok := genRequest.Config.(MyModelConfig); !ok {
			return nil, fmt.Errorf("request config must be type MyModelConfig")
		}

		// Use your custom logic to convert Genkit's ai.GenerateRequest
		// into a form usable by the model's native API.
		apiRequest, err := apiRequestFromGenkitRequest(genRequest)
		if err != nil {
			return nil, err
		}

		// Send the request to the model API, using your own code or the
		// model API's client library.
		apiResponse, err := callModelAPI(apiRequest)
		if err != nil {
			return nil, err
		}

		// Use your custom logic to convert the model's response to Genkin's
		// ai.GenerateResponse.
		response, err := genResponseFromAPIResponse(apiResponse)
		if err != nil {
			return nil, err
		}

		return response, nil
	},
)

الإعلان عن إمكانات النموذج

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

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

تحديد مخطط تكوين النموذج

لتحديد خيارات الإنشاء التي يدعمها النموذج، حدد وصدِّر نوع التهيئة. تحتوي مجموعة Genkit على النوع ai.GenerationCommonConfig الذي يحتوي على المتاحة بشكل متكرر بواسطة خدمات نموذج الذكاء الاصطناعي التوليدي، التي يمكنك تضمينها أو استخدامها بشكل مباشر

يجب أن تتحقق دالة الإنشاء من أن الطلب يحتوي على القيم نوع الخيارات.

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

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

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

عمليات التصدير

بالإضافة إلى الموارد التي يجب على جميع المكوّنات الإضافية تصديرها، وهي Init والنوع Config — يجب أن يصدِّر المكوِّن الإضافي للنموذج أيضًا التالي:

  • نوع إعداد الإنشاء، كما تمت مناقشته سابقًا.

  • دالة Model التي تعرض مراجع لنماذج المكوّن الإضافي المحددة. وغالبًا ما يكون ذلك ببساطة:

    func Model(name string) *ai.Model {
        return ai.LookupModel(providerID, name)
    }
    
  • اختياري: دالة DefineModel، التي تتيح للمستخدمين تحديد النماذج التي التي يمكن أن يوفرها المكون الإضافي، لكن لا يمكنك تحديدها تلقائيًا. تتوفر هناك سببان رئيسيان وراء رغبتك في توفير هذه الدالة:

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

    • لمنح المستخدمين القدرة على استخدام النماذج التي تم إصدارها حديثًا والتي لديك لم تتم إضافتها بعد إلى المكون الإضافي.

    تكون دالة DefineModel للمكوّن الإضافي عادةً واجهة أمامية لـ ai.DefineModel تحدد دالة الإنشاء، ولكن تتيح للمستخدم تحديد اسم النموذج وإمكانات النماذج.