Home »
Blog »
AI/ML Engineer সিরিজ » Series 08 » Episode 03
Vector Database: pgvector, Qdrant, Pinecone — vector কোথায় থাকে আর কীভাবে খোঁজে
pgvector হাতে-কলমে (Series 08, Episode 03)
🟡 INTERMEDIATE
Series 08 — Generative AI Engineering
Episode 03 / 09
📑 এই পর্বে যা যা আছে
- ১. গল্প: ৫ লাখ vector মেমরিতে ধরল না
- ২. সমস্যা: brute-force similarity স্কেল করে না
- ৩. Vector database কী করে
- ৪. তিন স্তরে বোঝা
- ৫. ANN: exact নয়, approximate খোঁজা
- ৬. pgvector, Qdrant, Pinecone — কোনটা কখন
- ৭. Code: pgvector হাতে-কলমে
- ৮. Metadata filtering
- ৯. বাস্তব উদাহরণ: বাংলাদেশের context
- ১০. Boss Question
- ১১. Job Requirement Decoder
- ১২. সাধারণ ভুল
- ১৩. Interview Prep
- ১৪. হাতে-কলমে
- ১৫. Project Connection
- ১৬. সারসংক্ষেপ ও পরবর্তী পর্ব
🧩 ১. গল্প: ৫ লাখ 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-র মূল দায়িত্ব:
- Store: vector + সাথে metadata (source, date, category) রাখা।
- Index: vector গুলোকে এমনভাবে সাজানো (যেমন HNSW graph) যাতে খোঁজা দ্রুত হয়।
- Search: একটা query vector-এর জন্য top-K nearest neighbor ফেরত দেওয়া।
- Filter: metadata শর্ত দিয়ে search সীমিত করা (যেমন শুধু "2024"-এর JD)।
🪜 ৪. তিন স্তরে বোঝা
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 | ধরন | কখন বেছে নেবেন |
| pgvector | PostgreSQL-এর extension | ইতিমধ্যে Postgres ব্যবহার করছেন; relational data + vector একসাথে চান; সহজ শুরু |
| Qdrant | Dedicated vector DB (open-source, self-host) | বিশাল স্কেল, উন্নত filtering, নিজের infra-তে চালাতে চান |
| Pinecone | Managed cloud service | infra 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
- একটা internal knowledge base — কোম্পানির policy PDF embed করে pgvector-এ; কর্মী প্রশ্ন করলে relevant অংশ খুঁজে দেয়।
- Bangla e-commerce-এ product embedding + category filter দিয়ে "similar product in electronics"।
- একটা health startup রোগীর symptom description embed করে similar case খোঁজে (metadata: বিভাগ, বয়স)।
💼 ১০. 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
একসাথে বানাব।