<पी> एआई-संचालित एप्लिकेशन जो तुरंत प्रतिक्रिया देते हैं, उपयोगकर्ता के अनुभव को बढ़ाते हैं और उन्हें तुरंत सुनने और देखने का अनुभव कराते हैं। स्ट्रीमिंग के साथ, आप ऐसे चैटबॉट बना सकते हैं जो तुरंत प्रश्नों का समाधान करते हैं या वास्तविक समय में वैयक्तिकृत अनुशंसाएँ प्रदान करते हैं। यह केवल गति के बारे में नहीं है - यह उपयोगकर्ता की जरूरतों को तुरंत पूरा करने, इसके कथित मूल्य को बढ़ाने के बारे में है। <पी> स्ट्रीमिंग में डेटा को एक बड़े ब्लॉक के बजाय छोटे, निरंतर टुकड़ों में भेजना शामिल है। चैटबॉट्स या अनुशंसा प्रणाली जैसे एआई अनुप्रयोगों के संदर्भ में, स्ट्रीमिंग का अर्थ है उपयोगकर्ताओं को उपलब्ध होते ही आंशिक प्रतिक्रियाएं भेजना, बजाय इसके कि संपूर्ण प्रतिक्रिया को एक बार में संकलित करने और वितरित करने की प्रतीक्षा की जाए। यह दृष्टिकोण सुनिश्चित करता है कि उपयोगकर्ताओं को तत्काल प्रतिक्रिया या जानकारी प्राप्त हो, जिससे अधिक गतिशील और प्रतिक्रियाशील उपयोगकर्ता अनुभव तैयार हो सके। <पी> इस गाइड में, आप सीखेंगे कि लैंगचेन और ओपनएआई के भाषा मॉडल के साथ नेक्स्ट.जेएस एंडपॉइंट में स्ट्रीमिंग को लागू करने के लिए सर्वर-सेंटेड इवेंट्स (एसएसई) का लाभ कैसे उठाया जाए। इसके अलावा, आप सीखेंगे कि अपस्टैश के साथ स्ट्रीमिंग प्रतिक्रियाओं को कैसे कैश किया जाए। आवश्यकताएँ
<पी> आपको निम्नलिखित की आवश्यकता होगी: - Node.js 18 या बाद का संस्करण
- एक OpenAI खाता
- एक अपस्टैश खाता
- एक वर्सेल खाता
टेक स्टैक
प्रौद्योगिकी | विवरण | अपस्टैशसर्वरलेस डेटाबेस प्लेटफ़ॉर्म। आप OpenAI API प्रतिक्रियाओं को कैश करने के लिए अपस्टैश रेडिस का उपयोग करने जा रहे हैं। OpenAI एक कृत्रिम बुद्धिमत्ता अनुसंधान प्रयोगशाला है जो उन्नत AI प्रौद्योगिकियों को विकसित करने पर केंद्रित है। भाषा मॉडल द्वारा संचालित अनुप्रयोगों को विकसित करने के लिए लैंगचेन फ्रेमवर्क। Next.js वेब के लिए रिएक्ट फ्रेमवर्क। वेब अनुप्रयोगों को तैनात करने और स्केल करने के लिए एक क्लाउड प्लेटफॉर्म। OpenAI टोकन जेनरेट करें
<पी> OpenAI API का उपयोग करके, आप AI का उपयोग करके चैटबॉट प्रतिक्रियाएँ बनाने में सक्षम हैं। OpenAI API के किसी भी अनुरोध के लिए प्राधिकरण टोकन की आवश्यकता होती है। टोकन प्राप्त करने के लिए, अपने OpenAI खाते में API कुंजियों पर जाएँ, और नई गुप्त कुंजी बनाएँ पर क्लिक करें। बटन. इस टोकन को बाद में OPENAI_API_KEY के रूप में उपयोग के लिए कॉपी और सुरक्षित रूप से संग्रहीत करें पर्यावरण चर. अपस्टैश रेडिस की स्थापना
<पी> एक बार जब आप एक अपस्टैश खाता बना लेते हैं और लॉग इन हो जाते हैं तो आप रेडिस टैब पर जाएंगे और एक डेटाबेस बनाएंगे। <पी>
<पी>
<पी> REST API अनुभाग मिलने तक नीचे स्क्रॉल करें और .env चुनें बटन. सामग्री को कॉपी करें और इसे किसी सुरक्षित स्थान पर सहेजें। <पी>
एक नया Next.js एप्लिकेशन बनाएं
<पी> आइए एक नया Next.js प्रोजेक्ट बनाकर शुरुआत करें। अपना टर्मिनल खोलें और निम्नलिखित कमांड चलाएँ: npx create-next-app@latest my-app
<पी> संकेत मिलने पर, चुनें: Yes जब टाइपस्क्रिप्ट का उपयोग करने के लिए कहा जाए।
No जब ESLint का उपयोग करने के लिए कहा जाए।
Yes जब टेलविंड सीएसएस का उपयोग करने के लिए कहा जाए।
No जब src/ का उपयोग करने के लिए कहा जाए निर्देशिका.
Yes जब ऐप राउटर का उपयोग करने के लिए कहा जाए।
No जब डिफ़ॉल्ट आयात उपनाम (@/*) को अनुकूलित करने के लिए कहा जाए ).
<पी> एक बार यह हो जाने के बाद, प्रोजेक्ट निर्देशिका में जाएँ और निम्नलिखित कमांड निष्पादित करके ऐप को डेवलपमेंट मोड में प्रारंभ करें: cd my-app
npm run dev
<पी> ऐप लोकलहोस्ट:3000 पर चलना चाहिए। निम्नलिखित आदेश निष्पादित करके एप्लिकेशन में लैंगचेन निर्भरता स्थापित करने के लिए विकास सर्वर को रोकें: npm install @langchain/openai @langchain/community
<पी> कमांड ने निम्नलिखित लाइब्रेरी स्थापित की: @langchain/openai :मॉडलों की OpenAI श्रृंखला के साथ इंटरफेस करने के लिए एक लैंगचेन पैकेज।
@langchain/community :लैंगचेन कोर के साथ प्लग-एन-प्ले के लिए तृतीय पक्ष एकीकरण का संग्रह।
<पी> अब, एक .env बनाएं अपने प्रोजेक्ट के मूल में फ़ाइल करें। आप OPENAI_API_KEY जोड़ने जा रहे हैं आपने पहले प्राप्त किया। <पी> इसे कुछ इस तरह दिखना चाहिए: # .env
# OpenAI Environment Variable
OPENAI_API_KEY="..."
# Upstash Redis Environment Variables
UPSTASH_REDIS_REST_URL="..."
UPSTASH_REDIS_REST_TOKEN="..."
<पी> नेक्स्ट.जेएस में एपीआई एंडपॉइंट बनाने के लिए, आप नेक्स्ट.जेएस रूट हैंडलर का उपयोग करेंगे जो आपको वेब रिक्वेस्ट और रिस्पांस एपीआई पर प्रतिक्रियाएं देने की अनुमति देते हैं। Next.js में एक एपीआई रूट बनाना शुरू करने के लिए जो उपयोगकर्ता को प्रतिक्रियाएं स्ट्रीम करता है, निम्नलिखित कमांड निष्पादित करें: mkdir -p app/api/stream/completion/chat
mkdir app/lib
<पी> -p ध्वज chat के लिए मूल निर्देशिका बनाता है यदि वे गायब हैं तो निर्देशिका। <पी> यह हमारा Next.js प्रोजेक्ट सेट करता है। अब, अपस्टैश के साथ कैश हैंडलर बनाने की ओर बढ़ते हैं। अपस्टैश रेडिस कैश क्लाइंट को इंस्टेंट करें
<पी> UpstashRedisCache के साथ क्लास, आप कोड की कुछ पंक्तियों के भीतर ओपनएआई एपीआई प्रतिक्रियाओं को कैशिंग करने के लिए रेडिस कैश क्लाइंट को प्रारंभ कर सकते हैं। एक फ़ाइल upstashCache.tsx बनाएं app/lib के अंदर निर्देशिका: <पी> कैश हैंडलर का उपयोग करके, OpenAI API द्वारा उत्पन्न वार्तालापों या पूर्ण प्रतिक्रियाओं को कैश करना बहुत आसान हो जाता है। आइए यह समझने के लिए आगे बढ़ें कि आप Next.js में सर्वर-भेजे गए इवेंट का उपयोग कैसे शुरू कर सकते हैं। नेक्स्ट.जेएस ऐप राउटर में सर्वर-सेंटेड इवेंट एपीआई बनाना
<पी> सर्वर-सेंटेड इवेंट (एसएसई) आपको निरंतर मतदान की आवश्यकता के बिना सर्वर से क्लाइंट तक वास्तविक समय डेटा अपडेट देने की अनुमति देता है। SSE एकल, लंबे समय तक चलने वाले HTTP कनेक्शन पर डेटा के यूनिडायरेक्शनल प्रवाह को सक्षम बनाता है। <पी> route.ts नाम की एक फ़ाइल बनाएं app/api/stream में निम्नलिखित कोड के साथ सर्वर-भेजे गए ईवेंट का उपयोग करके प्रतिक्रियाओं को स्ट्रीम करने के लिए आवश्यक न्यूनतम सेटअप को समझने के लिए निर्देशिका: // File: app/api/stream/route.ts
// Prevents this route's response from being cached on Vercel
export const dynamic = "force-dynamic";
export async function POST(request: Request) {
const encoder = new TextEncoder()
// Create a streaming response
const customReadable = new ReadableStream({
start(controller) {
const message = "A sample message."
controller.enqueue(encoder.encode(`data: ${message}\n\n`))
},
})
// Return the stream response and keep the connection alive
return new Response(customReadable, {
// Set the headers for Server-Sent Events (SSE)
headers: {
Connection: "keep-alive",
"Content-Encoding": "none",
"Cache-Control": "no-cache, no-transform",
"Content-Type": "text/event-stream; charset=utf-8",
},
})
}
<पी> उपरोक्त कोड निम्न कार्य करता है: - गतिशील स्थिरांक
force-dynamic पर सेट है , वर्सेल प्लेटफ़ॉर्म पर प्रतिक्रियाओं की कैशिंग को रोकना। यह सुनिश्चित करता है कि एसएसई स्ट्रीम के लिए प्रत्येक अनुरोध को ताज़ा डेटा मिलता है और कैश से नहीं दिया जाता है।
- ए
ReadableStream क्लाइंट को भेजे जाने वाले डेटा की एक स्ट्रीम उत्पन्न करने के लिए बनाया गया है। स्ट्रीम की प्रारंभ विधि में, एक संदेश को एन्कोड किया जाता है और स्ट्रीम के नियंत्रक में सूचीबद्ध किया जाता है। यह संदेश क्लाइंट को SSE स्ट्रीम के भाग के रूप में भेजा जाएगा।
- द
Response ऑब्जेक्ट सर्वर-भेजे गए इवेंट के लिए विशिष्ट हेडर के साथ बनाया गया है। इन शीर्षलेखों में निम्नलिखित शामिल हैं: Connection: keep-alive स्ट्रीमिंग के लिए कनेक्शन खुला रखने के लिए।
Cache-Control: no-cache, no-transform ब्राउज़र में कैशिंग को रोकने के लिए.
Content-Type: text/event-stream; charset=utf-8 सामग्री प्रकार को सर्वर-भेजे गए ईवेंट के रूप में निर्दिष्ट करने के लिए।
- कस्टम ReadableStream युक्त रिस्पॉन्स ऑब्जेक्ट एंडपॉइंट से लौटाया जाता है। यह प्रतिक्रिया एसएसई स्ट्रीम का अनुरोध करने वाले ग्राहकों को भेजी जाएगी।
<पी> इसके साथ, आपने एक समापन बिंदु बनाया है जो प्रतिक्रियाओं को स्ट्रीम करने में सक्षम है। अगले अनुभागों में, आप समझेंगे कि आप लैंगचेन कॉलबैक के साथ OpenAI से कंप्लीशन और चैट कंप्लीशन एपीआई प्रतिक्रियाओं को कैसे स्ट्रीम कर सकते हैं। लैंगचेन कॉलबैक के साथ ओपनएआई कंप्लीशन एपीआई प्रतिक्रियाओं को स्ट्रीम करना
<पी> ओपनएआई कंप्लीशन एपीआई दिए गए संकेतों के आधार पर टेक्स्ट तैयार करने के लिए एक शक्तिशाली उपकरण प्रदान करता है, जो सामग्री निर्माण और भाषा अनुवाद जैसे विभिन्न वास्तविक जीवन परिदृश्यों में उपयोगी है। लैंगचेन कॉलबैक को एकीकृत करने से प्रतिक्रियाओं की वास्तविक समय की स्ट्रीमिंग सक्षम हो जाती है, जिससे अनुप्रयोगों में कथित प्रतिक्रिया बढ़ जाती है। <पी> completionModel.tsx नाम की एक फ़ाइल बनाएं app/lib में निर्देशिका, एक फ़ंक्शन को परिभाषित करती है जो स्ट्रीमिंग सक्षम और लैंगचेन कॉलबैक के साथ ओपनएआई इंस्टेंस को प्रारंभ करती है, वास्तविक समय में टेक्स्ट उत्पन्न करती है। // File: app/lib/completionModel.tsx
import { OpenAI } from "@langchain/openai";
export const completionModel = (
controller: ReadableStreamDefaultController,
encoder: TextEncoder
) =>
new OpenAI({
streaming: true,
callbacks: [
{
handleLLMNewToken(token) {
controller.enqueue(encoder.encode(`data: ${token}\n\n`));
},
async handleLLMEnd(output) {
controller.close();
},
},
],
});
<पी> उपरोक्त कोड निम्न कार्य करता है: OpenAI आयात करता है @langchain/openai से कक्षा पैकेज.
-
completionModel नाम का एक फ़ंक्शन निर्यात करता है जो दो पैरामीटर लेता है: - नियंत्रक:A
ReadableStreamDefaultController ऑब्जेक्ट जो आपको संदेशों को स्ट्रीम में पंक्तिबद्ध करने की अनुमति देता है।
- एनकोडर:ए
TextEncoder ऑब्जेक्ट जो संदेशों को Uint8Array में एन्कोड करता है वस्तु.
OpenAI का एक नया उदाहरण बनाता है निम्न कॉन्फ़िगरेशन विकल्पों के साथ कक्षा: streaming :सत्य पर सेट करें, यह दर्शाता है कि एपीआई को स्ट्रीमिंग प्रतिक्रियाएँ लौटानी चाहिए।
callbacks :एक सरणी जिसमें दो कॉलबैक फ़ंक्शंस के साथ एक ऑब्जेक्ट होता है, जिसका उपयोग प्रत्येक चरण में एलएलएम द्वारा प्रतिक्रिया निर्माण को रोकने के लिए किया जाता है।
handleLLMNewToken :भाषा मॉडल द्वारा एक नया टोकन उत्पन्न होने पर कॉलबैक लागू होता है। यह एन्कोडेड टोकन को नियंत्रक के पास भेजता है।
handleLLMEnd :भाषा मॉडल निर्माण पूरा होने पर एक एसिंक्रोनस कॉलबैक लागू किया जाता है। यह नियंत्रक को बंद कर देता है।
<पी> इसके अलावा, route.ts नाम की एक फ़ाइल बनाएं app/api/stream/completion में निम्नलिखित कोड के साथ निर्देशिका. आपके द्वारा बनाए गए आरंभिक स्ट्रीमिंग रूट हैंडलर से किए गए परिवर्तनों को नीचे हाइलाइट किया गया है: // File: app/api/stream/completion/route.ts
// Prevents this route's response from being cached on Vercel
export const dynamic = "force-dynamic";
+ import { completionModel } from "@/app/lib/completionModel";
export async function POST(request: Request) {
+ // Obtain the user message from request's body
+ const { message } = await request.json();
const encoder = new TextEncoder();
// Create a streaming response
const customReadable = new ReadableStream({
async start(controller) {
+ // Generate a streaming response from OpenAI with LangChain
+ await completionModel(controller, encoder).invoke(message);
},
});
// Return the stream response and keep the connection alive
return new Response(customReadable, {
// Set the headers for Server-Sent Events (SSE)
headers: {
Connection: "keep-alive",
"Content-Encoding": "none",
"Cache-Control": "no-cache, no-transform",
"Content-Type": "text/event-stream; charset=utf-8",
},
});
}
<पी> Next.js में स्ट्रीमिंग एंडपॉइंट बनाने के लिए आपने पहले जो किया उसके अलावा, ऊपर दिए गए कोड निम्नलिखित कार्य करते हैं: completionModel आयात करता है समारोह.
-
request.json() का उपयोग करके अनुरोध निकाय से उपयोगकर्ता संदेश निकालता है .
start के अंदर ReadableStream की विधि, completionModel अनुरोध से प्राप्त संदेश के साथ फ़ंक्शन को अतुल्यकालिक रूप से लागू किया जाता है। यह फ़ंक्शन लैंगचेन के साथ ओपनएआई से स्ट्रीमिंग प्रतिक्रिया उत्पन्न करता है।
<पी> उपस्टैश के साथ उपयोगकर्ता प्रश्नों और उनकी प्रतिक्रियाओं को कैश करने के लिए, अपस्टैश रेडिस कैश क्लाइंट को completionModel में आयात करें। इस प्रकार कार्य करें: import { OpenAI } from "@langchain/openai";
+ import cache from '@/app/lib/upstashCache';
export const completionModel = (
controller: ReadableStreamDefaultController,
encoder: TextEncoder
) =>
new OpenAI({
+ cache,
streaming: true,
temperature: 0.9,
callbacks: [
{
handleLLMNewToken(token) {
controller.enqueue(encoder.encode(token));
},
async handleLLMEnd(output) {
console.log(output.generations[0][0].text);
controller.close();
},
},
],
});
<पी> न्यूनतम परिवर्तनों के साथ, आपने अपस्टैश के साथ ओपनएआई कंप्लीशन एपीआई प्रतिक्रियाओं की कैशिंग सक्षम कर दी है। <पी> अब, आइए जानें कि कैसे OpenAI चैट कंप्लीशन एपीआई प्रतिक्रियाओं को Next.js एंडपॉइंट में स्ट्रीम किया जा सकता है। लैंगचेन कॉलबैक के साथ ओपनएआई चैट समापन एपीआई प्रतिक्रियाओं को स्ट्रीम करना
<पी> ओपनएआई चैट कंप्लीशन एपीआई प्रदान किए गए संदेशों के आधार पर वास्तविक समय की बातचीत संबंधी प्रतिक्रियाएं उत्पन्न करने के लिए एक शक्तिशाली उपकरण प्रदान करता है। एप्लिकेशन प्राकृतिक संवादों में संलग्न होने में सक्षम चैटबॉट बनाने से लेकर एआई-संचालित इंटरैक्शन क्षमताओं के साथ ग्राहक सहायता प्रणालियों को बढ़ाने तक फैले हुए हैं। यह डेवलपर्स को गतिशील और प्रतिक्रियाशील संवादात्मक इंटरफ़ेस बनाने में सक्षम बनाता है। <पी> chatCompletionModel.tsx नाम की एक फ़ाइल बनाएं app/lib में निर्देशिका, एक chatCompletionModel को परिभाषित करती है फ़ंक्शन जो लैंगचेन कॉलबैक के साथ ओपनएआई के चैट कंप्लीशन एपीआई के लिए एक स्ट्रीमिंग इंटरफ़ेस बनाता है, जो दिए गए संदेशों के आधार पर वास्तविक समय की बातचीत की सुविधा प्रदान करता है। // File: app/lib/chatCompletionModel.tsx
import { ChatOpenAI } from "@langchain/openai";
export type ConversationMessage = {
role: string;
content: string;
};
export type ConversationMessages = ConversationMessage[];
export const chatCompletionModel = (
controller: ReadableStreamDefaultController,
encoder: TextEncoder
) =>
new ChatOpenAI({
streaming: true,
callbacks: [
{
handleLLMNewToken(token) {
controller.enqueue(encoder.encode(`data: ${token}\n\n`));
},
async handleLLMEnd(output) {
controller.close();
},
},
],
});
<पी> उपरोक्त कोड निम्न कार्य करता है: ChatOpenAI आयात करता है @langchain/openai से कक्षा पैकेज.
- निम्न प्रकार की परिभाषाएँ बनाता है:
ConversationMessage :वार्तालाप में एकल संदेश के लिए एक प्रकार को परिभाषित करता है। इसमें दो गुण शामिल हैं:भूमिका (प्रेषक की भूमिका का संकेत) और सामग्री (संदेश सामग्री).
ConversationMessages :वार्तालाप संदेशों की एक श्रृंखला के लिए एक प्रकार को परिभाषित करता है।
-
chatCompletionModel नाम का एक फ़ंक्शन निर्यात करता है जो दो पैरामीटर लेता है: - नियंत्रक:ए
ReadableStreamDefaultController ऑब्जेक्ट जो आपको संदेशों को स्ट्रीम में पंक्तिबद्ध करने की अनुमति देता है।
- एनकोडर:ए
TextEncoder ऑब्जेक्ट जो संदेशों को Uint8Array में एन्कोड करता है वस्तु.
ChatOpenAI का एक नया उदाहरण बनाता है निम्न कॉन्फ़िगरेशन विकल्पों के साथ कक्षा: streaming :सत्य पर सेट करें, यह दर्शाता है कि एपीआई को स्ट्रीमिंग प्रतिक्रियाएँ लौटानी चाहिए।
callbacks :एक सरणी जिसमें दो कॉलबैक फ़ंक्शंस के साथ एक ऑब्जेक्ट होता है, जिसका उपयोग प्रत्येक चरण में एलएलएम द्वारा प्रतिक्रिया निर्माण को रोकने के लिए किया जाता है।
handleLLMNewToken :भाषा मॉडल द्वारा एक नया टोकन उत्पन्न होने पर कॉलबैक लागू होता है। यह एन्कोडेड टोकन को नियंत्रक के पास भेजता है।
handleLLMEnd :भाषा मॉडल निर्माण पूरा होने पर एक एसिंक्रोनस कॉलबैक लागू किया जाता है। यह नियंत्रक को बंद कर देता है।
<पी> इसके अलावा, route.ts नाम की एक फ़ाइल बनाएं app/api/stream/completion/chat में निम्नलिखित कोड के साथ निर्देशिका. आपके द्वारा बनाए गए आरंभिक स्ट्रीमिंग रूट हैंडलर से किए गए परिवर्तनों को नीचे हाइलाइट किया गया है: // File: app/api/stream/completion/chat/route.ts
// Prevents this route's response from being cached on Vercel
export const dynamic = "force-dynamic";
+ import {
+ type ConversationMessage,
+ chatCompletionModel,
+ } from "@/app/lib/chatCompletionModel";
export async function POST(request: Request) {
+ // Obtain the conversation messages from request's body
+ const { messages = [] } = await request.json();
const encoder = new TextEncoder();
// Create a streaming response
const customReadable = new ReadableStream({
async start(controller) {
+ // Generate a streaming response from OpenAI with LangChain
+ await chatCompletionModel(controller, encoder).invoke(
+ messages.map((i: ConversationMessage) => [i["role"], i["content"]])
+ );
},
});
// Return the stream response and keep the connection alive
return new Response(customReadable, {
// Set the headers for Server-Sent Events (SSE)
headers: {
Connection: "keep-alive",
"Content-Encoding": "none",
"Cache-Control": "no-cache, no-transform",
"Content-Type": "text/event-stream; charset=utf-8",
},
});
}
<पी> Next.js में स्ट्रीमिंग एंडपॉइंट बनाने के लिए आपने पहले जो किया उसके अलावा, ऊपर दिए गए कोड निम्नलिखित कार्य करते हैं: chatCompletionModel आयात करता है फ़ंक्शन और ConversationMessage प्रकार परिभाषा.
request.json() का उपयोग करके अनुरोध निकाय से वार्तालाप में मौजूद संदेशों को निकालता है .
start के अंदर ReadableStream की विधि, chatCompletionModel रूपांतरित संदेश सरणी के बाद फ़ंक्शन को अतुल्यकालिक रूप से लागू किया जाता है। प्रत्येक संदेश एक सारणी में बदल जाता है जिसमें संदेश की भूमिका और सामग्री होती है। यह फ़ंक्शन लैंगचेन के साथ ओपनएआई से स्ट्रीमिंग प्रतिक्रिया उत्पन्न करता है।
<पी> अपस्टैश के साथ चैट इतिहास को कैश करने के लिए, अपस्टैश रेडिस कैश क्लाइंट को chatCompletionModel में आयात करें। इस प्रकार कार्य करें: + import cache from '@/app/lib/upstashCache';
import { ChatOpenAI } from "@langchain/openai";
export type ConversationMessage = {
role: string;
content: string;
};
export type ConversationMessages = ConversationMessage[];
export const chatCompletionModel = (
controller: ReadableStreamDefaultController,
encoder: TextEncoder
) =>
new ChatOpenAI({
+ cache,
streaming: true,
temperature: 0.9,
callbacks: [
{
handleLLMNewToken(token) {
controller.enqueue(encoder.encode(token));
},
async handleLLMEnd(output) {
console.log(output.generations[0][0].text);
controller.close();
},
},
],
});
<पी> न्यूनतम परिवर्तनों के साथ, आपने अपस्टैश के साथ संपूर्ण चैट इतिहास की कैशिंग सक्षम कर दी है। <पी> अब, स्ट्रीमिंग एंडपॉइंट्स का उपभोग करने के लिए क्लाइंट साइड रिएक्ट घटकों को बनाने के लिए आगे बढ़ें। सर्वर द्वारा भेजे गए ईवेंट को सुनने के लिए Next.js फ्रंटएंड सेटअप करें
<पी> इस अनुभाग में, आप सीखेंगे कि सर्वर-भेजे गए इवेंट एपीआई संदेशों के लिए न्यूनतम श्रोता को कैसे सेटअप किया जाए, और उपयोगकर्ता और एआई के बीच आदान-प्रदान किए गए संदेशों की स्थिति को प्रबंधित करने का एक तरीका। रिएक्ट में सर्वर द्वारा भेजे गए इवेंट एपीआई को सुनना
<पी> रिएक्ट में हमारे क्लाइंट-साइड घटक में एसएसई एपीआई को सुनने के लिए, आप निर्दिष्ट एपीआई रूट पर एक POST अनुरोध शुरू करने जा रहे हैं। प्रतिक्रिया प्राप्त होने पर, आप TextDecoderStream का उपयोग करके आने वाले डेटा को एक स्ट्रिंग के रूप में डिकोड करेंगे विधि, और स्ट्रीम से डेटा को लगातार पढ़ें। "use client";
export default function () {
const obtainAPIResponse = async (apiRoute: string, apiData: any) => {
// Initiate the first call to connect to SSE API
const apiResponse = await fetch(apiRoute, {
method: "POST",
headers: {
"Content-Type": "text/event-stream",
},
body: JSON.stringify(apiData),
});
if (!apiResponse.body) return;
// To decode incoming data as a string
const reader = apiResponse.body
.pipeThrough(new TextDecoderStream())
.getReader();
while (true) {
const { value, done } = await reader.read();
if (done) {
break;
}
if (value) {
// Do something
}
}
};
return <></>
}
प्रतिक्रिया में बातचीत की स्थिति प्रबंधित करना
<पी> उपयोगकर्ता और चैटबॉट के बीच बातचीत की स्थिति को प्रबंधित करने के लिए, आप राज्य चर का उपयोग कर सकते हैं। आप राज्य चर messages को अपडेट करेंगे और latestMessage क्रमशः वार्तालाप इतिहास और नवीनतम संदेश को संग्रहीत करने के लिए। एसएसई एपीआई से आने वाले डेटा को संसाधित करने वाले लूप के भीतर इन राज्य चर को अपडेट करके, आप वार्तालाप प्रदर्शन के वास्तविक समय के अपडेट को सुनिश्चित कर सकते हैं। इसे प्राप्त करने के लिए जोड़े गए कोड इस प्रकार हैं: "use client";
+ import { useEffect, useState } from "react";
+ import { ConversationMessages } from "@/app/lib/chatCompletionModel";
export default function () {
+ const [latestMessage, setLatestMessage] = useState<string>("");
+ const [messages, setMessages] = useState<ConversationMessages>([]);
const obtainAPIResponse = async (apiRoute: string, apiData: any) => {
// Initiate the first call to connect to SSE API
const apiResponse = await fetch(apiRoute, {
method: "POST",
headers: {
"Content-Type": "text/event-stream",
},
body: JSON.stringify(apiData),
});
if (!apiResponse.body) return;
// To decode incoming data as a string
const reader = apiResponse.body
.pipeThrough(new TextDecoderStream())
.getReader();
+ let incomingMessage = "";
while (true) {
const { value, done } = await reader.read();
if (done) {
+ // Insert the response received into the messages state
+ setMessages((messages) => [
+ ...messages,
+ { role: "assistant", content: incomingMessage },
+ ]);
+ // Reset the latest message's state received
+ setLatestMessage("");
break;
}
if (value) {
+ // Append the incoming data to latest message's value
+ incomingMessage += value;
+ setLatestMessage(incomingMessage);
}
}
};
return <></>
}
<पी> ऊपर दिए गए कोड निम्नलिखित कार्य करते हैं: - एसएसई एपीआई से प्राप्त आने वाली डेटा स्ट्रीम को स्टोर करने के लिए एक स्टेट वेरिएबल घोषित किया गया है।
- पूर्ण संदेश प्राप्त होने पर (
done द्वारा दर्शाया गया)। सत्य होने पर), नवीनतम प्राप्त संदेश messages में जोड़ा जाता है राज्य सरणी. यह संदेश सहायक की भूमिका के साथ स्वरूपित किया गया है इसे उपयोगकर्ता संदेशों से अलग करने के लिए। साथ ही, अगले आने वाले संदेश की तैयारी के लिए नवीनतम संदेश स्थिति को एक खाली स्ट्रिंग पर रीसेट कर दिया जाता है।
- चूंकि डेटा क्रमिक रूप से प्राप्त होता है (अभी तक पूर्ण संदेश नहीं बना है), इसे
incomingMessage में जोड़ दिया जाता है परिवर्तनशील.
- नवीनतम संदेश स्थिति को सम्मिलित आने वाले डेटा के साथ अद्यतन किया जाता है, जिससे नए डेटा के आने पर वास्तविक समय में अपडेट सुनिश्चित किया जाता है।
<पी> बढ़िया! प्रतिक्रियाशील latestMessage के साथ और messages चर, अब आप बातचीत में आदान-प्रदान किए गए संदेशों और नवीनतम एआई उत्पन्न प्रतिक्रिया का प्रतिनिधित्व करने वाले गतिशील उपयोगकर्ता इंटरफ़ेस बना सकते हैं। <पी> वह बहुत कुछ सीखने वाला था! अब आपका काम पूरा हो गया है ✨ वर्सेल में तैनात करें
<पी> रिपॉजिटरी अब वर्सेल में तैनात करने के लिए तैयार है। तैनात करने के लिए निम्नलिखित चरणों का उपयोग करें: - अपने ऐप के कोड वाली GitHub रिपॉजिटरी बनाकर शुरुआत करें।
- फिर, वर्सेल डैशबोर्ड पर नेविगेट करें और एक नया प्रोजेक्ट बनाएं .
- नए प्रोजेक्ट को आपके द्वारा अभी बनाए गए GitHub रिपॉजिटरी से लिंक करें।
- सेटिंग्समें , पर्यावरण चर को अद्यतन करें आपके स्थानीय
.env से मिलान करने के लिए फ़ाइल.
- तैनाती! 🚀
अधिक जानकारी
<पी> अधिक विस्तृत जानकारी के लिए, इस पोस्ट में उद्धृत संदर्भ देखें। - गिटहब रिपॉजिटरी
- सर्वर द्वारा भेजे गए इवेंट
- Next.js स्ट्रीमिंग
- एलएलएम के लिए कैशिंग परत