Ana içeriğe geç

RAG ve İnce Ayar (Fine-Tuning): Uygulamalı Örneklerle Kapsamlı Bir Eğitim

LLM’lerde modeli özelleştirme ve halüsinasyonları azaltma için RAG ve İnce Ayar teknikleri arasındaki farkları öğrenin.
· 13 dk. oku

Yapay Zeka ile Keşfedin

GPT-4 gibi Büyük Dil Modellerinin (LLM) çoğu, genelleştirilmiş ve çoğu zaman güncelliğini yitirmiş veri kümeleri üzerinde eğitilir. Genel sorulara yanıt vermede çok iyi olsalar da, güncel haberler, en son gelişmeler ve alan-özel konularla ilgili sorgularda zorlanırlar. Bu durumlarda halüsinasyon üretebilir veya hatalı yanıtlar verebilirler. 

Claude 3.5 Sonnet gibi daha iyi performans gösteren modeller ortaya çıkmış olsa da, hâlâ ya kişiselleştirilmiş yanıtlar üretmek için modeli ince ayarlamamız ya da temel modele ek bağlam sağlamak için Retrieval-Augmented Generation (RAG) sistemlerini kullanmamız gerekiyor.

Bu eğitimde, LLM yanıtlarını iyileştirmek için kullanılan iki farklı teknik olan RAG ve ince ayarı inceleyeceğiz. Aralarındaki farkları değerlendirip teoriyi uygulamaya dökeceğiz. 

Ayrıca, ince ayarlı modelleri RAG sistemleriyle birleştiren ve iki dünyanın en iyilerini bir araya getiren hibrit tekniklere de değineceğiz. Son olarak, belirli kullanım senaryolarına ve gereksinimlere göre bu üç yaklaşım arasında nasıl seçim yapılacağını öğreneceğiz.

RAG ve İnce Ayara Genel Bakış

RAG ve ince ayar teknikleri, alan-özel sorgular için yanıt üretimini iyileştirir, ancak doğaları gereği tamamen farklıdır. Gelin bunları öğrenelim.

Retrieval-Augmented Generation (RAG)

Retrieval-Augmented Generation, GPT-4o gibi büyük dil modellerinin harici veri kaynaklarını kullanarak bağlamdan haberdar hâle geldiği bir süreçtir. Bir alıcı (retriever) ve bir üreticinin (generator) birleşimidir. Alıcı, İnternet’ten veya bir vektör veritabanından verileri çeker ve bunları orijinal kullanıcının sorgusuyla birlikte üreticiye sağlar. Üretici, ek bağlamı kullanarak son derece doğru ve ilgili bir yanıt üretir.  

Daha fazla bilgi için Retrieval Augmented Generation (RAG) nedir? Temellere Giriş Rehberi yazımızı okuyarak RAG uygulamasının iç işleyişini ve çeşitli kullanım alanlarını anlayın. 

İnce Ayar (Fine-Tuning)

İnce ayar, önceden eğitilmiş bir modelin alan-özel bir veri kümesiyle yeniden ayarlanması işlemidir. Önceden eğitilmiş model, İnternet’ten kazınmış çok sayıda genel veri kümesi üzerinde eğitilmiştir. Genel sorulara yanıt vermede iyidirler, ancak alan-özel soruları yanıtlarken zorlanır, hatta halüsinasyon üretebilirler. 

Örneğin, önceden eğitilmiş bir model genel sohbet yeteneklerinde yetkin olabilir, ancak karmaşık tıbbi prosedürler veya hukuki emsaller hakkında sorulduğunda yanlış yanıtlar üretebilir. 

Bunu tıbbi veya hukuki bir veri kümesiyle ince ayarlamak, modelin bu alanlardaki soruları daha yüksek doğruluk ve alaka düzeyiyle anlamasını ve yanıtlamasını sağlar.

Görsel rehberlerle önceden eğitilmiş bir modeli nasıl özelleştireceğinizi öğrenmek için LLM’lerde İnce Ayara Giriş Rehberi eğitimini takip edin. 

RAG vs. İnce Ayar

LLM’lerin yanıt üretimini iyileştirmeye yönelik her yöntemi öğrendik. Şimdi, daha iyi anlamak için aralarındaki farkları inceleyelim. 

1. Öğrenme tarzı

RAG dinamik bir öğrenme tarzı kullanır; bu sayede dil modelleri veritabanları, İnternet veya hatta API’lerden en güncel ve doğru verilere erişip bunları kullanabilir. Bu yaklaşım, üretilen yanıtların her zaman güncel ve ilgili olmasını sağlar.

İnce ayar ise eğitimin gerçekleştiği aşamada modelin yeni bir veri kümesiyle öğrendiği statik bir öğrenmeyi içerir. Bu yöntem, modelin alan-özel yanıt üretimine uyum sağlamasına olanak tanısa da, eğitim sonrası yeni bilgileri yeniden eğitmeden entegre edemez.

2. Uyarlanabilirlik

RAG genellemelere en uygunudur. Farklı veri kaynaklarından bilgi çekmek için alma (retrieval) sürecini kullanır. RAG modelin yanıtını değiştirmez; sadece modeli yönlendirmek için ek bilgi sağlar. 

İnce ayar model çıktısını özelleştirir ve eğitim veri kümesiyle yakından ilişkili özel bir alanda model performansını artırır. Ayrıca yanıt üretim tarzını değiştirir ve bazen RAG sistemlerinden daha alakalı yanıtlar verir. 

3. Kaynak yoğunluğu

RAG çıkarım (inference) sırasında çalıştığı için kaynak yoğun bir yaklaşımdır. RAG olmayan basit LLM’lere kıyasla daha fazla bellek ve hesaplama gücü gerektirir. 

İnce ayar hesaplama açısından yoğundur, ancak bir kez yapılır. Eğitim sürecinde birden çok GPU ve yüksek bellek gerektirir; sonrasında ise RAG sistemlerine kıyasla oldukça kaynak dostudur. 

4. Maliyet

RAG daha iyi yanıt üretimi için sınıfının en iyisi gömme (embedding) modelleri ve LLM’ler gerektirir. Ayrıca hızlı bir vektör veritabanına ihtiyaç duyar. API ve işletim maliyetleri oldukça hızlı yükselebilir.

İnce ayar size büyük maliyeti yalnızca eğitim sırasında çıkarır; sonrasında model çıkarımı için ödeme yaparsınız ve bu, RAG’e göre oldukça daha ucuzdur.   

Genel olarak, tüm faktörler hesaba katıldığında ortalamada ince ayarın maliyeti RAG’den daha fazladır. 

5. Uygulama karmaşıklığı

RAG sistemleri yazılım mühendisleri tarafından kurulabilir ve orta düzey teknik uzmanlık gerektirir. LLM tasarımları, vektör veritabanları, gömme teknikleri, prompt mühendisliği ve daha fazlasını öğrenmeniz gerekir; bu zaman alır ancak bir ay içinde öğrenmesi mümkündür. 

İnce ayar yüksek teknik uzmanlık gerektirir. Veri kümesi hazırlamadan ayar parametrelerini belirlemeye ve model performansını izlemeye kadar, doğal dil işleme alanında yıllara dayanan deneyim gerekir. 

Teoriyi Uygulamalı Örneklerle Test Etme

Aynı prompt’u ince ayarlı bir modele, bir RAG uygulamasına ve hibrit bir yaklaşıma vererek teorimizi test edelim ve sonuçları değerlendirelim. Hibrit yaklaşım, ince ayarlı modeli RAG uygulamasıyla birleştirecek. Bu örnek için, hastalar ve doktorlar arasındaki çeşitli sağlık durumlarına ilişkin konuşmaları içeren Hugging Face’teki ruslanmv/ai-medical-chatbot veri setini kullanacağız.

Llama 3 ile RAG Uygulaması Kurma

Llama 3 ve LangChain ekosistemini kullanarak RAG uygulamasını kurarak başlayacağız. 

Ayrıca, adım adım kodu takip ederek LlamaIndex ile bir RAG uygulaması oluşturmayı da öğrenebilirsiniz: LlamaIndex ile Retrieval Augmented Generation.

1. Gerekli tüm Python paketlerini yükleyin.

%%capture
%pip install -U langchain langchainhub langchain_community langchain-huggingface faiss-gpu transformers accelerate

2. LangChain ve Transformers kütüphanelerinden gerekli işlevleri yükleyin.

from langchain.document_loaders import HuggingFaceDatasetLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from transformers import AutoTokenizer, AutoModelForCausalLM,pipeline
from langchain_huggingface import HuggingFacePipeline
from langchain.chains import RetrievalQA

3. Kısıtlı modellere ve veri kümelerine erişmek için Hugging Face hub’ına API anahtarıyla giriş yapmanız önerilir.

from huggingface_hub import login
from kaggle_secrets import UserSecretsClient
user_secrets = UserSecretsClient()

hf_token = user_secrets.get_secret("HUGGINGFACE_TOKEN")
login(token = hf_token)

4. Veri kümesini, veri kümesi adını ve sütun adını HuggingFaceDatasetLoader’a vererek yükleyin. “Doctor” sütunu ana belgemiz olacak, geri kalan sütunlar ise metaveri olarak değerlendirilecek. 

5. Veri kümesini ilk 1000 satırla sınırlayalım. Veri kümesini küçültmek, vektör veritabanına veri depolama süresini azaltmamıza yardımcı olacaktır. 

# Specify the dataset name
dataset_name = "ruslanmv/ai-medical-chatbot"


# Create a loader instance using dataset columns
loader_doctor = HuggingFaceDatasetLoader(dataset_name,"Doctor")

# Load the data
doctor_data = loader_doctor.load()

# Select the first 1000 entries
doctor_data = doctor_data[:1000]

doctor_data[:2]

Gördüğümüz gibi, “Doctor” sütunu sayfa içeriği, geri kalanlar ise metaveri olarak kabul ediliyor. 

HuggingFaceDatasetLoader veri kümesi çıktısı

6. GPU hızlandırmayı etkinleştirmek gibi belirli parametrelerle Hugging Face’ten gömme modelini yükleyin.

7. Modele örnek bir metin vererek gömme modelini test edin.

# Define the path to the embedding model
modelPath = "sentence-transformers/all-MiniLM-L12-v2"

# GPU acceleration
model_kwargs = {'device':'cuda'}

# Create a dictionary with encoding options
encode_kwargs = {'normalize_embeddings': False}

# Initialize an instance of HuggingFaceEmbeddings with the specified parameters
embeddings = HuggingFaceEmbeddings(
    model_name=modelPath,     
    model_kwargs=model_kwargs, 
    encode_kwargs=encode_kwargs
)
text = "Why are you a doctor?"
query_result = embeddings.embed_query(text)
query_result[:3]
[-0.059351932257413864, 0.08008933067321777, 0.040729623287916183]

8. Verileri gömmelere dönüştürün ve vektör veritabanına kaydedin.

9. Vektör veritabanını yerel dizine kaydedin.

10. Örnek prompt kullanarak benzerlik araması yapın.

vector_db = FAISS.from_documents(doctor_data, embeddings)
vector_db.save_local("/kaggle/working/faiss_doctor_index")
question = "Hi Doctor, I have a headache, help me."
searchDocs = vector_db.similarity_search(question)
print(searchDocs[0].page_content)

benzerlik araması sonucu.

11. Vektör veritabanı örneğini bir alıcıya (retriever) dönüştürün. Bu, RAG zinciri oluşturmamıza yardımcı olacak.

retriever = vector_db.as_retriever()

12. Llama 3 8B Chat modelini kullanarak belirteçleyiciyi (tokenizer) ve modeli yükleyin.

13. Bunları kullanarak test üretim hattını (pipeline) oluşturun.

14. Hattı LangChain LLM istemcisine dönüştürün.

import torch
base_model = "/kaggle/input/llama-3/transformers/8b-chat-hf/1"

tokenizer = AutoTokenizer.from_pretrained(base_model)

model = AutoModelForCausalLM.from_pretrained(
        base_model,
        return_dict=True,
        low_cpu_mem_usage=True,
        torch_dtype=torch.float16,
        device_map="auto",
        trust_remote_code=True,
)

pipe = pipeline(
    "text-generation", 
    model=model, 
    tokenizer=tokenizer,
    max_new_tokens=120
)

llm = HuggingFacePipeline(pipeline=pipe)

15. Alıcı, kullanıcı sorgusu, RAG prompt’u ve LLM’i kullanarak bir soru-cevap zinciri oluşturun.

from langchain import hub
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough


rag_prompt = hub.pull("rlm/rag-prompt")




qa_chain = (
    {"context": retriever, "question": RunnablePassthrough()}
    | rag_prompt
    | llm
    | StrOutputParser()
)

16. Soru-cevap zincirini doktora sorular sorarak test edin.

question = "Hi Doctor, I have a headache, help me."
result = qa_chain.invoke(question)
print(result.split("Answer: ")[1])

Veri setine oldukça benzer, ancak tarzı yakalamıyor. Bağlamı anlamış ve bunu kendi tarzında yanıt yazmak için kullanmış. 

RAG zinciri sonucu

Başka bir soruyla tekrar deneyelim. 

question = "Hello doctor, I have bad acne. How do I get rid of it?"
result = qa_chain.invoke(question)
print(result.split("Answer: ")[1])

Bu çok doğrudan bir cevap. Belki de doktor-hasta sohbet botu için RAG yaklaşımı yerine modeli ince ayarlamamız gerekir. 

RAG zinciri sonucu

Kodu çalıştırırken zorluk yaşıyorsanız, lütfen şu Kaggle defterine başvurun: Llama 3 Kullanarak RAG Uygulaması Oluşturma.

Parçalama (chunking), yeniden sıralama (reranking) ve sorgu dönüşümleri gibi tekniklerle RAG sistemi performansını nasıl artıracağınızı öğrenmek için RAG Performansı Nasıl İyileştirilir: Örneklerle 5 Temel Teknik eğitimini takip edin.

Llama 3’ün Tıbbi Verilerle İnce Ayarı

Doktor-hasta veri kümesi üzerinde modeli ince ayarlamayacağız; çünkü bunu daha önceki bir eğitimde zaten yaptık: Llama 3’ü İnce Ayarlama ve Yerel Olarak Kullanma: Adım Adım Rehber. Yapacağımız şey, ince ayarlı modeli yükleyip aynı soruları vererek sonuçları değerlendirmek olacak. İnce ayarlı model Hugging Face ve Kaggle’da mevcuttur.

OpenAI API’sini kullanarak GPT-4 modelini ince ayarlamakla ilgileniyorsanız, kolay takip edilebilir DataCamp eğitimine bakabilirsiniz: OpenAI’nin GPT-4 Modelinde İnce Ayar: Adım Adım Rehber.

Hugging Face’te ince ayarlı model

Kaynak: kingabzpro/llama-3-8b-chat-doctor

1. Transformer kütüphanesini kullanarak belirteçleyiciyi ve modeli yükleyin.

2. Modeli Kaggle GPU T4 x2 ortamında yüklemek için doğru parametreleri kullandığınızdan emin olun.

from transformers import AutoTokenizer,AutoModelForCausalLM,pipeline
import torch

base_model = "/kaggle/input/fine-tuned-adapter-to-full-model/llama-3-8b-chat-doctor/"

tokenizer = AutoTokenizer.from_pretrained(base_model)

model = AutoModelForCausalLM.from_pretrained(
        base_model,
        return_dict=True,
        low_cpu_mem_usage=True,
        torch_dtype=torch.float16,
        device_map="auto",
        trust_remote_code=True,
)

3. Sohbet şablonunu iletilere uygulayın.

4. Model ve belirteçleyiciyi kullanarak bir metin üretim hattı oluşturun.

5. Hat nesnesine bir prompt verin ve yanıt oluşturun.

messages = [{"role": "user", "content": "Hi Doctor, I have a headache, help me."}]

prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
pipe = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    torch_dtype=torch.float16,
    device_map="auto",
)

outputs = pipe(prompt, max_new_tokens=120, do_sample=True)
print(outputs[0]["generated_text"])

Yanıt veri setiyle oldukça benzer. Tarz aynı; ancak doğrudan yanıt vermek yerine hastanın ek testlerden geçmesini öneriyor.

ince ayarlı Llama3 modelinden üretilen sonuç

6. İkinci soruyu soralım.

messages = [{"role": "user", "content": "Hello doctor, I have bad acne. How do I get rid of it?"}]

prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
outputs = pipe(prompt, max_new_tokens=120, do_sample=True)
print(outputs[0]["generated_text"])

Tarz aynı ve yanıt oldukça empatik ve açıklayıcı. 

ince ayarlı Llama3 modelinden üretilen sonuç

Kodu çalıştırırken zorluk yaşıyorsanız, lütfen şu Kaggle defterine başvurun: İnce Ayarlı Llama 3 HF Çıkarım.

Hibrit Yaklaşım (RAG + İnce Ayar)

Şimdi, yanıtı daha da ayarlamak ve dengeyi bulmak için ince ayarlı modele ek bağlam sağlayacağız. 

Tüm kodu tekrar yazmak yerine, doğrudan Soru-Cevap zincirini kullanarak yanıt üretimine geçeceğiz. İnce ayarlı bir modeli RAG Soru-Cevap zinciriyle nasıl birleştirdiğimize dair tam kodu görmek isterseniz, lütfen şu Kaggle defterine göz atın: Hibrit Yaklaşım (RAG + İnce Ayar). 

Zincire RAG ve ince ayarlı modele sorduğumuz aynı soruları verin.

question = "Hi Doctor, I have a headache, help me."
result = qa_chain.invoke(question)
print(result.split("Answer: ")[1])

Yanıt oldukça doğru ve doktorun tarzında üretilmiş. 

hibrit yaklaşım (RAG + İnce Ayar) ile üretilen sonuç

İkinci soruyu soralım.

question = "Hello doctor, I have bad acne. How do I get rid of it?"
result = qa_chain.invoke(question)
print(result.split("Answer: ")[1])

Bu ilginç. Sivilcelerin iltihaplı olup olmadığına dair ek bir bağlam hiç vermemiştik. Belki Hibrit model bazı sorgular için uygun değildir. 

hibrit yaklaşım (RAG + İnce Ayar) ile üretilen sonuç

Doktor-hasta sohbet botu örneğinde, ince ayarlı model tarzı benimseme ve doğrulukta öne çıkıyor. Ancak bu, diğer kullanım durumlarında değişebilir; bu nedenle, belirli kullanım senaryonuz için en iyi yöntemi belirlemek üzere kapsamlı testler yapmak önemlidir.

Hibrit yaklaşımın resmi adı RAFT’tır (Retrieval Augmented Fine-Tuning). Daha fazla bilgi edinmek için RAFT Nedir? RAG ve İnce Ayarı Birleştirerek LLM’leri Uzman Alanlara Uyumlandırma blog yazımızı okuyun.

RAG mi, İnce Ayar mı, RAFT mı? Nasıl Seçilir

Her şey kullanım senaryonuza ve mevcut kaynaklarınıza bağlıdır. Sınırlı kaynaklara sahip bir girişimseniz, OpenAI API ve LangChain çerçevesini kullanarak bir RAG kavram kanıtı oluşturmayı deneyin. Bunun için sınırlı kaynak, uzmanlık ve veri kümesi yeterlidir. 

Orta ölçekli bir şirketseniz ve yanıt doğruluğunu artırmak ve açık kaynak modeli bulutta dağıtmak için ince ayar yapmak istiyorsanız, veri bilimciler ve makine öğrenimi operasyonları mühendisleri gibi uzmanları işe almanız gerekir. İnce ayar, sınıfının en iyisi GPU’lar, büyük bellek, temizlenmiş bir veri kümesi ve LLM’leri anlayan teknik bir ekip gerektirir. 

Hibrit çözüm hem kaynak hem de hesaplama açısından yoğundur. Ayrıca, ince ayar ve RAG arasında denge kurabilen bir LLMOps mühendisi gerektirir. RAG’in ve ince ayarlı bir modelin iyi yönlerinden faydalanarak yanıt üretimini daha da iyileştirmek istediğinizde bunu değerlendirmelisiniz. 

RAG, ince ayar ve RAFT çözümlerine genel bir bakış için lütfen aşağıdaki tabloya bakın.

 

RAG

İnce Ayar

RAFT

Avantajlar

Bağlamsal anlama, halüsinasyonları en aza indirir, yeni verilere kolay uyum, maliyet etkin.

Göreve özel uzmanlık, özelleştirme, artırılmış doğruluk, yükseltilmiş sağlamlık.

Hem RAG’in hem de ince ayarın güçlü yanlarını birleştirir, daha derin anlama ve bağlam.

Dezavantajlar

Veri kaynağı yönetimi, karmaşıklık.

Veri yanlılığı, kaynak yoğun, yüksek hesaplama maliyetleri, büyük bellek gereksinimleri, zaman ve uzmanlık gerektirir.

Uygulama karmaşıklığı, alma ve ince ayar süreçlerini dengelemeyi gerektirir.

Uygulama Karmaşıklığı

Prompt mühendisliğinden daha yüksek.

RAG’den daha yüksek. Yüksek teknik uzmanlar gerektirir.

Üçü arasında en karmaşık olan.

Öğrenme Tarzı

Dinamik

Statik

Dinamik + Statik

Uyarlanabilirlik

Yeni veriler ve değişen gerçeklere kolayca uyum sağlar.

Çıktıları belirli görevlere ve alanlara göre özelleştirir.

Hem gerçek zamanlı verilere hem de özel görevlere uyum sağlar.

Maliyet

Düşük

Orta

Yüksek

Kaynak Yoğunluğu

Düşük. Kaynaklar Çıkarım sırasında kullanılır. 

Orta. Kaynaklar ince ayar sırasında kullanılır. 

Yüksek

Sonuç

Büyük Dil Modelleri bugün yapay zekâ geliştirmesinin merkezinde yer alıyor. Şirketler, eğitime milyonlar harcamadan bu modelleri iyileştirmenin ve özelleştirmenin çeşitli yollarını arıyor. Parametre optimizasyonu ve prompt mühendisliği ile başlıyorlar. Daha iyi yanıtlar elde etmek ve halüsinasyonları azaltmak için ya RAG’i seçiyorlar ya da modeli ince ayarlıyorlar. Yanıtı iyileştirmek için başka teknikler olsa da, en popüler seçenekler bunlardır.

Bu eğitimde, hem teori hem de uygulamalı örneklerle RAG ve ince ayar arasındaki farkları öğrendik. Ayrıca hibrit modelleri inceledik ve hangisinin sizin için en iyi çalışabileceğini karşılaştırdık.

LLM’leri dağıtma ve ilgili çeşitli teknikler hakkında daha fazla bilgi edinmek için, LLaMAIndex ile RAG kod eşliğinde çalışmamıza ve LangChain ile LLM uygulamalarını dağıtma kursumuza göz atın.

Abid Ali Awan

Yazar

Abid Ali Awan

Sertifikalı bir veri bilimcisi olarak, yenilikçi makine öğrenimi uygulamaları oluşturmak için en son teknolojileri kullanmaya büyük ilgi duyuyorum. Konuşma tanıma, veri analizi ve raporlama, MLOps, konuşma yapay zekası ve NLP alanlarında güçlü bir geçmişe sahip olarak, gerçek bir etki yaratabilecek akıllı sistemler geliştirme becerilerimi geliştirdim. Teknik uzmanlığımın yanı sıra, karmaşık kavramları açık ve özlü bir dille ifade etme yeteneğine sahip, becerikli bir iletişimciyim. Sonuç olarak, veri bilimi konusunda aranan bir blog yazarı oldum ve giderek büyüyen veri profesyonelleri topluluğuyla görüşlerimi ve deneyimlerimi paylaşıyorum. Şu anda, içerik oluşturma ve düzenlemeye odaklanıyorum. Büyük dil modelleriyle çalışarak, hem işletmelerin hem de bireylerin verilerinden en iyi şekilde yararlanmalarına yardımcı olabilecek güçlü ve ilgi çekici içerikler geliştiriyorum.

Konular

İlgili