Fine-Tuning w OpenAI: Jak Dostosować Model do Twoich Potrzeb i Poprawić Wyniki

Po co stosować Fine-Tuning?

Gdy odpowiedzi modelu nie spełniają naszych oczekiwań, fine-tuning umożliwia lepsze dostosowanie modelu do pożądanych rezultatów. Dzięki temu można osiągnąć:

  • Wyższą jakość wyników w specyficznych zadaniach.
  • Oszczędność tokenów, poprzez krótsze prompty.
  • Zmniejszenie opóźnienia żądań.

Kiedy stosować Fine-Tuning?

Fine-tuning ma sens, gdy łatwiej jest nam pokazać modelowi, co ma robić, niż to opisywać. Warto także pamiętać, że będzie on najbardziej efektywny, gdy potrzeby użytkowników są dobrze zdefiniowane i można je sformułować na podstawie powtarzalnych wzorców. Przykłady zastosowań obejmują: Przykłady zastosowań:

  • Ustawienie stylu odpowiedzi lub tonu.
  • Zwiększyć pewność zwrócenia pożądanego wyniku.
  • Zarządzanie przypadkami brzegowymi w konkretny sposób.
  • Kategoryzowanie danych.

Jak przygotować dane do Fine-Tuningu?

Aby wyszkolić model OpenAI, musimy przygotować plik w formacie JsonL zawierający dane, na których model będzie douczany. JsonL to w zasadzie plik Json, ale z tą różnicą, że każdy obiekt zapisany jest w jednej linii. Przykład struktury:

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already."}]}

W pliku tym znajdują się struktury wiadomości systemowej, użytkownika i odpowiedzi asystenta. Dzięki wielu takim liniom model uczy się, jak odpowiadać na podobne pytania.

Zastosowanie fine-tuningu w praktyce

Weźmy przykład aplikacji, której celem jest pobranie od użytkownika słów w bezokoliczniku i użycie ich do budowania zdań poprawnych gramatycznie. Na przykład, mając słowa „mama”, „ja”, „wczoraj”, „być” i „las”, model generuje zdanie: „Mamo, byłem wczoraj w lesie.” W takim przypadku fine-tuning jest niezwykle pomocny, gdyż łatwiej jest pokazać modelowi, w jaki sposób ma formułować zdania, niż wyjaśniać koncepcję przy każdym zapytaniu.

Dane do nauki modelu można przygotować w formacie:

Mama, ja, chcieć, ciastko; Mamo chcę dostać ciastko.
Ja, być, wczoraj, zewnątrz; Byłem wczoraj na zewnątrz.

Przygotowanie pliku JsonL

Korzystając z tej struktury, przygotowałem skrypt do przetworzenia danych:

import json
import sys

if len(sys.argv) != 2:
    print("Using: python convert.py <input_file_name>")
    sys.exit(1)

input_file = sys.argv[1]

try:
    with open(input_file, "r", encoding="utf-8") as f:
        data = f.read()
except FileNotFoundError:
    print(f"File {input_file} does not exists.")
    sys.exit(1)

lines = data.strip().split("\\n")

output = []

def process_line(line):
    input_part, output_part = line.split("; ")
    return {
        "messages": [
            {"role": "system", "content": "Popraw gramatykę zdania."},
            {"role": "user", "content": input_part.strip()},
            {"role": "assistant", "content": output_part.strip()}
        ]
    }

for line in lines:
    output.append(process_line(line))

output_file = "fine_tuning_grammar.jsonl"
with open(output_file, "w", encoding="utf-8") as f:
    for item in output:
        f.write(json.dumps(item, ensure_ascii=False) + "\\n")

print(f"Data was write to the {output_file}")

I po przekonwertowaniu pliku głównego dostałem następujący rezultat:

{"messages": [{"role": "system", "content": "Popraw gramatykę zdania."}, {"role": "user", "content": "Mama, ja, chcieć, ciastko"}, {"role": "assistant", "content": "Mamo chcę dostać cistko."}]}
{"messages": [{"role": "system", "content": "Popraw gramatykę zdania."}, {"role": "user", "content": "Ja, być, wczoraj, zewnątrz"}, {"role": "assistant", "content": "Byłem wczoraj na zewnątrz."}]}

Przygotowałem ponad 50 takich przykładów. Większa ilość danych może poprawić skuteczność modelu. Jeżeli nie mamy danych uczących, możemy użyć dowolnych modeli LLM do ich stworzenia.

Jak przeprowadzić Fine-Tuning?

Mając przygotowany plik, potrzebujemy zalogować się na nasze konto OpenAI na platformie, a następnie przejść na Dashboards: PLATFORM

Po lewej stronie będzie zakładka “Fine-tuning”.

Następnie tworzymy nowy “fine-tuned model” i wybieramy model który chcemy douczyć.

W moim przypadku padło na gpt-4-mini ze względu na niski koszt nauki. Z racji tego, że informacje o dostępnych modelach jak i kosztach mogą się zmieniać w przyszłości to szczegółowe informacje można znaleźć tutaj: PRICING

Dla moich potrzeb resztę konfiguracji zostawiam domyślnie.

W tym momencie plik JsonL, który chcę wykorzystać do douczenia modelu przechodzi przez etap walidacji jego danych. Między innymi czy struktura jest poprawna oraz czy nie ma w nim danych łamiących regulamin. Następnym etapem jest etap fine-tuningu, który może potrwać od kilku do kilkudziesięciu minut w zależności od ilości danych .

Po tym czasie nasz model będzie w pełni nauczony i będziemy mogli go wykorzystać.

Dodatkową informacją jest zamieszczony dla wytrenowanego modelu wykres:

Przedstawia on proces nauki modelu. Widać na nim jak model na początku popełniał błędy i z upływem czasu zielona linia jest wypłaszczona. Co oznacza, że model prawidłowo przetwarzał dane testowe.

Jak wywołać fine-tuned model przez API?

Po prawidłowym przejściu etapu fine-tuningu możemy użyć modelu. Skopiuj wartość „Output model” i użyj jej w polu „model” podczas wysyłania zapytania do API.

Przykład wykorzystania API:

Jak widać prompt użytkownika zaczynam od polecenia systemowego, użytego na etapie przygotowywania pliku JsonL. Jest on niezbędny, żeby model wiedział, że teraz ma zwrócić odpowiedz w konkretny sposób, który go nauczyliśmy.

Scroll to Top