Menyesuaikan EmbeddingGemma

Lihat di ai.google.dev Jalankan di Google Colab Jalankan di Kaggle Buka di Vertex AI Lihat sumber di GitHub

Penyesuaian membantu mempersempit kesenjangan antara pemahaman model untuk tujuan umum dan akurasi berperforma tinggi yang khusus yang diperlukan aplikasi Anda. Karena tidak ada satu model pun yang sempurna untuk setiap tugas, penyesuaian akan mengadaptasinya ke domain spesifik Anda.

Bayangkan perusahaan Anda, "Shibuya Financial", menawarkan berbagai produk keuangan kompleks seperti unit tepercaya investasi, akun NISA (rekening tabungan yang bebas pajak), dan pinjaman rumah. Tim dukungan pelanggan Anda menggunakan pusat informasi internal untuk menemukan jawaban atas pertanyaan pelanggan dengan cepat.

Penyiapan

Sebelum memulai tutorial ini, selesaikan langkah-langkah berikut:

  • Dapatkan akses ke EmbeddingGemma dengan login ke Hugging Face dan memilih Acknowledge license untuk model Gemma.
  • Buat Token Akses Hugging Face dan gunakan untuk login dari Colab.

Notebook ini akan berjalan di CPU atau GPU.

Menginstal paket Python

Instal library yang diperlukan untuk menjalankan model EmbeddingGemma dan membuat embedding. Sentence Transformers adalah framework Python untuk embedding teks dan gambar. Untuk mengetahui informasi selengkapnya, lihat dokumentasi Sentence Transformers.

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

Setelah menyetujui lisensi, Anda memerlukan Token Hugging Face yang valid untuk mengakses model.

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

Memuat Model

Gunakan library sentence-transformers untuk membuat instance class model dengan 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

Menyiapkan Set Data Fine-Tuning

Ini adalah bagian yang paling penting. Anda perlu membuat set data yang mengajarkan model apa yang dimaksud dengan "mirip" dalam konteks spesifik Anda. Data ini sering kali disusun sebagai triplet: (anchor, positif, negatif)

  • Anchor: Kueri atau kalimat asli.
  • Positif: Kalimat yang secara semantik sangat mirip atau identik dengan anchor.
  • Negatif: Kalimat yang membahas topik terkait, tetapi berbeda secara semantik.

Dalam contoh ini, kita hanya menyiapkan 3 triplet, tetapi untuk aplikasi nyata, Anda memerlukan set data yang jauh lebih besar agar dapat berfungsi dengan baik.

from datasets import Dataset

dataset = [
    ["How do I open a NISA account?", "What is the procedure for starting a new tax-free investment account?", "I want to check the balance of my regular savings account."],
    ["Are there fees for making an early repayment on a home loan?", "If I pay back my house loan early, will there be any costs?", "What is the management fee for this investment trust?"],
    ["What is the coverage for medical insurance?", "Tell me about the benefits of the health insurance plan.", "What is the cancellation policy for my life insurance?"],
]

# Convert the list-based dataset into a list of dictionaries.
data_as_dicts = [ {"anchor": row[0], "positive": row[1], "negative": row[2]} for row in dataset ]

# Create a Hugging Face `Dataset` object from the list of dictionaries.
train_dataset = Dataset.from_list(data_as_dicts)
print(train_dataset)
Dataset({
    features: ['anchor', 'positive', 'negative'],
    num_rows: 3
})

Sebelum Fine-Tuning

Penelusuran "investasi bebas pajak" mungkin memberikan hasil berikut, dengan skor kemiripan:

  1. Dokumen: Membuka akun NISA (Skor: 0,45)
  2. Dokumen: Membuka Rekening Tabungan Reguler (Skor: 0,48) <- Skor serupa, berpotensi membingungkan
  3. Dokumen: Panduan Pengajuan Pinjaman Rumah (Skor: 0,42)
task_name = "STS"

def get_scores(query, documents):
  # Calculate embeddings by calling model.encode()
  query_embeddings = model.encode(query, prompt=task_name)
  doc_embeddings = model.encode(documents, prompt=task_name)

  # Calculate the embedding similarities
  similarities = model.similarity(query_embeddings, doc_embeddings)

  for idx, doc in enumerate(documents):
    print("Document: ", doc, "-> 🤖 Score: ", similarities.numpy()[0][idx])

query = "I want to start a tax-free installment investment, what should I do?"
documents = ["Opening a NISA Account", "Opening a Regular Savings Account", "Home Loan Application Guide"]

get_scores(query, documents)
Document:  Opening a NISA Account -> 🤖 Score:  0.45698774
Document:  Opening a Regular Savings Account -> 🤖 Score:  0.48092696
Document:  Home Loan Application Guide -> 🤖 Score:  0.42127067

Pelatihan

Dengan menggunakan framework seperti sentence-transformers di Python, model dasar secara bertahap mempelajari perbedaan halus dalam kosakata keuangan Anda.

from sentence_transformers import SentenceTransformerTrainer, SentenceTransformerTrainingArguments
from sentence_transformers.losses import MultipleNegativesRankingLoss
from transformers import TrainerCallback

loss = MultipleNegativesRankingLoss(model)

args = SentenceTransformerTrainingArguments(
    # Required parameter:
    output_dir="my-embedding-gemma",
    # Optional training parameters:
    prompts=model.prompts[task_name],    # use model's prompt to train
    num_train_epochs=5,
    per_device_train_batch_size=1,
    learning_rate=2e-5,
    warmup_ratio=0.1,
    # Optional tracking/debugging parameters:
    logging_steps=train_dataset.num_rows,
    report_to="none",
)

class MyCallback(TrainerCallback):
    "A callback that evaluates the model at the end of eopch"
    def __init__(self, evaluate):
        self.evaluate = evaluate # evaluate function

    def on_log(self, args, state, control, **kwargs):
        # Evaluate the model using text generation
        print(f"Step {state.global_step} finished. Running evaluation:")
        self.evaluate()

def evaluate():
  get_scores(query, documents)

trainer = SentenceTransformerTrainer(
    model=model,
    args=args,
    train_dataset=train_dataset,
    loss=loss,
    callbacks=[MyCallback(evaluate)]
)
trainer.train()
Step 3 finished. Running evaluation:
Document:  Opening a NISA Account -> 🤖 Score:  0.6449194
Document:  Opening a Regular Savings Account -> 🤖 Score:  0.44123
Document:  Home Loan Application Guide -> 🤖 Score:  0.46752414
Step 6 finished. Running evaluation:
Document:  Opening a NISA Account -> 🤖 Score:  0.68873787
Document:  Opening a Regular Savings Account -> 🤖 Score:  0.34069622
Document:  Home Loan Application Guide -> 🤖 Score:  0.50065553
Step 9 finished. Running evaluation:
Document:  Opening a NISA Account -> 🤖 Score:  0.7148906
Document:  Opening a Regular Savings Account -> 🤖 Score:  0.30480516
Document:  Home Loan Application Guide -> 🤖 Score:  0.52454984
Step 12 finished. Running evaluation:
Document:  Opening a NISA Account -> 🤖 Score:  0.72614634
Document:  Opening a Regular Savings Account -> 🤖 Score:  0.29255486
Document:  Home Loan Application Guide -> 🤖 Score:  0.5370023
Step 15 finished. Running evaluation:
Document:  Opening a NISA Account -> 🤖 Score:  0.7294032
Document:  Opening a Regular Savings Account -> 🤖 Score:  0.2893038
Document:  Home Loan Application Guide -> 🤖 Score:  0.54087913
Step 15 finished. Running evaluation:
Document:  Opening a NISA Account -> 🤖 Score:  0.7294032
Document:  Opening a Regular Savings Account -> 🤖 Score:  0.2893038
Document:  Home Loan Application Guide -> 🤖 Score:  0.54087913
TrainOutput(global_step=15, training_loss=0.009651281436261646, metrics={'train_runtime': 63.2486, 'train_samples_per_second': 0.237, 'train_steps_per_second': 0.237, 'total_flos': 0.0, 'train_loss': 0.009651281436261646, 'epoch': 5.0})

Setelah Penyesuaian

Penelusuran yang sama kini memberikan hasil yang jauh lebih jelas:

  1. Dokumen: Membuka akun NISA (Skor: 0,72) <- Jauh lebih yakin
  2. Dokumen: Membuka Rekening Tabungan Reguler (Skor: 0,28) <- Jelas kurang relevan
  3. Dokumen: Panduan Permohonan Pinjaman Rumah (Skor: 0,54)
get_scores(query, documents)
Document:  Opening a NISA Account -> 🤖 Score:  0.7294032
Document:  Opening a Regular Savings Account -> 🤖 Score:  0.2893038
Document:  Home Loan Application Guide -> 🤖 Score:  0.54087913

Untuk mengupload model ke Hugging Face Hub, Anda dapat menggunakan metode push_to_hub dari library Sentence Transformers.

Dengan mengupload model, Anda dapat dengan mudah mengaksesnya untuk inferensi langsung dari Hub, membagikannya kepada orang lain, dan membuat versi pekerjaan Anda. Setelah diupload, siapa pun dapat memuat model Anda dengan satu baris kode, cukup dengan mereferensikan ID model uniknya <username>/my-embedding-gemma

# Push to Hub
model.push_to_hub("my-embedding-gemma")

Ringkasan dan langkah selanjutnya

Sekarang Anda telah mempelajari cara mengadaptasi model EmbeddingGemma untuk domain tertentu dengan menyesuaikannya menggunakan library Sentence Transformers.

Pelajari lebih lanjut hal yang dapat Anda lakukan dengan EmbeddingGemma: