Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Redis

LangChain और Upstash Redis के साथ चैट इतिहास को बनाए रखना

LangChain एक मानव और AI के बीच बातचीत संचालित करने के लिए एक सरल इंटरफ़ेस प्रदान करता है। इसे BufferMemory का उपयोग करने के लिए आसानी से कॉन्फ़िगर किया जा सकता है, जिससे आप मेमोरी में बातचीत इतिहास संग्रहीत कर सकते हैं। यह कुछ उपयोग के मामलों के लिए संतोषजनक हो सकता है, लेकिन आपके ऐप्स को चैट इतिहास के दीर्घकालिक स्थायित्व की भी आवश्यकता हो सकती है। सौभाग्य से, इसे Upstash Redis इंस्टेंस के लिए स्वैप करना उतना ही सीधा है।

LangChain Redis के लिए कई एकीकरण प्रदान करता है, जिनमें ioredis, node-redis और Upstash Redis शामिल हैं। क्योंकि Upstash Redis क्लाइंट REST के माध्यम से काम करता है, आप इसका उपयोग एज-तैयार एप्लिकेशन बनाने के लिए कर सकते हैं जिन्हें Vercel, Cloudflare Workers, या किसी अन्य सर्वरलेस वातावरण में डिप्लॉय किया जा सकता है। हम इसका उपयोग एक साधारण चैट ऐप बनाने के लिए करेंगे जिसमें सत्रों में स्थायी मेमोरी हो।

आप इस डेमो के लिए पूरा सोर्स कोड यहां पा सकते हैं।

पूर्वापेक्षाएँ

  • एक Upstash Redis डेटाबेस
  • एक OpenAI API कुंजी

शुरुआत करना

प्रोजेक्ट बनाना

हम Vercel AI SDK का उपयोग करके एक बुनियादी Next.js ऐप बनाएंगे यह दिखाने के लिए कि LangChain को Upstash Redis के साथ कैसे उपयोग किया जाए। शुरू करने के लिए, एक नया Next.js ऐप बनाएं:

npx create-next-app@latest

यह आपसे कुछ प्रोजेक्ट विकल्प चुनने के लिए कहेगा। अधिकांश ऐप्स के लिए, डिफ़ॉल्ट ठीक काम करेंगे। इस डेमो के उद्देश्य के लिए, TypeScript और app निर्देशिका को सक्षम करना सुनिश्चित करें।

निर्भरताएँ इंस्टॉल करना

ऐप बनने के बाद, आपको कुछ निर्भरताएँ इंस्टॉल करने की आवश्यकता होगी:

npm install ai langchain openai @upstash/redis

हालांकि सख्ती से आवश्यक नहीं, Vercel AI SDK OpenAI से हमारे Next.js फ्रंटएंड पर प्रतिक्रियाओं को स्ट्रीम करना आसान बना देगा। हमें केवल Redis क्लाइंट बनाने के लिए @upstash/redis का उपयोग करना होगा—LangChain बाकी का ख्याल रखेगा।

पर्यावरण चर सेट करना

अंत में, हमें पहले की पूर्वापेक्षाओं से निम्नलिखित पर्यावरण चर की आवश्यकता होगी। उन्हें ठीक उसी तरह नाम देना सुनिश्चित करें जैसा यहां वर्णित है, क्योंकि अन्यथा वे स्वचालित रूप से नहीं पढ़े जाएंगे! आप इन्हें अपने नए प्रोजेक्ट के रूट में .env फ़ाइल में जोड़ सकते हैं:

UPSTASH_REDIS_REST_URL="https://********.upstash.io" UPSTASH_REDIS_REST_TOKEN="********" OPENAI_API_KEY="sk-********"

एक बुनियादी चैट क्लाइंट बनाना

आप देखेंगे कि Next.js ने हमारे लिए कई फाइलें बनाई हैं। हम app निर्देशिका में केवल कुछ फाइलों के साथ काम करेंगे, इसलिए आप public और app में वर्तमान में मौजूद सब कुछ आगे बढ़कर हटा सकते हैं।

शुरू करने के लिए, हम अपने ऐप को रखने के लिए एक बुनियादी app/layout.tsx बनाएंगे:

import type { PropsWithChildren } from "react"; export default function RootLayout({ children }: PropsWithChildren) { return ( <html lang="en"> <body>{children}</body> </html> ); }

अगला, हमें उपयोगकर्ता से संदेश स्वीकार करने के लिए एक इनपुट के साथ एक बुनियादी फॉर्म की आवश्यकता होगी। इसे हमारे app/page.tsx में जोड़ा जा सकता है:

export default function Home() { return ( <main> <form> <input placeholder="Enter a message..." /> <button type="submit">Send</button> </form> </main> ); }

LangChain और Upstash Redis के साथ चैट इतिहास को बनाए रखना

Vercel AI SDK एक उपयोगी हुक useChat निर्यात करता है, जो हमारे चैट ऐप के लिए एक पारंपरिक उपयोगकर्ता इंटरफ़ेस बनाना बहुत आसान बनाता है। यह चैट संदेशों को स्ट्रीम करने और हमारे चैट इनपुट की स्थिति को प्रबंधित करने को संभालता है। हुक का उपयोग करने के लिए, हमें "use client" निर्देश को अपनी फ़ाइल के शीर्ष पर जोड़कर React को बताना होगा कि यह एक क्लाइंट कंपोनेंट है। फिर, हम useChat हुक से कुछ गुणों को डिस्ट्रक्चर कर सकते हैं:

  • messages भेजे गए और प्राप्त संदेशों की एक सरणी है।
  • input इनपुट फ़ील्ड का वर्तमान मूल्य है।
  • handleInputChange एक फ़ंक्शन है जो इनपुट मान को अपडेट करता है।
  • handleSubmit एक फ़ंक्शन है जो संदेशों को हमारे एंडपॉइंट पर भेजता है।
"use client"; import { useChat } from "ai/react"; export default function Home() { const { messages, input, handleInputChange, handleSubmit } = useChat(); return ( <main> <form onSubmit={handleSubmit}> <input value={input} onChange={handleInputChange} placeholder="Enter a message..." /> <button type="submit">Send</button> </form> </main> ); }

आंतरिक रूप से, useChat हुक स्वचालित रूप से handleSubmit कॉल किए जाने पर input को messages में जोड़ता है, जिससे री-रेंडर ट्रिगर होता है इसलिए हमें UI को स्वयं अपडेट करने के बारे में चिंता करने की आवश्यकता नहीं है। यह इनपुट फ़ील्ड को भी साफ़ करेगा और निर्दिष्ट एंडपॉइंट पर एक API कॉल ट्रिगर करेगा। डिफ़ॉल्ट रूप से, यह /api/chat है।

अंत में, आइए अपने फॉर्म के ऊपर messages को रेंडर करें:

<main> <section> {messages.map((message) => ( <p key={message.id}>{message.content}</p> ))} </section> {/* snip */} </main>

API एंडपॉइंट बनाना

हम अपने एंडपॉइंट को रखने के लिए एक app/api/chat/route.ts फ़ाइल बनाकर शुरू कर सकते हैं। Next.js API एंडपॉइंट के साथ-साथ पेजों के लिए फ़ाइल-आधारित रूटिंग का उपयोग करता है—यही कारण है कि इस नई फ़ाइल के लिए फ़ोल्डर संरचना पहले से डिफ़ॉल्ट एंडपॉइंट, /api/chat से मेल खाती है।

क्योंकि हम Upstash Redis का उपयोग कर रहे हैं, हमारा एंडपॉइंट एज-संगत है। हम अपने एंडपॉइंट से const runtime = "edge" निर्यात करके इसे निर्दिष्ट कर सकते हैं। एंडपॉइंट में ही, हम useChat हुक द्वारा हमारे लिए भरे गए messages फ़ील्ड को पुनः प्राप्त कर सकते हैं। यह हमें नवीनतम संदेश को LangChain पर पास करने की अनुमति देता है:

import { type NextRequest } from "next/server"; import { LangChainStream, StreamingTextResponse } from "ai"; export const runtime = "edge"; export async function POST(req: NextRequest) { const { messages } = await req.json(); const { stream, handlers } = LangChainStream(); const latestMessage = messages[messages.length - 1]; return new StreamingTextResponse(stream); }

useChat की तरह, LangChainStream भी कुछ गुण लौटाता है जिन्हें हम डिस्ट्रक्चर कर सकते हैं।

  • stream एक ReadableStream है जिसमें अंततः LangChain प्रक्रिया के परिणाम होंगे।
  • handlers एक ऑब्जेक्ट है जिसमें LLM कॉलबैक फ़ंक्शन होते हैं जिन्हें LangChain को पास किया जा सकता है।

इससे पहले कि हम चेन को लागू कर सकें, हमें कुछ अतिरिक्त वर्गों को आयात करने की आवश्यकता होगी:

import { Redis } from "@upstash/redis"; import { ConversationChain } from "langchain/chains"; import { ChatOpenAI } from "langchain/chat_models/openai"; import { BufferMemory } from "langchain/memory"; import { UpstashRedisChatMessageHistory } from "langchain/stores/message/upstash_redis";

अब हम एक Redis क्लाइंट बना सकते हैं और अपनी चेन के लिए मेमोरी सेट कर सकते हैं। यहां, हम एक ConversationChain बनाते हैं जिसे हम मॉडल के स्थान पर कॉल कर सकते हैं। यह एक कस्टम चेन है जो एक मानव और AI के बीच बातचीत की सुविधा प्रदान करती है। हम चेन को एक कस्टम BaseMemory कार्यान्वयन पास कर सकते हैं, जिसका उपयोग संदेशों को संग्रहीत और पुनः प्राप्त करने के लिए किया जाएगा। इस मामले में, हम संदेशों को Upstash Redis में संग्रहीत करने के लिए UpstashRedisChatMessageHistory के साथ BufferMemory का उपयोग कर रहे हैं:

// snip const latestMessage = messages[messages.length - 1]; const memory = new BufferMemory({ chatHistory: new UpstashRedisChatMessageHistory({ sessionId: new Date().toLocaleDateString(), client: Redis.fromEnv(), }), }); const model = new ChatOpenAI({ modelName: "gpt-3.5-turbo", streaming: true, }); const chain = new ConversationChain({ llm: model, memory }); // snip

हम @upstash/redis से निर्यात Redis क्लास का उपयोग करके एक नया Redis क्लाइंट बनाते हैं। यह पर्यावरण चर को स्वचालित रूप से लोड करने के लिए एक विधि प्रदान करता है, जो ChatOpenAI के व्यवहार को दर्शाता है। जब तक आपने अपने पर्यावरण चर को सही ढंग से नाम दिया है, तब तक आपको इनमें से किसी भी क्लास को कोई अतिरिक्त आर्गुमेंट पास करने की आवश्यकता नहीं होगी।

आपके ऐप में, आप यह सुनिश्चित करने के लिए sessionId के लिए उपयोगकर्ता की आईडी या किसी अन्य अद्वितीय पहचानकर्ता का उपयोग करना चाह सकते हैं कि संदेश उपयोगकर्ताओं के बीच साझा नहीं किए जाते हैं, लेकिन हम इस डेमो के लिए वर्तमान तारीख का उपयोग करेंगे। UpstashRedisChatMessageHistory sessionTTL जैसे अधिक कॉन्फ़िगरेशन विकल्प प्रदान करता है ताकि कैश के जीवनकाल को सेट किया जा सके।

मॉडल पर streaming सक्षम करना महत्वपूर्ण है, क्योंकि यह हमें पहले से डिस्ट्रक्चर किए गए handlers ऑब्जेक्ट का उपयोग करके चेन के परिणामों को stream पर पाइप करने की अनुमति देगा। अंत में, हम चेन को कॉल कर सकते हैं, नवीनतम संदेश और handlers ऑब्जेक्ट पास करते हुए:

// snip const chain = new ConversationChain({ llm: model, memory }); chain.call({ input: latestMessage.content, callbacks: [handlers], }); return new StreamingTextResponse(stream); // snip

हमारा पहले से latestMessage ऑब्जेक्ट LLM के लिए प्रॉम्प्ट के रूप में उपयोग किया जाता है। हम handlers ऑब्जेक्ट को चेन पर भी पास करते हैं, जिसका उपयोग परिणामों को stream पर पाइप करने के लिए किया जाएगा।

निष्कर्ष

बस! अब आप npm run dev के साथ अपना ऐप चला सकते हैं और अपने AI के साथ चैट करना शुरू कर सकते हैं। प्रतिक्रिया स्वचालित रूप से हमारे द्वारा पहले बनाए गए क्लाइंट पर वापस स्ट्रीम की जाएगी, और बातचीत इतिहास Upstash Redis में संग्रहीत किया जाएगा।

LangChain और Upstash Redis के साथ चैट इतिहास को बनाए रखना

LangChain और Upstash Redis के साथ चैट इतिहास को बनाए रखना

  1. रूबी में Rake में महारत हासिल करें: टास्क ऑटोमेशन के लिए पूर्ण गाइड रूबी में Rake में महारत हासिल करें: टास्क ऑटोमेशन के लिए पूर्ण गाइड

    Rake रूबी में एक लोकप्रिय टास्क रनर है। टास्क क्या है? अपने डेटाबेस का बैकअप बनाना अपने टेस्ट्स चलाना आंकड़े इकट्ठा करना और रिपोर्ट करना ये छोटे टास्क हैं जो Rake के बिना आपकी प्रोजेक्ट पर अलग-अलग फाइलों में बिखरे होंगे। Rake आपके टास्क्स तक पहुंच को केंद्रीकृत करता है। Rake कुछ चीजों को आसान भी ब

  1. Matplotlib में X-एक्सिस और Y-एक्सिस की रेंज कैसे बदलें? Matplotlib में X-एक्सिस और Y-एक्सिस की रेंज कैसे बदलें?

    X और Y एक्सेस की रेंज बदलने के लिए, हम xlim() और ylim() मेथड्स का उपयोग कर सकते हैं।चरणफिगर का आकार सेट करें और सबप्लॉट्स के बीच और आसपास पैडिंग एडजस्ट करें।NumPy का उपयोग करके x और y डेटा पॉइंट्स बनाएं।plot() मेथड का उपयोग करके x और y डेटा पॉइंट्स प्लॉट करें।X और Y एक्सेस लिमिट सेट करें।फिगर प्रदर्

  1. फोर्ड-फुल्करसन एल्गोरिदम फोर्ड-फुल्करसन एल्गोरिदम

    फोर्ड-फुल्करसन एल्गोरिदम का उपयोग दिए गए ग्राफ में प्रारंभ शीर्ष से सिंक शीर्ष तक अधिकतम प्रवाह का पता लगाने के लिए किया जाता है। इस ग्राफ में, प्रत्येक किनारे की क्षमता होती है। दो शीर्ष दिए गए हैं जिन्हें स्रोत और सिंक नाम दिया गया है। स्रोत शीर्ष में सभी जावक किनारे होते हैं, कोई आवक किनारा नहीं