LangChain একটি মানুষ এবং একটি AI মধ্যে কথোপকথন পরিচালনা করার জন্য একটি সহজ ইন্টারফেস প্রদান করে। এটি সহজেই BufferMemory ব্যবহার করার জন্য কনফিগার করা যেতে পারে , আপনাকে মেমরিতে কথোপকথনের ইতিহাস সংরক্ষণ করতে সক্ষম করে। কিছু ব্যবহারের ক্ষেত্রে এটি সন্তোষজনক হতে পারে, তবে আপনার অ্যাপগুলির জন্য চ্যাট ইতিহাসের দীর্ঘমেয়াদী অধ্যবসায়েরও প্রয়োজন হতে পারে। সৌভাগ্যবশত, এটি একটি Upstash Redis উদাহরণের জন্য অদলবদল করা ঠিক ততটাই সহজ।
LangChain ioredis সহ Redis-এর জন্য একাধিক ইন্টিগ্রেশন প্রদান করে , node-redis এবং Upstash Redis. যেহেতু Upstash Redis ক্লায়েন্ট REST এর মাধ্যমে কাজ করে, আপনি এটিকে এজ-রেডি অ্যাপ্লিকেশন তৈরি করতে ব্যবহার করতে পারেন যা Vercel, Cloudflare Workers বা অন্য কোনো সার্ভারহীন পরিবেশে স্থাপন করা যেতে পারে। আমরা মেমরি সহ একটি সাধারণ চ্যাট অ্যাপ তৈরি করতে এটি ব্যবহার করব যা সেশন জুড়ে থাকে।
আপনি এখানে এই ডেমোর জন্য সম্পূর্ণ সোর্স কোড খুঁজে পেতে পারেন।
পূর্বশর্ত
- একটি Upstash Redis ডাটাবেস
- একটি OpenAI API কী
শুরু করা
প্রকল্প তৈরি করা হচ্ছে
কিভাবে Upstash Redis-এর সাথে LangChain ব্যবহার করতে হয় তা প্রদর্শন করতে Vercel AI SDK ব্যবহার করে আমরা একটি বেসিক Next.js অ্যাপ তৈরি করব। শুরু করতে, একটি নতুন Next.js অ্যাপ তৈরি করুন:
npx create-next-app@latest
এটি আপনাকে কয়েকটি প্রকল্প বিকল্প নির্বাচন করতে বলবে। বেশিরভাগ অ্যাপের জন্য, ডিফল্ট ঠিক কাজ করবে। এই ডেমোর উদ্দেশ্যে, TypeScript এবং app সক্ষম করতে ভুলবেন না ডিরেক্টরি।
নির্ভরতা ইনস্টল করা
অ্যাপটি তৈরি হয়ে গেলে, আপনাকে কয়েকটি নির্ভরতা ইনস্টল করতে হবে:
npm install ai langchain openai @upstash/redis
কঠোরভাবে প্রয়োজন না হলেও, Vercel AI SDK OpenAI থেকে আমাদের Next.js ফ্রন্টএন্ডে প্রতিক্রিয়া স্ট্রিম করা সহজ করে তুলবে। আমাদের শুধুমাত্র @upstash/redis ব্যবহার করতে হবে একটি 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>
);
}

Vercel AI SDK useChat নামে একটি দরকারী হুক রপ্তানি করে , যা আমাদের চ্যাট অ্যাপের জন্য একটি প্রচলিত ইউজার ইন্টারফেস তৈরি করা খুব সহজ করে তোলে। এটি স্ট্রিমিং চ্যাট বার্তা পরিচালনা করে এবং আমাদের চ্যাট ইনপুটের অবস্থা পরিচালনা করে। হুক ব্যবহার করার জন্য, আমাদের প্রতিক্রিয়া জানাতে হবে যে এটি "use client" যোগ করে একটি ক্লায়েন্ট উপাদান আমাদের ফাইলের শীর্ষে নির্দেশিকা। তারপর, আমরা 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 হুক স্বয়ংক্রিয়ভাবে input যোগ করে messages এ যখন handleSubmit বলা হয়, একটি পুনরায় রেন্ডার ট্রিগার করে যাতে আমাদের নিজেদের UI আপডেট করার বিষয়ে চিন্তা করতে হবে না। এটি ইনপুট ক্ষেত্রটিও সাফ করবে এবং নির্দিষ্ট এন্ডপয়েন্টে একটি API কল ট্রিগার করবে। ডিফল্টরূপে, এটি /api/chat .
অবশেষে, চলুন রেন্ডার করি messages আমাদের ফর্মের উপরে:
<main>
<section>
{messages.map((message) => (
<p key={message.id}>{message.content}</p>
))}
</section>
{/* snip */}
</main> এপিআই এন্ডপয়েন্ট তৈরি করা হচ্ছে
আমরা একটি app/api/chat/route.ts তৈরি করে শুরু করতে পারি ফাইল আমাদের শেষ পয়েন্ট হাউস. Next.js API এন্ডপয়েন্টের পাশাপাশি পৃষ্ঠাগুলির জন্য ফাইল-ভিত্তিক রাউটিং ব্যবহার করে—এই কারণেই এই নতুন ফাইলের ফোল্ডার কাঠামো ডিফল্ট এন্ডপয়েন্টের সাথে মেলে, /api/chat , আগে থেকে।
যেহেতু আমরা Upstash Redis ব্যবহার করছি, আমাদের এন্ডপয়েন্ট এজ-সামঞ্জস্যপূর্ণ। আমরা const runtime = "edge" রপ্তানি করে এটি নির্দিষ্ট করতে পারি আমাদের শেষ পয়েন্ট থেকে। শেষবিন্দুতে, আমরা messages পুনরুদ্ধার করতে পারি ক্ষেত্র যা useChat হুক আমাদের জন্য জনবহুল. এটি আমাদের 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যা শেষ পর্যন্ত ল্যাংচেইন প্রক্রিয়ার ফলাফল ধারণ করবে।handlersLLM কলব্যাক ফাংশন ধারণকারী একটি বস্তু যা 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";
আমরা এখন একটি রেডিস ক্লায়েন্ট তৈরি করতে পারি এবং আমাদের চেইনের জন্য মেমরি সেট আপ করতে পারি। এখানে, আমরা একটি ConversationChain তৈরি করি যে আমরা মডেলের পরিবর্তে কল করতে পারি। এটি একটি কাস্টম চেইন যা একজন মানুষ এবং একজন AI এর মধ্যে কথোপকথনকে সহজতর করে। আমরা একটি কাস্টম BaseMemory পাস করতে পারি চেইনে বাস্তবায়ন, যা বার্তা সংরক্ষণ এবং পুনরুদ্ধার করতে ব্যবহার করা হবে। এই ক্ষেত্রে, আমরা BufferMemory ব্যবহার করছি UpstashRedisChatMessageHistory সহ Upstash Redis-এ বার্তা সংরক্ষণ করতে:
// 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
আমরা Redis ব্যবহার করে একটি নতুন Redis ক্লায়েন্ট তৈরি করি @upstash/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 আগের থেকে অবজেক্ট এলএলএম-এর প্রম্পট হিসাবে ব্যবহৃত হয়। এছাড়াও আমরা handlers পাস করি চেইনে অবজেক্ট, যা ফলাফলগুলিকে stream এ পাইপ করতে ব্যবহার করা হবে .
উপসংহার
তাই তো! আপনি এখন npm run dev দিয়ে আপনার অ্যাপ চালাতে পারেন এবং আপনার AI এর সাথে চ্যাট শুরু করুন। প্রতিক্রিয়া স্বয়ংক্রিয়ভাবে আমরা পূর্বে তৈরি করা ক্লায়েন্টে ফিরে আসবে এবং কথোপকথনের ইতিহাস Upstash Redis-এ সংরক্ষণ করা হবে।

