এই পোস্টে, আমি কিভাবে Upstash Vector, Upstash Redis, Hugging Face Inference API, Replicate LLAMA-2-70B চ্যাট মডেল এবং Vercel সহ একটি ওপেন-সোর্স কাস্টম কন্টেন্ট RAG চ্যাটবট তৈরি করেছি সে সম্পর্কে কথা বলি। Upstash ভেক্টর আমাকে ভেক্টর সন্নিবেশ করতে এবং জিজ্ঞাসা করতে সাহায্য করেছে, গতিশীলভাবে প্রতিটি ব্যবহারকারীর বার্তার জন্য প্রাসঙ্গিক প্রসঙ্গ তৈরি বা আপডেট করতে এবং Upstash Redis আমাকে চ্যাটবট কথোপকথন সংরক্ষণ করতে সাহায্য করেছে।
পূর্বশর্ত
আপনার নিম্নলিখিতগুলির প্রয়োজন হবে:
- Node.js 18 বা তার পরে
- একটি Upstash অ্যাকাউন্ট
- একটি আলিঙ্গন করা মুখের অ্যাকাউন্ট
- একটি প্রতিলিপি অ্যাকাউন্ট
- একটি Vercel অ্যাকাউন্ট
টেক স্ট্যাক
Upstash Redis সেট আপ করা হচ্ছে
একবার আপনি একটি Upstash অ্যাকাউন্ট তৈরি করেছেন এবং লগ ইন করলে আপনি Redis ট্যাবে যান এবং একটি ডাটাবেস তৈরি করতে যাচ্ছেন৷


আপনি আপনার ডাটাবেস তৈরি করার পরে, আপনি তারপরে বিশদ ট্যাবে যাচ্ছেন। আপনি আপনার ডাটাবেস সংযোগ বিভাগটি খুঁজে না পাওয়া পর্যন্ত নিচে স্ক্রোল করুন। বিষয়বস্তু অনুলিপি করুন এবং এটি নিরাপদ কোথাও সংরক্ষণ করুন৷
৷

এছাড়াও, আপনি REST API বিভাগটি খুঁজে না পাওয়া পর্যন্ত নিচে স্ক্রোল করুন এবং .env বোতামটি নির্বাচন করুন। বিষয়বস্তু অনুলিপি করুন এবং এটি নিরাপদ কোথাও সংরক্ষণ করুন৷
৷

Upstash ভেক্টর সেট আপ করা হচ্ছে
একবার আপনি একটি Upstash অ্যাকাউন্ট তৈরি করেছেন এবং লগ ইন করলে আপনি ভেক্টর ট্যাবে গিয়ে একটি সূচক তৈরি করতে যাচ্ছেন৷


এছাড়াও, আপনি সংযোগ না পাওয়া পর্যন্ত নিচে স্ক্রোল করুন বিভাগ এবং .env নির্বাচন করুন বোতাম বিষয়বস্তু অনুলিপি করুন এবং এটি নিরাপদ কোথাও সংরক্ষণ করুন৷
৷

প্রকল্প সেট আপ করা হচ্ছে
সেট আপ করতে, শুধু অ্যাপ রেপো ক্লোন করুন এবং এতে যা আছে তা শিখতে এই টিউটোরিয়ালটি অনুসরণ করুন। প্রকল্পটি ফর্ক করতে, চালান:
git clone https://github.com/rishi-raj-jain/custom-rag-chatbot-upstash-vector
cd custom-rag-chatbot-upstash-vector
pnpm install
একবার আপনি রেপো ক্লোন করলে, আপনি একটি .env তৈরি করতে যাচ্ছেন ফাইল আপনি উপরের বিভাগগুলি থেকে আমরা যে আইটেমগুলি সংরক্ষণ করেছি তা যোগ করতে চলেছেন৷
এটি দেখতে এইরকম কিছু হওয়া উচিত:
# .env
# Obtained from the steps as above
# 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 ভান্ডারের কাঠামো
এই প্রকল্পের জন্য প্রধান ফোল্ডার গঠন. আমি সেই ফাইলগুলিকে লাল রঙে চিহ্নিত করেছি যা এই পোস্টে আরও আলোচনা করা হবে যা আপনার কাস্টম প্রসঙ্গে প্রশিক্ষিত AI এর সাথে চ্যাট করার জন্য API রুট তৈরি এবং upsert এর মাধ্যমে প্রসঙ্গ আপডেট করার সাথে সম্পর্কিত। - বিদ্যমান সূচকে ভেক্টর।

Next.js অ্যাপ রাউটারে চ্যাট রুট সেটআপ করুন
এই বিভাগে, আমরা কীভাবে রুট সেটআপ করেছি সে সম্পর্কে কথা বলি:app/api/chat/route.js আমাদের সার্ভারহীন ডাটাবেসে কথোপকথনটি সিঙ্ক করতে, গতিশীলভাবে স্ট্রিংগুলির এম্বেডিং তৈরি করুন, প্রসঙ্গ তৈরি করতে একটি প্রদত্ত সূচক থেকে প্রাসঙ্গিক ভেক্টর জিজ্ঞাসা করুন এবং LLAMA-2-70B চ্যাট মডেল ব্যবহার করে প্রাসঙ্গিক পূর্বাভাসের অনুরোধ করুন৷ জিনিসগুলিকে সহজ করার জন্য, আমরা এটিকে আরও ভাগে ভাগ করব:
কথোপকথন সংরক্ষণ করা
আপস্ট্যাশ রেডিসের সাথে সংঘটিত কথোপকথনটি ক্যাশে করতে, আমরা রেডিস তালিকা ব্যবহার করব। উত্তর দেওয়ার জন্য ব্যবহারকারীর কাছ থেকে একটি বার্তা আসার সাথে সাথে, আমরা শর্তসাপেক্ষে চ্যাটবট থেকে (আগের) প্রতিক্রিয়াটিকে তালিকায় ঠেলে দিই। তারপরে, আমরা ব্যবহারকারীর সর্বশেষ বার্তাটিকে তালিকাতে পুশ করে সংরক্ষণ করি এবং এটিতে প্রতিক্রিয়া জানাতে এগিয়ে যাই।
// File: app/api/chat/route.js
import { Redis } from '@upstash/redis'
// Instantiate the 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 {
// the whole chat as array of messages
const { messages } = await req.json()
// assuming user - assistant chat
// add assitant's response to the chat history
if (messages.length > 1) {
await upstashRedis.lpush('unique_conversation_id', JSON.stringify(messages[messages.length - 2]))
}
// add user's request to the chat history
await upstashRedis.lpush('unique_conversation_id', JSON.stringify(messages[messages.length - 1]))
// Proceed to create a response
} সাম্প্রতিক বার্তার এম্বেডিং তৈরি করুন৷
সমস্ত প্রদত্ত প্রসঙ্গে কার্যকরভাবে ব্যবহারকারীর সর্বশেষ বার্তার উত্তর দিতে (অর্থাৎ কাস্টম সামগ্রী ব্যবহারকারীর সরবরাহ করা হয়েছে), আমরা একটি এমবেডিং তৈরি করতে যাচ্ছি যা আমাদের বিদ্যমান সূচক থেকে প্রাসঙ্গিক প্রসঙ্গ (ওরফে অনুরূপ ভেক্টর) পুনরুদ্ধার করতে সহায়তা করবে। আমরা প্রান্তে একটি API কল দিয়ে এমবেডিং তৈরি করতে LangChain-এর সাথে Hugging Face Inference API ব্যবহার করব এবং Upstash ভেক্টর সূচক (এখানে, 256 )।
// File: app/api/chat/route.js
import { HuggingFaceInferenceEmbeddings } from '@langchain/community/embeddings/hf'
// Instantiate the Hugging Face Inference API
const embeddings = new HuggingFaceInferenceEmbeddings()
export async function POST(req) {
try {
// ...
// get the latest question stored in the last message of the chat array
const userMessages = messages.filter((i) => i.role === 'user')
const lastMessage = userMessages[userMessages.length - 1].content
// generate embeddings of the latest question
const queryVector = (await embeddings.embedQuery(lastMessage)).slice(0, 256)
// Proceed to create a response
} সাম্প্রতিক বার্তার উপর ভিত্তি করে প্রাসঙ্গিক প্রসঙ্গ ভেক্টর পুনরুদ্ধার করুন
প্রতি বার্তা প্রতি ব্যবহারকারীর দ্বারা সরবরাহকৃত সমস্ত প্রসঙ্গ গতিশীলভাবে আনা একটি ব্যয়বহুল অপারেশন। আমরা শুধুমাত্র ব্যবহারকারীর সাম্প্রতিক বার্তার সাথে প্রাসঙ্গিক প্রসঙ্গ ব্যবহার করতে চাই এবং সিস্টেম প্রম্পট হিসাবে এটি LLAMA-2-70B চ্যাট মডেলে পাঠাতে চাই। শুধুমাত্র প্রাসঙ্গিক প্রসঙ্গ আনার জন্য, আমরা তাদের মেটাডেটা সহ 2টি সবচেয়ে প্রাসঙ্গিক ভেক্টর পেতে বিদ্যমান ভেক্টরের সেটকে জিজ্ঞাসা করি এবং ফলাফলগুলি ফিল্টার করি যেখানে আত্মবিশ্বাসের স্কোর 70% এর বেশি।
// File: app/api/chat/route.js
import { Index } from '@upstash/vector'
// Instantiate the Upstash Vector Index
const upstashVectorIndex = new Index()
export async function POST(req) {
try {
// ...
// query the relevant vectors from the embedding vector
const queryResult = await upstashVectorIndex.query({
vector: queryVector,
// get the top 2 relevant results
topK: 2,
// do not include the whole set of embeddings in the response
includeVectors: false,
// include the meta data so that can get the description out of the index
includeMetadata: true,
})
// console.log('The query result came in', queryResult.length)
// using the resulting set of relevant vectors
// filter the one that have score of greater than 70% match
// and get the description we stored while training
const queryPrompt = queryResult
.filter((match) => match.score && match.score > 0.7)
.map((match) => match.metadata.description)
.join('\n')
// console.log('The query prompt is', queryPrompt)
// Proceed to create a response
} ভবিষ্যদ্বাণীর প্রসঙ্গ সহ প্রম্পট LLAMA-2-70B চ্যাট মডেল
এখন যেহেতু আমরা একটি স্ট্রিং হিসাবে প্রাসঙ্গিক প্রসঙ্গটি পেয়েছি, চূড়ান্ত পদক্ষেপটি হল ব্যবহারকারীর সর্বশেষ বার্তায় সাড়া দেওয়ার জন্য llama-2-70B চ্যাট মডেলকে প্রম্পট করা। আমরা Vercel AI SDK-এর experimental_buildLlama2Prompt ব্যবহার করি পদ্ধতি যা llama-2-70B চ্যাট মডেলের জন্য উপযুক্ত প্রম্পট বিন্যাস তৈরি করার যত্ন নেয়।
// File: app/api/chat/route.js
import Replicate from 'replicate'
import { experimental_buildLlama2Prompt } from 'ai/prompts'
import { ReplicateStream, StreamingTextResponse } from 'ai'
// Instantiate the Replicate API
const replicate = new Replicate({
auth: process.env.REPLICATE_API_TOKEN,
})
export async function POST(req) {
try {
// ...
const response = await replicate.predictions.create({
// You must enable streaming.
stream: true,
// The model must support streaming. See https://replicate.com/docs/streaming
// This is the model ID for Llama 2 70b Chat
version: '2c1608e18606fad2812020dc541930f2d0495ce32eee50074220b87300bc16e1',
// Format the message list into the format expected by Llama 2
// @see https://github.com/vercel/ai/blob/99cf16edf0a09405d15d3867f997c96a8da869c6/packages/core/prompts/huggingface.ts#L53C1-L78C2
input: {
prompt: experimental_buildLlama2Prompt([
{
// create a system content message to be added as
// the llama2prompt generator will supply it as the context with the API
role: 'system',
content: queryPrompt.substring(0, Math.min(queryPrompt.length, 2000)),
},
// also, pass the whole conversation!
...messages,
]),
},
})
// stream the result to the frontend
const stream = await ReplicateStream(response)
return new StreamingTextResponse(stream)
} Next.js অ্যাপ রাউটারে ট্রেনের রুট সেটআপ করুন
এই বিভাগে, আমরা কীভাবে রুট সেটআপ করেছি সে সম্পর্কে কথা বলি:app/api/train/route.js অনুরোধ অবজেক্টে পাস করা স্ট্রিংগুলির গতিশীলভাবে এমবেডিং তৈরি করতে এবং সেগুলিকে আপস্ট্যাশ ভেক্টর সূচকে যুক্ত করতে। জিনিসগুলিকে সহজ করার জন্য, আমরা এটিকে আরও ভাগে ভাগ করব:
স্ট্রিংগুলির এম্বেডিং তৈরি করুন৷
আমরা স্ট্রিংগুলির এম্বেডিং তৈরি করতে যাচ্ছি যা আমাদের বিদ্যমান সূচক সেট বা আপডেট করতে সহায়তা করবে। এটি করার ফলে আমাদের চ্যাটবটের ভবিষ্যত প্রতিক্রিয়াগুলির প্রসঙ্গ আপ টু ডেট রাখতে পারবেন। প্রান্তে শুধুমাত্র একটি API কলের মাধ্যমে এম্বেডিং তৈরি করতে আমরা LangChain-এর সাথে Hugging Face Inference API ব্যবহার করব।
// File: app/api/train/route.js
import { HuggingFaceInferenceEmbeddings } from '@langchain/community/embeddings/hf'
// Instantiate the Hugging Face Inference API
const embeddings = new HuggingFaceInferenceEmbeddings()
export async function POST(req) {
try {
// a default set of messages to create vector embeddings on
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 the POST request is of type application/json
if (req.headers.get('Content-Type') === 'application/json') {
// and if the request contains array of messages to train on
const { messages } = await req.json()
if (typeof messages !== 'string' && messages.length > 0) {
messagesToVectorize = messages
}
}
// Call the Hugging Face Inference API to get emebeddings on the messages
const generatedEmbeddings = await Promise.all(messagesToVectorize.map((i) => embeddings.embedQuery(i)))
// ...
} প্রাসঙ্গিকতা অনুসন্ধানের জন্য ভেক্টর সংরক্ষণ করুন
ভেক্টর সূচকে জেনারেট করা এমবেডিং যোগ করতে, আমরা আপস্ট্যাশ ভেক্টর সূচক (এখানে, 256 স্পিন করার সময় কনফিগার করা দৈর্ঘ্যে প্রাপ্ত ভেক্টরগুলিকে স্লাইস করি। ) এবং upsert ব্যবহার করুন মেটাডেটা সহ এমবেডিং সন্নিবেশ করার পদ্ধতি, অর্থাৎ স্ট্রিংগুলি নিজেই। এটি আমাদের স্ট্রিংগুলি পুনরুদ্ধার করার অনুমতি দেয় যখন অনুরূপ ভেক্টরগুলি অনুসন্ধান করা হয় এবং তাই, কথোপকথনের জ্ঞানের ভিত্তি সেট করুন যখন আমরা প্রতিক্রিয়া তৈরি করতে LLAMA-2-70B চ্যাট মডেলকে কল করি৷
// File: app/api/train/route.js
import { Index } from '@upstash/vector'
// Instantiate the Upstash Vector Index
const upstashVectorIndex = new Index()
export async function POST(req) {
try {
// ...
// Slice the vector into lengths of upto 256
await Promise.all(
generatedEmbeddings
.map((i) => i.slice(0, 256))
.map((vector, index) =>
// Upsert the vector with description to be further as the context to upcoming questions
upstashVectorIndex.upsert({
vector,
id: index.toString(),
metadata: { description: messagesToVectorize[index] },
}),
),
)
// Once done, return with a successful 200 response
return new Response(JSON.stringify({ code: 1 }), { status: 200, headers: { 'Content-Type': 'application/json' } })
} যে অনেক শেখার ছিল! আপনি এখন সব সম্পন্ন করেছেন ✨
Vercel এ স্থাপন করুন
সংগ্রহস্থল, এখন Vercel এ স্থাপন করার জন্য প্রস্তুত। 👇🏻
স্থাপন করতে নিম্নলিখিত পদক্ষেপগুলি ব্যবহার করুন৷- আপনার অ্যাপের কোড সহ একটি GitHub সংগ্রহস্থল তৈরি করে শুরু করুন।
- তারপর, Vercel ড্যাশবোর্ডে নেভিগেট করুন এবং একটি নতুন প্রকল্প তৈরি করুন .
- আপনার তৈরি করা GitHub সংগ্রহস্থলের সাথে নতুন প্রজেক্ট লিঙ্ক করুন।
- সেটিংস-এ ,
Environment Variablesআপডেট করুন আপনার স্থানীয়.envএর সাথে মেলে ফাইল। - স্থাপন করুন! 🚀
আরো তথ্য
আরো বিস্তারিত অন্তর্দৃষ্টির জন্য, এই পোস্টে উদ্ধৃত রেফারেন্সগুলি অন্বেষণ করুন৷
৷উপসংহার
উপসংহারে, এই প্রকল্পটি কীভাবে এম্বেডিং তৈরি করতে হয়, বিদ্যমান ভেক্টরের সেট থেকে প্রশ্ন করতে হয় এবং LLAMA-2-70B চ্যাট মডেল ব্যবহার করে প্রাসঙ্গিক ভবিষ্যদ্বাণী তৈরি করতে প্রেক্ষাপট ব্যবহার করতে শেখার ক্ষেত্রে মূল্যবান অভিজ্ঞতা প্রদান করেছে, এমন একটি পরিষেবা ব্যবহার করে যা আপনার প্রয়োজনের সাথে স্কেল করে, যেমন Upstash৷