ভেক্টর স্টোর আধুনিক জেনারেটিভ এআই অ্যাপ্লিকেশনের একটি অপরিহার্য উপাদান, বিশেষ করে যখন আপনার প্রয়োজন হয় সেমান্টিক অনুসন্ধান, রিট্রিভাল অগমেন্টেড জেনারেশন (RAG) বা দীর্ঘমেয়াদি মেমরি ব্যবস্থাপনা। Spring AI ডেভেলপারদের জন্য বিভিন্ন ভেক্টর ডাটাবেসের ওপর একটি অভিন্ন অ্যাবস্ট্রাকশন প্রদান করে, যার মাধ্যমে অ্যাপ্লিকেশনে সহজেই এম্বেডিং সংরক্ষণ ও দ্রুত সাদৃশ্য অনুসন্ধান যোগ করা যায়। এই টিউটোরিয়ালে আমরা ভেক্টর স্টোরের ধারণা, Spring AI-তে এর কনফিগারেশন, বাস্তব উদাহরণ এবং কিছু গুরুত্বপূর্ণ অনুশীলন বিস্তারিতভাবে বুঝব।
ভেক্টর স্টোর কী?
ভেক্টর স্টোর হল এমন একটি ডেটাবেস বা ডেটা স্ট্রাকচার, যা বিশেষভাবে ডিজাইন করা হয়েছে উচ্চ-মাত্রার ভেক্টর (এম্বেডিং) সংরক্ষণ, ইনডেক্স ও অনুসন্ধানের জন্য। টেক্সট, ইমেজ বা অন্যান্য ডেটাকে যখন এম্বেডিং মডেল ভেক্টরে রূপান্তর করে, তখন প্রতিটি ভেক্টর মূল ডেটার শব্দার্থিক প্রতিনিধিত্ব ধারণ করে। ভেক্টর স্টোর এই ভেক্টরগুলোর মধ্যে কাছাকাছি প্রতিবেশী (nearest neighbor) খুঁজে বের করার জন্য অপ্টিমাইজড অ্যালগরিদম ব্যবহার করে, যেমন HNSW, IVF বা ডিস্ক-বেসড ANN ইন্ডেক্স।
একটি সাধারণ ডেটাবেস যেখানে exact matching বা range query হয়, সেখানে ভেক্টর স্টোর সাদৃশ্য-ভিত্তিক অনুসন্ধান (similarity search) সাপোর্ট করে। উদাহরণস্বরূপ, "বাংলা কবিতা" লিখে সার্চ করলে এটি শুধু কীওয়ার্ড নয়, বরং অর্থগতভাবে সম্পর্কিত "রবীন্দ্রনাথের গীতাঞ্জলি" বা "আধুনিক বাংলা সাহিত্য" জাতীয় ডকুমেন্ট খুঁজে দিতে পারে। Spring AI VectorStore ইন্টারফেসের মাধ্যমে এই ক্ষমতা অ্যাপ্লিকেশনে সংযুক্ত করে।
কেন ভেক্টর স্টোর ব্যবহার করবেন?
ভেক্টর স্টোর ছাড়া শুধুমাত্র এম্বেডিং তৈরি করা অর্থহীন হয়ে পড়ে যখন আপনাকে হাজার হাজার, এমনকি মিলিয়ন ডকুমেন্টের মধ্যে প্রাসঙ্গিক তথ্য খুঁজতে হয়। এর মূল প্রয়োজনীয়তাগুলো নিম্নরূপ:
- স্কেলেবল সেমান্টিক সার্চ: কয়েক মিলিয়ন ভেক্টরের মধ্যেও মিলিসেকেন্ডে সাদৃশ্যভিত্তিক টপ-কে ফলাফল পাওয়া যায়।
- মেমরি ব্যবস্থাপনা: কথোপকথনমূলক এআই এজেন্টের পূর্বের প্রসঙ্গ পুনরুদ্ধার করতে ভেক্টর স্টোর দীর্ঘমেয়াদি মেমরি হিসেবে কাজ করে।
- RAG পাইপলাইনের ভিত্তি: ইউজার কোয়েরির সাথে প্রাসঙ্গিক ডকুমেন্ট খুঁজে এনে এলএলএম-এর রেসপন্সকে গ্রাউন্ডেড ও তথ্যবহুল করে তোলে।
- অ্যাবস্ট্রাকশন ও পোর্টেবিলিটি: Spring AI-র
VectorStoreঅ্যাবস্ট্রাকশন ব্যবহার করলে এক লাইন কনফিগারেশন পরিবর্তন করেই আপনি ক্রোমা, পাইনকোন, উইভিয়েট অথবা সিম্পল ইন-মেমরি স্টোরের মধ্যে সুইচ করতে পারবেন।
একটি RAG ফ্লোতে ভেক্টর স্টোরকে কেন্দ্রীয় উপাদান ভাবুন – এটি আপনার ডোমেইন জ্ঞানের সূচিপত্র তৈরি করে, যার ওপর ভিত্তি করে এলএলএম নির্ভুল ও প্রাসঙ্গিক উত্তর প্রদান করে।
Spring AI-তে ভেক্টর স্টোর কনফিগারেশন
Spring AI বুট অ্যাপ্লিকেশনে ভেক্টর স্টোর যোগ করা অত্যন্ত সরল। প্রথমে আপনার পছন্দের স্টোরের নির্ভরতা (dependency) যুক্ত করুন। উদাহরণস্বরূপ, সহজ পরীক্ষার জন্য ইন-মেমরি SimpleVectorStore ব্যবহার করতে পারেন, তবে প্রোডাকশনে আমরা পাইনকোন বা পিজিভেক্টরের মতো এক্সটার্নাল স্টোর সুপারিশ করি।
Maven নির্ভরতা (SimpleVectorStore):
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-simple-vector-store</artifactId>
</dependency>
application.yml কনফিগারেশন:
spring:
ai:
vectorstore:
simple:
initialize-schema: true
openai:
api-key: ${OPENAI_API_KEY}
উপরের কনফিগারেশনটি একটি SimpleVectorStore বিন অটো-কনফিগার করে, যা অ্যাপ্লিকেশন মেমরিতে ভেক্টর জমা রাখে। OpenAI API Key এম্বেডিং ক্লায়েন্টের জন্য প্রয়োজন, যেটি ডকুমেন্টকে ভেক্টরে রূপান্তর করে।
একইভাবে পাইনকোন ইত্যাদির জন্যও Spring AI স্টার্টার প্রদান করে। শুধু নির্ভরতা ও প্রাসঙ্গিক api-key, environment, project-id ইয়ামলে সেট করলেই চলে।
উদাহরণ: ডকুমেন্ট ব্যবস্থাপনা ও অনুসন্ধান
নিচের সার্ভিস ক্লাসটি VectorStore ব্যবহার করে ডকুমেন্ট যুক্ত করা এবং সাদৃশ্য অনুসন্ধান করার বাস্তব ধারণা দেয়:
import org.springframework.ai.document.Document;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
@Service
public class KnowledgeBaseService {
private final VectorStore vectorStore;
public KnowledgeBaseService(VectorStore vectorStore) {
this.vectorStore = vectorStore;
}
public void addDocuments(List<String> contents) {
List<Document> documents = contents.stream()
.map(content -> new Document(content, Map.of("source", "knowledge-base")))
.toList();
vectorStore.accept(documents);
}
public List<Document> search(String query, int topK) {
return vectorStore.similaritySearch(query, topK);
}
}
addDocuments মেথড প্রতিটি টেক্সট কনটেন্ট থেকে একটি Document তৈরি করে এবং accept() কলের মাধ্যমে ভেক্টর স্টোরে জমা রাখে। ব্যাকগ্রাউন্ডে Spring AI স্বয়ংক্রিয়ভাবে এম্বেডিং ক্লায়েন্ট (যেমন OpenAIEmbeddingClient) ব্যবহার করে ডকুমেন্টগুলোর ভেক্টর জেনারেট করে এবং স্টোরে ইনসার্ট করে। similaritySearch মেথড একটি প্রাকৃতিক ভাষার কোয়েরি নিয়ে সাদৃশ্যভিত্তিক শীর্ষ topK ডকুমেন্ট রিটার্ন করে।
একটি কন্ট্রোলারের মাধ্যমে এই সার্ভিস ব্যবহার করলে আপনি সহজেই REST এন্ডপয়েন্ট তৈরি করতে পারেন, যেখানে ইউজারের ইনপুটের ওপর ভিত্তি করে ডকুমেন্ট খোঁজা হবে এবং পরবর্তী ধাপে তা এলএলএম-কে কনটেক্সট হিসেবে পাঠানো যাবে।
সেরা অনুশীলন ও সারসংক্ষেপ
ভেক্টর স্টোর ব্যবহারের সময় কিছু কৌশল অবলম্বন করলে পারফরম্যান্স ও নির্ভুলতা উন্নত হয়:
- ডকুমেন্ট চাঙ্কিং: বড় ডকুমেন্টকে ছোট ছোট টুকরায় ভাগ করুন, যাতে এম্বেডিং অর্থপূর্ণ হয় এবং প্রাসঙ্গিক অংশ নির্ভুলভাবে রিট্রিভ করা যায়। Spring AI-র
TokenTextSplitterএক্ষেত্রে কার্যকরী। - মেটাডেটা সমৃদ্ধকরণ: প্রতিটি ডকুমেন্টের সাথে প্রয়োজনীয় মেটাডেটা (উৎস, তারিখ, ক্যাটাগরি) সংযুক্ত করুন; পরবর্তী ফিল্টারিং ও অ্যানালিটিক্স সহজ হয়।
- ইনডেক্স ব্যবস্থাপনা: প্রোডাকশন স্টোরে ইনডেক্স ক্রিয়েশন, রি-বিল্ডিং এবং ডাইমেনশন অ্যালাইনমেন্টের দিকে নজর দিন। অনেক ক্লাউড ভেক্টর ডাটাবেস অটোমেটিক ইনডেক্সিং সাপোর্ট করে।
- এম্বেডিং মডেল ধারাবাহিকতা: যে এম্বেডিং মডেল দিয়ে ভেক্টর তৈরি করবেন, অনুসন্ধানের সময় একই মডেল ব্যবহার করুন – অন্যথায় সাদৃশ্য পরিমাপ ভুল হবে।
- মনিটরিং ও অপ্টিমাইজেশন: লেটেন্সি, রিকল ও কস্ট ট্র্যাক করুন। প্রয়োজনে হাইব্রিড সার্চ (কীওয়ার্ড + ভেক্টর) বিবেচনা করুন।
Spring AI-র ভেক্টর স্টোর অ্যাবস্ট্রাকশন ডেভেলপারদের জটিল ইন্টিগ্রেশন ঝামেলা থেকে মুক্তি দেয় এবং নির্ভরযোগ্য RAG পাইপলাইন তৈরির পথ প্রশস্ত করে। সঠিক স্টোর নির্বাচন, ধারাবাহিক চাঙ্কিং এবং মেটাডেটা সমৃদ্ধকরণের মাধ্যমে আপনার জেনারেটিভ এআই অ্যাপ্লিকেশন হবে স্কেলেবল ও প্রোডাকশন-রেডি।