Embeddings গভীরভাবে: text কেন vector হয়, semantic similarity কীভাবে কাজ করে

cosine similarity; embedding ≠ LLM (Series 08, Episode 02)

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

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

🧩 ১. গল্প: keyword search কেন ব্যর্থ হলো

Rahim তার job assistant-এ একটা search বসাল — user লিখবে skill, সে matching JD দেখাবে। সে WHERE description LIKE '%Python%' দিয়ে শুরু করল। কিন্তু একজন user লিখল "machine learning developer" — অথচ অনেক relevant JD-তে লেখা ছিল "ML engineer", "data scientist", "deep learning"। keyword মেলেনি বলে ভালো ভালো ফল বাদ পড়ে গেল।

Nila (data scientist) বলল: "তোমার search শব্দ মেলাচ্ছে, অর্থ মেলাচ্ছে না। 'ML engineer' আর 'machine learning developer' প্রায় একই জিনিস — কিন্তু computer সেটা জানবে কীভাবে? এখানেই আসে embeddings — text-কে এমন সংখ্যায় বদলানো যেখানে কাছাকাছি অর্থের জিনিস কাছাকাছি বসে।"

২. সমস্যা: computer "অর্থ" বোঝে না

Computer-এর কাছে "Python" আর "পাইথন" আর "python programming" — সব আলাদা string। keyword search exact character মেলায়, semantics নয়। কিন্তু মানুষ জানে এগুলো সম্পর্কিত। আমাদের দরকার এমন একটা উপায় যাতে computer meaning-এর কাছাকাছি হওয়া মাপতে পারে।

সমাধান: প্রতিটা text-কে একটা vector (সংখ্যার তালিকা) দিয়ে উপস্থাপন করা, যেখানে একই অর্থের text-এর vector একে অপরের কাছাকাছি থাকে। এই vector-ই embedding।

🎯 ৩. Embedding আসলে কী

Embedding হলো একটা text (শব্দ, বাক্য বা paragraph)-এর সংখ্যাগত উপস্থাপন — একটা fixed-length dense vector (যেমন ৩৮৪ বা ১৫৩৬টা float সংখ্যা)। একটা embedding model text নেয়, vector দেয়।

"ML engineer" → [0.12, -0.44, 0.98, ... ] (384-dim) "machine learning dev" → [0.14, -0.41, 0.95, ... ] ← কাছাকাছি! "রান্নার রেসিপি" → [-0.88, 0.23, -0.10, ... ] ← অনেক দূরে

লক্ষ্য করুন — প্রথম দুটোর সংখ্যা প্রায় মিলে গেছে (কাছাকাছি অর্থ), তৃতীয়টা একদম আলাদা (ভিন্ন অর্থ)।

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

Level 1 — সহজ intuition

একটা বিশাল library ভাবুন যেখানে প্রতিটা বই তার বিষয় অনুযায়ী সাজানো — রান্নার বই এক কোণে, programming-এর বই আরেক কোণে। কোনো বই খুঁজতে হলে তার নাম না জেনেও, বিষয় দিয়ে কাছের তাকে যেতে পারবেন। Embedding space ঠিক এই "বিষয় অনুযায়ী সাজানো" জগৎ।

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

Embedding model (যেমন sentence-transformers) একটা neural network যা বিশাল text-এ train করা হয়েছে যাতে semantically similar text-এর output vector কাছাকাছি হয়। প্রতিটা dimension কোনো নির্দিষ্ট মানবীয় অর্থ ধরে না, কিন্তু সম্মিলিতভাবে vector-টা meaning ধরে রাখে।

Level 3 — engineer perspective

একজন AI Engineer document একবার embed করে vector হিসেবে store করে (offline)। search-এর সময় শুধু query embed করে nearest vector খোঁজে। এটাই RAG, semantic search, recommendation-এর ভিত্তি — দ্রুত ও scalable, কারণ ভারী কাজটা আগেই হয়ে গেছে।

📐 ৫. Vector space: কাছাকাছি মানে একই অর্থ

দুটো vector কতটা "কাছাকাছি" — সেটা মাপার সবচেয়ে প্রচলিত উপায় cosine similarity। এটা দুটো vector-এর মধ্যেকার কোণ মাপে, দৈর্ঘ্য নয়। মান -১ থেকে +১:

Cosine similarityঅর্থ
≈ 1.0প্রায় একই অর্থ
≈ 0.0সম্পর্কহীন
< 0বিপরীতমুখী (text-এ বিরল)

🧮 ৬. Cosine similarity — দূরত্ব নয়, দিক

কেন দৈর্ঘ্যের বদলে দিক (কোণ)? কারণ একটা লম্বা document আর ছোট বাক্য একই অর্থের হতে পারে; তাদের vector-এর দৈর্ঘ্য আলাদা হলেও দিক কাছাকাছি হবে। সূত্রটা সহজ:

cosine_sim(a, b) = dot(a, b) / (norm(a) * norm(b)) # যদি vector গুলো আগে থেকে normalize করা থাকে # (norm = 1), তাহলে cosine_sim = dot(a, b) — খুব দ্রুত।
এজন্যই vector database-এ প্রায়ই vector normalize করে রাখা হয় — তখন similarity মানে শুধু একটা dot product, যা হাজারো vector-এ অত্যন্ত দ্রুত হিসাব হয়।

🚫 ৭. embedding ≠ LLM (গুরুত্বপূর্ণ পার্থক্য)

Interview-তে এটা প্রায়ই আটকে দেয়। দুটোই neural model, দুটোই text নেয় — কিন্তু কাজ ভিন্ন:

Embedding model
input: text
output: একটা fixed vector (সংখ্যা)
কাজ: meaning capture, similarity, search
উদাহরণ: text-embedding-3, bge, e5
LLM (generative)
input: text (prompt)
output: নতুন text (token by token)
কাজ: উত্তর/লেখা generate করা
উদাহরণ: GPT-4o, Llama, Claude
মনে রাখুন: embedding "বোঝে ও পরিমাপ করে", LLM "লেখে ও generate করে"। RAG-এ দুটোই লাগে — embedding দিয়ে relevant অংশ খুঁজি, তারপর LLM দিয়ে উত্তর লিখি।

💻 ৮. Code: semantic search হাতে-কলমে

কেন sentence-transformers? — এটা free, locally চলে (কোনো API খরচ নেই), Bangla সহ multilingual model দেয়, আর junior-দের জন্য শেখা সহজ।

from sentence_transformers import SentenceTransformer import numpy as np # multilingual model — Bangla + English দুটোই বোঝে model = SentenceTransformer( "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2" ) docs = [ "Python ও Pandas জানা ML engineer দরকার", "React frontend developer, 2 years experience", "Deep learning ও PyTorch expert খুঁজছি", "Restaurant-এর জন্য experienced cook", ] # একবার document embed করি (offline কাজ) doc_vecs = model.encode(docs, normalize_embeddings=True) def search(query: str, top_k: int = 2): q_vec = model.encode([query], normalize_embeddings=True)[0] # normalize করা থাকায় dot product = cosine similarity scores = doc_vecs @ q_vec ranked = np.argsort(scores)[::-1][:top_k] return [(docs[i], round(float(scores[i]), 3)) for i in ranked] print(search("machine learning job")) # [('Deep learning ও PyTorch expert...', 0.62), # ('Python ও Pandas জানা ML engineer...', 0.58)]

খেয়াল করুন: query-তে "machine learning" লেখা, কিন্তু কোনো document-এ ঠিক সেই শব্দ নেই — তবু অর্থগতভাবে কাছের JD গুলো উপরে এসেছে। keyword search এটা কখনো পারত না।

🧪 ৯. Experiment: keyword বনাম semantic

query = "AI বিশেষজ্ঞ" # কোনো doc-এ এই শব্দ নেই # keyword: 0 match (কোনো doc-এ "AI বিশেষজ্ঞ" নেই) # semantic: "Deep learning ও PyTorch expert" উপরে আসবে print(search("AI বিশেষজ্ঞ"))
যা শিখলেন: embedding-based search Bangla ও English মিশ্র query-তেও অর্থ ধরে ফেলে। এই কারণেই আধুনিক search/RAG সব embedding-এর উপর দাঁড়িয়ে।

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

💼 ১১. Boss Question

Boss: "আমাদের তো search আছেই (LIKE query)। embedding-এর পিছনে আলাদা খরচ কেন?"

উত্তর: keyword search শুধু হুবহু শব্দ মেলায় — মানে অর্ধেক relevant ফলাফল হারিয়ে যায়, user "কিছু পেলাম না" বলে চলে যায়। semantic search অর্থ বোঝে, তাই relevant conversion বাড়ে। Document একবার embed করে রাখলে search প্রায় free ও instant। মানে — বেশি relevant ফল, বেশি engagement, বেশি বিক্রি — একই data-তে।

🔎 ১২. Job Requirement Decoder

JD: "Experience with embeddings / semantic search"

১. কী বোঝায়? text-কে vector-এ রূপান্তর করে similarity দিয়ে search/matching করতে পারা।
২. কেন চায়? RAG, recommendation, search — সব এর উপর দাঁড়ায়; আধুনিক AI-এর ভিত্তি।
৩. কোন সমস্যা সমাধান করে? keyword-এর সীমাবদ্ধতা; অর্থভিত্তিক খোঁজা।
৪. junior-এর কী জানা লাগে? embedding মানে কী, cosine similarity, একটা embedding model দিয়ে search করা, embedding ≠ LLM।
৫. এখনই কী master লাগে না? নিজের embedding model train করা, quantization, ANN index tuning।
৬. GitHub-এ কীভাবে দেখাবে? একটা semantic search demo repo — sentence-transformers + একটা corpus + keyword বনাম semantic তুলনা।
৭. interview প্রশ্ন? "cosine similarity কী?", "embedding আর LLM-এর পার্থক্য?", "keyword search-এর সমস্যা কী?"

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

ভুল ১: query আর document আলাদা model দিয়ে embed করা। → একই model ব্যবহার করুন, নাহলে vector একই space-এ থাকে না।

ভুল ২: normalize না করে dot product-কে cosine ভাবা। → normalize করুন অথবা সঠিক cosine সূত্র ব্যবহার করুন।

ভুল ৩: English-only model দিয়ে Bangla embed করা। → multilingual model বেছে নিন।

ভুল ৪: embedding-কে LLM ভাবা বা উল্টো। → দুটো ভিন্ন কাজ।

ভুল ৫: খুব বড় text এক embedding-এ চাপা। → বড় document chunk করুন (পরের episode-এ)।

🎤 ১৪. Interview Prep

প্র: Embedding কী?
উ: Text-এর একটা fixed-length dense vector উপস্থাপন, যেখানে similar meaning-এর text কাছাকাছি বসে।

প্র: Cosine similarity কেন, Euclidean নয়?
উ: Cosine দিক (কোণ) মাপে, দৈর্ঘ্য নয় — তাই আলাদা দৈর্ঘ্যের text-এর অর্থগত মিল ভালো ধরে।

প্র: Embedding আর LLM কি একই?
উ: না — embedding vector দেয় (measure/search), LLM নতুন text generate করে।

প্র: semantic search keyword search-এর চেয়ে ভালো কেন?
উ: এটা synonym/অর্থ ধরে; hুবহু শব্দ না মিললেও relevant ফল দেয়।

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

৫টা বাংলা ও ইংরেজি মিশ্র বাক্য নিন (কিছু programming, কিছু রান্না নিয়ে)। সব embed করুন। "software job" query দিয়ে cosine similarity বের করে ranking দেখুন। তারপর একই query keyword (in operator) দিয়ে চালিয়ে দেখুন কতগুলো relevant ফল keyword মিস করল।

🚀 ১৬. Project Connection

আমাদের flagship assistant এখন JD আর user query দুটোই embed করে semantic matching করতে পারবে। এই episode-এর doc_vecs আর search() হলো V6-এর retrieval-এর বীজ। কিন্তু হাজার হাজার vector মেমরিতে রাখা যায় না — সেগুলো efficiently store ও খোঁজার জন্য দরকার একটা vector database, যেটা পরের episode।

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

✓ Embedding = text-এর dense vector, যেখানে similar meaning কাছাকাছি
✓ cosine similarity দিক (কোণ) মাপে; normalize করলে dot product = cosine
✓ embedding ≠ LLM — একটা measure করে, অন্যটা generate করে
✓ document একবার embed করে store (offline), query embed করে search (online)
✓ multilingual model Bangla-English মিশ্র text-এ কাজ করে
পরবর্তী Episode: "Vector Database" — এত vector কোথায় রাখব আর লক্ষ কোটির মধ্যে nearest কীভাবে মিলিসেকেন্ডে খুঁজব? pgvector হাতে-কলমে দেখব।
© 2025 Sheikh Thanbir Alam. All Rights Reserved. thanbirtamim.github.io
এই লেখা মূল লেখকের সম্পত্তি — লিখিত অনুমতি ছাড়া কপি করে অন্য কোনো ওয়েবসাইট, ব্লগ, বই বা প্ল্যাটফর্মে প্রকাশ/বিতরণ করা কঠোরভাবে নিষিদ্ধ। Content may not be copied or republished without permission.