تولید جاسازی با «ترانسفورماتورهای جمله»

مشاهده در ai.google.dev اجرا در Google Colab اجرا در Kaggle باز کردن در Vertex AI مشاهده منبع در GitHub

‫EmbeddingGemma یک مدل جاسازی باز و سبک‌وزن است که برای بازیابی سریع و باکیفیت در دستگاه‌های روزمره مانند تلفن همراه طراحی شده است. این مدل با تنها ۳۰۸ میلیون پارامتر، به‌اندازه کافی کارآمد است تا تکنیک‌های هوش مصنوعی پیشرفته، مانند «تولید با کمک بازیابی» (RAG)، را مستقیماً در دستگاه محلی شما و بدون نیاز به اتصال اینترنت اجرا کند.

راه‌اندازی

قبل‌از شروع این آموزش گام‌به‌گام، مراحل زیر را تکمیل کنید:

  • با ورود به سیستم Hugging Face و انتخاب تصدیق پروانه برای مدل Gemma، به Gemma دسترسی پیدا کنید.
  • یک کد دسترسی Hugging Face تولید کنید و از آن برای ورود به سیستم از Colab استفاده کنید.

این دفترچه روی CPU یا GPU اجرا خواهد شد.

نصب بسته‌های Python

کتابخانه‌های موردنیاز برای اجرای مدل EmbeddingGemma و تولید جاسازی‌ها را نصب کنید. ‫Sentence Transformers چارچوب Python برای جاسازی نوشتار و تصویر است. برای اطلاعات بیشتر، به مستندات تبدیل‌کننده‌های جمله مراجعه کنید.

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()

بار کردن مدل

از کتابخانه‌های sentence-transformers برای ایجاد نمونه‌ای از کلاس مدل با EmbeddingGemma استفاده کنید.

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"] را پردازش می‌کند.

‫Gemma با حجم عظیمی از نوشتار آموزش دیده است و روابط بین کلمات و مفاهیم را یاد گرفته است.

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 از دو بردار دیگر بسیار دور خواهد بود.

تعیین شباهت

در این بخش، از جاسازی‌ها برای تعیین میزان شباهت معنایی جملات مختلف استفاده می‌کنیم. در اینجا نمونه‌هایی با امتیازهای شباهت بالا، متوسط و پایین نشان می‌دهیم.

  • شباهت زیاد:

    • جمله A: «سرآشپز غذای خوشمزه‌ای برای مهمانان آماده کرد.»
    • جمله B: «سرآشپز برای بازدیدکنندگان شام خوشمزه‌ای پخت.»
    • دلیل: هر دو جمله رویداد یکسانی را بااستفاده از کلمات و ساختارهای دستوری متفاوت (حالت معلوم دربرابر حالت مجهول) توصیف می‌کنند. آن‌ها معنای اصلی یکسانی را منتقل می‌کنند.
  • شباهت متوسط:

    • جمله A: «او در یادگیری ماشین متخصص است.»
    • جمله ب: «او علاقه زیادی به هوش مصنوعی دارد.»
    • دلیل: این جمله‌ها باهم مرتبط‌اند زیرا یادگیری ماشین زیرمجموعه هوش مصنوعی است. بااین‌حال، آن‌ها درباره افراد مختلف با سطوح مختلف تعامل (متخصص در مقابل علاقه‌مند) صحبت می‌کنند.
  • شباهت کم:

    • جمله A: «امروز هوا در توکیو آفتابی است.»
    • جمله ب: «باید خواروبار هفته را بخرم.»
    • دلیل: این دو جمله درباره موضوعات کاملاً نامربوط هستند و هیچ هم‌پوشانی معنایی ندارند.
# 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، باید «پیام‌آور آموزشی» یا «تکلیف» را به ابتدای نوشتار ورودی‌تان اضافه کنید. این پیام‌واره‌ها جاسازی‌ها را برای تکالیف خاصی مثل بازیابی سند یا پاسخ به سؤال بهینه‌سازی می‌کنند و به مدل کمک می‌کنند بین انواع مختلف درونداد، مثل پُرسمان جستجو دربرابر سند، تمایز قائل شود.

نحوه اعمال پیام‌واره‌ها

می‌توانید پیام‌واره را درطول استنباط به سه روش اعمال کنید.

  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 را مشخص نکنید، سیستم به‌طور خودکار از پیام‌واره‌ای که به‌عنوان 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 دردسترس، کارت مدل را ببینید.
  • برای اطلاعات کلی درباره الگوهای پیام‌واره، به اسناد Sentence 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

اکنون برای درخواست سریع‌تر، به مدل جدیدی نیاز ندارید. به‌سادگی جاسازی‌های کامل را به ۵۱۲ بُعد اول کوتاه کنید. برای دریافت نتایج بهینه، توصیه می‌شود 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 ادامه دهید.

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