একটি জেনকিট মডেল প্লাগইন লেখা

জেনকিট মডেল প্লাগইনগুলি জেনকিট রেজিস্ট্রিতে এক বা একাধিক জেনারেটিভ এআই মডেল যুক্ত করে। একটি মডেল এমন কোনো জেনারেটিভ মডেলকে উপস্থাপন করে যা ইনপুট হিসাবে একটি প্রম্পট গ্রহণ করতে এবং আউটপুট হিসাবে পাঠ্য, মিডিয়া বা ডেটা তৈরি করতে সক্ষম।

আপনি শুরু করার আগে

মডেল প্লাগইন সহ যেকোন ধরনের জেনকিট প্লাগ-ইন লেখার বিষয়ে তথ্যের জন্য Writing Genkit প্লাগইন পড়ুন। বিশেষ করে, মনে রাখবেন যে প্রতিটি প্লাগইনকে অবশ্যই একটি Init ফাংশন রপ্তানি করতে হবে, যা ব্যবহারকারীরা প্লাগইন ব্যবহার করার আগে কল করবে বলে আশা করা হয়।

মডেল সংজ্ঞা

সাধারণত, একটি মডেল প্লাগইন তার Init ফাংশনে এক বা একাধিক ai.DefineModel কল করবে—একবার প্রতিটি মডেলের জন্য প্লাগইনটি একটি ইন্টারফেস প্রদান করছে।

একটি মডেল সংজ্ঞা তিনটি উপাদান নিয়ে গঠিত:

  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 টাইপ রয়েছে যেটিতে জেনারেটিভ AI মডেল পরিষেবাগুলির দ্বারা ঘন ঘন সমর্থিত বিকল্পগুলি রয়েছে, যা আপনি সরাসরি এম্বেড করতে বা ব্যবহার করতে পারেন৷

আপনার প্রজন্মের ফাংশনটি যাচাই করা উচিত যে অনুরোধটিতে সঠিক বিকল্পের ধরন রয়েছে।

অনুরোধ এবং প্রতিক্রিয়া রূপান্তর

জেনারেশন ফাংশনটি একটি জেনকিট মডেল প্লাগইনের প্রাথমিক কাজ সম্পাদন করে: জেনকিটের সাধারণ বিন্যাস থেকে ai.GenerateRequest কে আপনার মডেলের API দ্বারা সমর্থিত একটি বিন্যাসে রূপান্তরিত করা এবং তারপরে আপনার মডেল থেকে প্রতিক্রিয়াটিকে ai.GenerateResponse বিন্যাসে রূপান্তর করা গেনকিট।

কখনও কখনও, মডেলের সীমাবদ্ধতাগুলির কাছাকাছি কাজ করার জন্য এটি ম্যাসেজ বা ডেটা ম্যানিপুলেট করার প্রয়োজন হতে পারে। উদাহরণস্বরূপ, যদি আপনার মডেল স্থানীয়ভাবে একটি system বার্তা সমর্থন না করে, তাহলে আপনাকে একটি প্রম্পটের সিস্টেম বার্তাকে একটি ব্যবহারকারী-মডেল বার্তা জোড়াতে রূপান্তর করতে হতে পারে।

রপ্তানি

সমস্ত প্লাগইনকে রপ্তানি করতে হবে এমন সংস্থানগুলি ছাড়াও - একটি Init ফাংশন এবং একটি Config প্রকার - একটি মডেল প্লাগইনকে নিম্নলিখিতগুলিও রপ্তানি করা উচিত:

  • একটি প্রজন্মের কনফিগার টাইপ, যেমনটি আগে আলোচনা করা হয়েছে।

  • একটি Model ফাংশন, যা আপনার প্লাগইন এর সংজ্ঞায়িত মডেলের রেফারেন্স প্রদান করে। প্রায়শই, এটি সহজভাবে হতে পারে:

    func Model(name string) *ai.Model {
        return ai.LookupModel(providerID, name)
    }
    
  • ঐচ্ছিক : একটি DefineModel ফাংশন, যা ব্যবহারকারীদের আপনার প্লাগইন প্রদান করতে পারে এমন মডেলগুলিকে সংজ্ঞায়িত করতে দেয়, কিন্তু আপনি স্বয়ংক্রিয়ভাবে সংজ্ঞায়িত করেন না। আপনি এই ধরনের একটি ফাংশন প্রদান করতে চাইতে পারেন কেন দুটি প্রধান কারণ আছে:

    • আপনার প্লাগইন ব্যবহারিকভাবে প্রতিটি একটি নিবন্ধন করার জন্য অনেক মডেল অ্যাক্সেস প্রদান করে. উদাহরণস্বরূপ, ওল্লামা প্লাগইনটি কয়েক ডজন বিভিন্ন মডেলে অ্যাক্সেস প্রদান করতে পারে, আরও ঘন ঘন যুক্ত করা হয়। এই কারণে, এটি স্বয়ংক্রিয়ভাবে কোনো মডেলকে সংজ্ঞায়িত করে না, এবং পরিবর্তে ব্যবহারকারীকে তাদের ব্যবহার করতে চান এমন প্রতিটি মডেলের জন্য DefineModel কল করতে হবে।

    • আপনার ব্যবহারকারীদের নতুন-মুক্ত করা মডেলগুলি ব্যবহার করার ক্ষমতা দিতে যা আপনি এখনও আপনার প্লাগইনে যোগ করেননি।

    একটি প্লাগইন এর DefineModel ফাংশন সাধারণত ai.DefineModel এর একটি ফ্রন্টএন্ড যা একটি প্রজন্মের ফাংশন সংজ্ঞায়িত করে, কিন্তু ব্যবহারকারীকে মডেলের নাম এবং মডেলের ক্ষমতা নির্দিষ্ট করতে দেয়।