|
|
Google Colab-এ রান করান
|
|
|
GitHub-এ সোর্স দেখুন
|
EmbeddingGemma হল একটি হালকা ওজনের, ওপেন এম্বেডিং মডেল যা মোবাইল ফোনের মতো দৈনন্দিন ডিভাইসে দ্রুত, উচ্চ-কোয়ালিটির রিট্রিভালের জন্য ডিজাইন করা হয়েছে। মাত্র ৩০৮ মিলিয়ন প্যারামিটার সহ, এটি ইন্টারনেট কানেকশন ছাড়াই আপনার লোকাল মেশিনে সরাসরি রিট্রিভাল অগমেন্টেড জেনারেশন (RAG)-এর মতো উন্নত AI টেকনিক রান করার জন্য যথেষ্ট দক্ষ।
সেট-আপ করুন
এই টিউটোরিয়াল শুরু করার আগে, নিম্নলিখিত ধাপগুলি সম্পূর্ণ করুন:
- Hugging Face-এ লগ-ইন করে এবং Gemma মডেলের জন্য লাইসেন্স স্বীকার করুন বিকল্প বেছে নিয়ে Gemma অ্যাক্সেস করুন।
- Hugging Face অ্যাক্সেস টোকেন তৈরি করুন এবং Colab থেকে লগ-ইন করার জন্য এটি ব্যবহার করুন।
এই নোটবুক CPU বা GPU-তে চলবে।
Python প্যাকেজ ইনস্টল করা
EmbeddingGemma মডেল চালানোর জন্য প্রয়োজনীয় লাইব্রেরি ইনস্টল করুন এবং এম্বেডিং তৈরি করুন। Sentence Transformers হল টেক্সট ও ইমেজ এম্বেডিংয়ের জন্য Python ফ্রেমওয়ার্ক। আরও তথ্যের জন্য, Sentence Transformers ডকুমেন্টেশন দেখুন।
pip install -U sentence-transformers git+https://github.com/huggingface/transformers@v4.56.0-Embedding-Gemma-previewলাইসেন্সে সম্মতি জানানোর পরে, মডেল অ্যাক্সেস করার জন্য আপনার একটি বৈধ Hugging Face টোকেন প্রয়োজন।
# Login into Hugging Face Hub
from huggingface_hub import login
login()
মডেল লোড করা
EmbeddingGemma-র সাহায্যে মডেল ক্লাসের ইনস্ট্যান্স তৈরি করতে sentence-transformers লাইব্রেরি ব্যবহার করুন।
import torch
from sentence_transformers import SentenceTransformer
device = "cuda" if torch.cuda.is_available() else "cpu"
model_id = "google/embeddinggemma-300M"
model = SentenceTransformer(model_id).to(device=device)
print(f"Device: {model.device}")
print(model)
print("Total number of parameters in the model:", sum([p.numel() for _, p in model.named_parameters()]))
Device: cuda:0
SentenceTransformer(
(0): Transformer({'max_seq_length': 2048, 'do_lower_case': False, 'architecture': 'Gemma3TextModel'})
(1): Pooling({'word_embedding_dimension': 768, 'pooling_mode_cls_token': False, 'pooling_mode_mean_tokens': True, 'pooling_mode_max_tokens': False, 'pooling_mode_mean_sqrt_len_tokens': False, 'pooling_mode_weightedmean_tokens': False, 'pooling_mode_lasttoken': False, 'include_prompt': True})
(2): Dense({'in_features': 768, 'out_features': 3072, 'bias': False, 'activation_function': 'torch.nn.modules.linear.Identity'})
(3): Dense({'in_features': 3072, 'out_features': 768, 'bias': False, 'activation_function': 'torch.nn.modules.linear.Identity'})
(4): Normalize()
)
Total number of parameters in the model: 307581696
এম্বেডিং জেনারেট করা হচ্ছে
এম্বেডিং হল টেক্সটের সংখ্যাগত উপস্থাপনা, যেমন কোনও শব্দ বা বাক্য যা এর অর্থগত অর্থকে ক্যাপচার করে। মূলত, এটি হল সংখ্যার একটি তালিকা (একটি ভেক্টর) যা কম্পিউটারকে শব্দের মধ্যে সম্পর্ক ও প্রসঙ্গ বুঝতে সাহায্য করে।
EmbeddingGemma কীভাবে তিনটি আলাদা আলাদা শব্দ ["apple", "banana", "car"] প্রসেস করে তা দেখা যাক।
EmbeddingGemma-কে প্রচুর টেক্সট ডেটা দিয়ে প্রশিক্ষণ দেওয়া হয়েছে এবং এটি শব্দ ও ধারণার মধ্যে সম্পর্ক শিখেছে।
words = ["apple", "banana", "car"]
# Calculate embeddings by calling model.encode()
embeddings = model.encode(words)
print(embeddings)
for idx, embedding in enumerate(embeddings):
print(f"Embedding {idx+1} (shape): {embedding.shape}")
[[-0.18476306 0.00167681 0.03773484 ... -0.07996225 -0.02348064 0.00976741] [-0.21189538 -0.02657359 0.02513712 ... -0.08042689 -0.01999852 0.00512146] [-0.18924113 -0.02551468 0.04486253 ... -0.06377774 -0.03699806 0.03973572]] Embedding 1: (768,) Embedding 2: (768,) Embedding 3: (768,)
মডেলটি প্রতিটি বাক্যের জন্য একটি সাংখ্যিক ভেক্টর আউটপুট দেয়। প্রকৃত ভেক্টরগুলি খুব দীর্ঘ (৭৬৮), তবে সহজবোধ্যতার জন্য, সেগুলি কয়েকটি ডাইমেনশন সহ উপস্থাপন করা হয়েছে।
কীটি হল স্বতন্ত্র সংখ্যাগুলি নয়, বরং ভেক্টরগুলির মধ্যে দূরত্ব। আমরা যদি এই ভেক্টরগুলিকে একটি মাল্টি-ডাইমেনশনাল স্পেসে প্লট করি, তাহলে apple এবং banana-এর ভেক্টরগুলি একে অপরের খুব কাছাকাছি হবে। এবং car-এর ভেক্টর অন্য দু'টি থেকে অনেক দূরে থাকবে।
সাদৃশ্য নির্ধারণ করা
এই বিভাগে, আমরা এম্বেডিং ব্যবহার করে নির্ধারণ করি যে বিভিন্ন বাক্যগুলি কীভাবে শব্দগতভাবে একই রকম। এখানে আমরা বেশি, মাঝারি ও কম মিল স্কোর সহ উদাহরণ দেখাচ্ছি।
খুব বেশি মিল:
- বাক্য ক: "শেফ অতিথিদের জন্য একটি সুস্বাদু খাবার তৈরি করেছেন।"
- বাক্য খ: "দর্শকদের জন্য শেফ একটি সুস্বাদু ডিনার রান্না করেছিলেন।"
- যুক্তি: দুটি বাক্যই আলাদা আলাদা শব্দ ও ব্যাকরণগত গঠন (কর্তৃবাচ্য বনাম কর্মবাচ্য) ব্যবহার করে একই ঘটনার বর্ণনা দিয়েছে। দুটি বাক্যই একই মূল অর্থ প্রকাশ করে।
মাঝারি মিল:
- বাক্য ক: "তিনি মেশিন লার্নিংয়ে বিশেষজ্ঞ।"
- বাক্য 'খ': "আর্টিফিশিয়াল ইন্টেলিজেন্সের প্রতি তার গভীর আগ্রহ রয়েছে।"
- যুক্তি: বাক্যগুলি একে অপরের সাথে সম্পর্কিত কারণ মেশিন লার্নিং হল আর্টিফিশিয়াল ইন্টেলিজেন্সের একটি উপশাখা। তবে, তারা বিভিন্ন লেভেলের এনগেজমেন্ট (বিশেষজ্ঞ বনাম আগ্রহ) সহ বিভিন্ন লোকজনের ব্যাপারে কথা বলেন।
কম মিল:
- বাক্য ক: "টোকিওতে আজকের আবহাওয়া রৌদ্রোজ্জ্বল।"
- বাক্য খ: "সপ্তাহের জন্য আমাকে মুদিখানা কিনতে হবে।"
- কারণ: দুটি বাক্য সম্পূর্ণ আলাদা আলাদা বিষয় নিয়ে লেখা এবং সেগুলির মধ্যে কোনও অর্থগত মিল নেই।
# The sentences to encode
sentence_high = [
"The chef prepared a delicious meal for the guests.",
"A tasty dinner was cooked by the chef for the visitors."
]
sentence_medium = [
"She is an expert in machine learning.",
"He has a deep interest in artificial intelligence."
]
sentence_low = [
"The weather in Tokyo is sunny today.",
"I need to buy groceries for the week."
]
for sentence in [sentence_high, sentence_medium, sentence_low]:
print("🙋♂️")
print(sentence)
embeddings = model.encode(sentence)
similarities = model.similarity(embeddings[0], embeddings[1])
print("`-> 🤖 score: ", similarities.numpy()[0][0])
🙋♂️ ['The chef prepared a delicious meal for the guests.', 'A tasty dinner was cooked by the chef for the visitors.'] `-> 🤖 score: 0.8002148 🙋♂️ ['She is an expert in machine learning.', 'He has a deep interest in artificial intelligence.'] `-> 🤖 score: 0.45417833 🙋♂️ ['The weather in Tokyo is sunny today.', 'I need to buy groceries for the week.'] `-> 🤖 score: 0.22262995
EmbeddingGemma-র সাথে প্রম্পট ব্যবহার করা
EmbeddingGemma-র মাধ্যমে সবচেয়ে ভাল এম্বেডিং তৈরি করতে, আপনার ইনপুট টেক্সটের শুরুতে "নির্দেশমূলক প্রম্পট" বা "টাস্ক" যোগ করতে হবে। এইসব প্রম্পট নির্দিষ্ট টাস্কের জন্য এম্বেডিং অপ্টিমাইজ করে, যেমন ডকুমেন্ট রিট্রিভাল বা প্রশ্নের উত্তর দেওয়া এবং মডেলকে বিভিন্ন ধরনের ইনপুট, যেমন সার্চ কোয়েরি বনাম ডকুমেন্ট, আলাদা করে চিনতে সাহায্য করে।
প্রম্পট কীভাবে প্রয়োগ করতে হয়
ইনফারেন্স চলাকালীন আপনি তিনটি উপায়ে প্রম্পট প্রয়োগ করতে পারবেন।
promptআর্গুমেন্ট ব্যবহার করে
encodeপদ্ধতিতে সরাসরি সম্পূর্ণ প্রম্পট স্ট্রিং পাস করুন। এটি আপনাকে সুনির্দিষ্ট নিয়ন্ত্রণ দেয়।embeddings = model.encode( sentence, prompt="task: sentence similarity | query: " )prompt_nameআর্গুমেন্ট ব্যবহার করে
নামের মাধ্যমে আগে থেকে সংজ্ঞায়িত প্রম্পট বেছে নিন। মডেলের কনফিগারেশন থেকে অথবা সেটি চালু করার সময় এইসব প্রম্পট লোড করা হয়।embeddings = model.encode(sentence, prompt_name="STS")ডিফল্ট প্রম্পট ব্যবহার করা
আপনিpromptবাprompt_nameকোনওটিই নির্দিষ্ট না করলে, সিস্টেম অটোমেটিকdefault_prompt_nameহিসেবে সেট করা প্রম্পট ব্যবহার করবে, কোনও ডিফল্ট সেট করা না থাকলে, কোনও প্রম্পট প্রয়োগ করা হবে না।embeddings = model.encode(sentence)
print("Available tasks:")
for name, prefix in model.prompts.items():
print(f" {name}: \"{prefix}\"")
print("-"*80)
for sentence in [sentence_high, sentence_medium, sentence_low]:
print("🙋♂️")
print(sentence)
embeddings = model.encode(sentence, prompt_name="STS")
similarities = model.similarity(embeddings[0], embeddings[1])
print("`-> 🤖 score: ", similarities.numpy()[0][0])
Available tasks: query: "task: search result | query: " document: "title: none | text: " BitextMining: "task: search result | query: " Clustering: "task: clustering | query: " Classification: "task: classification | query: " InstructionRetrieval: "task: code retrieval | query: " MultilabelClassification: "task: classification | query: " PairClassification: "task: sentence similarity | query: " Reranking: "task: search result | query: " Retrieval: "task: search result | query: " Retrieval-query: "task: search result | query: " Retrieval-document: "title: none | text: " STS: "task: sentence similarity | query: " Summarization: "task: summarization | query: " -------------------------------------------------------------------------------- 🙋♂️ ['The chef prepared a delicious meal for the guests.', 'A tasty dinner was cooked by the chef for the visitors.'] `-> 🤖 score: 0.9363755 🙋♂️ ['She is an expert in machine learning.', 'He has a deep interest in artificial intelligence.'] `-> 🤖 score: 0.6425841 🙋♂️ ['The weather in Tokyo is sunny today.', 'I need to buy groceries for the week.'] `-> 🤖 score: 0.38587403
ব্যবহারের ক্ষেত্র: রিট্রিভাল-অগমেন্টেড জেনারেশন (RAG)
RAG সিস্টেমের জন্য, আপনার কোয়েরি ও ডকুমেন্টের জন্য বিশেষ এম্বেডিং তৈরি করতে, নিম্নলিখিত prompt_name ভ্যালু ব্যবহার করুন:
কোয়েরির জন্য:
prompt_name="Retrieval-query"
ব্যবহার করুন।query_embedding = model.encode( "How do I use prompts with this model?", prompt_name="Retrieval-query" )ডকুমেন্টের জন্য:
prompt_name="Retrieval-document"ব্যবহার করুন। ডকুমেন্ট এম্বেডিং আরও উন্নত করতে, আপনি সরাসরিpromptআর্গুমেন্ট ব্যবহার করে একটি শিরোনামও অন্তর্ভুক্ত করতে পারেন:- শীর্ষক সহ:
doc_embedding = model.encode( "The document text...", prompt="title: Using Prompts in RAG | text: " )- শীর্ষক ছাড়া:
doc_embedding = model.encode( "The document text...", prompt="title: none | text: " )- শীর্ষক সহ:
আরও পড়ুন
- উপলভ্য সব EmbeddingGemma প্রম্পটের বিবরণ জানতে, মডেল কার্ড দেখুন।
- প্রম্পট টেমপ্লেট সম্পর্কে সাধারণ তথ্য পেতে, সেন্টেন্স ট্রান্সফরমার ডকুমেন্টেশন দেখুন।
- RAG-এর ডেমোর জন্য, Gemma Cookbook-এ সহজ RAG উদাহরণ দেখুন।
শ্রেণীবিভাগ
ক্লাসিফিকেশন হল পূর্বনির্ধারিত এক বা একাধিক বিভাগ বা লেবেলে কোনও টেক্সট অ্যাসাইন করার টাস্ক। এটি হল ন্যাচারাল ল্যাঙ্গুয়েজ প্রসেসিং (NLP)-এর অন্যতম মৌলিক টাস্ক।
টেক্সট ক্লাসিফিকেশনের একটি ব্যবহারিক প্রয়োগ হল গ্রাহক সহায়তা টিকিট রাউটিং। এই প্রসেস অটোমেটিক গ্রাহকের কোয়েরি সঠিক বিভাগে পাঠিয়ে দেয়, এর ফলে সময় বাঁচে এবং ম্যানুয়াল কাজ কমে যায়।
labels = ["Billing Issue", "Technical Support", "Sales Inquiry"]
sentence = [
"Excuse me, the app freezes on the login screen. It won't work even when I try to reset my password.",
"I would like to inquire about your enterprise plan pricing and features for a team of 50 people.",
]
# Calculate embeddings by calling model.encode()
label_embeddings = model.encode(labels, prompt_name="Classification")
embeddings = model.encode(sentence, prompt_name="Classification")
# Calculate the embedding similarities
similarities = model.similarity(embeddings, label_embeddings)
print(similarities)
idx = similarities.argmax(1)
print(idx)
for example in sentence:
print("🙋♂️", example, "-> 🤖", labels[idx[sentence.index(example)]])
tensor([[0.4673, 0.5145, 0.3604],
[0.4191, 0.5010, 0.5966]])
tensor([1, 2])
🙋♂️ Excuse me, the app freezes on the login screen. It won't work even when I try to reset my password. -> 🤖 Technical Support
🙋♂️ I would like to inquire about your enterprise plan pricing and features for a team of 50 people. -> 🤖 Sales Inquiry
ম্যাট্রিয়োস্কা রিপ্রেজেন্টেশন লার্নিং (MRL)
একটি মডেল থেকে একাধিক এম্বেডিং সাইজ প্রদান করতে, EmbeddingGemma, MRL ব্যবহার করে। এটি একটি বুদ্ধিদীপ্ত ট্রেনিং পদ্ধতি যা একটি সিঙ্গেল, হাই-কোয়ালিটি এম্বেডিং তৈরি করে যেখানে সবচেয়ে গুরুত্বপূর্ণ তথ্য ভেক্টরের শুরুতে কেন্দ্রীভূত থাকে।
এর অর্থ হল, সম্পূর্ণ এম্বেডিংয়ের প্রথম N ডাইমেনশন নিয়ে আপনি ছোট কিন্তু এখনও খুব উপযোগী এম্বেডিং পেতে পারেন। ছোট, ট্রানকেট করা এম্বেডিং ব্যবহার করলে তা স্টোর করা অনেক সস্তা হয় এবং প্রসেস করাও দ্রুত হয়, তবে এই দক্ষতার জন্য এম্বেডিংয়ের সম্ভাব্য কোয়ালিটি কম হতে পারে। আপনার অ্যাপ্লিকেশনের নির্দিষ্ট প্রয়োজনের জন্য এই স্পিড এবং নির্ভুলতার মধ্যে সর্বোত্তম ব্যালেন্স বেছে নেওয়ার ক্ষমতা MRL আপনাকে দেয়।
MRL কীভাবে কাজ করে তা দেখতে, আসুন তিনটি শব্দ ["apple", "banana", "car"] ব্যবহার করি এবং সরলীকৃত এম্বেডিং তৈরি করি।
def check_word_similarities():
# Calculate the embedding similarities
print("similarity function: ", model.similarity_fn_name)
similarities = model.similarity(embeddings[0], embeddings[1:])
print(similarities)
for idx, word in enumerate(words[1:]):
print("🙋♂️ apple vs.", word, "-> 🤖 score: ", similarities.numpy()[0][idx])
# Calculate embeddings by calling model.encode()
embeddings = model.encode(words, prompt_name="STS")
check_word_similarities()
similarity function: cosine tensor([[0.7510, 0.6685]]) 🙋♂️ apple vs. banana -> 🤖 score: 0.75102395 🙋♂️ apple vs. car -> 🤖 score: 0.6684626
এখন, আরও দ্রুত আবেদন করার জন্য, আপনার নতুন মডেলের প্রয়োজন নেই। সম্পূর্ণ এম্বেডিংকে প্রথম ৫১২টি ডাইমেনশনে ছোট করে দিন। অপ্টিমাল ফলাফলের জন্য, normalize_embeddings=True সেট করার সাজেশনও দেওয়া হয়, যা ভেক্টরকে ১-এর ইউনিট দৈর্ঘ্যে স্কেল করে।
embeddings = model.encode(words, truncate_dim=512, normalize_embeddings=True)
for idx, embedding in enumerate(embeddings):
print(f"Embedding {idx+1}: {embedding.shape}")
print("-"*80)
check_word_similarities()
Embedding 1: (512,) Embedding 2: (512,) Embedding 3: (512,) -------------------------------------------------------------------------------- similarity function: cosine tensor([[0.7674, 0.7041]]) 🙋♂️ apple vs. banana -> 🤖 score: 0.767427 🙋♂️ apple vs. car -> 🤖 score: 0.7040509
অত্যন্ত সীমিত এনভায়রনমেন্টে, আপনি এম্বেডিং আরও ছোট করে ২৫৬ ডাইমেনশন করতে পারেন। এছাড়াও, আপনি স্ট্যান্ডার্ড কোসাইন সাদৃশ্যের পরিবর্তে সাদৃশ্য গণনা করার জন্য আরও বেশি কার্যকর ডট-প্রোডাক্ট ব্যবহার করতে পারেন।
model = SentenceTransformer(model_id, truncate_dim=256, similarity_fn_name="dot").to(device=device)
embeddings = model.encode(words, prompt_name="STS", normalize_embeddings=True)
for idx, embedding in enumerate(embeddings):
print(f"Embedding {idx+1}: {embedding.shape}")
print("-"*80)
check_word_similarities()
Embedding 1: (256,) Embedding 2: (256,) Embedding 3: (256,) -------------------------------------------------------------------------------- similarity function: dot tensor([[0.7855, 0.7382]]) 🙋♂️ apple vs. banana -> 🤖 score: 0.7854644 🙋♂️ apple vs. car -> 🤖 score: 0.7382126
সারসংক্ষেপ ও পরবর্তী ধাপ
আপনি এখন EmbeddingGemma এবং Sentence Transformers লাইব্রেরি ব্যবহার করে খুব ভালো কোয়ালিটির টেক্সট এম্বেডিং জেনারেট করতে পারবেন। সেম্যান্টিক সিমিলারিটি, টেক্সট ক্লাসিফিকেশন ও রিট্রিভাল-অগমেন্টেড জেনারেশন (RAG) সিস্টেমের মতো শক্তিশালী ফিচার তৈরি করতে এই দক্ষতাগুলি প্রয়োগ করুন এবং Gemma মডেলের সাহায্যে কী কী করা সম্ভব তা এক্সপ্লোর করা চালিয়ে যান।
এর পরে নিম্নলিখিত ডকুমেন্টগুলি চেক করে দেখুন:
- EmbeddingGemma ফাইন-টিউন করা
- Gemma Cookbook-এ RAG-এর সহজ উদাহরণ
Google Colab-এ রান করান
GitHub-এ সোর্স দেখুন