ফাইন-টিউন এমবেডিং গেমা

ai.google.dev-এ দেখুন Google Colab-এ চালান কাগলে চালান Vertex AI-তে খুলুন GitHub-এ উৎস দেখুন

ফাইন-টিউনিং একটি মডেলের সাধারণ-উদ্দেশ্য বোঝা এবং আপনার অ্যাপ্লিকেশনের জন্য প্রয়োজনীয় বিশেষ, উচ্চ-কর্মক্ষমতা নির্ভুলতার মধ্যে ব্যবধান বন্ধ করতে সাহায্য করে। যেহেতু কোনো একক মডেল প্রতিটি কাজের জন্য নিখুঁত নয়, তাই ফাইন-টিউনিং এটিকে আপনার নির্দিষ্ট ডোমেনে মানিয়ে নেয়।

আপনার কোম্পানির কল্পনা করুন, "শিবুয়া ফাইন্যান্সিয়াল" বিভিন্ন জটিল আর্থিক পণ্য যেমন বিনিয়োগ ট্রাস্ট, NISA অ্যাকাউন্ট (একটি ট্যাক্স-সুবিধেযুক্ত সঞ্চয় অ্যাকাউন্ট) এবং হোম লোন অফার করে৷ আপনার গ্রাহক সহায়তা দল গ্রাহকের প্রশ্নের উত্তর দ্রুত খুঁজে পেতে একটি অভ্যন্তরীণ জ্ঞানের ভিত্তি ব্যবহার করে।

সেটআপ

এই টিউটোরিয়ালটি শুরু করার আগে, নিম্নলিখিত পদক্ষেপগুলি সম্পূর্ণ করুন:

  • Hugging Face- এ লগ ইন করে এবং Gemma মডেলের জন্য Acknowledge লাইসেন্স নির্বাচন করে এমবেডিংজেমা-তে অ্যাক্সেস পান।
  • একটি আলিঙ্গন ফেস অ্যাক্সেস টোকেন তৈরি করুন এবং Colab থেকে লগইন করতে এটি ব্যবহার করুন।

এই নোটবুকটি CPU বা GPU-তে চলবে।

পাইথন প্যাকেজ ইনস্টল করুন

EmbeddingGemma মডেল চালানো এবং এম্বেডিং তৈরি করার জন্য প্রয়োজনীয় লাইব্রেরিগুলি ইনস্টল করুন। সেন্টেন্স ট্রান্সফরমার হল টেক্সট এবং ইমেজ এম্বেডিংয়ের জন্য একটি পাইথন ফ্রেমওয়ার্ক। আরও তথ্যের জন্য, বাক্য ট্রান্সফরমার ডকুমেন্টেশন দেখুন।

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

আপনি লাইসেন্স গ্রহণ করার পরে, মডেলটি অ্যাক্সেস করার জন্য আপনার একটি বৈধ আলিঙ্গন ফেস টোকেন প্রয়োজন।

# 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

ফাইন-টিউনিং ডেটাসেট প্রস্তুত করুন

এটি সবচেয়ে গুরুত্বপূর্ণ অংশ। আপনাকে একটি ডেটাসেট তৈরি করতে হবে যা মডেলটিকে শেখায় যে আপনার নির্দিষ্ট প্রসঙ্গে "অনুরূপ" মানে কী। এই ডেটা প্রায়শই ট্রিপলেট হিসাবে গঠন করা হয়: (অ্যাঙ্কর, ইতিবাচক, নেতিবাচক)

  • অ্যাঙ্কর: মূল প্রশ্ন বা বাক্য।
  • ইতিবাচক: একটি বাক্য যা শব্দার্থগতভাবে অ্যাঙ্করের সাথে খুব মিল বা অভিন্ন।
  • নেতিবাচক: একটি বাক্য যা একটি সম্পর্কিত বিষয়ে কিন্তু শব্দার্থগতভাবে স্বতন্ত্র।

এই উদাহরণে, আমরা শুধুমাত্র 3টি ট্রিপলেট প্রস্তুত করেছি, কিন্তু একটি বাস্তব প্রয়োগের জন্য, আপনার ভাল পারফর্ম করার জন্য অনেক বড় ডেটাসেটের প্রয়োজন হবে।

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

ফাইন-টিউনিংয়ের আগে

"ট্যাক্স-ফ্রি ইনভেস্টমেন্ট" এর জন্য একটি অনুসন্ধান সাদৃশ্য স্কোর সহ নিম্নলিখিত ফলাফলগুলি দিতে পারে:

  1. নথি: একটি NISA অ্যাকাউন্ট খোলা (স্কোর: 0.45)
  2. নথি: একটি নিয়মিত সঞ্চয় অ্যাকাউন্ট খোলা (স্কোর: 0.48) <- অনুরূপ স্কোর, সম্ভাব্য বিভ্রান্তিকর
  3. নথি: হোম লোন অ্যাপ্লিকেশন গাইড (স্কোর: 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

প্রশিক্ষণ

পাইথনে sentence-transformers মতো একটি কাঠামো ব্যবহার করে, বেস মডেল ধীরে ধীরে আপনার আর্থিক শব্দভান্ডারের সূক্ষ্ম পার্থক্যগুলি শিখেছে।

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

ফাইন-টিউনিংয়ের পরে

একই অনুসন্ধান এখন অনেক পরিষ্কার ফলাফল দেয়:

  1. নথি: একটি NISA অ্যাকাউন্ট খোলা (স্কোর: 0.72) <- অনেক বেশি আত্মবিশ্বাসী
  2. নথি: একটি নিয়মিত সঞ্চয় অ্যাকাউন্ট খোলা (স্কোর: 0.28) <- স্পষ্টতই কম প্রাসঙ্গিক
  3. নথি: হোম লোন অ্যাপ্লিকেশন গাইড (স্কোর: 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

আপনার মডেলটি Hugging Face Hub-এ আপলোড করতে, আপনি Sentence Transformers লাইব্রেরি থেকে push_to_hub পদ্ধতি ব্যবহার করতে পারেন।

আপনার মডেল আপলোড করা হাব থেকে সরাসরি অনুমানের জন্য অ্যাক্সেস করা, অন্যদের সাথে ভাগ করা এবং আপনার কাজকে সংস্করণ করা সহজ করে তোলে। একবার আপলোড হয়ে গেলে, যেকেউ আপনার মডেলকে কোডের একক লাইন দিয়ে লোড করতে পারে, কেবল তার অনন্য মডেল আইডি <username>/my-embedding-gemma উল্লেখ করে

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

সারাংশ এবং পরবর্তী পদক্ষেপ

আপনি এখন শিখেছেন কিভাবে একটি নির্দিষ্ট ডোমেনের জন্য একটি এমবেডিংগেমা মডেলকে সেন্টেন্স ট্রান্সফরমার লাইব্রেরির সাথে ফাইন-টিউনিং করে মানিয়ে নিতে হয়।

EmbeddingGemma দিয়ে আপনি আরও কী করতে পারেন তা অন্বেষণ করুন: