نوشتن پلاگین مدل Genkit

پلاگین های مدل Genkit یک یا چند مدل هوش مصنوعی مولد را به رجیستری Genkit اضافه می کنند. مدل هر مدل تولیدی را نشان می‌دهد که قادر به دریافت یک اعلان به عنوان ورودی و تولید متن، رسانه یا داده به عنوان خروجی است.

قبل از شروع

برای اطلاعات در مورد نوشتن هر نوع پلاگین Genkit، از جمله پلاگین های مدل، افزونه های Writing 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 از این اطلاعات برای تعیین رفتارهای خاص استفاده می کند، مانند تأیید اینکه آیا ورودی های خاص برای مدل معتبر هستند یا خیر. برای مثال، اگر مدل از فعل و انفعالات چند چرخشی پشتیبانی نمی‌کند، ارسال آن به تاریخچه پیام با خطا است.

توجه داشته باشید که این اعلان‌ها به قابلیت‌های مدل ارائه‌شده توسط افزونه شما اشاره دارند و لزوماً به قابلیت‌های مدل و API مدل زیربنایی نگاشت نمی‌شوند. به عنوان مثال، حتی اگر مدل API روش خاصی برای تعریف پیام‌های سیستم ارائه ندهد، افزونه شما ممکن است همچنان از نقش سیستم پشتیبانی کند و آن را به عنوان یک منطق خاص پیاده‌سازی کند که پیام‌های سیستم را در اعلان کاربر درج می‌کند.

تعریف طرح پیکربندی مدل شما

برای تعیین گزینه های تولیدی که یک مدل پشتیبانی می کند، یک نوع پیکربندی را تعریف و صادر کنید. Genkit یک نوع ai.GenerationCommonConfig دارد که شامل گزینه‌هایی است که اغلب توسط سرویس‌های مدل هوش مصنوعی مولد پشتیبانی می‌شوند، که می‌توانید آن‌ها را جاسازی کنید یا به طور کامل از آنها استفاده کنید.

تابع تولید شما باید تأیید کند که درخواست دارای نوع گزینه صحیح است.

تغییر درخواست ها و پاسخ ها

تابع تولید کار اصلی یک پلاگین مدل Genkit را انجام می دهد: تبدیل ai.GenerateRequest از فرمت رایج Genkit به قالبی که توسط API مدل شما پشتیبانی می شود، و سپس تبدیل پاسخ از مدل شما به فرمت ai.GenerateResponse استفاده شده توسط جنکیت.

گاهی اوقات، این ممکن است نیاز به ماساژ یا دستکاری داده ها برای رفع محدودیت های مدل داشته باشد. برای مثال، اگر مدل شما به طور بومی از یک پیام system پشتیبانی نمی کند، ممکن است لازم باشد پیام سیستمی یک درخواست را به یک جفت پیام مدل کاربر تبدیل کنید.

صادرات

علاوه بر منابعی که همه افزونه ها باید صادر کنند - یک تابع Init و یک نوع Config - یک پلاگین مدل نیز باید موارد زیر را صادر کند:

  • یک نوع پیکربندی نسل، همانطور که قبلاً بحث شد.

  • یک تابع Model ، که ارجاعاتی را به مدل های تعریف شده افزونه شما برمی گرداند. اغلب، این به سادگی می تواند باشد:

    func Model(name string) *ai.Model {
        return ai.LookupModel(providerID, name)
    }
    
  • اختیاری : یک تابع DefineModel ، که به کاربران امکان می دهد مدل هایی را که افزونه شما می تواند ارائه دهد، تعریف کنند، اما شما به طور خودکار تعریف نمی کنید. دو دلیل اصلی وجود دارد که ممکن است بخواهید چنین عملکردی را ارائه دهید:

    • افزونه شما به مدل‌های بسیار زیادی دسترسی می‌دهد تا عملاً هر یک را ثبت کنید. به عنوان مثال، پلاگین Olama می‌تواند به ده‌ها مدل مختلف دسترسی داشته باشد که اغلب به آنها اضافه می‌شود. به همین دلیل، هیچ مدلی را به‌طور خودکار تعریف نمی‌کند، و در عوض کاربر را ملزم می‌کند که DefineModel برای هر مدلی که می‌خواهد استفاده کند، فراخوانی کند.

    • برای اینکه به کاربران خود توانایی استفاده از مدل های تازه منتشر شده را بدهید که هنوز به افزونه خود اضافه نکرده اید.

    تابع DefineModel پلاگین معمولاً یک frontend برای ai.DefineModel است که یک تابع تولید را تعریف می کند، اما به کاربر اجازه می دهد نام مدل و قابلیت های مدل را مشخص کند.