با Transformers جمله سازی جاسازی ها را ایجاد کنید

مشاهده در ai.google.dev در Google Colab اجرا شود در Kaggle بدوید در Vertex AI باز کنید مشاهده منبع در 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، باید یک «اعلان آموزشی» یا «وظیفه» را به ابتدای متن ورودی خود اضافه کنید. این اعلان‌ها جاسازی‌ها را برای کارهای خاص، مانند بازیابی سند یا پاسخ‌گویی به سؤال، بهینه می‌کنند و به مدل کمک می‌کنند تا بین انواع ورودی‌های مختلف، مانند عبارت جستجو در مقابل یک سند، تمایز قائل شود.

نحوه اعمال دستورات

شما می توانید یک فرمان را در حین استنتاج به سه روش اعمال کنید.

  1. با استفاده از آرگومان prompt
    رشته اعلان کامل را مستقیماً به روش encode ارسال کنید. این به شما کنترل دقیقی می دهد.

    embeddings = model.encode(
        sentence,
        prompt="task: sentence similarity | query: "
    )
    
  2. با استفاده از آرگومان prompt_name
    یک دستور از پیش تعریف شده را با نام آن انتخاب کنید. این دستورات از پیکربندی مدل یا در طول اولیه سازی آن بارگذاری می شوند.

    embeddings = model.encode(sentence, prompt_name="STS")
    
  3. با استفاده از اعلان پیش فرض
    اگر 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 ممکن است ادامه دهید.

در ادامه اسناد زیر را بررسی کنید: