लगातार चैट करने की सुविधा वाले सेशन बनाना

आपके कई उपयोगकर्ता, चैटबॉट की मदद से बड़े लैंग्वेज मॉडल से पहली बार इंटरैक्ट करेंगे. हालांकि, एलएलएम, बातचीत को सिम्युलेट करने के अलावा और भी बहुत कुछ कर सकते हैं, लेकिन यह इंटरैक्शन का एक जाना-पहचाना और काम का तरीका है. भले ही, आपके उपयोगकर्ता इस तरह से सीधे तौर पर मॉडल के साथ इंटरैक्ट न कर रहे हों, फिर भी बातचीत वाले स्टाइल में प्रॉम्प्ट करने का तरीका, एआई मॉडल से जनरेट किए गए आउटपुट पर असर डालने का एक बेहतरीन तरीका है.

इस तरह के इंटरैक्शन की सुविधा देने के लिए, Genkit इंटरफ़ेस और एब्स्ट्रैक्शन का एक सेट उपलब्ध कराता है. इससे, चैट पर काम करने वाले एलएलएम ऐप्लिकेशन को आसानी से बनाया जा सकता है.

शुरू करने से पहले

इस पेज को पढ़ने से पहले, आपको एआई मॉडल की मदद से कॉन्टेंट जनरेट करना पेज पर मौजूद कॉन्टेंट के बारे में जानकारी होनी चाहिए.

अगर आपको इस पेज पर दिए गए कोड के उदाहरण चलाने हैं, तो पहले शुरू करने से जुड़ी गाइड में दिया गया तरीका अपनाएं. सभी उदाहरणों में यह माना गया है कि आपने अपने प्रोजेक्ट में, डिपेंडेंसी के तौर पर Genkit पहले ही इंस्टॉल कर लिया है.

चैट सेशन के बारे में बुनियादी जानकारी

यहां एक छोटा, कंसोल-आधारित चैटबॉट ऐप्लिकेशन दिया गया है:

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?

इस छोटे से इंटरैक्शन से पता चलता है कि चैट सेशन में मैसेज भेजने पर, मॉडल अपने जवाबों में अब तक के सेशन का इस्तेमाल कर सकता है. ऐसा इसलिए होता है, क्योंकि Genkit कुछ काम पर्दे के पीछे करता है:

  • अगर चैट का इतिहास मौजूद है, तो उसे स्टोरेज से वापस लाता है. स्टोरेज और डेटा को बनाए रखने के बारे में बाद में ज़्यादा जानकारी दी जाएगी
  • 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,
  },
});

स्टेटफ़ुल चैट सेशन

चैट सेशन के मैसेज के इतिहास को सेव करने के अलावा, किसी भी JavaScript ऑब्जेक्ट को भी सेव किया जा सकता है. ऐसा करने से, मैसेज के इतिहास में मौजूद जानकारी के बजाय, राज्य को बेहतर तरीके से मैनेज किया जा सकता है.

किसी सेशन में स्टेटस शामिल करने के लिए, आपको साफ़ तौर पर सेशन को इंस्टैंशिएट करना होगा:

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',
});

सेशन का बना रहना (प्रयोग के तौर पर उपलब्ध)

जब कोई नई चैट या सेशन शुरू किया जाता है, तो उसे डिफ़ॉल्ट रूप से कॉन्फ़िगर किया जाता है, ताकि सेशन को सिर्फ़ मेमोरी में सेव किया जा सके. यह तब सही होता है, जब सेशन को आपके प्रोग्राम के एक बार इस्तेमाल होने के दौरान ही बनाए रखना हो. जैसे, इस पेज की शुरुआत में दिए गए सैंपल चैटबॉट में. हालांकि, किसी ऐप्लिकेशन में एलएलएम चैट को इंटिग्रेट करते समय, आम तौर पर कॉन्टेंट जनरेशन लॉजिक को स्टेटलेस वेब एपीआई एंडपॉइंट के तौर पर डिप्लॉय किया जाता है. इस सेटअप में, हमेशा चालू रहने वाली चैट की सुविधा काम करे, इसके लिए आपको किसी तरह का सेशन स्टोरेज लागू करना होगा. यह स्टोरेज, आपके एंडपॉइंट के सभी अनुरोधों के दौरान स्थिति को बनाए रख सकता है.

चैट सेशन में पर्सिस्टेंस जोड़ने के लिए, आपको Genkit का 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(),
});