Fine-tuning prispôsobí LLM vášmu špecifickému use case. Ale nie vždy je to správna voľba.
Kedy fine-tuning potrebujete
Áno, fine-tuning
- Špecifický štýl/tón (brand voice)
- Doménová terminológia (medicína, právo)
- Konzistentný formát výstupu
- Zníženie latencie (menší model)
Nie, použite RAG alebo prompting
- Potrebujete aktuálne informácie
- Firemné dokumenty/dáta
- Málo trénovacích príkladov (<100)
- Rýchle experimentovanie
Porovnanie prístupov
| Metóda | Kedy použiť | Náklady | Komplexita |
|---|---|---|---|
| Prompting | MVP, experimenty | Nízke | Nízka |
| RAG | Firemné dáta | Stredné | Stredná |
| Fine-tuning | Štýl, formát | Vysoké | Vysoká |
| Pre-training | Nová doména | Veľmi vysoké | Veľmi vysoká |
OpenAI Fine-tuning
Príprava dát
# training_data.jsonl
{"messages": [
{"role": "system", "content": "Si customer support agent."},
{"role": "user", "content": "Kde je moja objednávka?"},
{"role": "assistant", "content": "Rád vám pomôžem! Môžete mi poskytnúť číslo objednávky?"}
]}
{"messages": [
{"role": "system", "content": "Si customer support agent."},
{"role": "user", "content": "Chcem vrátiť produkt"},
{"role": "assistant", "content": "Samozrejme! Vrátenie je možné do 30 dní..."}
]}
Spustenie fine-tuningu
from openai import OpenAI
client = OpenAI()
# Upload trénovacích dát
file = client.files.create(
file=open("training_data.jsonl", "rb"),
purpose="fine-tune"
)
# Spustenie fine-tuningu
job = client.fine_tuning.jobs.create(
training_file=file.id,
model="gpt-4o-mini-2024-07-18"
)
# Sledovanie progresu
print(client.fine_tuning.jobs.retrieve(job.id))
Použitie fine-tuned modelu
response = client.chat.completions.create(
model="ft:gpt-4o-mini-2024-07-18:org::xxxx",
messages=[
{"role": "user", "content": "Kde je moja objednávka?"}
]
)
LoRA: Efektívny fine-tuning
Low-Rank Adaptation - trénujete len malú časť parametrov:
from peft import LoraConfig, get_peft_model
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.2-3B")
lora_config = LoraConfig(
r=16, # rank
lora_alpha=32,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05,
)
model = get_peft_model(model, lora_config)
# Trénovanie len ~0.1% parametrov
print(f"Trainable params: {model.num_parameters(only_trainable=True):,}")
Best Practices
Dáta
- Kvalita > kvantita - 100 kvalitných > 1000 slabých
- Diverzita - pokryte rôzne scenáre
- Konzistencia - rovnaký štýl vo všetkých príkladoch
- Validácia - 10-20% dát na testovanie
Tréning
# Hyperparametre pre OpenAI
{
"n_epochs": 3, # 1-4 typicky stačí
"batch_size": 4,
"learning_rate_multiplier": 0.5 # znížte ak overtrained
}
Evaluácia
def evaluate_model(model, test_data):
correct = 0
for example in test_data:
response = model.generate(example["input"])
if matches_expected(response, example["expected"]):
correct += 1
return correct / len(test_data)
Náklady
| Model | Tréning (1M tokenov) | Inference |
|---|---|---|
| GPT-4o mini | $3 | $0.15/1M input |
| GPT-4o | $25 | $3.75/1M input |
Záver
Fine-tuning je mocný nástroj, ale nie prvá voľba. Začnite s prompt engineeringom, potom RAG, a až keď to nestačí, zvážte fine-tuning.