Sentence Transformers ile yerleştirilmiş öğeler oluşturma

ai.google.dev'de görüntüle Google Colab'de çalıştırma Kaggle'da çalıştır Vertex AI'da aç Kaynağı GitHub'da görüntüle

EmbeddingGemma, cep telefonları gibi günlük cihazlarda hızlı ve yüksek kaliteli alma için tasarlanmış hafif ve açık bir yerleştirme modelidir. Yalnızca 308 milyon parametreye sahip olan bu model, Retrieval Augmented Generation (RAG) gibi gelişmiş yapay zeka tekniklerini internet bağlantısı gerektirmeden doğrudan yerel makinenizde çalıştıracak kadar verimlidir.

Kurulum

Bu eğitime başlamadan önce aşağıdaki adımları tamamlayın:

  • Hugging Face'e giriş yapıp bir Gemma modeli için Lisansı onayla'yı seçerek Gemma'ya erişebilirsiniz.
  • Hugging Face erişim jetonu oluşturun ve Colab'den giriş yapmak için bu jetonu kullanın.

Bu not defteri CPU veya GPU'da çalıştırılabilir.

Python paketlerini yükleme

EmbeddingGemma modelini çalıştırmak ve yerleştirmeler oluşturmak için gereken kitaplıkları yükleyin. Sentence Transformers, metin ve resim yerleştirmeleri için kullanılan bir Python çerçevesidir. Daha fazla bilgi için Sentence Transformers belgelerini inceleyin.

pip install -U sentence-transformers git+https://github.com/huggingface/transformers@v4.56.0-Embedding-Gemma-preview

Lisansı kabul ettikten sonra modele erişmek için geçerli bir Hugging Face jetonuna ihtiyacınız vardır.

# Login into Hugging Face Hub
from huggingface_hub import login
login()

Modeli yükle

EmbeddingGemma ile model sınıfının bir örneğini oluşturmak için sentence-transformers kitaplıklarını kullanın.

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

Yerleştirilmiş öğe oluşturma

Yerleştirme, kelime veya cümle gibi bir metnin semantik anlamını yakalayan sayısal bir gösterimidir. Temel olarak, bilgisayarların kelimelerin ilişkilerini ve bağlamını anlamasına olanak tanıyan bir sayı listesidir (vektör).

EmbeddingGemma'nın üç farklı kelimeyi nasıl işleyeceğini inceleyelim ["apple", "banana", "car"].

EmbeddingGemma, büyük miktarda metinle eğitildi ve kelimeler ile kavramlar arasındaki ilişkileri öğrendi.

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

Model, her cümle için sayısal bir vektör çıkışı verir. Gerçek vektörler çok uzundur (768), ancak basitlik için birkaç boyutla sunulur.

Önemli olan, sayıların kendisi değil, vektörler arasındaki mesafedir. Bu vektörleri çok boyutlu bir uzayda çizseydik apple ve banana vektörleri birbirine çok yakın olurdu. car için vektör, diğer ikisinden çok uzakta olur.

Benzerliği Belirleme

Bu bölümde, farklı cümlelerin anlamsal olarak ne kadar benzer olduğunu belirlemek için yerleştirmelerden yararlanırız. Burada, yüksek, orta ve düşük benzerlik puanlarına sahip örnekler gösterilmektedir.

  • Yüksek Benzerlik:

    • A cümlesi: "Şef, konuklar için lezzetli bir yemek hazırladı."
    • B cümlesi: "Şef, ziyaretçiler için lezzetli bir akşam yemeği pişirdi."
    • Gerekçe: Her iki cümle de aynı etkinliği farklı kelimeler ve dilbilgisi yapıları (etken yapı ve edilgen yapı) kullanarak açıklıyor. Aynı temel anlamı ifade ederler.
  • Orta düzeyde benzerlik:

    • A cümlesi: "Makine öğrenimi konusunda uzman."
    • B cümlesi: "Yapay zekaya büyük ilgi duyuyor."
    • Gerekçe: Makine öğrenimi, yapay zekanın bir alt alanı olduğundan cümleler birbiriyle ilişkilidir. Ancak bu kişiler, farklı etkileşim düzeylerine (uzman ve ilgi) sahip farklı kişiler hakkında konuşuyor.
  • Düşük Benzerlik:

    • A cümlesi: "Tokyo'da bugün hava güneşli."
    • B cümlesi: "Bu hafta için market alışverişi yapmam gerekiyor."
    • Gerekçe: İki cümle tamamen alakasız konularla ilgili ve semantik olarak örtüşmüyor.
# 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 ile istemleri kullanma

EmbeddingGemma ile en iyi gömmeleri oluşturmak için giriş metninizin başına bir "talimat istemi" veya "görev" eklemeniz gerekir. Bu istemler, doküman alma veya soru yanıtlama gibi belirli görevler için gömmeleri optimize eder ve modelin, arama sorgusu ile doküman gibi farklı giriş türlerini ayırt etmesine yardımcı olur.

İstemleri uygulama

Çıkarım sırasında istemi üç şekilde uygulayabilirsiniz.

  1. prompt bağımsız değişkenini kullanma
    Tam istem dizesini doğrudan encode yöntemine iletin. Bu sayede hassas kontrol elde edersiniz.

    embeddings = model.encode(
        sentence,
        prompt="task: sentence similarity | query: "
    )
    
  2. prompt_name bağımsız değişkenini kullanma
    Adına göre önceden tanımlanmış bir istem seçin. Bu istemler, modelin yapılandırmasından veya başlatılması sırasında yüklenir.

    embeddings = model.encode(sentence, prompt_name="STS")
    
  3. Varsayılan istemi kullanma
    prompt veya prompt_name değerini belirtmezseniz sistem, default_prompt_name olarak ayarlanan istemi otomatik olarak kullanır. Varsayılan bir istem ayarlanmamışsa istem uygulanmaz.

    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

Kullanım alanı: Veriyle Artırılmış Üretim (RAG)

RAG sistemlerinde, sorgularınız ve belgeleriniz için özel yerleştirmeler oluşturmak üzere aşağıdaki prompt_name değerlerini kullanın:

  • Sorgular için: prompt_name="Retrieval-query".
    kullanın.

    query_embedding = model.encode(
        "How do I use prompts with this model?",
        prompt_name="Retrieval-query"
    )
    
  • Dokümanlar için: prompt_name="Retrieval-document" simgesini kullanın. Doküman yerleştirmelerini daha da iyileştirmek için prompt bağımsız değişkenini doğrudan kullanarak başlık da ekleyebilirsiniz:

    • Başlıklı:
    doc_embedding = model.encode(
        "The document text...",
        prompt="title: Using Prompts in RAG | text: "
    )
    
    • Başlıksız:
    doc_embedding = model.encode(
        "The document text...",
        prompt="title: none | text: "
    )
    

Daha fazla bilgi

Sınıflandırma

Sınıflandırma, bir metin parçasını önceden tanımlanmış bir veya daha fazla kategoriye ya da etikete atama işlemidir. Bu, doğal dil işlemedeki (NLP) en temel görevlerden biridir.

Metin sınıflandırmanın pratik uygulamalarından biri müşteri destek kaydı yönlendirmesidir. Bu süreç, müşteri sorgularını otomatik olarak doğru departmana yönlendirerek zamandan tasarruf sağlar ve manuel işleri azaltır.

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

Matryoshka Representation Learning (MRL)

EmbeddingGemma, tek bir modelden birden fazla yerleştirme boyutu sağlamak için MRL'den yararlanır. Bu, en önemli bilgilerin vektörün başında yoğunlaştığı tek ve yüksek kaliteli bir yerleştirme oluşturan akıllı bir eğitim yöntemidir.

Bu sayede, tam yerleştirmenin ilk N boyutlarını alarak daha küçük ancak yine de çok kullanışlı bir yerleştirme elde edebilirsiniz. Daha küçük ve kısaltılmış gömmeleri depolamak önemli ölçüde daha ucuz ve işlemek daha hızlıdır. Ancak bu verimlilik, gömmelerin kalitesinin düşmesi pahasına elde edilir. MRL, uygulamanızın özel ihtiyaçları için bu hız ve doğruluk arasında optimum dengeyi seçme gücü verir.

MRL'nin nasıl çalıştığını görmek için üç kelime ["apple", "banana", "car"] kullanarak basitleştirilmiş yerleştirmeler oluşturalım.

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

Artık daha hızlı bir uygulama için yeni bir modele ihtiyacınız yok. Tam yerleştirmeleri ilk 512 boyuta kısaltmanız yeterlidir. En iyi sonuçlar için vektörleri 1 birim uzunluğuna ölçeklendiren normalize_embeddings=True değerini ayarlamanız da önerilir.

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

Son derece kısıtlı ortamlarda, yerleştirmeleri 256 boyutla sınırlayabilirsiniz. Benzerlik hesaplamaları için standart kosinüs benzerliği yerine daha verimli olan nokta çarpımı da kullanabilirsiniz.

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

Özet ve sonraki adımlar

Artık EmbeddingGemma ve Sentence Transformers kitaplığını kullanarak yüksek kaliteli metin yerleştirmeleri oluşturabilirsiniz. Bu becerileri kullanarak semantik benzerlik, metin sınıflandırma ve veriyle artırılmış üretim (RAG) sistemleri gibi güçlü özellikler oluşturun ve Gemma modelleriyle neler yapabileceğinizi keşfetmeye devam edin.

Ardından aşağıdaki belgelere göz atın: