ক্রমাগত চ্যাট সেশন তৈরি করা

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

এই ধরনের মিথস্ক্রিয়াকে সমর্থন করার জন্য, Genkit ইন্টারফেস এবং বিমূর্ততার একটি সেট সরবরাহ করে যা আপনার জন্য চ্যাট-ভিত্তিক LLM অ্যাপ্লিকেশনগুলি তৈরি করা সহজ করে তোলে।

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

এই পৃষ্ঠাটি পড়ার আগে, আপনার AI মডেলের সাথে তৈরি সামগ্রী পৃষ্ঠায় আচ্ছাদিত বিষয়বস্তুর সাথে পরিচিত হওয়া উচিত।

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

চ্যাট সেশন বেসিক

এখানে একটি ন্যূনতম, কনসোল-ভিত্তিক, চ্যাটবট অ্যাপ্লিকেশন রয়েছে:

import { genkit } from "genkit";
import { googleAI, gemini15Flash } from "@genkit-ai/googleai";

import { createInterface } from "node:readline/promises";

const ai = genkit({
  plugins: [googleAI()],
  model: gemini15Flash,
});

(async () => {
  const chat = ai.chat();
  console.log("You're chatting with Gemini. Ctrl-C to quit.\n");
  const readline = createInterface(process.stdin, process.stdout);
  while (true) {
    const userInput = await readline.question("> ");
    const { text } = await chat.send(userInput);
    console.log(text);
  }
})();

এই প্রোগ্রামের সাথে একটি চ্যাট সেশন নিম্নলিখিত উদাহরণের মত কিছু দেখায়:

You're chatting with Gemini. Ctrl-C to quit.

> hi
Hi there! How can I help you today? 

> my name is pavel
Nice to meet you, Pavel! What can I do for you today? 

> what's my name?
Your name is Pavel! I remembered it from our previous interaction. 

Is there anything else I can help you with?

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

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

মডেল কনফিগারেশন

chat() পদ্ধতি generate() হিসাবে একই কনফিগারেশন বিকল্পগুলির বেশিরভাগ গ্রহণ করে। মডেলটিতে কনফিগারেশন বিকল্পগুলি পাস করতে:

const chat = ai.chat({
  model: gemini15Pro,
  system:
    "You're a pirate first mate. Address the user as Captain and assist " +
    "them however you can.",
  config: {
    temperature: 1.3,
  },
});

রাষ্ট্রীয় চ্যাট সেশন

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

একটি অধিবেশনে রাজ্য অন্তর্ভুক্ত করতে, আপনাকে স্পষ্টভাবে একটি সেশন ইনস্ট্যান্ট করতে হবে:

interface MyState {
  userName: string;
}

const session = ai.createSession<MyState>({
  initialState: {
    userName: 'Pavel',
  },
});

তারপরে আপনি সেশনের মধ্যে একটি চ্যাট শুরু করতে পারেন:

const chat = session.chat();

চ্যাট কীভাবে উন্মোচিত হয় তার উপর ভিত্তি করে সেশনের অবস্থা পরিবর্তন করতে, সরঞ্জামগুলিকে সংজ্ঞায়িত করুন এবং আপনার অনুরোধের সাথে সেগুলি অন্তর্ভুক্ত করুন:

const changeUserName = ai.defineTool(
  {
    name: 'changeUserName',
    description: 'can be used to change user name',
    inputSchema: z.object({
      newUserName: z.string(),
    }),
  },
  async (input) => {
    await ai.currentSession<MyState>().updateState({
      userName: input.newUserName,
    });
    return 'changed username to ${input.newUserName}';
  }
);
const chat = session.chat({
  model: gemini15Pro,
  tools: [changeUserName],
});
await chat.send('change user name to Kevin');

মাল্টি-থ্রেড সেশন

একটি একক সেশনে একাধিক চ্যাট থ্রেড থাকতে পারে। প্রতিটি থ্রেডের নিজস্ব বার্তা ইতিহাস আছে, কিন্তু তারা একটি একক সেশনের অবস্থা ভাগ করে।

const lawyerChat = session.chat('lawyerThread', {
  system: 'talk like a lawyer',
});
const pirateChat = session.chat('pirateThread', {
  system: 'talk like a pirate',
});

সেশনের স্থায়িত্ব (পরীক্ষামূলক)

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

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

class JsonSessionStore<S = any> implements SessionStore<S> {
  async get(sessionId: string): Promise<SessionData<S> | undefined> {
    try {
      const s = await readFile(`${sessionId}.json`, { encoding: 'utf8' });
      const data = JSON.parse(s);
      return data;
    } catch {
      return undefined;
    }
  }

  async save(sessionId: string, sessionData: SessionData<S>): Promise<void> {
    const s = JSON.stringify(sessionData);
    await writeFile(`${sessionId}.json`, s, { encoding: 'utf8' });
  }
}

এই বাস্তবায়ন সম্ভবত ব্যবহারিক স্থাপনার জন্য পর্যাপ্ত নয়, তবে এটি ব্যাখ্যা করে যে একটি সেশন স্টোরেজ বাস্তবায়নের জন্য শুধুমাত্র দুটি কাজ সম্পন্ন করতে হবে:

  • স্টোরেজ থেকে সেশন আইডি ব্যবহার করে একটি সেশন অবজেক্ট পান
  • একটি প্রদত্ত সেশন অবজেক্ট সংরক্ষণ করুন, তার সেশন আইডি দ্বারা সূচীকৃত

একবার আপনি আপনার স্টোরেজ ব্যাকএন্ডের জন্য ইন্টারফেসটি প্রয়োগ করার পরে, আপনার বাস্তবায়নের একটি উদাহরণ সেশন কনস্ট্রাক্টরদের কাছে প্রেরণ করুন:

// To create a new session:
const session = ai.createSession({
  store: new JsonSessionStore(),
});

// Save session.id so you can restore the session the next time the
// user makes a request.
// If the user has a session ID saved, load the session instead of creating
// a new one:
const session = await ai.loadSession(sessionId, {
    store: new JsonSessionStore(),
});