| | در Google Colab اجرا شود | | | مشاهده منبع در GitHub |
EmbeddingGemma یک مدل جاسازی سبک وزن است که برای بازیابی سریع و با کیفیت بالا در دستگاه های روزمره مانند تلفن های همراه طراحی شده است. تنها با 308 میلیون پارامتر، به اندازه کافی کارآمد است که تکنیک های پیشرفته هوش مصنوعی، مانند Retrieval Augmented Generation (RAG) را مستقیماً روی دستگاه محلی خود بدون نیاز به اتصال به اینترنت اجرا کنید.
راه اندازی
قبل از شروع این آموزش، مراحل زیر را انجام دهید:
- با ورود به Hugging Face و انتخاب مجوز Acknowledge برای مدل Gemma به Gemma دسترسی پیدا کنید.
- یک نشانه دسترسی به چهره در آغوش گرفته و از آن برای ورود از Colab استفاده کنید.
این نوت بوک بر روی CPU یا GPU کار می کند.
بسته های پایتون را نصب کنید
کتابخانه های مورد نیاز برای اجرای مدل EmbeddingGemma و ایجاد جاسازی ها را نصب کنید. Sentence Transformers یک چارچوب پایتون برای تعبیه متن و تصویر است. برای اطلاعات بیشتر، به مستندات 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,)
مدل خروجی یک بردار عددی برای هر جمله می دهد. بردارهای واقعی بسیار طولانی هستند (768)، اما برای سادگی، آن ها با چند بعد ارائه شده اند.
کلید خود اعداد نیست، بلکه فاصله بین بردارها است . اگر بخواهیم این بردارها را در یک فضای چند بعدی رسم کنیم، بردارهای apple و banana بسیار نزدیک به هم خواهند بود. و بردار car از دو مورد دیگر بسیار دور خواهد بود.
تعیین شباهت
در این بخش، ما از embedding ها برای تعیین اینکه جملات مختلف از نظر معنایی مشابه هستند استفاده می کنیم. در اینجا نمونه هایی با نمرات شباهت بالا، متوسط و پایین را نشان می دهیم.
شباهت زیاد:
- جمله الف: «سرآشپز یک غذای خوشمزه برای مهمانان آماده کرد».
- جمله ب: یک شام خوشمزه توسط سرآشپز برای بازدیدکنندگان پخته شد.
- استدلال: هر دو جمله یک رویداد را با استفاده از کلمات و ساختارهای دستوری متفاوت توصیف می کنند (صدای فعال در مقابل غیرفعال). آنها همان معنای اصلی را منتقل می کنند.
شباهت متوسط:
- جمله الف: "او متخصص در یادگیری ماشین است."
- جمله ب: "او علاقه عمیقی به هوش مصنوعی دارد."
- استدلال: جملات مرتبط هستند زیرا یادگیری ماشین زیرشاخه هوش مصنوعی است. با این حال، آنها در مورد افراد مختلف با سطوح مختلف مشارکت صحبت می کنند (کارشناس در مقابل علاقه).
شباهت کم:
- جمله الف: "هوای توکیو امروز آفتابی است."
- جمله ب: «نیاز به خرید مواد غذایی برای هفته دارم».
- استدلال: این دو جمله در موضوعات کاملاً نامرتبط هستند و هیچ همپوشانی معنایی ندارند.
# 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
استفاده از Prompts با 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مشخص نکنید، سیستم بهطور خودکار از دستور prompt بهعنوان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
مورد استفاده: Retrieval-Augmented Generation (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 موجود، به کارت مدل مراجعه کنید.
- برای اطلاعات کلی در مورد الگوهای سریع، به مستندات Transformer جمله مراجعه کنید.
- برای نمایش نسخه RAG، به مثال RAG ساده در کتاب آشپزی Gemma مراجعه کنید.
طبقه بندی
طبقه بندی وظیفه اختصاص دادن یک قطعه متن به یک یا چند دسته یا برچسب از پیش تعریف شده است. این یکی از اساسی ترین وظایف در پردازش زبان طبیعی (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 به شما این قدرت را می دهد که تعادل بهینه بین این سرعت و دقت را برای نیازهای خاص برنامه خود انتخاب کنید.
بیایید از سه کلمه ["apple", "banana", "car"] استفاده کنیم و تعبیههای سادهسازی شدهای ایجاد کنیم تا ببینیم MRL چگونه کار میکند.
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
اکنون، برای یک برنامه سریعتر، نیازی به مدل جدیدی ندارید. به سادگی جاسازی های کامل را به 512 بعد اول کوتاه کنید . برای نتایج بهینه، تنظیم normalize_embeddings=True نیز توصیه می شود که بردارها را به طول واحد 1 مقیاس می کند.
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
در محیط های بسیار محدود، می توانید تعبیه ها را به 256 بعد کوتاه تر کنید. همچنین می توانید به جای شباهت کسینوس استاندارد از نقطه-محصول کارآمدتر برای محاسبات شباهت استفاده کنید.
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 مجهز به ایجاد تعبیههای متنی با کیفیت بالا هستید. این مهارتها را برای ایجاد ویژگیهای قدرتمندی مانند شباهت معنایی، طبقهبندی متن، و سیستمهای Retrieval-Augmented Generation (RAG) بکار ببرید و به کاوش در آنچه که با مدلهای Gemma ممکن است ادامه دهید.
در ادامه اسناد زیر را بررسی کنید:
- EmbeddingGemma را به خوبی تنظیم کنید
- مثال RAG ساده در کتاب آشپزی Gemma
در Google Colab اجرا شود
مشاهده منبع در GitHub