এই পোস্টে আমি ব্যাখ্যা করব কিভাবে Upstash Vector, Upstash Redis, Hugging Face Inference API, Replicate LLAMA-2-70B চ্যাট মডেল এবং Vercel ব্যবহার করে একটি ওপেন-সোর্স কাস্টম কন্টেন্ট RAG চ্যাটবট তৈরি করা হয়েছে। Upstash Vector ভেক্টর ইনসার্ট ও কোয়েরি করতে সাহায্য করে, প্রতিটি ইউজার মেসেজের জন্য ডাইনামিক্যালি প্রাসঙ্গিক কনটেক্সট তৈরি বা আপডেট করে, আর Upstash Redis চ্যাটবট কথোপকথন সংরক্ষণ করে।
পূর্বশর্ত
- Node.js 18 বা তার পরে
- Upstash অ্যাকাউন্ট
- Hugging Face অ্যাকাউন্ট
- Replicate অ্যাকাউন্ট
- Vercel অ্যাকাউন্ট
টেক স্ট্যাক
| প্রযুক্তি | বিবরণ |
|---|---|
| Upstash | সার্ভারলেস ডেটাবেস প্ল্যাটফর্ম। ভেক্টর এবং কথোপকথন সংরক্ষণের জন্য যথাক্রমে Upstash Vector এবং Upstash Redis ব্যবহার করা হয়েছে। |
| Next.js | ওয়েবের জন্য React ফ্রেমওয়ার্ক। দ্রুত প্রোটোটাইপিং-এর জন্য shadcn/ui ব্যবহার করা হয়েছে। |
| Replicate | ওপেন-সোর্স মডেল রান ও ফাইন-টিউন করার প্ল্যাটফর্ম। LLAMA-2-70B চ্যাট মডেল ব্যবহার করা হয়েছে। |
| Hugging Face | মেশিন লার্নিং কমিউনিটির প্ল্যাটফর্ম। এমবেডিং তৈরি করার জন্য Hugging Face Inference API ব্যবহার করা হয়েছে। |
| LangChain | ভাষা মডেল-চালিত অ্যাপ্লিকেশন বিকাশের ফ্রেমওয়ার্ক। |
| TailwindCSS | কাস্টম ডিজাইন তৈরির CSS ফ্রেমওয়ার্ক। |
| Vercel | ওয়েব অ্যাপ্লিকেশন স্থাপন ও স্কেল করার ক্লাউড প্ল্যাটফর্ম। |
Upstash Redis সেটআপ করা
Upstash অ্যাকাউন্টে লগ ইন করে Redis ট্যাবে একটি ডেটাবেস তৈরি করুন। Details ট্যাবে Connect your database সেকশন থেকে কানেকশন স্ট্রিং কপি করে রাখুন। REST API সেকশনে .env বাটনে ক্লিক করে কন্টেন্ট কপি করুন।
Upstash Vector সেটআপ করা
Vector ট্যাবে একটি Index তৈরি করুন। Connect সেকশনে .env বাটনে ক্লিক করে কন্টেন্ট কপি করুন।
প্রজেক্ট সেটআপ করা
রিপো ক্লোন করুন এবং ডিপেন্ডেন্সি ইনস্টল করুন:
git clone https://github.com/rishi-raj-jain/custom-rag-chatbot-upstash-vector cd custom-rag-chatbot-upstash-vector pnpm install
.env ফাইল তৈরি করুন:
# .env # উপরের ধাপগুলো থেকে প্রাপ্ত # Upstash Redis URL and Token UPSTASH_REDIS_REST_URL="https://....upstash.io" UPSTASH_REDIS_REST_TOKEN="..." # Upstash Vector URL and Token UPSTASH_VECTOR_REST_URL="https://...-vector.upstash.io" UPSTASH_VECTOR_REST_TOKEN="..." # Replicate API Key REPLICATE_API_TOKEN="r8_..." # Hugging Face Inference API Key HUGGINGFACEHUB_API_KEY="hf_..."
লোকাল এনভায়রনমেন্ট চালান:
pnpm dev
রিপোজিটরি কাঠামো
প্রজেক্টের প্রধান ফোল্ডার কাঠামো। লাল চিহ্নিত ফাইলগুলো এই পোস্টে আলোচনা করা হয়েছে।
Next.js App Router-এ Chat Route সেটআপ করা
app/api/chat/route.js রাউট সেটআপ করা হয়েছে যাতে কথোপকথন সিঙ্ক করা যায়, স্ট্রিং-এর এমবেডিং তৈরি করা যায়, প্রাসঙ্গিক ভেক্টর কোয়েরি করা যায় এবং LLAMA-2-70B চ্যাট মডেল থেকে প্রিডিকশন নেওয়া যায়।
কথোপকথন সংরক্ষণ করা
Upstash Redis-এ Redis Lists ব্যবহার করে কথোপকথন ক্যাশ করা হয়। ইউজার মেসেজ আসার সাথে সাথে চ্যাটবটের আগের রেসপন্স এবং লেটেস্ট ইউজার মেসেজ লিস্টে পুশ করা হয়।
import { Redis } from '@upstash/redis' const upstashRedis = new Redis({ url: process.env.UPSTASH_REDIS_REST_URL, token: process.env.UPSTASH_REDIS_REST_TOKEN, }) export async function POST(req) { try { const { messages } = await req.json() if (messages.length > 1) { await upstashRedis.lpush('unique_conversation_id', JSON.stringify(messages[messages.length - 2])) } await upstashRedis.lpush('unique_conversation_id', JSON.stringify(messages[messages.length - 1])) // রেসপন্স তৈরি করুন }
লেটেস্ট মেসেজের এমবেডিং তৈরি করা
Hugging Face Inference API এবং LangChain ব্যবহার করে এজ-এ এমবেডিং তৈরি করা হয় এবং Upstash Vector Index-এ কনফিগার করা দৈর্ঘ্যের (২৫৬) অনুযায়ী স্লাইস করা হয়।
import { HuggingFaceInferenceEmbeddings } from '@langchain/community/embeddings/hf' const embeddings = new HuggingFaceInferenceEmbeddings() export async function POST(req) { try { // ... const userMessages = messages.filter((i) => i.role === 'user') const lastMessage = userMessages[userMessages.length - 1].content const queryVector = (await embeddings.embedQuery(lastMessage)).slice(0, 256) // রেসপন্স তৈরি করুন }
লেটেস্ট মেসেজ অনুযায়ী প্রাসঙ্গিক কনটেক্সট ভেক্টর রিট্রিভ করা
সارا নলেজ বেস প্রতিবার ফেচ করা ব্যয়বহুল। শুধু প্রাসঙ্গিক কনটেক্সট ব্যবহার করতে উপস্থিত ভেক্টর সেট থেকে ২টি সবচেয়ে প্রাসঙ্গিক ভেক্টর কোয়েরি করা হয়, ৭০% 이상의 কনফিডেন্স স্কোর वालা ফিল্টার করা হয়।
import { Index } from '@upstash/vector' const upstashVectorIndex = new Index() export async function POST(req) { try { // ... const queryResult = await upstashVectorIndex.query({ vector: queryVector, topK: 2, includeVectors: false, includeMetadata: true, }) const queryPrompt = queryResult .filter((match) => match.score && match.score > 0.7) .map((match) => match.metadata.description) .join('\n') // রেসপন্স তৈরি করুন }
LLAMA-2-70B চ্যাট মডেলকে কনটেক্সটসহ প্রম্পট করা
প্রাসঙ্গিক কনটেক্সট স্ট্রিং হিসেবে পাওয়া গেলে Vercel AI SDK-এর experimental_buildLlama2Prompt মেথড ব্যবহার করে LLAMA-2-70B চ্যাট মডেলকে প্রম্পট করা হয়।
import Replicate from 'replicate' import { experimental_buildLlama2Prompt } from 'ai/prompts' import { ReplicateStream, StreamingTextResponse } from 'ai' const replicate = new Replicate({ auth: process.env.REPLICATE_API_TOKEN, }) export async function POST(req) { try { // ... const response = await replicate.predictions.create({ stream: true, version: '2c1608e18606fad2812020dc541930f2d0495ce32eee50074220b87300bc16e1', input: { prompt: experimental_buildLlama2Prompt([ { role: 'system', content: queryPrompt.substring(0, Math.min(queryPrompt.length, 2000)), }, ...messages, ]), }, }) const stream = await ReplicateStream(response) return new StreamingTextResponse(stream) }
Next.js App Router-এ Train Route সেটআপ করা
app/api/train/route.js রাউটে স্ট্রিং-এর এমবেডিং তৈরি করে Upstash Vector Index-এ আপসার্ট করা হয়।
স্ট্রিং-এর এমবেডিং তৈরি করা
import { HuggingFaceInferenceEmbeddings } from '@langchain/community/embeddings/hf' const embeddings = new HuggingFaceInferenceEmbeddings() export async function POST(req) { try { let messagesToVectorize = [ 'Rishi is pretty much active on Twitter nowadays.', 'Rishi loves writing for Upstash', "Rishi's recent article on building chatbot using Upstash went viral", 'Rishi is enjoying building launchfa.st.', ] if (req.headers.get('Content-Type') === 'application/json') { const { messages } = await req.json() if (typeof messages !== 'string' && messages.length > 0) { messagesToVectorize = messages } } const generatedEmbeddings = await Promise.all(messagesToVectorize.map((i) => embeddings.embedQuery(i))) // ... }
রিলেভেন্সি সার্চের জন্য ভেক্টর সংরক্ষণ করা
জেনারেট করা এমবেডিং ২৫৬ দৈর্ঘ্যে স্লাইস করে upsert মেথড দিয়ে মেটাডেটা (স্ট্রিং খুদ) সহ ভেক্টর ইন্ডেক্সে ইনসার্ট করা হয়।
import { Index } from '@upstash/vector' const upstashVectorIndex = new Index() export async function POST(req) { try { // ... await Promise.all( generatedEmbeddings .map((i) => i.slice(0, 256)) .map((vector, index) => upstashVectorIndex.upsert({ vector, id: index.toString(), metadata: { description: messagesToVectorize[index] }, }), ), ) return new Response(JSON.stringify({ code: 1 }), { status: 200, headers: { 'Content-Type': 'application/json' } }) }
Vercel-এ ডিপ্লয় করা
- GitHub রিপোজিটরি তৈরি করুন।
- Vercel Dashboard-এ New Project তৈরি করুন।
- GitHub রিপোজিটরি লিংক করুন।
- Settings-এ Environment Variables আপডেট করুন।
- Deploy! 🚀
আরও তথ্য
বিস্তারিত জানতে রেফারেন্স দেখুন।
উপসংহার
এই প্রজেক্ট থেকে এমবেডিং তৈরি করা, এক্সিস্টিং ভেক্টর সেট থেকে কোয়েরি করা এবং LLAMA-2-70B চ্যাট মডেল ব্যবহার করে প্রাসঙ্গিক প্রিডিকশন তৈরি করা শিখা যাওয়া, সেটি আপনার ডিমান্ড অনুযায়ী স্কেল হওয়া সার্ভিস (Upstash) ব্যবহার করে।