জেনারেটিভ এআই এর কেন্দ্রবিন্দুতে রয়েছে এআই মডেল । জেনারেটিভ মডেলের দুটি সবচেয়ে বিশিষ্ট উদাহরণ হল বড় ভাষা মডেল (LLM) এবং ইমেজ জেনারেশন মডেল। এই মডেলগুলি ইনপুট গ্রহণ করে, যাকে বলা হয় প্রম্পট (সাধারণত পাঠ্য, একটি চিত্র বা উভয়ের সংমিশ্রণ), এবং এটি থেকে আউটপুট পাঠ্য, একটি চিত্র, এমনকি অডিও বা ভিডিও তৈরি করে।
এই মডেলগুলির আউটপুট আশ্চর্যজনকভাবে বিশ্বাসযোগ্য হতে পারে: এলএলএমগুলি এমন পাঠ্য তৈরি করে যা মনে হয় এটি কোনও মানুষের দ্বারা লেখা হতে পারে, এবং ইমেজ জেনারেশন মডেলগুলি এমন চিত্র তৈরি করতে পারে যা মানুষের দ্বারা তৈরি বাস্তব ফটোগ্রাফ বা শিল্পকর্মের খুব কাছাকাছি।
এছাড়াও, এলএলএমগুলি সাধারণ পাঠ্য প্রজন্মের বাইরেও কাজ করতে সক্ষম বলে প্রমাণিত হয়েছে:
- কম্পিউটার প্রোগ্রাম লেখা।
- একটি বৃহত্তর টাস্ক সম্পূর্ণ করার জন্য প্রয়োজনীয় সাবটাস্কের পরিকল্পনা করা।
- অসংগঠিত তথ্য সংগঠিত.
- পাঠ্যের একটি কর্পাস থেকে তথ্য ডেটা বোঝা এবং বের করা।
- কার্যকলাপের একটি পাঠ্য বিবরণের উপর ভিত্তি করে স্বয়ংক্রিয় ক্রিয়াকলাপগুলি অনুসরণ করা এবং সম্পাদন করা।
বিভিন্ন প্রদানকারীর কাছ থেকে আপনার কাছে অনেক মডেল উপলব্ধ। প্রতিটি মডেলের নিজস্ব শক্তি এবং দুর্বলতা রয়েছে এবং একটি মডেল একটি কাজে পারদর্শী হতে পারে কিন্তু অন্যদের ক্ষেত্রে কম ভাল পারফর্ম করতে পারে। জেনারেটিভ এআই ব্যবহার করে অ্যাপগুলি প্রায়শই হাতের কাজের উপর নির্ভর করে একাধিক ভিন্ন মডেল ব্যবহার করে উপকৃত হতে পারে।
একজন অ্যাপ ডেভেলপার হিসেবে, আপনি সাধারণত জেনারেটিভ এআই মডেলের সাথে সরাসরি ইন্টারঅ্যাক্ট করেন না, বরং ওয়েব API হিসেবে উপলব্ধ পরিষেবার মাধ্যমে। যদিও এই পরিষেবাগুলিতে প্রায়শই একই রকম কার্যকারিতা থাকে, তবে এগুলি সবগুলিই আলাদা এবং বেমানান API-এর মাধ্যমে প্রদান করে। আপনি যদি একাধিক মডেল পরিষেবা ব্যবহার করতে চান তবে আপনাকে তাদের প্রতিটি মালিকানাধীন SDK ব্যবহার করতে হবে, একে অপরের সাথে সম্ভাব্য বেমানান৷ এবং আপনি যদি একটি মডেল থেকে নতুন এবং সবচেয়ে সক্ষম মডেলে আপগ্রেড করতে চান, তাহলে আপনাকে আবার সেই ইন্টিগ্রেশন তৈরি করতে হতে পারে।
Genkit একটি একক ইন্টারফেস প্রদান করে এই চ্যালেঞ্জ মোকাবেলা করে যা ইতিমধ্যেই উপলব্ধ বেশ কিছু পূর্বনির্মাণ বাস্তবায়ন সহ সম্ভাব্য যেকোন জেনারেটিভ এআই মডেল পরিষেবা অ্যাক্সেস করার বিশদ বিবরণকে বিমূর্ত করে। Genkit-এর চারপাশে আপনার AI-চালিত অ্যাপ তৈরি করা আপনার প্রথম জেনারেটিভ AI কল করার প্রক্রিয়াটিকে সহজ করে তোলে এবং একাধিক মডেলকে একত্রিত করা বা নতুন মডেলের আবির্ভাব হওয়ার সাথে সাথে একটি মডেলকে অন্যটির জন্য অদলবদল করা সমানভাবে সহজ করে তোলে।
আপনি শুরু করার আগে
আপনি যদি এই পৃষ্ঠায় কোডের উদাহরণ চালাতে চান, তাহলে প্রথমে শুরু করুন গাইডের ধাপগুলি সম্পূর্ণ করুন৷ সমস্ত উদাহরণ অনুমান করে যে আপনি ইতিমধ্যেই আপনার প্রকল্পে নির্ভরতা হিসাবে জেনকিট ইনস্টল করেছেন।
Genkit দ্বারা সমর্থিত মডেল
জেনকিট সম্ভাব্য যেকোন জেনারেটিভ এআই মডেল পরিষেবা ব্যবহার করার জন্য যথেষ্ট নমনীয় হতে ডিজাইন করা হয়েছে। এর মূল লাইব্রেরিগুলি মডেলগুলির সাথে কাজ করার জন্য সাধারণ ইন্টারফেসকে সংজ্ঞায়িত করে এবং মডেল প্লাগইনগুলি একটি নির্দিষ্ট মডেল এবং এর API এর সাথে কাজ করার জন্য বাস্তবায়নের বিবরণ সংজ্ঞায়িত করে।
Genkit টিম Vertex AI, Google Generative AI, এবং Ollama দ্বারা প্রদত্ত মডেলগুলির সাথে কাজ করার জন্য প্লাগইনগুলি বজায় রাখে:
- Google Cloud Vertex AI প্লাগইনের মাধ্যমে LLM-এর জেমিনি পরিবার।
- গুগল এআই প্লাগইনের মাধ্যমে এলএলএম-এর মিথুন পরিবার।
- Gemma 3, Llama 4, এবং আরো অনেক উন্মুক্ত মডেল, ওল্লামা প্লাগইনের মাধ্যমে (আপনাকে অবশ্যই ওল্লামা সার্ভারটি হোস্ট করতে হবে)।
মডেল প্লাগইন লোড এবং কনফিগার করা হচ্ছে
আপনি সামগ্রী তৈরি করা শুরু করার জন্য Genkit ব্যবহার করার আগে, আপনাকে একটি মডেল প্লাগইন লোড এবং কনফিগার করতে হবে। আপনি যদি শুরু করেন গাইড থেকে আসছেন, আপনি ইতিমধ্যেই এটি করেছেন৷ অন্যথায়, শুরু করুন গাইড বা পৃথক প্লাগইনের ডকুমেন্টেশন দেখুন এবং চালিয়ে যাওয়ার আগে সেখানে পদক্ষেপগুলি অনুসরণ করুন৷
genkit.Generate()
ফাংশন
জেনকিটে, প্রাথমিক ইন্টারফেস যার মাধ্যমে আপনি জেনারেটিভ এআই মডেলের সাথে ইন্টারঅ্যাক্ট করেন তা হল genkit.Generate()
ফাংশন।
সহজতম genkit.Generate()
কলটি আপনি যে মডেলটি ব্যবহার করতে চান এবং একটি টেক্সট প্রম্পট নির্দিষ্ট করে:
import (
"context"
"log"
"github.com/firebase/genkit/go/ai"
"github.com/firebase/genkit/go/genkit"
"github.com/firebase/genkit/go/plugins/googlegenai"
)
func main() {
ctx := context.Background()
g, err := genkit.Init(ctx,
genkit.WithPlugins(&googlegenai.GoogleAI{}),
genkit.WithDefaultModel("googleai/gemini-2.0-flash"),
)
if err != nil {
log.Fatal(err)
}
resp, err := genkit.Generate(ctx, g,
ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
)
if err != nil {
log.Fatal(err)
}
log.Println(resp.Text())
}
আপনি যখন এই সংক্ষিপ্ত উদাহরণটি চালাবেন, এটি genkit.Generate()
কলের আউটপুট দ্বারা অনুসরণ করে কিছু ডিবাগিং তথ্য প্রিন্ট করবে, যা সাধারণত নিম্নলিখিত উদাহরণের মতো মার্কডাউন পাঠ্য হবে:
## The Blackheart's Bounty
**A hearty stew of slow-cooked beef, spiced with rum and molasses, served in a
hollowed-out cannonball with a side of crusty bread and a dollop of tangy
pineapple salsa.**
**Description:** This dish is a tribute to the hearty meals enjoyed by pirates
on the high seas. The beef is tender and flavorful, infused with the warm spices
of rum and molasses. The pineapple salsa adds a touch of sweetness and acidity,
balancing the richness of the stew. The cannonball serving vessel adds a fun and
thematic touch, making this dish a perfect choice for any pirate-themed
adventure.
স্ক্রিপ্টটি আবার চালান এবং আপনি একটি ভিন্ন আউটপুট পাবেন।
পূর্ববর্তী কোড নমুনাটি ডিফল্ট মডেলে প্রজন্মের অনুরোধ পাঠিয়েছে, যা আপনি যখন Genkit ইনস্ট্যান্স কনফিগার করেছিলেন তখন আপনি নির্দিষ্ট করেছিলেন।
আপনি একটি একক genkit.Generate()
কলের জন্য একটি মডেলও নির্দিষ্ট করতে পারেন:
resp, err := genkit.Generate(ctx, g,
ai.WithModelName("googleai/gemini-2.5-pro"),
ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
)
একটি মডেল স্ট্রিং শনাক্তকারী দেখায় providerid/modelid
মতো, যেখানে প্রদানকারী আইডি (এই ক্ষেত্রে, googleai
) প্লাগইনটিকে শনাক্ত করে, এবং মডেল আইডি একটি মডেলের একটি নির্দিষ্ট সংস্করণের জন্য একটি প্লাগইন-নির্দিষ্ট স্ট্রিং শনাক্তকারী৷
এই উদাহরণগুলি একটি গুরুত্বপূর্ণ বিষয়কেও তুলে ধরে: যখন আপনি genkit.Generate()
ব্যবহার করে জেনারেটিভ AI মডেল কল করতে চান, আপনি যে মডেলটি ব্যবহার করতে চান তা পরিবর্তন করা মডেল প্যারামিটারে একটি ভিন্ন মান পাস করার বিষয়। নেটিভ মডেল SDK-এর পরিবর্তে genkit.Generate()
ব্যবহার করে, আপনি নিজেকে আরও সহজে আপনার অ্যাপে বিভিন্ন মডেল ব্যবহার করতে এবং ভবিষ্যতে মডেল পরিবর্তন করতে নমনীয়তা দেন।
এখন পর্যন্ত আপনি শুধুমাত্র সহজতম genkit.Generate()
কলের উদাহরণ দেখেছেন। যাইহোক, genkit.Generate()
জেনারেটিভ মডেলগুলির সাথে আরও উন্নত ইন্টারঅ্যাকশনের জন্য একটি ইন্টারফেস প্রদান করে, যা আপনি অনুসরণকারী বিভাগে দেখতে পাবেন।
সিস্টেম প্রম্পট
কিছু মডেল একটি সিস্টেম প্রম্পট প্রদানকে সমর্থন করে, যা ব্যবহারকারীর কাছ থেকে আসা বার্তাগুলিতে আপনি কীভাবে প্রতিক্রিয়া জানাতে চান তার মডেল নির্দেশাবলী দেয়। আপনি সিস্টেম প্রম্পট ব্যবহার করতে পারেন বৈশিষ্ট্যগুলি নির্দিষ্ট করতে যেমন আপনি মডেলটিকে গ্রহণ করতে চান এমন একটি ব্যক্তিত্ব, এর প্রতিক্রিয়াগুলির স্বর এবং এর প্রতিক্রিয়াগুলির বিন্যাস৷
আপনি যে মডেলটি ব্যবহার করছেন সেটি যদি সিস্টেম প্রম্পট সমর্থন করে, তাহলে আপনি WithSystem()
বিকল্পের সাথে একটি প্রদান করতে পারেন:
resp, err := genkit.Generate(ctx, g,
ai.WithSystem("You are a food industry marketing consultant."),
ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
)
যে মডেলগুলি সিস্টেম প্রম্পট সমর্থন করে না তাদের জন্য, WithSystem()
একটি সিস্টেম প্রম্পটের মতো উপস্থিত হওয়ার অনুরোধটি সংশোধন করে এটিকে অনুকরণ করে।
মডেল পরামিতি
genkit.Generate()
ফাংশনটি একটি WithConfig()
বিকল্প নেয়, যার মাধ্যমে আপনি ঐচ্ছিক সেটিংস নির্দিষ্ট করতে পারেন যা নিয়ন্ত্রণ করে কিভাবে মডেল সামগ্রী তৈরি করে:
resp, err := genkit.Generate(ctx, g,
ai.WithModelName("googleai/gemini-2.0-flash"),
ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
ai.WithConfig(&googlegenai.GeminiConfig{
MaxOutputTokens: 500,
StopSequences: ["<end>", "<fin>"],
Temperature: 0.5,
TopP: 0.4,
TopK: 50,
}),
)
সমর্থিত সঠিক প্যারামিটারগুলি পৃথক মডেল এবং মডেল API এর উপর নির্ভর করে। যাইহোক, পূর্ববর্তী উদাহরণের পরামিতিগুলি প্রায় প্রতিটি মডেলের জন্য সাধারণ। নিম্নলিখিত এই পরামিতিগুলির একটি ব্যাখ্যা:
প্যারামিটার যা আউটপুট দৈর্ঘ্য নিয়ন্ত্রণ করে
MaxOutputTokens
এলএলএমগুলি টোকেন নামে এককগুলিতে কাজ করে৷ একটি টোকেন সাধারণত, কিন্তু অগত্যা নয়, অক্ষরের একটি নির্দিষ্ট ক্রম অনুসারে মানচিত্র। আপনি যখন একটি মডেলে একটি প্রম্পট পাস করেন, তখন এটির প্রথম পদক্ষেপগুলির মধ্যে একটি হল আপনার প্রম্পট স্ট্রিংকে টোকেনগুলির একটি অনুক্রমে টোকেনাইজ করা ৷ তারপর, LLM টোকেনাইজড ইনপুট থেকে টোকেনের একটি ক্রম তৈরি করে। অবশেষে, টোকেনগুলির ক্রমটি পাঠ্যে রূপান্তরিত হয়, যা আপনার আউটপুট।
সর্বোচ্চ আউটপুট টোকেন প্যারামিটার LLM ব্যবহার করে কতগুলি টোকেন তৈরি করতে হবে তার একটি সীমা নির্ধারণ করে। প্রতিটি মডেল সম্ভাব্যভাবে একটি ভিন্ন টোকেনাইজার ব্যবহার করে, কিন্তু একটি ভাল নিয়ম হল একটি ইংরেজি শব্দকে 2 থেকে 4টি টোকেন দিয়ে তৈরি করা বিবেচনা করা।
যেমনটি আগে বলা হয়েছে, কিছু টোকেন অক্ষর অনুক্রমের মানচিত্র নাও হতে পারে। এরকম একটি উদাহরণ হল যে প্রায়শই একটি টোকেন থাকে যা সিকোয়েন্সের শেষ নির্দেশ করে: যখন একটি LLM এই টোকেন তৈরি করে, এটি আরও তৈরি করা বন্ধ করে দেয়। অতএব, এটি সম্ভব এবং প্রায়শই একটি LLM সর্বোচ্চ থেকে কম টোকেন তৈরি করে কারণ এটি "স্টপ" টোকেন তৈরি করেছে।
স্টপ সিকোয়েন্স
আপনি টোকেন বা টোকেন সিকোয়েন্স সেট করতে এই প্যারামিটারটি ব্যবহার করতে পারেন যা জেনারেট হলে এলএলএম আউটপুটের শেষ নির্দেশ করে। এখানে ব্যবহার করার জন্য সঠিক মানগুলি সাধারণত মডেলটি কীভাবে প্রশিক্ষিত হয়েছিল তার উপর নির্ভর করে এবং সাধারণত মডেল প্লাগইন দ্বারা সেট করা হয়। যাইহোক, যদি আপনি মডেলটিকে অন্য একটি স্টপ সিকোয়েন্স তৈরি করার জন্য অনুরোধ করেন, আপনি এটি এখানে উল্লেখ করতে পারেন।
মনে রাখবেন আপনি অক্ষর ক্রম নির্দিষ্ট করছেন, এবং প্রতি টোকেন নয়। বেশিরভাগ ক্ষেত্রে, আপনি একটি অক্ষর ক্রম নির্দিষ্ট করবেন যা মডেলের টোকেনাইজার একটি একক টোকেনে মানচিত্র করে।
প্যারামিটার যা "সৃজনশীলতা" নিয়ন্ত্রণ করে
তাপমাত্রা , top-p , এবং top-k প্যারামিটার একসাথে নিয়ন্ত্রণ করে যে আপনি মডেলটিকে কতটা "সৃজনশীল" হতে চান৷ এই বিভাগটি এই পরামিতিগুলির অর্থ কী তার খুব সংক্ষিপ্ত ব্যাখ্যা প্রদান করে, তবে আরও গুরুত্বপূর্ণ বিষয় হল: এই প্যারামিটারগুলি একটি LLM-এর আউটপুটের চরিত্র সামঞ্জস্য করতে ব্যবহৃত হয়। তাদের জন্য সর্বোত্তম মানগুলি আপনার লক্ষ্য এবং পছন্দগুলির উপর নির্ভর করে এবং শুধুমাত্র পরীক্ষার মাধ্যমে পাওয়া যেতে পারে।
তাপমাত্রা
এলএলএম হল মৌলিকভাবে টোকেন-ভবিষ্যদ্বাণী করার মেশিন। টোকেনগুলির একটি প্রদত্ত অনুক্রমের জন্য (যেমন প্রম্পট) একটি LLM ভবিষ্যদ্বাণী করে, প্রতিটি টোকেনের জন্য তার শব্দভাণ্ডারে, টোকেনটি অনুক্রমের পরে আসার সম্ভাবনা। তাপমাত্রা হল একটি স্কেলিং ফ্যাক্টর যার দ্বারা এই ভবিষ্যদ্বাণীগুলিকে 0 এবং 1 এর মধ্যে সম্ভাব্যতা স্বাভাবিক করার আগে ভাগ করা হয়।
নিম্ন তাপমাত্রার মান—0.0 এবং 1.0-এর মধ্যে—টোকেনগুলির মধ্যে সম্ভাবনার পার্থক্যকে প্রসারিত করে, ফলে মডেলটি এমন একটি টোকেন তৈরি করার সম্ভাবনাও কম হবে যা ইতিমধ্যেই অসম্ভাব্য বলে মূল্যায়ন করা হয়েছে। এটি প্রায়ই কম সৃজনশীল আউটপুট হিসাবে অনুভূত হয়। যদিও 0.0 প্রযুক্তিগতভাবে একটি বৈধ মান নয়, অনেক মডেল এটিকে ইঙ্গিত করে যে মডেলটিকে নির্ধারকভাবে আচরণ করা উচিত এবং শুধুমাত্র একক সম্ভাব্য টোকেন বিবেচনা করা উচিত।
উচ্চ তাপমাত্রার মানগুলি—যেগুলি 1.0-এর বেশি—টোকেনগুলির মধ্যে সম্ভাবনার পার্থক্যগুলিকে সংকুচিত করে, যার ফলস্বরূপ মডেলটি এমন টোকেন তৈরি করার সম্ভাবনা বেশি হয়ে যায় যা পূর্বে অসম্ভাব্য বলে মূল্যায়ন করা হয়েছিল। এটি প্রায়শই আউটপুট হিসাবে অনুভূত হয় যা আরও সৃজনশীল। কিছু মডেল API সর্বোচ্চ তাপমাত্রা আরোপ করে, প্রায়ই 2.0।
টপপি
Top-p হল 0.0 এবং 1.0 এর মধ্যে একটি মান যা টোকেনগুলির ক্রমবর্ধমান সম্ভাব্যতা নির্দিষ্ট করে মডেলটিকে বিবেচনা করতে চান এমন সম্ভাব্য টোকেনের সংখ্যা নিয়ন্ত্রণ করে৷ উদাহরণস্বরূপ, 1.0 এর মান মানে প্রতিটি সম্ভাব্য টোকেন বিবেচনা করা (কিন্তু তারপরও প্রতিটি টোকেনের সম্ভাব্যতা বিবেচনা করা)। 0.4 মান মানে শুধুমাত্র সবচেয়ে সম্ভাব্য টোকেন বিবেচনা করা, যার সম্ভাব্যতা 0.4 পর্যন্ত যোগ করা এবং বাকি টোকেনগুলিকে বিবেচনা থেকে বাদ দেওয়া।
টপকে
Top-k হল একটি পূর্ণসংখ্যার মান যা আপনি মডেলটিকে বিবেচনা করতে চান এমন সম্ভাব্য টোকেনের সংখ্যাও নিয়ন্ত্রণ করে, কিন্তু এবার স্পষ্টভাবে টোকেনের সর্বাধিক সংখ্যা নির্দিষ্ট করে। 1 এর একটি মান নির্দিষ্ট করার অর্থ হল মডেলটিকে নির্ধারকভাবে আচরণ করা উচিত।
মডেল পরামিতি সঙ্গে পরীক্ষা
আপনি বিকাশকারী UI ব্যবহার করে বিভিন্ন মডেল এবং প্রম্পট সংমিশ্রণ দ্বারা উত্পন্ন আউটপুটে এই পরামিতিগুলির প্রভাব নিয়ে পরীক্ষা করতে পারেন। genkit start
কমান্ড দিয়ে বিকাশকারী UI শুরু করুন এবং এটি স্বয়ংক্রিয়ভাবে আপনার প্রকল্পে কনফিগার করা প্লাগইন দ্বারা সংজ্ঞায়িত সমস্ত মডেল লোড করবে। কোডে বারবার এই পরিবর্তনগুলি না করেই আপনি দ্রুত বিভিন্ন প্রম্পট এবং কনফিগারেশন মান চেষ্টা করতে পারেন।
এর কনফিগারেশনের সাথে মডেলটি পেয়ার করুন
প্রদত্ত যে প্রতিটি প্রদানকারী বা এমনকি একটি নির্দিষ্ট মডেলের নিজস্ব কনফিগারেশন স্কিমা থাকতে পারে বা নির্দিষ্ট সেটিংসের নিশ্চয়তা দিতে পারে, এটি WithModelName()
এবং WithConfig()
ব্যবহার করে পৃথক বিকল্প সেট করার ক্ষেত্রে ত্রুটি প্রবণ হতে পারে কারণ পরবর্তীটি আগেরটির সাথে দৃঢ়ভাবে টাইপ করা হয়নি।
একটি মডেলকে এর কনফিগারেশনের সাথে যুক্ত করতে, আপনি একটি মডেল রেফারেন্স তৈরি করতে পারেন যা আপনি পরিবর্তে জেনারেট কলে পাস করতে পারেন:
model := googlegenai.GoogleAIModelRef("gemini-2.0-flash", &googlegenai.GeminiConfig{
MaxOutputTokens: 500,
StopSequences: ["<end>", "<fin>"],
Temperature: 0.5,
TopP: 0.4,
TopK: 50,
})
resp, err := genkit.Generate(ctx, g,
ai.WithModel(model),
ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
)
if err != nil {
log.Fatal(err)
}
মডেল রেফারেন্সের জন্য কনস্ট্রাক্টর প্রয়োগ করবে যে সঠিক কনফিগার টাইপ প্রদান করা হয়েছে যা অমিল কমাতে পারে।
স্ট্রাকচার্ড আউটপুট
আপনার অ্যাপ্লিকেশনে একটি উপাদান হিসাবে জেনারেটিভ এআই ব্যবহার করার সময়, আপনি প্রায়শই প্লেইন টেক্সট ছাড়া অন্য ফর্ম্যাটে আউটপুট চান। এমনকি যদি আপনি ব্যবহারকারীর কাছে প্রদর্শনের জন্য সামগ্রী তৈরি করেন তবে আপনি কেবল ব্যবহারকারীর কাছে আরও আকর্ষণীয়ভাবে উপস্থাপন করার উদ্দেশ্যে কাঠামোগত আউটপুট থেকে উপকৃত হতে পারেন। কিন্তু জেনারেটিভ এআই-এর আরও উন্নত অ্যাপ্লিকেশনের জন্য, যেমন মডেলের আউটপুটের প্রোগ্রাম্যাটিক ব্যবহার, বা এক মডেলের আউটপুটকে অন্য মডেলে খাওয়ানো, কাঠামোগত আউটপুট আবশ্যক।
Genkit-এ, আপনি genkit.Generate()
কল করার সময় একটি আউটপুট প্রকার উল্লেখ করে একটি মডেল থেকে কাঠামোগত আউটপুট অনুরোধ করতে পারেন :
type MenuItem struct {
Name string `json:"name"`
Description string `json:"description"`
Calories int `json:"calories"`
Allergens []string `json:"allergens"`
}
resp, err := genkit.Generate(ctx, g,
ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
ai.WithOutputType(MenuItem{}),
)
if err != nil {
log.Fatal(err) // One possible error is that the response does not conform to the type.
}
invopop/jsonschema
প্যাকেজ ব্যবহার করে মডেল আউটপুট প্রকার JSON স্কিমা হিসাবে নির্দিষ্ট করা হয়। এটি রানটাইম টাইপ চেকিং প্রদান করে, যা স্ট্যাটিক গো প্রকার এবং জেনারেটিভ এআই মডেলের অপ্রত্যাশিত আউটপুটের মধ্যে ব্যবধান পূরণ করে। এই সিস্টেমটি আপনাকে কোড লিখতে দেয় যা এই সত্যটির উপর নির্ভর করতে পারে যে একটি সফল জেনারেট কল সর্বদা আপনার Go প্রকারের সাথে সামঞ্জস্যপূর্ণ আউটপুট ফিরিয়ে দেবে।
আপনি যখন genkit.Generate()
এ একটি আউটপুট প্রকার নির্দিষ্ট করেন, তখন Genkit পর্দার আড়ালে বেশ কিছু কাজ করে:
- নির্বাচিত আউটপুট বিন্যাস সম্পর্কে অতিরিক্ত নির্দেশিকা সহ প্রম্পটকে বৃদ্ধি করে। আপনি ঠিক কোন বিষয়বস্তু তৈরি করতে চান তা মডেলকে নির্দিষ্ট করারও এটির পার্শ্বপ্রতিক্রিয়া রয়েছে (উদাহরণস্বরূপ, শুধুমাত্র একটি মেনু আইটেমের প্রস্তাবনাই নয়, একটি বিবরণ, অ্যালার্জেনের তালিকা এবং আরও অনেক কিছু তৈরি করুন)।
- আউটপুট স্কিমার সাথে সামঞ্জস্যপূর্ণ কিনা তা যাচাই করে।
- মডেল আউটপুটকে গো টাইপে মার্শাল করে।
একটি সফল জেনারেট কল থেকে কাঠামোগত আউটপুট পেতে, টাইপের একটি খালি মান সহ মডেল প্রতিক্রিয়াতে Output()
কল করুন:
var item MenuItem
if err := resp.Output(&item); err != nil {
log.Fatalf(err)
}
log.Printf("%s (%d calories, %d allergens): %s\n",
item.Name, item.Calories, len(item.Allergens), item.Description)
বিকল্পভাবে, আপনি আরও সংক্ষিপ্ত কলের জন্য genkit.GenerateData()
ব্যবহার করতে পারেন:
item, resp, err := genkit.GenerateData[MenuItem](ctx, g,
ai.WithPrompt("Invent a menu item for a pirate themed restaurant."),
)
if err != nil {
log.Fatal(err)
}
log.Printf("%s (%d calories, %d allergens): %s\n",
item.Name, item.Calories, len(item.Allergens), item.Description)
এই ফাংশনের জন্য আউটপুট টাইপ প্যারামিটার প্রয়োজন কিন্তু স্বয়ংক্রিয়ভাবে WithOutputType()
বিকল্প সেট করে এবং মান ফেরত দেওয়ার আগে resp.Output()
কল করে।
হ্যান্ডলিং ত্রুটি
পূর্বের উদাহরণে নোট করুন যে genkit.Generate()
কলের ফলে একটি ত্রুটি হতে পারে। একটি সম্ভাব্য ত্রুটি ঘটতে পারে যখন মডেলটি স্কিমার সাথে সামঞ্জস্যপূর্ণ আউটপুট তৈরি করতে ব্যর্থ হয়। এই ধরনের ত্রুটিগুলি মোকাবেলা করার জন্য সর্বোত্তম কৌশলটি আপনার সঠিক ব্যবহারের ক্ষেত্রে নির্ভর করবে, তবে এখানে কিছু সাধারণ ইঙ্গিত রয়েছে:
একটি ভিন্ন মডেল চেষ্টা করুন . কাঠামোবদ্ধ আউটপুট সফল হওয়ার জন্য, মডেলটিকে অবশ্যই JSON-এ আউটপুট তৈরি করতে সক্ষম হতে হবে। মিথুনের মতো সবচেয়ে শক্তিশালী এলএলএমগুলি এটি করার জন্য যথেষ্ট বহুমুখী; যাইহোক, ছোট মডেল, যেমন কিছু স্থানীয় মডেল যা আপনি ওল্লামার সাথে ব্যবহার করবেন, তারা নির্ভরযোগ্যভাবে কাঠামোগত আউটপুট তৈরি করতে সক্ষম হবে না যদি না তাদের এটি করার জন্য বিশেষভাবে প্রশিক্ষণ দেওয়া হয়।
স্কিমা সরলীকরণ করুন । LLM-এর জটিল বা গভীরভাবে নেস্টেড ধরনের তৈরি করতে সমস্যা হতে পারে। আপনি যদি নির্ভরযোগ্যভাবে স্ট্রাকচার্ড ডেটা তৈরি করতে না পারেন তবে পরিষ্কার নাম, কম ক্ষেত্র বা সমতল কাঠামো ব্যবহার করার চেষ্টা করুন।
genkit.Generate()
কলটি পুনরায় চেষ্টা করুন । আপনি যে মডেলটি বেছে নিয়েছেন তা যদি খুব কমই কনফরম্যান্ট আউটপুট জেনারেট করতে ব্যর্থ হয়, তাহলে আপনি ত্রুটিটিকে এমনভাবে বিবেচনা করতে পারেন যেভাবে আপনি একটি নেটওয়ার্ক ত্রুটিকে বিবেচনা করবেন এবং কিছু ধরণের বর্ধিত ব্যাক-অফ কৌশল ব্যবহার করে অনুরোধটি পুনরায় চেষ্টা করুন।
স্ট্রিমিং
প্রচুর পরিমাণে টেক্সট তৈরি করার সময়, আপনি আপনার ব্যবহারকারীদের জন্য আউটপুট তৈরির মতো করে উপস্থাপন করে অভিজ্ঞতা উন্নত করতে পারেন—আউটপুট স্ট্রিমিং। অ্যাকশনে স্ট্রিমিংয়ের একটি পরিচিত উদাহরণ বেশিরভাগ LLM চ্যাট অ্যাপগুলিতে দেখা যেতে পারে: ব্যবহারকারীরা তাদের বার্তার মডেলের প্রতিক্রিয়া পড়তে পারেন কারণ এটি তৈরি হচ্ছে, যা অ্যাপ্লিকেশনটির অনুভূত প্রতিক্রিয়াশীলতাকে উন্নত করে এবং একজন বুদ্ধিমান প্রতিপক্ষের সাথে চ্যাট করার বিভ্রমকে উন্নত করে।
জেনকিটে, আপনি WithStreaming()
বিকল্পটি ব্যবহার করে আউটপুট স্ট্রিম করতে পারেন:
resp, err := genkit.Generate(ctx, g,
ai.WithPrompt("Suggest a complete menu for a pirate themed restaurant."),
ai.WithStreaming(func(ctx context.Context, chunk *ai.ModelResponseChunk) error {
// Do something with the chunk...
log.Println(chunk.Text())
return nil
}),
)
if err != nil {
log.Fatal(err)
}
log.Println(resp.Text())
মাল্টিমোডাল ইনপুট
আপনি এখন পর্যন্ত যে উদাহরণগুলি দেখেছেন সেগুলি মডেল প্রম্পট হিসাবে পাঠ্য স্ট্রিং ব্যবহার করেছে। যদিও এটি জেনারেটিভ এআই মডেলগুলিকে প্রম্পট করার সবচেয়ে সাধারণ উপায় হিসাবে রয়ে গেছে, অনেক মডেল অন্যান্য মিডিয়াকেও প্রম্পট হিসাবে গ্রহণ করতে পারে। মিডিয়া প্রম্পটগুলি প্রায়শই টেক্সট প্রম্পটের সাথে একত্রে ব্যবহৃত হয় যা মডেলকে মিডিয়াতে কিছু অপারেশন করার নির্দেশ দেয়, যেমন একটি চিত্রের ক্যাপশন বা একটি অডিও রেকর্ডিং প্রতিলিপি করা।
মিডিয়া ইনপুট গ্রহণ করার ক্ষমতা এবং আপনি যে ধরনের মিডিয়া ব্যবহার করতে পারেন তা সম্পূর্ণরূপে মডেল এবং এর API এর উপর নির্ভরশীল। উদাহরণস্বরূপ, জেমিনি 2.0 সিরিজের মডেলগুলি প্রম্পট হিসাবে ছবি, ভিডিও এবং অডিও গ্রহণ করতে পারে।
genkit.Generate()
এ একটি সাধারণ পাঠ্য প্রম্পট পাস করার পরিবর্তে, একটি মিডিয়া অংশ এবং একটি পাঠ্য অংশ সমন্বিত একটি অ্যারে পাস করুন। এই উদাহরণটি একটি সর্বজনীনভাবে অ্যাক্সেসযোগ্য HTTPS URL ব্যবহার করে একটি চিত্র নির্দিষ্ট করে৷
resp, err := genkit.Generate(ctx, g,
ai.WithModelName("googleai/gemini-2.0-flash"),
ai.WithMessages(
NewUserMessage(
NewMediaPart("image/jpeg", "https://example.com/photo.jpg"),
NewTextPart("Compose a poem about this image."),
),
),
)
আপনি একটি ডেটা URL হিসাবে এনকোড করে সরাসরি মিডিয়া ডেটা পাস করতে পারেন৷ যেমন:
image, err := ioutil.ReadFile("photo.jpg")
if err != nil {
log.Fatal(err)
}
resp, err := genkit.Generate(ctx, g,
ai.WithModelName("googleai/gemini-2.0-flash"),
ai.WithMessages(
NewUserMessage(
NewMediaPart("image/jpeg", "data:image/jpeg;base64," + base64.StdEncoding.EncodeToString(image)),
NewTextPart("Compose a poem about this image."),
),
),
)
মিডিয়া ইনপুট সমর্থন করে এমন সমস্ত মডেল ডেটা URL এবং HTTPS URL উভয়কেই সমর্থন করে। কিছু মডেল প্লাগইন অন্যান্য মিডিয়া উৎসের জন্য সমর্থন যোগ করে। উদাহরণস্বরূপ, Vertex AI প্লাগইন আপনাকে ক্লাউড স্টোরেজ ( gs://
) ইউআরএল ব্যবহার করতে দেয়।
পরবর্তী পদক্ষেপ
Genkit সম্পর্কে আরও জানুন
- একজন অ্যাপ ডেভেলপার হিসেবে, আপনি যে প্রাথমিক উপায়ে জেনারেটিভ এআই মডেলের আউটপুটকে প্রভাবিত করেন তা হল প্রম্পটিংয়ের মাধ্যমে। কীভাবে জেনকিট আপনাকে কার্যকর প্রম্পট তৈরি করতে এবং আপনার কোডবেসে সেগুলি পরিচালনা করতে সহায়তা করে তা জানতে ডটপ্রম্পটের সাথে ম্যানেজিং প্রম্পট পড়ুন।
- যদিও
genkit.Generate()
হল প্রতিটি জেনারেটিভ AI চালিত অ্যাপ্লিকেশনের নিউক্লিয়াস, বাস্তব-বিশ্বের অ্যাপ্লিকেশনগুলির জন্য সাধারণত একটি জেনারেটিভ AI মডেল ব্যবহার করার আগে এবং পরে অতিরিক্ত কাজের প্রয়োজন হয়। এটি প্রতিফলিত করার জন্য, জেনকিট প্রবাহের ধারণাটি প্রবর্তন করে, যা ফাংশনের মতো সংজ্ঞায়িত করা হয় তবে অতিরিক্ত বৈশিষ্ট্যগুলি যেমন পর্যবেক্ষণযোগ্যতা এবং সরলীকৃত স্থাপনার যোগ করে। আরও জানতে, AI কর্মপ্রবাহের সংজ্ঞা দেখুন।
উন্নত এলএলএম ব্যবহার
এলএলএম থেকে আরও বেশি সুবিধা পেতে আপনার অ্যাপ ব্যবহার করতে পারে এমন কৌশল রয়েছে।
- এলএলএম-এর সক্ষমতা বাড়ানোর একটি উপায় হল তারা আপনার কাছ থেকে আরও তথ্যের অনুরোধ করতে পারে বা আপনাকে কিছু কাজ করার জন্য অনুরোধ করতে পারে তার একটি তালিকা দিয়ে তাদের প্রম্পট করা। এটি টুল কলিং বা ফাংশন কলিং নামে পরিচিত। এই ক্ষমতাকে সমর্থন করার জন্য প্রশিক্ষিত মডেলগুলি একটি বিশেষভাবে বিন্যাসিত প্রতিক্রিয়া সহ একটি প্রম্পটে প্রতিক্রিয়া জানাতে পারে, যা কলিং অ্যাপ্লিকেশনকে ইঙ্গিত দেয় যে এটির কিছু পদক্ষেপ করা উচিত এবং মূল প্রম্পটের সাথে LLM-এ ফলাফলটি ফেরত পাঠানো উচিত। জেনকিটের লাইব্রেরি ফাংশন রয়েছে যা একটি টুল কলিং বাস্তবায়নের প্রম্পট জেনারেশন এবং কল-প্রতিক্রিয়া লুপ উপাদান উভয়কেই স্বয়ংক্রিয় করে। আরও জানতে টুল কলিং দেখুন।
- পুনরুদ্ধার-অগমেন্টেড জেনারেশন (RAG) হল একটি মডেলের আউটপুটে ডোমেন-নির্দিষ্ট তথ্য প্রবর্তন করার জন্য ব্যবহৃত একটি কৌশল। এটি ভাষার মডেলে পাঠানোর আগে একটি প্রম্পটে প্রাসঙ্গিক তথ্য সন্নিবেশ করে সম্পন্ন করা হয়। একটি সম্পূর্ণ RAG বাস্তবায়নের জন্য আপনাকে বেশ কয়েকটি প্রযুক্তি একত্রে আনতে হবে: টেক্সট এমবেডিং জেনারেশন মডেল, ভেক্টর ডাটাবেস এবং বড় ভাষা মডেল। Genkit কিভাবে এই বিভিন্ন উপাদানের সমন্বয়ের প্রক্রিয়াকে সহজ করে তা শিখতে Retrieval-augmented generation (RAG) দেখুন।