Generative AI/LLM-এর ভিত্তি/Lesson 02
Embeddings — অর্থের মানচিত্র
শব্দ বা বাক্যকে সংখ্যার vector বানানো, যাতে কাছাকাছি অর্থ মানে কাছাকাছি vector। Cosine similarity, সবচেয়ে কাছের শব্দ খোঁজা, আর king − man + woman-এর বিখ্যাত অঙ্ক।
- সময়
- 22 মিনিট
- Exercise
- 1
- Challenge
- 1
- Quiz
- 3 প্রশ্ন
সহজ ভাষায়
Token id অর্থহীন নম্বর — "বিড়াল" 4021, "কুকুর" 9 হলে বোঝা যায় না যে দুটো কাছাকাছি জিনিস। Embedding প্রতিটা শব্দ বা বাক্যকে একটা vector (সংখ্যার list) বানায়, এমনভাবে যে:
কাছাকাছি অর্থ → কাছাকাছি vector
এটা একটা মানচিত্রের মতো। এখানে "বিড়াল" আর "কুকুর" একই পাড়ায়, "গাড়ি" অন্য শহরে।
(আসল embedding-এ শত শত বা হাজারখানেক dimension থাকে। এখানে বোঝার জন্য ২টা।)
কেন দরকার?
- LLM-এর ভেতরে: প্রতিটা token প্রথমেই embedding-এ রূপান্তর হয়। Model এর পরে যা করে সব এই vector নিয়ে।
- Semantic search: "আমার ল্যাপটপ চালু হচ্ছে না" দিয়ে খুঁজলে "computer won't boot" নামের লেখাও পাওয়া যায়, কারণ অর্থ মেলে, শব্দ না মিললেও।
- RAG: Generative AI path-এর পরের module-এর ভিত্তি।
- Recommendation, clustering, duplicate খোঁজা।
Cosine similarity
দুটো vector কতটা "একই দিকে":
| মান | অর্থ |
|---|---|
| 1 | একই দিক — খুব মিল |
| 0 | লম্ব — সম্পর্ক নেই |
| −1 | উল্টো দিক |
অর্থের অঙ্ক
২০১৩-র word2vec-এর একটা বিখ্যাত আবিষ্কার:
"রাজা থেকে পুরুষত্ব বাদ দিয়ে নারীত্ব যোগ" করলে রানির কাছে পৌঁছায়। অর্থাৎ embedding-এর মধ্যে কিছু দিক (direction) অর্থ বহন করে, যেমন "লিঙ্গ" বা "রাজকীয়তা"। Challenge-এ ছোট হাতে বানানো embedding দিয়ে এটা নিজে করবে। আসল embedding-এ এই অঙ্ক সবসময় এত পরিষ্কারভাবে মেলে না। এটা একটা ঝোঁক, নিয়ম না।
Exercise
Exercise
Cosine similarity
দুটো vector কতটা একই দিকে আছে, সেটা মাপে cosine similarity:
cos(a, b) = (a · b) ÷ (‖a‖ × ‖b‖)
এর মান 1 মানে একদম একই দিক, 0 মানে সম্পর্কহীন, −1 মানে উল্টো।
cosine(a, b) লেখো (NumPy array নেবে, float দেবে)। তারপর দেওয়া vector দিয়ে sim_cat_dog আর sim_cat_car হিসাব করো।
Quiz
Challenge
Challenge
সবচেয়ে কাছের শব্দ
most_similar(query, embeddings, k=3, exclude=()) লেখো:
query— একটা vector (NumPy array)embeddings— dict{শব্দ: vector}- cosine similarity অনুযায়ী সবচেয়ে কাছের
kটা শব্দের list return করো, বেশি থেকে কম ক্রমে exclude-এ থাকা শব্দগুলো বাদ যাবে
তারপর analogy দিয়ে answer বের করো: vector king − man + woman-এর সবচেয়ে কাছের শব্দ। king, man আর woman বাদ দিয়ে খুঁজবে।
বাস্তবে কোথায় ব্যবহার হয়?
আসল embedding আসে একটা embedding model থেকে (API বা open-source)। তারপর ঠিক তোমার challenge-এর কাজ — query-র সবচেয়ে কাছের document খোঁজা:
# sentence-transformers একটা জনপ্রিয় open-source লাইব্রেরি; বহুভাষিক model বাংলাও বোঝে
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("paraphrase-multilingual-MiniLM-L12-v2")
docs = ["ল্যাপটপ চালু হচ্ছে না", "How to cook rice", "Computer won't boot"]
vectors = model.encode(docs, normalize_embeddings=True)
query = model.encode(["আমার কম্পিউটার অন হয় না"], normalize_embeddings=True)
print(vectors @ query.T) # normalize করা, তাই dot product = cosine
(তোমার computer-এ চালাবে।) লাখ লাখ document হলে প্রতিটার সাথে তুলনা ধীর। তখন vector database লাগে — RAG module-এ আসবে।
Interview প্রশ্ন
- Beginner: Embedding কী? Token id থেকে কীভাবে আলাদা?
- Intermediate: Cosine similarity কী, আর কেন ব্যবহার করা হয়?
- Advanced: Semantic search-এর pipeline বর্ণনা করো। লাখ লাখ vector-এ দ্রুত খোঁজার জন্য কী করবে (approximate nearest neighbor)?
এরপর কী?
Token → embedding → ... → পরের token। LLM-এর মূল কাজটা আসলে একটাই: পরের token কী হবে, অনুমান করা। পরের lesson: Next-token prediction — একটা ছোট্ট language model নিজে বানাবে।