İçeriğe geç
Sedat Demir
Geri dön

Fine-tuning vs RAG: Yapay Zeka Modellerini Özelleştirmenin İki Yolu

Yapay Zeka Modellerini Özelleştirme: Fine-tuning ve RAG'ın Karşılaştırması

Yapay zeka (YZ) ve özellikle de büyük dil modelleri (LLM) hayatımıza hızla entegre oluyor. ChatGPT, Bard gibi modeller, genel amaçlı görevlerde inanılmaz derecede başarılı olsa da, belirli bir alanda veya şirketinizin özel verileriyle daha iyi performans göstermelerini istemek doğal bir ihtiyaçtır. İşte tam bu noktada, LLM'leri kendi ihtiyaçlarımıza göre özelleştirme yöntemleri devreye giriyor. Bu özelleştirmenin iki popüler yolu ise Fine-tuning ve RAG (Retrieval-Augmented Generation)'dır.

Peki, hangi durumda hangisini kullanmalısınız? Bu iki yaklaşım arasındaki farklar nelerdir ve hangi senaryolar için daha uygundurlar? Bu yazıda, bu soruların cevaplarını derinlemesine inceleyeceğiz.

LLM'leri Anlamak: Temel Kavramlar

Öncelikle, Fine-tuning ve RAG'ı anlamak için LLM'lerin nasıl çalıştığına dair temel bir anlayışa sahip olmak önemlidir. LLM'ler, devasa veri kümeleri üzerinde eğitilmiş, milyarlarca parametreye sahip derin öğrenme modelleridir. Bu eğitim, onlara dilin yapısını, anlamsal ilişkileri ve hatta dünya hakkında genel bilgiler öğrenmelerini sağlar. Ancak, bu genel bilgi, sizin spesifik iş alanınızdaki ince ayrıntıları veya güncel olmayan bilgileri kapsamayabilir.

LLM'lerin iki ana yeteneği vardır:

  1. Bilgi Üretme (Generation): Verilen bir komut (prompt) doğrultusunda metin, kod veya başka içerikler üretme yeteneği.
  2. Bilgi Alma (Retrieval): Eğitim verilerinden veya dış kaynaklardan bilgi çekme yeteneği.

Fine-tuning ve RAG, bu yetenekleri farklı şekillerde geliştirir.

Fine-tuning: Modeli Yeniden Şekillendirmek

Fine-tuning, önceden eğitilmiş bir LLM'yi alıp, daha küçük ve spesifik bir veri kümesi üzerinde ek bir eğitim sürecinden geçirme işlemidir. Bu, modelin mevcut bilgisini "ince ayar" yaparak, belirli bir görev veya alan için daha yetkin hale getirilmesini sağlar.

Nasıl Çalışır?

Fine-tuning sürecinde, modelin ağırlıkları (parametreleri) güncellenir. Bu güncelleme, modelin yeni veri kümesindeki örüntüleri ve bilgileri öğrenmesini sağlar. Model, bu yeni verilerle daha uyumlu hale gelir.

Avantajları:

Dezavantajları:

Ne Zaman Kullanılmalı?

Örnek: Duygu Analizi İçin Fine-tuning (Kavramsal Kod)

Diyelim ki müşteri yorumlarınızın duygu analizini yapmak istiyorsunuz. Genel bir LLM bu konuda yardımcı olabilir, ancak şirketinizin ürünlerine özgü terimleri ve ifadeleri tam olarak anlamayabilir.

# Bu sadece kavramsal bir örnektir. Gerçek implementasyon için
# Hugging Face Transformers gibi kütüphaneler kullanılır.

from transformers import AutoModelForSequenceClassification, AutoTokenizer, Trainer, TrainingArguments
from datasets import Dataset

# 1. Önceden Eğitilmiş Modeli Yükle
model_name = "bert-base-uncased" # Veya daha gelişmiş bir model
model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=3) # Örnek: Pozitif, Negatif, Nötr

# 2. Tokenizer'ı Yükle
tokenizer = AutoTokenizer.from_pretrained(model_name)

# 3. Kendi Veri Setinizi Oluşturun
# Örneğin, şirketinizin ürünleriyle ilgili yorumlar ve etiketleri
data = {
    "text": [
        "Bu ürün harika, bayıldım!",
        "Teslimat çok yavaştı, memnun kalmadım.",
        "Fiyatına göre performansı ortalama.",
        "Müşteri hizmetleri çok ilgiliydi.",
        "Kullanışlı ama biraz pahalı."
    ],
    "label": [2, 1, 0, 2, 0] # 0: Nötr, 1: Negatif, 2: Pozitif
}
# Bu veriyi daha büyük ve gerçekçi hale getirmeniz gerekir.

# Dataset objesine dönüştür
dataset = Dataset.from_dict(data)

# Tokenize etme fonksiyonu
def tokenize_function(examples):
    return tokenizer(examples["text"], padding="max_length", truncation=True)

tokenized_dataset = dataset.map(tokenize_function, batched=True)

# 4. Eğitim Parametrelerini Ayarla
training_args = TrainingArguments(
    output_dir="./results",          # Model çıktılarının kaydedileceği dizin
    num_train_epochs=3,              # Eğitim dönemi sayısı
    per_device_train_batch_size=8,   # Her GPU'daki batch boyutu
    save_steps=10_000,               # Modelin kaydedileceği adım sayısı
    save_total_limit=2,              # Kaydedilecek maksimum model sayısı
)

# 5. Trainer'ı Oluştur ve Eğit
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=tokenized_dataset,
)

trainer.train()

# 6. Eğitilmiş Modeli Kaydet ve Kullan
model.save_pretrained("./fine_tuned_sentiment_model")
tokenizer.save_pretrained("./fine_tuned_sentiment_model")

# Kullanım örneği:
# loaded_model = AutoModelForSequenceClassification.from_pretrained("./fine_tuned_sentiment_model")
# loaded_tokenizer = AutoTokenizer.from_pretrained("./fine_tuned_sentiment_model")
# text = "Ürün beklentilerimin ötesinde çıktı!"
# inputs = loaded_tokenizer(text, return_tensors="pt")
# outputs = loaded_model(**inputs)
# predictions = torch.nn.functional.softmax(outputs.logits, dim=-1)
# print(predictions)

Bu örnek, temel bir duygu analizi modelini kendi verilerinizle nasıl fine-tune edebileceğinizi göstermektedir. Gerçek bir uygulamada, veri toplama, ön işleme ve model seçimi gibi adımlar daha karmaşık olacaktır.

RAG (Retrieval-Augmented Generation): Bilgiyi Dinamik Olarak Entegre Etmek

RAG, LLM'leri harici bilgi kaynaklarıyla birleştiren bir tekniktir. Modelin doğrudan bilgiyi "ezberlemesi" yerine, bir sorgu geldiğinde ilgili bilgiyi harici bir veritabanından (veya belgelerden) alır ve bu bilgiyi kullanarak bir yanıt üretir.

Nasıl Çalışır?

RAG'ın temel adımları şunlardır:

  1. Retrieval (Bilgi Alma): Kullanıcı bir sorgu gönderdiğinde, bu sorgu önce bir bilgi alma modülüne gider. Bu modül, sorguyla en alakalı bilgileri önceden indekslenmiş bir veri kümesinden (örneğin, vektör veritabanı) çeker.
  2. Augmentation (Zenginleştirme): Alınan bilgiler, orijinal sorguyla birlikte LLM'ye bir "genişletilmiş prompt" olarak sunulur.
  3. Generation (Üretim): LLM, bu zenginleştirilmiş prompt'u kullanarak, hem sorguyu anlar hem de sağlanan bağlamı dikkate alarak bir yanıt üretir.

Avantajları:

Dezavantajları:

Ne Zaman Kullanılmalı?

Örnek: Şirket İçi Bilgi Tabanı Sorgusu İçin RAG (Kavramsal Kod)

Diyelim ki şirketinizin ürün kılavuzlarından veya SSS'lerinden soruları yanıtlayan bir chatbot oluşturmak istiyorsunuz.

# Bu sadece kavramsal bir örnektir. Gerçek implementasyon için
# Langchain, LlamaIndex gibi kütüphaneler ve vektör veritabanları (Pinecone, ChromaDB vb.) kullanılır.

from transformers import pipeline # Basit bir LLM kullanarak örnek
from sentence_transformers import SentenceTransformer # Vektör gömme için
# Gerçekte bir vektör veritabanı (örn. ChromaDB, Pinecone) kullanılır.
# Bu örnekte, basit bir liste ve kelime eşleştirme ile simüle ediyoruz.

# 1. Harici Bilgi Kaynaklarınızı Hazırlayın (Örnek: Belgeler)
documents = {
    "doc1": "Ürün A'nın garantisi 2 yıldır. Kullanıcı hatası hariçtir.",
    "doc2": "Ürün B'yi kurmak için Phillips tornavida gereklidir.",
    "doc3": "Ürün A'nın pil ömrü ortalama 8 saattir.",
    "doc4": "Ürün C, suya dayanıklı değildir.",
}

# 2. Bilgi Alma Modülünü Simüle Edin (Basit Anahtar Kelime Eşleştirme)
# Gerçekte, bu adım sorguyu vektöre dönüştürüp, belgelerin vektörleri ile
# benzerlik arayarak yapılır.
def retrieve_relevant_docs(query, docs):
    relevant_texts = []
    query_words = query.lower().split()
    for doc_id, text in docs.items():
        for word in query_words:
            if word in text.lower():
                relevant_texts.append(text)
                break # Bir kelime eşleşirse, belgeyi ekle ve diğer kelimelere bakmaya gerek yok
    return "\n".join(relevant_texts)

# 3. LLM'yi Yükleyin (Basit bir metin üretici)
# Gerçekte daha gelişmiş bir LLM (örn. GPT-3.5, Llama 2) kullanılır.
generator = pipeline("text-generation", model="gpt2") # Basit bir örnek model

# 4. RAG Süreci
def rag_query(query, documents):
    # Bilgi alma
    retrieved_info = retrieve_relevant_docs(query, documents)

    # Genişletilmiş Prompt Oluşturma
    prompt = f"""
    Aşağıdaki bilgilere dayanarak soruyu yanıtlayın:

    Bilgi:
    {retrieved_info}

    Soru: {query}

    Yanıt:
    """

    # LLM ile yanıt üretme
    response = generator(prompt, max_length=150, num_return_sequences=1)
    return response[0]['generated_text'].split("Yanıt:")[1].strip() # Sadece yanıt kısmını al

# Örnek Kullanım
user_query = "Ürün A'nın garanti süresi ne kadar?"
answer = rag_query(user_query, documents)
print(f"Soru: {user_query}")
print(f"Yanıt: {answer}")

user_query = "Ürün B'yi kurmak için ne lazım?"
answer = rag_query(user_query, documents)
print(f"\nSoru: {user_query}")
print(f"Yanıt: {answer}")

Bu RAG örneği, temel bir sorgu alıp, ilgili belgelerden bilgi çekerek ve bu bilgiyi kullanarak yanıt üreterek çalışır. Gerçek bir RAG sistemi, daha gelişmiş bilgi alma algoritmaları ve büyük dil modelleri kullanacaktır.

Fine-tuning vs RAG: Hangi Durumda Hangisi?

İki yöntemin de avantaj ve dezavantajlarını gördük. Şimdi, hangi durumda hangisinin daha uygun olduğunu özetleyelim:

Özellik Fine-tuning RAG (Retrieval-Augmented Generation)
Temel Amaç Modelin davranışını ve dilini değiştirmek. Modele harici bilgileri kullanarak yanıt üretmesini sağlamak.
Bilgi Kaynağı Modelin ağırlıklarına gömülmüş. Harici, dinamik olarak güncellenebilen veritabanları.
Maliyet Yüksek (Hesaplama gücü, zaman). Orta (Entegrasyon, veritabanı yönetimi).
Veri Gereksinimi Yüksek kaliteli, etiketli veri. Yapılandırılmamış veya yapılandırılmış belgeler.
Güncellik Düşük (Tekrar fine-tuning gerektirir). Yüksek (Harici veri güncellendiğinde).
"Halüsinasyon" Riski Orta (Eğitim verisine bağlı). Düşük (Sağlanan bağlama dayanır).
Alan Uzmanlığı Derinlemesine, modele işlenmiş. Bağlama dayalı, anlık.
Kaynak Gösterme Genellikle mümkün değil. Mümkün, yanıtın kaynağını belir

Share this post on:

Önceki Yazı
Retrieval-Augmented Generation (RAG) Mimarisi: Sıfırdan Kurulum Rehberi
Sonraki Yazı
React'te useOptimistic Hook ile Anlık UI Güncellemeleri: Kullanıcı Deneyimini Devrimleştirin