Vector Database: pgvector, Qdrant, Pinecone — vector কোথায় থাকে আর কীভাবে খোঁজে

pgvector হাতে-কলমে (Series 08, Episode 03)

🟡 INTERMEDIATE Series 08 — Generative AI Engineering Episode 03 / 09

📑 এই পর্বে যা যা আছে

🧩 ১. গল্প: ৫ লাখ vector মেমরিতে ধরল না

আগের episode-এ Rahim ৪টা document নিয়ে semantic search করেছিল — সব vector একটা NumPy array-তে। কিন্তু এবার তার corpus ৫ লাখ JD। সে চেষ্টা করল সব vector encode() করে RAM-এ রাখতে — মেশিন crash। আবার চেষ্টা করল প্রতি search-এ ৫ লাখ vector-এর সাথে similarity হিসাব — একটা query-তে কয়েক সেকেন্ড লাগল। production-এ এটা অসম্ভব।

Maya বলল: "তুমি একটা database-এর কাজ হাতে করার চেষ্টা করছ। যেভাবে relational data-র জন্য PostgreSQL আছে, ঠিক তেমনই vector store, index ও দ্রুত search-এর জন্য আছে vector database। এটা vector persist করে, আর মিলিসেকেন্ডে nearest খুঁজে দেয় — সব vector না ঘেঁটেই।"

২. সমস্যা: brute-force similarity স্কেল করে না

প্রতি search-এ সব vector-এর সাথে similarity মেলানো (brute-force / exact) হলো O(N) কাজ। N ছোট হলে ঠিক আছে, কিন্তু লাখ-কোটি vector-এ প্রতিবার এটা করা মানে — ধীর, ব্যয়বহুল, restart-এ vector হারিয়ে যাওয়া।

দরকার এমন একটা system যা: (১) vector persist করে, (২) একটা index দিয়ে nearest neighbor দ্রুত খোঁজে, (৩) metadata-র সাথে filter করতে পারে, (৪) নতুন vector যোগ/মুছতে দেয়। এটাই vector database।

🎯 ৩. Vector database কী করে

একটা vector DB-র মূল দায়িত্ব:

🪜 ৪. তিন স্তরে বোঝা

Level 1 — সহজ intuition

একটা বিশাল লাইব্রেরিতে সব বই এলোমেলো রাখলে কোনো বই খুঁজতে পুরো লাইব্রেরি ঘুরতে হবে। কিন্তু যদি বিষয় অনুযায়ী তাক আর একটা catalog (index) থাকে, তাহলে সরাসরি সঠিক তাকে যেতে পারবেন। Vector DB-র index হলো সেই catalog।

Level 2 — technical ভাবে কী হচ্ছে

Vector DB একটা ANN index (Approximate Nearest Neighbor) তৈরি করে — যেমন HNSW বা IVFFlat। এটা vector গুলোকে graph/cluster-এ সাজায় যাতে exhaustive তুলনা ছাড়াই সম্ভাব্য নিকটতম প্রার্থীদের কাছে দ্রুত পৌঁছানো যায়।

Level 3 — engineer perspective

Engineer বেছে নেয় — accuracy বনাম speed-এর trade-off। ANN "প্রায়" নিখুঁত (recall ~95-99%) কিন্তু বহুগুণ দ্রুত। index parameter (যেমন HNSW-এর m, ef_search) tune করে সে এই balance ঠিক করে।

📐 ৫. ANN: exact নয়, approximate খোঁজা

Exact (brute-force): সব vector মেলাও → 100% সঠিক, কিন্তু ধীর (O(N)) ANN (index): smart shortcut → ~98% সঠিক, কিন্তু অনেক দ্রুত query ● ──► [ HNSW graph ] ──► কাছের কয়েকটা node ──► top-K
কেন "approximate"-ই যথেষ্ট? RAG/search-এ আমরা top-৫ relevant document চাই। ৫ নম্বরের বদলে ৭ নম্বর এলে সাধারণত ক্ষতি নেই, কিন্তু ১০০ গুণ দ্রুত হওয়াটা বিশাল লাভ।

🔧 ৬. pgvector, Qdrant, Pinecone — কোনটা কখন

Optionধরনকখন বেছে নেবেন
pgvectorPostgreSQL-এর extensionইতিমধ্যে Postgres ব্যবহার করছেন; relational data + vector একসাথে চান; সহজ শুরু
QdrantDedicated vector DB (open-source, self-host)বিশাল স্কেল, উন্নত filtering, নিজের infra-তে চালাতে চান
PineconeManaged cloud serviceinfra manage করতে চান না; দ্রুত scale; বিল দিয়ে দিলেই চলে
Junior হিসেবে pgvector দিয়ে শুরু করুন — এটা শেখায় vector DB আসলে কী করে, আর এটাই আমাদের flagship project-এ ব্যবহার করব। Qdrant/Pinecone-এর ধারণা জানলেই যথেষ্ট, master করার দরকার নেই।

💻 ৭. Code: pgvector হাতে-কলমে

কেন pgvector? — আমাদের job assistant-এ JD-র relational তথ্য (title, company, date) আর তার embedding — দুটোই একই PostgreSQL-এ রাখতে পারলে architecture সহজ থাকে; আলাদা service লাগে না।

ধাপ ১ — extension ও table

-- pgvector extension চালু (একবার) CREATE EXTENSION IF NOT EXISTS vector; -- JD ও তার embedding রাখার table CREATE TABLE jd ( id SERIAL PRIMARY KEY, title TEXT, company TEXT, posted_at DATE, content TEXT, embedding vector(384) -- model-এর dimension ); -- দ্রুত search-এর জন্য HNSW index (cosine distance) CREATE INDEX ON jd USING hnsw (embedding vector_cosine_ops);

ধাপ ২ — Python থেকে insert ও search

import psycopg2 from sentence_transformers import SentenceTransformer model = SentenceTransformer( "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2" ) conn = psycopg2.connect("dbname=jobs user=postgres") cur = conn.cursor() def insert_jd(title, company, posted_at, content): vec = model.encode(content, normalize_embeddings=True).tolist() cur.execute( "INSERT INTO jd (title, company, posted_at, content, embedding)" " VALUES (%s, %s, %s, %s, %s)", (title, company, posted_at, content, vec), ) conn.commit() def search(query, top_k=5): q = model.encode(query, normalize_embeddings=True).tolist() # <=> হলো pgvector-এর cosine distance operator cur.execute( "SELECT title, company, 1 - (embedding <=> %s::vector)" " AS similarity" " FROM jd ORDER BY embedding <=> %s::vector LIMIT %s", (q, q, top_k), ) return cur.fetchall() print(search("machine learning engineer"))
<=> pgvector-এ cosine distance। distance ছোট = বেশি similar। আমরা 1 - distance দিয়ে similarity-তে রূপান্তর করলাম, আর ORDER BY distance দিয়ে nearest আগে আনলাম। HNSW index থাকায় এটা লাখো row-তেও দ্রুত।

🎛️ ৮. Metadata filtering

শুধু similarity যথেষ্ট নয় — বাস্তবে আমরা প্রায়ই বলি "শুধু ২০২৪-এর, শুধু Dhaka-র JD-র মধ্যে খোঁজো"। pgvector-এ এটা সহজ, কারণ এটা তো SQL-ই:

SELECT title, company FROM jd WHERE posted_at >= '2024-01-01' -- metadata filter ORDER BY embedding <=> %s::vector -- তারপর similarity LIMIT 5;
এই "filter + similarity" একসাথে করার ক্ষমতাই pgvector-কে junior-দের জন্য এত সুবিধাজনক করে — relational শক্তি + vector search এক জায়গায়।

🇧🇩 ৯. বাস্তব উদাহরণ: বাংলাদেশের context

💼 ১০. Boss Question

Boss: "আমাদের তো PostgreSQL আছেই। আলাদা vector database কিনতে হবে নাকি?"

উত্তর: না — pgvector দিয়ে existing PostgreSQL-এই vector search যোগ করা যায়, নতুন vendor বা খরচ ছাড়াই। এতে data এক জায়গায় থাকে, backup/infra সহজ থাকে। স্কেল যখন লাখ-কোটিতে যাবে বা খুব উচ্চ throughput লাগবে, তখন Qdrant/Pinecone বিবেচনা করা যাবে। মানে — এখন শূন্য নতুন খরচে শুরু, প্রয়োজনে পরে upgrade।

🔎 ১১. Job Requirement Decoder

JD: "Experience with Vector Databases (pgvector / Qdrant / Pinecone)"

১. কী বোঝায়? embedding vector store করে ANN দিয়ে similarity search করতে পারা।
২. কেন চায়? RAG ও semantic search production-এ চালাতে vector DB অপরিহার্য।
৩. কোন সমস্যা সমাধান করে? লাখো vector-এ দ্রুত, persistent, filterable nearest-neighbor search।
৪. junior-এর কী জানা লাগে? vector DB কেন লাগে, ANN বনাম brute-force, একটা (pgvector) দিয়ে insert+search+filter করা।
৫. এখনই কী master লাগে না? distributed sharding, index parameter fine-tuning, একাধিক DB benchmark।
৬. GitHub-এ কীভাবে দেখাবে? pgvector দিয়ে একটা mini semantic-search API — schema, insert script, search endpoint সহ।
৭. interview প্রশ্ন? "ANN আর exact search-এর পার্থক্য?", "কেন vector DB, শুধু NumPy নয় কেন?", "metadata filtering কীভাবে করবে?"

⚠️ ১২. সাধারণ ভুল

ভুল ১: সব vector প্রতি request-এ RAM-এ load করা। → DB-তে persist করে index দিয়ে খুঁজুন।

ভুল ২: index ছাড়াই লাখো row-তে search — ধীর। → HNSW/IVFFlat index বানান।

ভুল ৩: insert আর search-এ ভিন্ন dimension/model। → column dimension = model dimension, একই model।

ভুল ৪: cosine বেছেও L2 operator ব্যবহার। → index-এর vector_cosine_ops আর query operator (<=>) মিলিয়ে নিন।

ভুল ৫: vector DB-কে source of truth ভাবা। → মূল text/metadata আলাদাও রাখুন; vector হলো derived data।

🎤 ১৩. Interview Prep

প্র: Vector database কেন দরকার, NumPy দিয়ে হয় না?
উ: persistence, indexing (ANN), metadata filtering ও scale — NumPy in-memory ও O(N), production-এ অচল।

প্র: ANN কী? exact-এর সাথে পার্থক্য?
উ: Approximate nearest neighbor — সামান্য কম recall-এর বিনিময়ে বহুগুণ দ্রুত; exact সব মেলায়, ধীর।

প্র: pgvector-এ cosine distance operator কোনটা?
উ: <=>; distance ছোট মানে বেশি similar।

প্র: কখন Pinecone, কখন pgvector?
উ: ছোট/মাঝারি + existing Postgres → pgvector; বিশাল scale/managed চাইলে → Pinecone।

✍️ ১৪. হাতে-কলমে

Docker দিয়ে একটা pgvector container চালান (pgvector/pgvector image)। ১০টা JD insert করুন। তারপর একটা query-তে top-3 বের করুন। এবার একটা WHERE posted_at filter যোগ করে দেখুন কীভাবে similarity + filter একসাথে কাজ করে।

🚀 ১৫. Project Connection

এখন আমাদের flagship assistant-এর সব JD embedding pgvector-এ থাকবে (V6-এর storage layer)। এই jd table + search() function হলো RAG-এর retrieval অংশের ভিত্তি। পরের episode-এ আমরা এই retrieval-কে chunking, context building আর LLM-এর সাথে জুড়ে সম্পূর্ণ RAG pipeline বানাব।

📌 ১৬. সারসংক্ষেপ ও পরবর্তী পর্ব

✓ Vector DB = vector persist + ANN index + fast search + metadata filter
✓ ANN "প্রায় নিখুঁত" কিন্তু brute-force-এর চেয়ে বহুগুণ দ্রুত
✓ pgvector = existing PostgreSQL-এ vector search; junior-দের সেরা শুরু
<=> cosine distance; HNSW index দিয়ে scale
✓ Qdrant/Pinecone-এর ধারণা জানুন, master করা লাগবে না
পরবর্তী Episode: "RAG সম্পূর্ণ Architecture" — embedding আর vector DB এখন হাতে; এবার Documents → Chunking → Embeddings → Vector DB → Retrieval → LLM → Answer পুরো pipeline একসাথে বানাব।
© 2025 Sheikh Thanbir Alam. All Rights Reserved. thanbirtamim.github.io
এই লেখা মূল লেখকের সম্পত্তি — লিখিত অনুমতি ছাড়া কপি করে অন্য কোনো ওয়েবসাইট, ব্লগ, বই বা প্ল্যাটফর্মে প্রকাশ/বিতরণ করা কঠোরভাবে নিষিদ্ধ। Content may not be copied or republished without permission.