|
|
Google Colab'de çalıştırma
|
|
|
Kaynağı GitHub'da görüntüleyin
|
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ırmak için yeterince 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 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-previewLisansı 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
sentence-transformers kitaplıklarını kullanarak EmbeddingGemma ile bir model sınıfı örneği oluşturun.
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, bir kelime veya cümle gibi metnin sayısal gösterimidir ve semantik anlamını yakalar. 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, çok 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 gösterilir.
Buradaki önemli nokta, 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 gömmeleri kullanı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: "Ziyaretçiler için şef tarafından lezzetli bir akşam yemeği pişirildi."
- 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 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ı düzeylerde etkileşim (uzmanlık ve ilgi) gösteren farklı kullanıcılardan bahsediyor.
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.
promptbağımsız değişkenini kullanma
Tam istem dizesini doğrudanencodeyöntemine iletin. Bu sayede hassas kontrol sahibi olursunuz.embeddings = model.encode( sentence, prompt="task: sentence similarity | query: " )prompt_namebağı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")Varsayılan istemi kullanma
promptveyaprompt_namedeğerini belirtmezseniz sistem,default_prompt_nameolarak ayarlanan istemi otomatik olarak kullanır. Varsayılan 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ı: Almayla Artırılmış Üretim (RAG)
RAG sistemlerinde, sorgularınız ve dokümanlarınız 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çinpromptbağı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: " )- Başlıklı:
Daha fazla bilgi
- Kullanılabilen tüm EmbeddingGemma istemleriyle ilgili ayrıntılar için model kartına bakın.
- İstem şablonları hakkında genel bilgi için Sentence Transformer belgelerine bakın.
- RAG demosunu görmek için Gemma Cookbook'taki Simple RAG example (Basit RAG örneği) bölümüne bakın.
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 görevidir. Bu, doğal dil işlemedeki (NLP) en temel görevlerden biridir.
Metin sınıflandırmanın pratik bir uygulaması, müşteri destek kaydı yönlendirmesidir. Bu işlem, müşteri sorgularını otomatik olarak doğru departmana yönlendirerek zamandan tasarruf sağlar ve manuel çalışmayı 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, tam yerleştirmenin ilk N boyutlarını alarak daha küçük ancak yine de çok kullanışlı bir yerleştirme elde edebileceğiniz anlamına gelir. 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 ayarının da yapılması ö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 boyut olacak şekilde daha da kısaltabilirsiniz. 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 dokümanlara göz atın:
- EmbeddingGemma'yı ince ayarlama
- Gemma Cookbook'taki basit RAG örneği
Google Colab'de çalıştırma
Kaynağı GitHub'da görüntüleyin