Ana içeriğe geç

GPT-4o Mini’yi İnce Ayarlama: Adım Adım Kılavuz

GPT-4o Mini modelini özelleştirerek Reddit gönderilerini "stresli" ve "stresli değil" etiketlerine sınıflandırın.
· 13 dk. oku

Yapay Zeka ile Keşfedin

GPT-4o Mini modelini ince ayarlamaya başlamadan önce, model yanıtlarını özelleştirmek ve alanınıza özgü yanıtlar almak için istem mühendisliği, istem zincirleme ve fonksiyon çağrısı kullanmanızı öneririz.

İnce ayar; stil, ton veya biçimi ayarlamak istediğinizde gereklidir. Güvenilirliği ve doğruluğu artırmak, karmaşık istemleri ele almak veya istem mühendisliğiyle başarılamayan yeni bir görevi yerine getirmek için kullanılır.

Bu öğreticide GPT-4o Mini modelini metinleri "stres" ve "stres değil" etiketlerine sınıflandıracak şekilde ince ayarlayacağız. Ardından, ince ayarlı modele OpenAI API ve OpenAI playground üzerinden erişeceğiz. Son olarak, çeşitli sınıflandırma metriklerini kullanarak modeli ince ayardan önce ve sonra karşılaştırıp değerlendireceğiz.

GPT-4o Mini’yi ince ayarlama özellik görseli

Görsel: Yazar

GPT-4o Mini’ye Giriş

GPT-4o Mini, mevcut en maliyet etkin genel amaçlı büyük dil modelidir. MMLU’da %82 puan alır ve şu anda LMSYS lider panosunda sohbet tercihleri açısından Claude 3.5 Sonnet’i geride bırakır. Maliyet, milyon giriş belirteci başına 15 sent ve milyon çıkış belirteci başına 60 senttir; bu da GPT-3.5 Turbo’dan %60 daha ucuzdur.

GPT-4o mini şu anda girdi olarak metin ve görselleri destekler. Modelin bağlam penceresi 128K belirteçtir, istek başına 16K’a kadar çıktı belirteci destekler ve Ekim 2023’e kadar bilgiye sahiptir. GPT-4o Mini, GPT-4o belirteçleyicisini kullandığı için İngilizce olmayan metinleri de işleyebilir. Düşük maliyetle iki dünyanın en iyi yanlarını elde ederiz.

Kullanım senaryoları, sohbet tamamlama API’si ve GPT-4o Mini’nin ayrıntılı kıyaslamaları hakkında bilgi edinmek için blog yazımızı okuyun: GPT-4o Mini Nedir?

OpenAI API’sini Kurma

OpenAI web sitesine gidip bir hesap oluşturun. İnce ayar maliyetlidir ve GPT-4o Mini’yi API üzerinden kullanmak için hesabınıza bağlı bir ödeme yöntemi olması gerekir. Aksaklıkları önlemek için, modele ince ayar denemeden önce hesabınızda en az 10 USD kredi bakiyesi bulunduğundan emin olun.

Ana gösterge panosuna gidin, “API keys” sekmesine tıklayın ve OpenAI API gizli anahtarını oluşturun.

OpenAI API anahtarı oluşturma

Kod düzenleyicisi olarak DataCamp’in DataLab’ını kullanıyoruz. OpenAI API anahtarı çevre değişkenini ayarlamak için ortam sekmesine gidip çevre değişkeni seçeneğine tıklayın. Ardından, API anahtarı için çevre değişkenini ekleyip aşağıda gösterildiği gibi etkinleştirin.

DataLab’de çevre değişkeni ayarlama

GPT-4o Mini’ye erişmek için OpenAI Python paketini kurun.

%%capture
%pip install openai

OpenAI API anahtarını kullanarak istemciyi oluşturun ve örnek istemle bir yanıt üretin. Sohbet tamamlama işlevi model adını ve sözlük listesi biçiminde mesajları ister.

from IPython.display import Markdown, display
from openai import OpenAI
import os

openai_api_key = os.environ["OPENAI_API_KEY"]

client = OpenAI(api_key=openai_api_key)

response = client.chat.completions.create(
  model="gpt-4o-mini",
  messages=[
    {"role": "system", "content": "You are a great philosopher."},
    {"role": "user", "content": "What is the meaning of life?"}
  ]
)
display(Markdown(response.choices[0].message.content))

OpenAI API’miz tamamen kuruldu ve ince ayar işini başlatmaya hazırız.

GPT-4o-mini kullanarak yanıt üretme

OpenAI’nin API’sinde yeni misiniz? Durumu en iyi modelleri birkaç satır kodla nasıl kullanacağınızı anlamak için GPT-4o API Eğitimi: OpenAI’nin API’sine Başlarken başlıklı basit ve ayrıntılı öğreticiyi izleyebilirsiniz.

GPT-4o Mini’yi İnce Ayarlama

Bu bölümde, Kaggle’daki Stress Detection from the Social Media Articles veri kümesi üzerinde GPT-4o Mini modelini ince ayarlayacağız. Veri kümesi Reddit ve Twitter gönderilerini içerir ve bunları stres ve stres değil etiketlerine ayırır.

Veri kümesini oluşturma

Şimdi veri kümesini yükleyip işleyeceğiz.

  1. Reddit gönderi veri kümesinden ilk 200 satırı yükleyin.
  2. 'title' ve 'label' dışındaki tüm sütunları kaldırın.
  3. Etiket sütununu 0 ve 1 değerlerini "stres değil" ve "stres" etiketlerine dönüştürecek şekilde eşleyin.
  4. Veri kümesini eğitim ve doğrulama setlerine ayırın.
  5. Hem eğitim hem doğrulama setlerini JSONL formatında kaydedin.

Not: Sistem istemi, kullanıcı sorgusu ve yanıttan oluşan doğru veri kümesi biçimini sağladığınızdan emin olun. Yanıt, etiket olacaktır.

import pandas as pd
import json
from sklearn.model_selection import train_test_split

# Load the CSV file with the correct delimiter
file_path = 'Reddit_Title.csv'  # Change this to your local path
data = pd.read_csv(file_path, sep=';')

# Clean up and drop unnecessary columns, and select the top 200 rows
data_cleaned = data[['title', 'label']].head(200)

# Mapping the 'label' column to more human-readable text
label_mapping = {0: "non-stress", 1: "stress"}
data_cleaned['label'] = data_cleaned['label'].map(label_mapping)

# Split the data into training and validation sets (80% train, 20% validation)
train_data, validation_data = train_test_split(data_cleaned, test_size=0.2, random_state=42)

def save_to_jsonl(data, output_file_path):
    jsonl_data = []
    for index, row in data.iterrows():
        jsonl_data.append({
            "messages": [
                {"role": "system", "content": "Given a social media post, classify whether it indicates 'stress' or 'non-stress'."},
                {"role": "user", "content": row['title']},
                {"role": "assistant", "content": f"\"{row['label']}\""}
            ]
        })

    # Save to JSONL format
    with open(output_file_path, 'w') as f:
        for item in jsonl_data:
            f.write(json.dumps(item) + '\n')

# Save the training and validation sets to separate JSONL files
train_output_file_path = 'stress_detection_train.jsonl' 
validation_output_file_path = 'stress_detection_validation.jsonl'

save_to_jsonl(train_data, train_output_file_path)
save_to_jsonl(validation_data, validation_output_file_path)

print(f"Training dataset save to {train_output_file_path}")
print(f"Validation dataset save to {validation_output_file_path}")

Çıktı: 

Training dataset save to stress_detection_train.jsonl
Validation dataset save to stress_detection_validation.jsonl

Veri kümesini yükleme

Şimdi ince ayar için hem eğitim hem doğrulama veri kümelerini yüklemek üzere OpenAI istemcisini kullanacağız.

train_file = client.files.create(
  file=open(train_output_file_path, "rb"),
  purpose="fine-tune"
)

valid_file = client.files.create(
  file=open(validation_output_file_path, "rb"),
  purpose="fine-tune"
)

print(f"Training file Info: {train_file}")
print(f"Validation file Info: {valid_file}")

OpenAI API önce veri kümesini doğrular, ardından veri kümelerini yükleyip modeli ince ayarlamak için kullanabileceğimiz metaverileri üretir. 

Training file Info: FileObject(id='file-b2lo2chod6xuMhYg9JcEsnp6', bytes=48563, created_at=1727133513, filename='stress_detection_train.jsonl', object='file', purpose='fine-tune', status='processed', status_details=None)
Validation file Info: FileObject(id='file-Fae0AVSUhTGr49qhQz8d2yyp', bytes=12284, created_at=1727133514, filename='stress_detection_validation.jsonl', object='file', purpose='fine-tune', status='processed', status_details=None)

Veri kümesinin buluta başarıyla yüklendiğini kontrol etmek için Gösterge Paneline gidip “Storage” sekmesine tıklayın. Orada iki dosya görünecek ve kullanıma hazır olacaktır.

Eğitim ve doğrulama veri kümesini yükleme.

İnce ayar işini başlatma

İstemci API’sini kullanarak ince ayar işini oluşturun. İnce ayar işlevi, eğitim veri kümesi dosya kimliği, doğrulama veri kümesi dosya kimliği, model adı ve hiperparametreleri gerektirir. Modelimizi üç epoch boyunca ince ayarlayacağız. Model performansını artırmak için her zaman tam veri kümesinde en az 5 epoch ile eğitim yapabilirsiniz. 

model = client.fine_tuning.jobs.create(
  training_file=train_file.id, 
  validation_file=valid_file.id,
  model="gpt-4o-mini-2024-07-18", 
  hyperparameters={
    "n_epochs": 3,
	"batch_size": 3,
	"learning_rate_multiplier": 0.3
  }
)
job_id = model.id
status = model.status

print(f'Fine-tuning model with jobID: {job_id}.')
print(f"Training Response: {model}")
print(f"Training Status: {status}")

İşlevi çalıştırdığımızda ince ayar işi başlayacak ve günlükler görüntülenecektir. 

Fine-tuning model with jobID: ftjob-rgIMFxZSsWDqCNfOev54e4Jq.
Training Response: FineTuningJob(id='ftjob-rgIMFxZSsWDqCNfOev54e4Jq', created_at=1727135628, error=Error(code=None, message=None, param=None), fine_tuned_model=None, finished_at=None, hyperparameters=Hyperparameters(n_epochs=3, batch_size=3, learning_rate_multiplier=0.3), model='gpt-4o-mini-2024-07-18', object='fine_tuning.job', organization_id='org-jLXWbL5JssIxj9KNgoFBK7Qi', result_files=[], seed=748607710, status='validating_files', trained_tokens=None, training_file='file-b2lo2chod6xuMhYg9JcEsnp6', validation_file='file-Fae0AVSUhTGr49qhQz8d2yyp', estimated_finish=None, integrations=[], user_provided_suffix=None)
Training Status: validating_files

Gösterge panelinde “Fine-tuning” sekmesine ve iş kimliğine tıklayarak ince ayar işinin durumunu görüntüleyebiliriz.

Model ince ayarı

Ya da jobs.retrieve işlevini kullanarak ince ayar işinin durumunu kontrol edebiliriz. 

# Retrieve the state of a fine-tune
client.fine_tuning.jobs.retrieve(job_id)

Çıktı: 

FineTuningJob(id='ftjob-rgIMFxZSsWDqCNfOev54e4Jq', created_at=1727135628, error=Error(code=None, message=None, param=None), fine_tuned_model=None, finished_at=None, hyperparameters=Hyperparameters(n_epochs=3, batch_size=3, learning_rate_multiplier=0.3), model='gpt-4o-mini-2024-07-18', object='fine_tuning.job', organization_id='org-jLXWbL5JssIxj9KNgoFBK7Qi', result_files=[], seed=748607710, status='running', trained_tokens=None, training_file='file-b2lo2chod6xuMhYg9JcEsnp6', validation_file='file-Fae0AVSUhTGr49qhQz8d2yyp', estimated_finish=1727135943, integrations=[], user_provided_suffix=None)

Kayıp azalıyor gibi görünmüyorsa, jobs.cancel işlevini kullanarak işi her zaman iptal edebilirsiniz.

# Cancel a job
client.fine_tuning.jobs.cancel(job_id)

İnce ayar işi tamamlandığında, ince ayarlı modelin kullanıma hazır olduğunu bildiren bir e-posta alacaksınız.

İnce ayar iş durumu hakkında e-posta alma.

API ile İnce Ayarlı Modele Erişim

İnce ayarlı modele erişmek için, ince ayarlı modelin adını almamız gerekir. Bunu yapmak için tüm ince ayar işleri hakkında bilgi toplayacak, en sonuncusunu seçecek ve ardından model adını alacağız.

result = client.fine_tuning.jobs.list()

# Retrieve the fine tuned model
fine_tuned_model = result.data[0].fine_tuned_model
print(fine_tuned_model)

Bu bizim ince ayarlı model adımızdır. 

ft:gpt-4o-mini-2024-07-18:personal::AAnFfX5q

Sohbet tamamlama işlevine ince ayarlı model adını, doğru bir sistem istemi içeren mesajları ve veri kümesinden bir örneği vererek yanıt üretin.

completion = client.chat.completions.create(
  model = fine_tuned_model,
  messages=[
    {"role": "system", "content": "Given a social media post, classify whether it indicates 'stress' or 'non-stress'."},
    {"role": "user", "content": "Just went to my first homecoming, and they played a song I've always wanted to dance to at an official dance. Sorry for the terrible quality, but my happiness in this moment couldn't be exaggerated!"}
  ]
)
print(completion.choices[0].message.content)

Başarılı! Etiketi doğru tahmin ettim.

"non-stress"

Modelinizden memnun değilseniz, aşağıdaki komutu kullanarak her zaman silebilirsiniz. Biz bunu yapmayacağız çünkü önce ek model değerlendirmeleri yapmamız gerekiyor.

# Delete a fine-tuned model (must be an owner of the org the model was created in)
client.models.delete(fine_tuned_model)

Playground Kullanarak İnce Ayarlı Modele Erişim

İnce ayarlı modele erişmenin ve onu çeşitli istemlerde daha verimli şekilde denemenin başka bir yolu daha vardır.

OpenAI gösterge paneline gidin, "Fine-tuning" sekmesine tıklayın, son çalıştırılan işi seçin ve sağ altta bulunan "Playground" düğmesine tıklayın.

Playground kullanarak ince ayarlı modele erişim.

Sizi sohbet botu uygulamasına götürecektir. Burada bir sistem istemi sağlayabilir ve örnek Reddit gönderisini yazmaya başlayabilirsiniz. 

İnce ayarlı modeli deneme.

Daha iyi bir analiz için aynı istemi çalıştırıp başka bir modelle de karşılaştırabilirsiniz. 

Model Değerlendirme

Modeli ince ayarladık ve yeterince iyi olduğunu düşünüyoruz. Ancak baştan beri zaten daha iyi olup olmadığını düşündünüz mü? Ayrıntılı bir önce-sonra karşılaştırması yapmadık. 

Bu bölümde, temel modeli kullanarak doğrulama verilerinin etiketlerini tahmin edeceğiz ve ardından bunu ince ayarlı modelle karşılaştıracağız. Her iki modeli de doğruluk, sınıflandırma raporu ve karmaşıklık (confusion) metriklerine göre karşılaştıracağız. 

İnce ayardan önce model değerlendirmesi

predict işlevini oluşturun; bu işlev, veri kümesini ve model adını girdi olarak alıp tahmin edilen etiketlerin bir listesini üretir. Veri kümesindeki aynı sistem iletilerini ve gönderi başlıklarını kullanır.

def predict(test, model):
    y_pred = []
    categories = ["non-stress", "stress"]

    for index, row in test.iterrows():
        response = client.chat.completions.create(
            model=model,
            messages=[
                {
                    "role": "system",
                    "content": "Given a social media post, classify whether it indicates 'stress' or 'non-stress'.",
                },
                {"role": "user", "content": row["title"]},
            ],
        )

        answer = response.choices[0].message.content

        # Determine the predicted category

        for category in categories:
            if category.lower() in answer.lower():
                y_pred.append(category)
                break
        else:
            y_pred.append("none")
    return y_pred

Ardından, tahmin edilen ve gerçek etiketleri kullanarak doğruluk skoru, sınıflandırma raporu ve karmaşıklık metrikleri üretecek evaluate işlevini oluşturacağız.

from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
import numpy as np


def evaluate(y_true, y_pred):
    labels = ["non-stress", "stress"]
    mapping = {label: idx for idx, label in enumerate(labels)}

    def map_func(x):
        return mapping.get(
            x, -1
        )  # Map to -1 if not found, but should not occur with correct data

    y_true_mapped = np.vectorize(map_func)(y_true)
    y_pred_mapped = np.vectorize(map_func)(y_pred)

    # Calculate accuracy

    accuracy = accuracy_score(y_true=y_true_mapped, y_pred=y_pred_mapped)
    print(f"Accuracy: {accuracy:.3f}")

    # Generate accuracy report

    unique_labels = set(y_true_mapped)  # Get unique labels

    for label in unique_labels:
        label_indices = [
            i for i in range(len(y_true_mapped)) if y_true_mapped[i] == label
        ]
        label_y_true = [y_true_mapped[i] for i in label_indices]
        label_y_pred = [y_pred_mapped[i] for i in label_indices]
        label_accuracy = accuracy_score(label_y_true, label_y_pred)
        print(f"Accuracy for label {labels[label]}: {label_accuracy:.3f}")
    # Generate classification report

    class_report = classification_report(
        y_true=y_true_mapped,
        y_pred=y_pred_mapped,
        target_names=labels,
        labels=list(range(len(labels))),
    )
    print("\nClassification Report:")
    print(class_report)

    # Generate confusion matrix

    conf_matrix = confusion_matrix(
        y_true=y_true_mapped, y_pred=y_pred_mapped, labels=list(range(len(labels)))
    )
    print("\nConfusion Matrix:")
    print(conf_matrix)

predict işlevine doğrulama veri kümesini ve temel model adını verin. Ardından, tahmin edilen ve gerçek etiketleri evaluate işlevine sağlayarak bir model değerlendirme raporu oluşturun.

y_pred = predict(validation_data, "gpt-4o-mini-2024-07-18")
y_true = validation_data["label"]
evaluate(y_true, y_pred)

Temel modelimiz metni sınıflandırmada oldukça iyi. %92,5 doğruluk elde ettik.

Accuracy: 0.925
Accuracy for label non-stress: 0.947
Accuracy for label stress: 0.905

Classification Report:
              precision    recall  f1-score   support

  non-stress       0.90      0.95      0.92        19
      stress       0.95      0.90      0.93        21

    accuracy                           0.93        40
   macro avg       0.93      0.93      0.92        40
weighted avg       0.93      0.93      0.93        40


Confusion Matrix:
[[18  1]
 [ 2 19]]

İnce ayardan sonra model değerlendirmesi

Şimdi predict işlevini ince ayarlı model adıyla kullanarak stres etiketleri üretelim. Ardından, ayrıntılı model değerlendirme raporunu üretmek için tahmin edilen ve gerçek etiketleri kullanabiliriz.

fine_tuned_model = "ft:gpt-4o-mini-2024-07-18:personal::AAnFfX5q"

y_pred = predict(validation_data,fine_tuned_model)
evaluate(y_true, y_pred)

Modelimizin performansı iyileşti. %97,5 doğruluk elde ettik; bu kayda değer bir artış.

Accuracy: 0.975
Accuracy for label non-stress: 1.000
Accuracy for label stress: 0.952

Classification Report:
              precision    recall  f1-score   support

  non-stress       0.95      1.00      0.97        19
      stress       1.00      0.95      0.98        21

    accuracy                           0.97        40
   macro avg       0.97      0.98      0.97        40
weighted avg       0.98      0.97      0.98        40


Confusion Matrix:
[[19  0]
 [ 1 20]]

Belirli görevlerde ince ayar doğruluğu önemli ölçüde artırabilir. Bu sadece örnek bir testti; ancak gerçek dünya projelerinde ince ayar, sınıflandırma görevleri, stil verme ve yapılandırılmış çıktı gibi alanlarda modelin doğruluğunu ve performansını iyileştirir.

Yukarıdaki kodu çalıştırırken sorun yaşıyorsanız, lütfen DataLab çalışma alanına bakın: GPT-4 Mini’yi İnce Ayarlama.

Sıradaki adım, bu ince ayarlı modeli kullanarak düzgün bir yapay zeka uygulaması oluşturmaktır. Bunu, şu kod eşliğini takip ederek öğrenebilirsiniz: GPT-4o ile Yapay Zeka Asistanları Oluşturma.

Sonuç

Bu öğreticide, GPT-4o mini modelini metinleri "stres" ve "stres değil" etiketlerine sınıflandıracak şekilde başarıyla ince ayarladık. Ardından bu ince ayarlı modele OpenAI API ve OpenAI playground üzerinden erişerek pratik uygulama ve ileri testler gerçekleştirdik.

İnce ayarlı modelin değerlendirmesi, temel modelle karşılaştırıldığında çeşitli metriklerde sınıflandırma performansında bir iyileşme göstererek değerli içgörüler sundu. Bu süreç, özellikle metin sınıflandırma gibi görevlerde daha güvenilir ve doğru çıktılar elde etmek için ince ayarın önemini vurguladı.

Ücretsiz, açık kaynaklı bir model kullanmak istiyorsanız, Llama 3.2’yi İnce Ayarlama ve Yerelde Kullanma: Adım Adım Kılavuz adlı mükemmel bir eğitimimiz var. Bu kılavuzda, en yeni Llama modelini nasıl ince ayarlayacağınızı ve dizüstü bilgisayarınızda yerel kullanım için GGUF formatına nasıl dönüştüreceğinizi gösteriyoruz.

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