এআই মডেলগুলির সাথে সামগ্রী তৈরি করা

জেনারেটিভ এআই এর কেন্দ্রবিন্দুতে রয়েছে এআই মডেল । বর্তমানে, জেনারেটিভ মডেলের দুটি সবচেয়ে বিশিষ্ট উদাহরণ হল বড় ভাষা মডেল (LLM) এবং ইমেজ জেনারেশন মডেল। এই মডেলগুলি ইনপুট গ্রহণ করে, যাকে বলা হয় প্রম্পট (সাধারণত পাঠ্য, একটি চিত্র বা উভয়ের সংমিশ্রণ), এবং এটি থেকে আউটপুট পাঠ্য, একটি চিত্র, এমনকি অডিও বা ভিডিও তৈরি করে।

এই মডেলগুলির আউটপুট আশ্চর্যজনকভাবে বিশ্বাসযোগ্য হতে পারে: এলএলএমগুলি এমন পাঠ্য তৈরি করে যা মনে হয় এটি কোনও মানুষের দ্বারা লেখা হতে পারে, এবং ইমেজ জেনারেশন মডেলগুলি এমন চিত্র তৈরি করতে পারে যা মানুষের দ্বারা তৈরি বাস্তব ফটোগ্রাফ বা শিল্পকর্মের খুব কাছাকাছি।

এছাড়াও, এলএলএমগুলি সাধারণ পাঠ্য প্রজন্মের বাইরেও কাজ করতে সক্ষম বলে প্রমাণিত হয়েছে:

  • কম্পিউটার প্রোগ্রাম লেখা
  • একটি বৃহত্তর টাস্ক সম্পূর্ণ করার জন্য প্রয়োজনীয় সাবটাস্কের পরিকল্পনা করা
  • অসংগঠিত তথ্য সংগঠিত
  • পাঠ্যের একটি কর্পাস থেকে তথ্য ডেটা বোঝা এবং বের করা
  • কার্যকলাপের একটি পাঠ্য বিবরণের উপর ভিত্তি করে স্বয়ংক্রিয় ক্রিয়াকলাপগুলি অনুসরণ করা এবং সম্পাদন করা

বিভিন্ন প্রদানকারীর কাছ থেকে আপনার কাছে অনেক মডেল উপলব্ধ। প্রতিটি মডেলের নিজস্ব শক্তি এবং দুর্বলতা রয়েছে এবং একটি মডেল একটি কাজে পারদর্শী হতে পারে কিন্তু অন্যদের ক্ষেত্রে কম ভাল পারফর্ম করতে পারে। জেনারেটিভ এআই ব্যবহার করে অ্যাপগুলি প্রায়শই হাতের কাজের উপর নির্ভর করে একাধিক ভিন্ন মডেল ব্যবহার করে উপকৃত হতে পারে।

একজন অ্যাপ ডেভেলপার হিসেবে, আপনি সাধারণত জেনারেটিভ এআই মডেলের সাথে সরাসরি ইন্টারঅ্যাক্ট করেন না, বরং ওয়েব API হিসেবে উপলব্ধ পরিষেবার মাধ্যমে। যদিও এই পরিষেবাগুলিতে প্রায়শই একই রকম কার্যকারিতা থাকে, তবে এগুলি সবগুলিই আলাদা এবং বেমানান API-এর মাধ্যমে প্রদান করে। আপনি যদি একাধিক মডেল পরিষেবা ব্যবহার করতে চান তবে আপনাকে তাদের প্রতিটি মালিকানাধীন SDK ব্যবহার করতে হবে, একে অপরের সাথে সম্ভাব্য বেমানান৷ এবং আপনি যদি একটি মডেল থেকে নতুন এবং সবচেয়ে সক্ষম মডেলে আপগ্রেড করতে চান, তাহলে আপনাকে আবার সেই ইন্টিগ্রেশন তৈরি করতে হতে পারে।

জেনকিট একটি একক ইন্টারফেস প্রদান করে এই চ্যালেঞ্জ মোকাবেলা করে যা ইতিমধ্যেই উপলব্ধ বেশ কিছু পূর্ব-নির্মিত বাস্তবায়ন সহ সম্ভাব্য যেকোন জেনারেটিভ এআই মডেল পরিষেবা অ্যাক্সেস করার বিশদ বিবরণকে বিমূর্ত করে। Genkit-এর চারপাশে আপনার AI-চালিত অ্যাপ তৈরি করা আপনার প্রথম জেনারেটিভ AI কল করার প্রক্রিয়াটিকে সহজ করে তোলে এবং একাধিক মডেলকে একত্রিত করা বা নতুন মডেলের আবির্ভাব হওয়ার সাথে সাথে একটি মডেলকে অন্যটির জন্য অদলবদল করা সমানভাবে সহজ করে তোলে।

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

আপনি যদি এই পৃষ্ঠায় কোডের উদাহরণগুলি চালাতে চান, তাহলে প্রথমে শুরু করা গাইডের ধাপগুলি সম্পূর্ণ করুন৷ সমস্ত উদাহরণ অনুমান করে যে আপনি ইতিমধ্যেই আপনার প্রকল্পে নির্ভরতা হিসাবে জেনকিট ইনস্টল করেছেন।

Genkit দ্বারা সমর্থিত মডেল

জেনকিট সম্ভাব্য যেকোন জেনারেটিভ এআই মডেল পরিষেবা ব্যবহার করার জন্য যথেষ্ট নমনীয় হতে ডিজাইন করা হয়েছে। এর মূল লাইব্রেরিগুলি মডেলগুলির সাথে কাজ করার জন্য সাধারণ ইন্টারফেসকে সংজ্ঞায়িত করে এবং মডেল প্লাগইনগুলি একটি নির্দিষ্ট মডেল এবং এর API এর সাথে কাজ করার জন্য বাস্তবায়নের বিবরণ সংজ্ঞায়িত করে।

Genkit টিম Vertex AI, Google Generative AI, এবং Ollama দ্বারা প্রদত্ত মডেলগুলির সাথে কাজ করার জন্য প্লাগইনগুলি বজায় রাখে:

  • Google Cloud Vertex AI প্লাগইনের মাধ্যমে LLM-এর জেমিনি পরিবার
  • Google AI প্লাগইনের মাধ্যমে LLM-এর মিথুন পরিবার
  • Imagen2 এবং Imagen3 ইমেজ জেনারেশন মডেল, Google Cloud Vertex AI এর মাধ্যমে
  • অ্যানথ্রোপিকস ক্লাউড 3 পরিবারের এলএলএম, গুগল ক্লাউড ভার্টেক্স এআই-এর মডেল বাগানের মাধ্যমে
  • Gemma 2, Llama 3, এবং আরও অনেকগুলি উন্মুক্ত মডেল, ওল্লামা প্লাগইনের মাধ্যমে (আপনাকে অবশ্যই ওল্লামা সার্ভারটি হোস্ট করতে হবে)

এছাড়াও, বেশ কয়েকটি সম্প্রদায়-সমর্থিত প্লাগইন রয়েছে যা এই মডেলগুলিতে ইন্টারফেস সরবরাহ করে:

আপনি npmjs.org-এ genkit-model এর সাথে ট্যাগ করা প্যাকেজগুলি অনুসন্ধান করে আরও আবিষ্কার করতে পারেন।

মডেল প্লাগইন লোড এবং কনফিগার করা হচ্ছে

আপনি সামগ্রী তৈরি করা শুরু করার জন্য Genkit ব্যবহার করার আগে, আপনাকে একটি মডেল প্লাগইন লোড এবং কনফিগার করতে হবে। আপনি যদি শুরু করার নির্দেশিকা থেকে আসছেন, আপনি ইতিমধ্যেই এটি করেছেন৷ অন্যথায়, শুরু করার নির্দেশিকা বা পৃথক প্লাগইনের ডকুমেন্টেশন দেখুন এবং চালিয়ে যাওয়ার আগে সেখানে পদক্ষেপগুলি অনুসরণ করুন৷

generate() ফাংশন

জেনকিটে, প্রাথমিক ইন্টারফেস যার মাধ্যমে আপনি জেনারেটিভ এআই মডেলগুলির সাথে ইন্টারঅ্যাক্ট করেন তা হল generate() ফাংশন।

সহজতম generate() কলটি আপনি যে মডেলটি ব্যবহার করতে চান এবং একটি পাঠ্য প্রম্পট নির্দিষ্ট করে:

import { generate } from '@genkit-ai/ai';
import { configureGenkit } from '@genkit-ai/core';
import { gemini15Flash } from '@genkit-ai/googleai';

configureGenkit(/* ... */);

(async () => {
  const llmResponse = await generate({
    model: gemini15Flash,
    prompt: 'Invent a menu item for a pirate themed restaurant.',
  });

  console.log(await llmResponse.text());
})();

আপনি যখন এই সংক্ষিপ্ত উদাহরণটি চালাবেন, তখন এটি 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.

স্ক্রিপ্টটি আবার চালান এবং আপনি একটি ভিন্ন আউটপুট পাবেন।

পূর্ববর্তী কোড নমুনা মডেল প্লাগইন দ্বারা রপ্তানি করা একটি মডেল রেফারেন্স ব্যবহার করে মডেলটিকে নির্দিষ্ট করেছে৷ আপনি একটি স্ট্রিং শনাক্তকারী ব্যবহার করে মডেলটিও নির্দিষ্ট করতে পারেন:

const llmResponse = await generate({
  model: 'googleai/gemini-1.5-flash-latest',
  prompt: 'Invent a menu item for a pirate themed restaurant.',
});

একটি মডেল স্ট্রিং শনাক্তকারী দেখায় providerid/modelid মতো, যেখানে প্রদানকারী আইডি (এই ক্ষেত্রে, googleai ) প্লাগইনটিকে শনাক্ত করে, এবং মডেল আইডি একটি মডেলের একটি নির্দিষ্ট সংস্করণের জন্য একটি প্লাগইন-নির্দিষ্ট স্ট্রিং শনাক্তকারী৷

কিছু মডেল প্লাগইন, যেমন ওল্লামা প্লাগইন, সম্ভাব্য কয়েক ডজন বিভিন্ন মডেলে অ্যাক্সেস প্রদান করে এবং তাই পৃথক মডেলের রেফারেন্স রপ্তানি করে না। এই ক্ষেত্রে, আপনি শুধুমাত্র তার স্ট্রিং শনাক্তকারী ব্যবহার করে generate() করতে একটি মডেল নির্দিষ্ট করতে পারেন:

const llmResponse = await generate({
  model: 'ollama/gemma2',
  prompt: 'Invent a menu item for a pirate themed restaurant.',
});

পূর্ববর্তী সমস্ত উদাহরণগুলিও একটি গুরুত্বপূর্ণ বিষয় তুলে ধরে: আপনি যখন generate() জেনারেটিভ এআই মডেল কল করতে ব্যবহার করেন, আপনি যে মডেলটি ব্যবহার করতে চান তা পরিবর্তন করা কেবল মডেল প্যারামিটারে একটি ভিন্ন মান পাস করার বিষয়। নেটিভ মডেল SDK-এর পরিবর্তে generate() ব্যবহার করে, আপনি নিজেকে আরও সহজে আপনার অ্যাপে বিভিন্ন মডেল ব্যবহার করতে এবং ভবিষ্যতে মডেল পরিবর্তন করতে নমনীয়তা দেন।

এখন পর্যন্ত আপনি শুধুমাত্র সহজ generate() কলের উদাহরণ দেখেছেন। যাইহোক, generate() জেনারেটিভ মডেলগুলির সাথে আরও উন্নত ইন্টারঅ্যাকশনের জন্য একটি ইন্টারফেস প্রদান করে, যা আপনি অনুসরণকারী বিভাগে দেখতে পাবেন।

মডেল পরামিতি

generate() ফাংশনটি একটি config প্যারামিটার নেয়, যার মাধ্যমে আপনি ঐচ্ছিক সেটিংস নির্দিষ্ট করতে পারেন যা নিয়ন্ত্রণ করে কিভাবে মডেল সামগ্রী তৈরি করে:

const llmResponse = await generate({
  prompt: "Suggest an item for the menu of a pirate themed restaurant",
  model: gemini15Flash,
  config: {
    maxOutputTokens: 400,
    stopSequences: ["<end>", "<fin>"],
    temperature: 1.2,
    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 পর্যন্ত যোগ করা এবং বাকি টোকেনগুলিকে বিবেচনা থেকে বাদ দেওয়া।

topK

Top-k হল একটি পূর্ণসংখ্যার মান যা আপনি মডেলটিকে বিবেচনা করতে চান এমন সম্ভাব্য টোকেনের সংখ্যাও নিয়ন্ত্রণ করে, কিন্তু এবার স্পষ্টভাবে টোকেনের সর্বাধিক সংখ্যা নির্দিষ্ট করে। 1 এর একটি মান নির্দিষ্ট করার অর্থ হল মডেলটিকে নির্ধারকভাবে আচরণ করা উচিত।

মডেল পরামিতি সঙ্গে পরীক্ষা

আপনি বিকাশকারী UI ব্যবহার করে বিভিন্ন মডেল এবং প্রম্পট সংমিশ্রণ দ্বারা উত্পন্ন আউটপুটে এই পরামিতিগুলির প্রভাব নিয়ে পরীক্ষা করতে পারেন। genkit start কমান্ড দিয়ে বিকাশকারী UI শুরু করুন এবং এটি স্বয়ংক্রিয়ভাবে আপনার প্রকল্পে কনফিগার করা প্লাগইন দ্বারা সংজ্ঞায়িত সমস্ত মডেল লোড করবে। কোডে বারবার এই পরিবর্তনগুলি না করেই আপনি দ্রুত বিভিন্ন প্রম্পট এবং কনফিগারেশন মান চেষ্টা করতে পারেন।

স্ট্রাকচার্ড আউটপুট

আপনার অ্যাপ্লিকেশনে একটি উপাদান হিসাবে জেনারেটিভ এআই ব্যবহার করার সময়, আপনি প্রায়শই প্লেইন টেক্সট ছাড়া অন্য ফর্ম্যাটে আউটপুট চান। এমনকি যদি আপনি ব্যবহারকারীর কাছে প্রদর্শনের জন্য সামগ্রী তৈরি করেন তবে আপনি কেবল ব্যবহারকারীর কাছে আরও আকর্ষণীয়ভাবে উপস্থাপন করার উদ্দেশ্যে কাঠামোগত আউটপুট থেকে উপকৃত হতে পারেন। কিন্তু জেনারেটিভ এআই-এর আরও উন্নত অ্যাপ্লিকেশনের জন্য, যেমন মডেলের আউটপুটের প্রোগ্রাম্যাটিক ব্যবহার, বা এক মডেলের আউটপুটকে অন্য মডেলে খাওয়ানো, কাঠামোগত আউটপুট আবশ্যক।

জেনকিটে, আপনি generate() কল করার সময় একটি স্কিমা উল্লেখ করে একটি মডেল থেকে কাঠামোগত আউটপুট অনুরোধ করতে পারেন :

import { z } from "zod";
const MenuItemSchema = z.object({
  name: z.string(),
  description: z.string(),
  calories: z.number(),
  allergens: z.array(z.string()),
});

const llmResponse = await generate({
  prompt: "Suggest an item for the menu of a pirate themed restaurant",
  model: gemini15Flash,
  output: {
    schema: MenuItemSchema,
  },
});

মডেল আউটপুট স্কিমা Zod লাইব্রেরি ব্যবহার করে নির্দিষ্ট করা হয়। একটি স্কিমা সংজ্ঞা ভাষা ছাড়াও, Zod রানটাইম টাইপ চেকিং প্রদান করে, যা স্ট্যাটিক টাইপস্ক্রিপ্ট প্রকার এবং জেনারেটিভ AI মডেলের অপ্রত্যাশিত আউটপুটের মধ্যে ব্যবধান পূরণ করে। Zod আপনাকে কোড লিখতে দেয় যা এই সত্যের উপর নির্ভর করতে পারে যে একটি সফল জেনারেট কল সর্বদা আপনার টাইপস্ক্রিপ্ট প্রকারের সাথে সামঞ্জস্যপূর্ণ আউটপুট ফিরিয়ে দেবে।

আপনি যখন generate() এ একটি স্কিমা নির্দিষ্ট করেন, তখন Genkit পর্দার পিছনে বেশ কিছু কাজ করে:

  • পছন্দসই আউটপুট বিন্যাস সম্পর্কে অতিরিক্ত নির্দেশিকা সহ প্রম্পটকে বৃদ্ধি করে। আপনি ঠিক কোন বিষয়বস্তু তৈরি করতে চান তা মডেলকে নির্দিষ্ট করারও এটির পার্শ্বপ্রতিক্রিয়া রয়েছে (উদাহরণস্বরূপ, শুধুমাত্র একটি মেনু আইটেমের প্রস্তাবনাই নয়, একটি বিবরণ, অ্যালার্জেনের তালিকা এবং আরও অনেক কিছু তৈরি করুন)।
  • জাভাস্ক্রিপ্ট অবজেক্টে মডেল আউটপুট পার্স করে।
  • আউটপুট স্কিমার সাথে সামঞ্জস্যপূর্ণ কিনা তা যাচাই করে।

একটি সফল জেনারেট কল থেকে কাঠামোগত আউটপুট পেতে, প্রতিক্রিয়া বস্তুর output() পদ্ধতি ব্যবহার করুন:

type MenuItem = z.infer<typeof MenuItemSchema>;

const output: MenuItem | null = llmResponse.output();

হ্যান্ডলিং ত্রুটি

পূর্বের উদাহরণে নোট করুন যে আউটপুট পদ্ধতি null ফেরত দিতে পারে। এটি ঘটতে পারে যখন মডেলটি স্কিমার সাথে সামঞ্জস্যপূর্ণ আউটপুট তৈরি করতে ব্যর্থ হয়। আপনি জেনারেট দ্বারা নিক্ষিপ্ত NoValidCandidatesError ব্যতিক্রমটি ধরার মাধ্যমে এই অবস্থাটি সনাক্ত করতে পারেন:

import { NoValidCandidatesError } from "@genkit-ai/ai";
try {
  llmResponse = await generate(/* ... */);
} catch (e) {
  if (e instanceof NoValidCandidatesError) {
    // Output doesn't conform to schema.
  }
}

এই ধরনের ত্রুটিগুলি মোকাবেলা করার জন্য সর্বোত্তম কৌশলটি আপনার সঠিক ব্যবহারের ক্ষেত্রে নির্ভর করবে, তবে এখানে কিছু সাধারণ ইঙ্গিত রয়েছে:

  • একটি ভিন্ন মডেল চেষ্টা করুন . কাঠামোবদ্ধ আউটপুট সফল হওয়ার জন্য, মডেলটিকে অবশ্যই JSON-এ আউটপুট তৈরি করতে সক্ষম হতে হবে। সবচেয়ে শক্তিশালী এলএলএম, যেমন জেমিনি এবং ক্লড, এটি করার জন্য যথেষ্ট বহুমুখী; যাইহোক, ছোট মডেল, যেমন কিছু স্থানীয় মডেল যা আপনি ওল্লামার সাথে ব্যবহার করবেন, তারা নির্ভরযোগ্যভাবে কাঠামোগত আউটপুট তৈরি করতে সক্ষম হবে না যদি না তাদের এটি করার জন্য বিশেষভাবে প্রশিক্ষণ দেওয়া হয়।

  • Zod-এর জবরদস্তি ক্ষমতা ব্যবহার করুন : আপনি আপনার স্কিমাগুলিতে নির্দিষ্ট করতে পারেন যে Zod-এর উচিত নন-কনফর্মিং টাইপগুলিকে স্কিমা দ্বারা নির্দিষ্ট টাইপের মধ্যে জোর করার চেষ্টা করা। যদি আপনার স্কিমাতে স্ট্রিং ব্যতীত অন্যান্য আদিম প্রকারগুলি অন্তর্ভুক্ত থাকে, তাহলে Zod জবরদস্তি ব্যবহার করে আপনার অভিজ্ঞতার generate() ব্যর্থতার সংখ্যা হ্রাস করতে পারে। MenuItemSchema-এর নিম্নলিখিত সংস্করণটি স্বয়ংক্রিয়ভাবে পরিস্থিতি সংশোধন করতে টাইপ রূপান্তর ব্যবহার করে যেখানে মডেলটি একটি সংখ্যার পরিবর্তে একটি স্ট্রিং হিসাবে ক্যালোরি তথ্য তৈরি করে:

    const MenuItemSchema = z.object({
      name: z.string(),
      description: z.string(),
      calories: z.coerce.number(),
      allergens: z.array(z.string()),
    });
    
  • জেনারেট() কলটি পুনরায় চেষ্টা করুন । আপনি যে মডেলটি বেছে নিয়েছেন তা যদি খুব কমই কনফরম্যান্ট আউটপুট জেনারেট করতে ব্যর্থ হয়, তাহলে আপনি ত্রুটিটিকে নেটওয়ার্ক ত্রুটির মতো বিবেচনা করতে পারেন এবং কিছু ধরণের বর্ধিত ব্যাক-অফ কৌশল ব্যবহার করে অনুরোধটি পুনরায় চেষ্টা করুন।

স্ট্রিমিং

প্রচুর পরিমাণে টেক্সট তৈরি করার সময়, আপনি আপনার ব্যবহারকারীদের জন্য আউটপুট তৈরির মতো করে উপস্থাপন করে অভিজ্ঞতা উন্নত করতে পারেন—আউটপুট স্ট্রিমিং। অ্যাকশনে স্ট্রিমিংয়ের একটি পরিচিত উদাহরণ বেশিরভাগ LLM চ্যাট অ্যাপগুলিতে দেখা যায়: ব্যবহারকারীরা তাদের বার্তাগুলির মডেলের প্রতিক্রিয়া পড়তে পারে কারণ এটি তৈরি হচ্ছে, যা অ্যাপ্লিকেশনটির অনুভূত প্রতিক্রিয়াশীলতাকে উন্নত করে এবং একজন বুদ্ধিমান প্রতিপক্ষের সাথে চ্যাট করার বিভ্রমকে উন্নত করে।

জেনকিটে, আপনি generateStream() ফাংশন ব্যবহার করে আউটপুট স্ট্রিম করতে পারেন। এর সিনট্যাক্স generate() ফাংশনের অনুরূপ:

import { generateStream } from "@genkit-ai/ai";
import { GenerateResponseChunk } from "@genkit-ai/ai/lib/generate";
const llmResponseStream = await generateStream({
  prompt: 'Suggest a complete menu for a pirate themed restaurant',
  model: gemini15Flash,
});

যাইহোক, এই ফাংশন প্রতিক্রিয়া খণ্ডগুলির একটি অসিঙ্ক্রোনাস পুনরাবৃত্তিযোগ্য প্রদান করে। এই খণ্ডগুলির প্রতিটি উপলব্ধ হওয়ার সাথে সাথে পরিচালনা করুন:

for await (const responseChunkData of llmResponseStream.stream()) {
  const responseChunk = responseChunkData as GenerateResponseChunk;
  console.log(responseChunk.text());
}

আপনি এখনও একবারে সম্পূর্ণ প্রতিক্রিয়া পেতে পারেন:

const llmResponse = await llmResponseStream.response();

স্ট্রীমিং কাঠামোগত আউটপুটের সাথেও কাজ করে:

const MenuSchema = z.object({
  starters: z.array(MenuItemSchema),
  mains: z.array(MenuItemSchema),
  desserts: z.array(MenuItemSchema),
});
type Menu = z.infer<typeof MenuSchema>;

const llmResponseStream = await generateStream({
  prompt: "Suggest a complete menu for a pirate themed restaurant",
  model: gemini15Flash,
  output: { schema: MenuSchema },
});

for await (const responseChunkData of llmResponseStream.stream()) {
  const responseChunk = responseChunkData as GenerateResponseChunk<Menu>;
  // output() returns an object representing the entire output so far
  const output: Menu | null = responseChunk.output();
  console.log(output);
}

স্ট্রিমিং স্ট্রাকচার্ড আউটপুট স্ট্রিমিং টেক্সট থেকে একটু ভিন্নভাবে কাজ করে। আপনি যখন একটি প্রতিক্রিয়া খণ্ডের output() পদ্ধতিতে কল করেন, তখন আপনি একটি একক খণ্ডের প্রতিনিধিত্বকারী বস্তুর পরিবর্তে (যা নিজে থেকে বৈধ নাও হতে পারে) এর পরিবর্তে এখন পর্যন্ত তৈরি হওয়া খণ্ডগুলির সংগ্রহ থেকে একটি অবজেক্ট তৈরি করেন। কাঠামোগত আউটপুটের প্রতিটি অংশ এক অর্থে তার আগে আসা খণ্ডটিকে ছাড়িয়ে যায়

উদাহরণস্বরূপ, এখানে পূর্বের উদাহরণ থেকে প্রথম পাঁচটি আউটপুট রয়েছে:

null
{ starters: [ {} ] }
{
  starters: [ { name: "Captain's Treasure Chest", description: 'A' } ]
}
{
  starters: [
    {
      name: "Captain's Treasure Chest",
      description: 'A mix of spiced nuts, olives, and marinated cheese served in a treasure chest.',
      calories: 350
    }
  ]
}
{
  starters: [
    {
      name: "Captain's Treasure Chest",
      description: 'A mix of spiced nuts, olives, and marinated cheese served in a treasure chest.',
      calories: 350,
      allergens: [Array]
    },
    { name: 'Shipwreck Salad', description: 'Fresh' }
  ]
}

মাল্টিমোডাল ইনপুট

আপনি এখন পর্যন্ত যে উদাহরণগুলি দেখেছেন সেগুলি মডেল প্রম্পট হিসাবে পাঠ্য স্ট্রিং ব্যবহার করেছে। যদিও এটি জেনারেটিভ এআই মডেলগুলিকে প্রম্পট করার সবচেয়ে সাধারণ উপায় হিসাবে রয়ে গেছে, অনেক মডেল অন্যান্য মিডিয়াকেও প্রম্পট হিসাবে গ্রহণ করতে পারে। মিডিয়া প্রম্পটগুলি প্রায়শই টেক্সট প্রম্পটের সাথে একত্রে ব্যবহৃত হয় যা মডেলকে মিডিয়াতে কিছু অপারেশন করার নির্দেশ দেয়, যেমন একটি চিত্রের ক্যাপশন বা একটি অডিও রেকর্ডিং প্রতিলিপি করা।

মিডিয়া ইনপুট গ্রহণ করার ক্ষমতা এবং আপনি যে ধরনের মিডিয়া ব্যবহার করতে পারেন তা সম্পূর্ণরূপে মডেল এবং এর API এর উপর নির্ভরশীল। উদাহরণস্বরূপ, জেমিনি 1.5 সিরিজের মডেলগুলি প্রম্পট হিসাবে ছবি, ভিডিও এবং অডিও গ্রহণ করতে পারে।

এটিকে সমর্থন করে এমন একটি মডেলকে একটি মিডিয়া প্রম্পট প্রদান করতে, একটি সাধারণ পাঠ্য প্রম্পট তৈরি করার পরিবর্তে, একটি মিডিয়া অংশ এবং একটি পাঠ্য অংশ সমন্বিত একটি অ্যারে পাস করুন:

const llmResponse = await generate({
  prompt: [
    { media: { url: 'https://example.com/photo.jpg' } },
    { text: 'Compose a poem about this image.' },
  ],
  model: gemini15Flash,
});

উপরের উদাহরণে, আপনি একটি সর্বজনীনভাবে অ্যাক্সেসযোগ্য HTTPS URL ব্যবহার করে একটি চিত্র নির্দিষ্ট করেছেন৷ আপনি একটি ডেটা URL হিসাবে এনকোড করে সরাসরি মিডিয়া ডেটা পাস করতে পারেন৷ যেমন:

import { readFile } from 'node:fs/promises';
const b64Data = await readFile('output.png', { encoding: 'base64url' });
const dataUrl = `data:image/png;base64,${b64Data}`;

const llmResponse = await generate({
  prompt: [
    { media: { url: dataUrl } },
    { text: 'Compose a poem about this image.' },
  ],
  model: gemini15Flash,
});

মিডিয়া ইনপুট সমর্থন করে এমন সমস্ত মডেল ডেটা URL এবং HTTPS URL উভয়কেই সমর্থন করে। কিছু মডেল প্লাগইন অন্যান্য মিডিয়া উৎসের জন্য সমর্থন যোগ করে। উদাহরণস্বরূপ, Vertex AI প্লাগইন আপনাকে ক্লাউড স্টোরেজ ( gs:// ) ইউআরএল ব্যবহার করতে দেয়।

মিডিয়া তৈরি করা হচ্ছে

এখন পর্যন্ত, এই পৃষ্ঠার বেশিরভাগ উদাহরণ LLM ব্যবহার করে টেক্সট তৈরি করা নিয়ে কাজ করেছে। যাইহোক, Genkit ইমেজ জেনারেশন মডেলের সাথেও ব্যবহার করা যেতে পারে। একটি ইমেজ জেনারেশন মডেলের সাথে generate() ব্যবহার করা একটি LLM ব্যবহারের অনুরূপ। উদাহরণস্বরূপ, Vertex AI এর মাধ্যমে Imagen2 মডেল ব্যবহার করে একটি চিত্র তৈরি করতে:

  1. জেনকিট data: উত্পন্ন মিডিয়ার জন্য স্ট্যান্ডার্ড আউটপুট ফর্ম্যাট হিসাবে URL। এটি একটি স্ট্যান্ডার্ড ফরম্যাট যেখানে অনেক লাইব্রেরি তাদের পরিচালনা করার জন্য উপলব্ধ। এই উদাহরণটি jsdom থেকে data-urls প্যাকেজ ব্যবহার করে:

    npm i data-urls
    npm i --save-dev @types/data-urls
  2. একটি ছবি তৈরি করতে এবং একটি ফাইলে সংরক্ষণ করতে, generate() কল করুন, একটি ইমেজ জেনারেশন মডেল এবং মিডিয়া টাইপ আউটপুট ফর্ম্যাট উল্লেখ করুন:

    import { generate } from '@genkit-ai/ai';
    import { configureGenkit } from '@genkit-ai/core';
    import { vertexAI, imagen2 } from '@genkit-ai/vertexai';
    import parseDataURL from 'data-urls';
    
    import { writeFile } from 'node:fs/promises';
    
    configureGenkit({
      plugins: [vertexAI({ location: 'us-central1' })],
    });
    
    (async () => {
      const mediaResponse = await generate({
        model: imagen2,
        prompt: 'photo of a meal fit for a pirate',
        output: { format: 'media' },
      });
    
      const media = mediaResponse.media();
      if (media === null) throw new Error('No media generated.');
    
      const data = parseDataURL(media.url);
      if (data === null) throw new Error('Invalid ‘data:’ URL.');
    
      await writeFile(`output.${data.mimeType.subtype}`, data.body);
    })();
    

বার্তা ইতিহাস রেকর্ডিং

আপনার অনেক ব্যবহারকারী চ্যাটবটের মাধ্যমে প্রথমবারের মতো বৃহৎ ভাষার মডেলের সাথে যোগাযোগ করবে। যদিও এলএলএম কথোপকথনের অনুকরণের চেয়ে অনেক বেশি সক্ষম, তবে এটি মিথস্ক্রিয়া করার একটি পরিচিত এবং দরকারী শৈলী হিসাবে রয়ে গেছে। এমনকি যখন আপনার ব্যবহারকারীরা এইভাবে মডেলের সাথে সরাসরি ইন্টারঅ্যাক্ট করবেন না, তখনও প্রম্পট করার কথোপকথন শৈলী একটি AI মডেল দ্বারা তৈরি আউটপুটকে প্রভাবিত করার একটি শক্তিশালী উপায়।

একটি মডেল প্রতিক্রিয়া থেকে বার্তা ইতিহাস তৈরি করতে, toHistory() পদ্ধতিতে কল করুন:

let response = await generate({
  model: gemini15Flash,
  prompt: "How do you say 'dog' in French?",
});
let history = response.toHistory();

আপনি এই ইতিহাসকে সিরিয়ালাইজ করতে পারেন এবং এটি একটি ডাটাবেস বা সেশন স্টোরেজে চালিয়ে যেতে পারেন। তারপরে, generate() করতে ভবিষ্যতের কলগুলিতে প্রম্পটের সাথে ইতিহাসটি পাস করুন:

response = await generate({
  model: gemini15Flash,
  prompt: 'How about in Spanish?',
  history,
});
history = response.toHistory();

আপনি যে মডেলটি ব্যবহার করছেন সেটি যদি system ভূমিকা সমর্থন করে, আপনি সিস্টেম বার্তা সেট করতে প্রাথমিক ইতিহাস ব্যবহার করতে পারেন:

import { MessageData } from "@genkit-ai/ai/model";
let history: MessageData[] = [
  { role: 'system', content: [{ text: 'Talk like a pirate.' }] },
];
let response = await generate({
  model: gemini15Flash,
  prompt: "How do you say 'dog' in French?",
  history,
});

পরবর্তী পদক্ষেপ

Genkit সম্পর্কে আরও জানুন

  • একজন অ্যাপ ডেভেলপার হিসেবে, আপনি যে প্রাথমিক উপায়ে জেনারেটিভ এআই মডেলের আউটপুটকে প্রভাবিত করেন তা হল প্রম্পটিংয়ের মাধ্যমে। কিভাবে জেনকিট আপনাকে কার্যকর প্রম্পট তৈরি করতে এবং আপনার কোডবেসে সেগুলি পরিচালনা করতে সাহায্য করে তা জানতে প্রম্পট ব্যবস্থাপনা পড়ুন।
  • যদিও generate() হল প্রতিটি জেনারেটিভ AI চালিত অ্যাপ্লিকেশনের নিউক্লিয়াস, বাস্তব-বিশ্বের অ্যাপ্লিকেশনগুলির জন্য সাধারণত একটি জেনারেটিভ AI মডেল ব্যবহার করার আগে এবং পরে অতিরিক্ত কাজের প্রয়োজন হয়। এটি প্রতিফলিত করার জন্য, জেনকিট প্রবাহের ধারণাটি প্রবর্তন করে, যা ফাংশনের মতো সংজ্ঞায়িত করা হয় তবে অতিরিক্ত বৈশিষ্ট্যগুলি যেমন পর্যবেক্ষণযোগ্যতা এবং সরলীকৃত স্থাপনার যোগ করে। আরও জানতে, কর্মপ্রবাহ সংজ্ঞায়িত করা দেখুন।

উন্নত এলএলএম ব্যবহার

  • এলএলএম-এর সক্ষমতা বাড়ানোর একটি উপায় হল তারা আপনার কাছ থেকে আরও তথ্যের অনুরোধ করতে পারে বা আপনাকে কিছু কাজ করার জন্য অনুরোধ করতে পারে তার একটি তালিকা দিয়ে তাদের প্রম্পট করা। এটি টুল কলিং বা ফাংশন কলিং নামে পরিচিত। এই ক্ষমতাকে সমর্থন করার জন্য প্রশিক্ষিত মডেলগুলি একটি বিশেষভাবে বিন্যাসিত প্রতিক্রিয়া সহ একটি প্রম্পটে প্রতিক্রিয়া জানাতে পারে, যা কলিং অ্যাপ্লিকেশনকে ইঙ্গিত দেয় যে এটির কিছু পদক্ষেপ করা উচিত এবং মূল প্রম্পটের সাথে LLM-এ ফলাফলটি ফেরত পাঠানো উচিত। জেনকিটের লাইব্রেরি ফাংশন রয়েছে যা একটি টুল কলিং বাস্তবায়নের প্রম্পট জেনারেশন এবং কল-প্রতিক্রিয়া লুপ উপাদান উভয়কেই স্বয়ংক্রিয় করে। আরও জানতে টুল কলিং দেখুন।
  • পুনরুদ্ধার-অগমেন্টেড জেনারেশন (RAG) হল একটি মডেলের আউটপুটে ডোমেন-নির্দিষ্ট তথ্য প্রবর্তন করার জন্য ব্যবহৃত একটি কৌশল। এটি ভাষার মডেলে পাঠানোর আগে একটি প্রম্পটে প্রাসঙ্গিক তথ্য সন্নিবেশ করে সম্পন্ন করা হয়। একটি সম্পূর্ণ RAG বাস্তবায়নের জন্য আপনাকে বেশ কয়েকটি প্রযুক্তি একত্রে আনতে হবে: টেক্সট এমবেডিং জেনারেশন মডেল, ভেক্টর ডাটাবেস এবং বড় ভাষা মডেল। Genkit কিভাবে এই বিভিন্ন উপাদানের সমন্বয়ের প্রক্রিয়াকে সহজ করে তা শিখতে Retrieval-augmented generation (RAG) দেখুন।

মডেল আউটপুট টেস্টিং

একজন সফ্টওয়্যার প্রকৌশলী হিসাবে, আপনি নির্ধারক সিস্টেমে অভ্যস্ত যেখানে একই ইনপুট সর্বদা একই আউটপুট তৈরি করে। যাইহোক, এআই মডেলগুলি সম্ভাব্যতামূলক হওয়ায়, ইনপুটের সূক্ষ্ম সূক্ষ্মতার উপর ভিত্তি করে আউটপুট পরিবর্তিত হতে পারে, মডেলের প্রশিক্ষণের ডেটা এবং এমনকি তাপমাত্রার মতো পরামিতিগুলির দ্বারা ইচ্ছাকৃতভাবে প্রবর্তিত এলোমেলোতার উপর ভিত্তি করে।

জেনকিটের মূল্যায়নকারীরা বিভিন্ন কৌশল ব্যবহার করে আপনার LLM-এর প্রতিক্রিয়াগুলির গুণমান মূল্যায়ন করার জন্য কাঠামোগত উপায়। মূল্যায়ন পৃষ্ঠায় আরও পড়ুন।