Jak dostroić model LLM [i kiedy zamiast tego użyć RAG lub promptowania]

Ten przewodnik wyjaśnia krok po kroku, jak dostroić model LLM, porównuje pełne dostrajanie z LoRA i QLoRA oraz pokazuje, kiedy promptowanie lub RAG są lepszym sposobem na poprawę odpowiedzi modelu.

Diagram comparing pre-training and fine-tuning: pre-training turns a vast general text corpus (trillions of tokens, large labs, huge compute) into a base model, while fine-tuning combines a base model with a small task-specific dataset (a few hundred to a few thousand examples, one GPU, hours) to produce a specialized model.

Dostrajanie dużego modelu językowego (LLM) polega na dopracowaniu wstępnie wytrenowanego LLM na niewielkim zbiorze danych dopasowanym do konkretnego zadania, tak aby generował wyniki, których nie uzyskasz samym promptowaniem.

Dostrajanie obejmuje zebranie przykładowych par wejście/wyjście, które pokazują pożądane zachowanie, przeprowadzenie przebiegów treningowych przesuwających wagi modelu w ich kierunku oraz porównanie wyniku z odpowiedziami oryginalnego modelu. Metody efektywne parametrycznie, takie jak LoRA, obniżają koszt na tyle, że całość można uruchomić na jednym GPU.

Jeśli nie odpowiadają Ci wyniki generowane przez LLM, najpierw dopracuj prompty i generowanie wspomagane wyszukiwaniem (RAG). Dostrajanie zmienia sposób zachowania LLM. Gdy potrzebujesz, by model korzystał z aktualnych lub zastrzeżonych informacji, promptowanie i RAG są zwykle lepszym wyborem.

Oto jak krok po kroku dostroić LLM, jakie są główne metody dostrajania (LoRA i QLoRA) oraz jakie wyzwania i błędy mogą zniweczyć cały proces.

Czym jest dostrajanie LLM i czym różni się od wstępnego trenowania LLM

Wstępne trenowanie LLM buduje od podstaw ogólne zdolności językowe modelu na ogromnym korpusie, a dostrajanie LLM dostosowuje wstępnie wytrenowany model do jednego zadania na niewielkim zbiorze danych.

Wstępne trenowanie LLM to zasobochłonny etap, w wyniku którego powstaje model bazowy. Uczy się on na szerokim korpusie tekstów, co daje mu ogólną znajomość gramatyki i faktów oraz umiejętność rozumowania, ale nie specjalizuje go w Twoim zadaniu.

Dostrajanie LLM kontynuuje trenowanie modelu bazowego na niewielkim, starannie dobranym zbiorze danych, aby model generował pożądane wyniki w konkretnym zadaniu lub zastosowaniu. Chodzi na przykład o spójny format, głos lub ton marki, wzorce charakterystyczne dla danej dziedziny albo niezawodne wywołania narzędzi i funkcji.

Kiedy dostrajać LLM, a kiedy zamiast tego postawić na prompty lub RAG

Aby poprawić skuteczność LLM, wspinaj się po kolejnych szczeblach: promptowanie -> RAG -> dostrajanie.

Dopracuj prompty, dodając bardziej szczegółowe instrukcje, i użyj RAG, aby dostarczyć modelowi aktualne informacje. Po dostrajanie sięgaj dopiero wtedy, gdy ulepszenia promptów i wyszukiwania nie przynoszą efektów.

Podejście

Co zmienia

Kiedy stosować

Główne ograniczenie

Inżynieria promptów

Wysyłane zapytanie

Zachowanie jest bliskie oczekiwanemu, a zależy Ci na szybkości i odwracalności

Ograniczone istniejącymi możliwościami modelu bazowego

RAG

To, co model widzi w czasie wnioskowania

Fakty często się zmieniają, a LLM potrzebuje dostępu do aktualnych informacji

Zwiększa opóźnienia związane z wyszukiwaniem i wymaga infrastruktury; nie zmienia zachowania

Dostrajanie LLM

Wagi modelu (wewnętrzne parametry modelu)

Potrzebujesz spójnego zachowania, formatu lub tonu na dużą skalę albo krótszych promptów przy każdym wywołaniu

Koszt początkowy, wiedza zapisana w wagach się dezaktualizuje, ryzyko zapomnienia zachowań nabytych podczas wstępnego trenowania

Kiedy lepsze prompty wygrywają z dostrajaniem, a kiedy nie wystarczą

Promptowanie to najszybszy i najtańszy sposób na poprawę wyników. W wielu przypadkach dokładniejsze i bardziej szczegółowe prompty pozwalają uzyskać pożądane zmiany w zachowaniu.

Dłuższe prompty spowalniają jednak pracę, zwiększają jej koszt i nie pozwalają przezwyciężyć istniejących ograniczeń modelu.

Oznaki, że promptowanie mogło osiągnąć swoje granice:

  • Nowe przypadki brzegowe wciąż psują wyniki: Na przykład model zwraca zwykły tekst, gdy potrzebujesz JSON-a, albo zmienia ton, a Ty łatasz prompt przy każdym nowym przypadku.
  • Prompt systemowy ciągle się rozrasta: Prompt liczy setki lub tysiące wierszy i trudno nim zarządzać.
  • Płacisz za to przy każdym wywołaniu: Prompt jest ponownie wysyłany i przetwarzany przy każdym żądaniu, więc rosną koszty tokenów i opóźnienia.
  • Zmiany przestają cokolwiek dawać: Nowe instrukcje nie poprawiają wyników.

Nawet wtedy najpierw wypróbuj tańsze poprawki na poziomie promptu. Użyj przykładów few-shot, aby pokazać modelowi wzorzec (pary wejście/wyjście), łączenia promptów w łańcuchy (prompt chaining), aby podzielić trudne zadania na mniejsze kroki, lub wywoływania funkcji, aby zlecić na zewnątrz dokładne wyszukiwanie danych lub obliczenia.

Kiedy RAG ma więcej sensu niż dostrajanie modelu

RAG zmienia to, co LLM wie, a dostrajanie LLM zmienia to, jak się zachowuje. Jeśli brakuje wiedzy, zwłaszcza takiej, która często się zmienia lub znajduje się w Twoich własnych dokumentach, rozwiązaniem jest RAG. Jeśli problem dotyczy zachowania, postaw na dostrajanie.

Dostrajanie także zmienia zakres wiedzy modelu, ale wszystkie przyswojone fakty zostają zamrożone w momencie trenowania i w dynamicznie rozwijających się dziedzinach szybko tracą aktualność. Do tego informacje zostają zapisane w wagach modelu, które nie przechowują żadnej informacji o ich źródle.

Aktualizacja dokumentów źródłowych, z których korzysta warstwa wyszukiwania, jest szybsza i tańsza, a ponadto warstwa ta może wskazać dokładne źródła, z których skorzystała. Dlatego jest lepszym wyborem, gdy potrzebujesz aktualnych informacji, które da się zweryfikować.

Wada RAG? To dodatkowa warstwa, którą trzeba zbudować i utrzymywać, a do tego zwiększa opóźnienia.

W praktyce często potrzebne jest jedno i drugie. Systemy produkcyjne łączą dostrojone modele z RAG: pierwsze odpowiadają za spójne zachowanie, a drugie za aktualne fakty.

Typowe pułapki, ryzyka i wyzwania związane z dostrajaniem

Nawet gdy dostrajanie jest właściwym narzędziem, wiąże się z kosztami i ryzykiem:

  • Koszt i czas: Zebranie czystych, reprezentatywnych danych treningowych i moc obliczeniowa potrzebna do trenowania są kosztowne.
  • Katastrofalne zapominanie: Model wytrenowany na wąskim zbiorze danych może utracić ogólne umiejętności i nabrać nowych słabości, przez co popełnia błędy, których nie popełniał model bazowy.
  • Nadmierne dopasowanie: Przy zbyt małej ilości danych lub zbyt powtarzalnych danych model zapamiętuje przykłady treningowe zamiast uczyć się wzorców, więc dobrze radzi sobie z próbkami treningowymi, ale słabo z rzeczywistymi danymi wejściowymi.
  • Nieaktualna wiedza: Wiedza zapisana w wagach szybko się starzeje, więc trzeba ponownie trenować model na nowych danych.
  • Starzenie się modelu: Gdy pojawia się mocniejszy model, często od razu przewyższa Twój dostrojony model i trzeba wykonać pracę od nowa.
  • Trudności z oceną i odtwarzalnością: Trudno udowodnić, że dostrojony model działa lepiej niż model bazowy. Ponadto dwa przebiegi trenowania na GPU z tymi samymi ustawieniami mogą dać nieco inne modele.
  • Zarządzanie danymi: Trenowanie na zastrzeżonych lub wrażliwych danych rodzi pytania dotyczące prywatności i licencji; model może później ujawniać fragmenty danych, na których był trenowany.

Główne metody dostrajania

Główne rodzaje dostrajania LLM różnią się tym, jak dużą część modelu zmieniają: pełne dostrajanie ponownie trenuje cały model, a metody dostrajania efektywnego parametrycznie (PEFT), takie jak LoRA i QLoRA, aktualizują tylko część wag. Metody PEFT wymagają ułamka pamięci potrzebnej do pełnego dostrajania, a przy odpowiednich ustawieniach mogą dorównać jego wynikom.

Pełne dostrajanie aktualizuje każdą wagę modelu. Jest najdroższe i niesie największe ryzyko katastrofalnego zapominania. Zarezerwuj je na duże zmiany w zachowaniu, gdy masz wystarczająco dużo danych i mocy obliczeniowej.

Alternatywą jest dostrajanie efektywne parametrycznie, czyli PEFT. To zbiorcze określenie metod, które zamrażają większość modelu i trenują tylko niewielki zestaw parametrów. Zużywa znacznie mniej pamięci i jest mniej podatne na zapominanie, ponieważ model bazowy pozostaje nienaruszony.

Przy niskich rzędach PEFT uczy się mniej niż pełne dostrajanie, ale zwiększenie rzędu i dostrojenie współczynnika uczenia niweluje większość tej różnicy w zadaniach dostrajania do instrukcji.

Do metod PEFT należą:

  • LoRA (Low-Rank Adaptation): Typowy punkt wyjścia. Zamraża oryginalne wagi i trenuje niewielki zestaw dodanych parametrów adaptera, często poniżej 1% całości, dzięki czemu działa na jednym konsumenckim GPU.
  • QLoRA (Quantized Low-Rank Adaptation): Kompresuje model bazowy do 4-bitowej precyzji przed zastosowaniem LoRA, co pozwala dostroić duży model na jednym GPU.

Metoda

Co aktualizuje

Wymagania sprzętowe w praktyce

Kiedy stosować

Pełne dostrajanie

Każdą wagę modelu

Węzeł z wieloma GPU dla modeli klasy 7B, znacznie więcej dla większych

Potrzebujesz głębokiej zmiany zachowania i masz dane oraz moc obliczeniową

LoRA (PEFT)

Niewielki zestaw dodanych wag adaptera

Jeden konsumencki GPU

Domyślny punkt wyjścia

QLoRA (PEFT)

Adaptery LoRA na modelu bazowym skompresowanym do 4 bitów

Bardzo duże modele na jednym GPU

Brakuje Ci pamięci, ale chcesz użyć dużego modelu bazowego

Oprócz tego stosujemy metody dostrajania do instrukcji i do preferencji, od RLHF (Reinforcement Learning from Human Feedback) po lżejsze alternatywy, takie jak Direct Preference Optimization (DPO) i Odds Ratio Preference Optimization (ORPO), aby kształtować sposób, w jaki model wykonuje instrukcje i dopasowuje się do ludzkich preferencji.

Jak krok po kroku dostroić LLM

Gdy już uznasz, że dostrojenie LLM to właściwa decyzja, skorzystaj z poniższego przepływu pracy.

Krok 1: Zdefiniuj zadanie i sposób mierzenia sukcesu

Określ, jakiego zachowania oczekujesz od LLM i po czym poznasz, że udało się je osiągnąć.

Nazwij konkretne zadanie, które ma wykonywać dostrojony model, na przykład klasyfikowanie zgłoszeń do działu wsparcia, streszczanie umów w ustalonym formacie lub generowanie kodu zgodnie ze stylem przyjętym w Twojej firmie.

Następnie zdefiniuj, czym jest sukces. Typowe opcje to:

  • Poprawność wyników: Na przykład czy wynik daje się sparsować jako poprawny JSON lub czy odpowiada wymaganej strukturze Markdown?
  • Automatyczne metryki: Korzystaj z metryk takich jak BLEU czy ROUGE, które porównują wygenerowany tekst z odpowiedziami referencyjnymi, lub z dokładności wykonania zadania na oznaczonym zbiorze danych.
  • Ocena przez ludzi: Punktowa lub zero-jedynkowa (zaliczone/niezaliczone) rubryka oceny cech, z którymi skrypty radzą sobie słabo, takich jak ton czy przydatność.
  • Niezawodność przy trudnych danych wejściowych: Czy model radzi sobie z nietypowymi danymi wejściowymi, na których potykał się model bazowy?

Krok 2: Przygotuj zbiór danych

Jakość danych decyduje o powodzeniu dostrajania, więc włóż wysiłek w zebranie odpowiedniego zbioru danych do dostrajania.

Sformatuj dane jako pary instrukcja/odpowiedź w formacie JSONL, w którym każdy wiersz zawiera dane wejściowe (wraz z ewentualnym kontekstem) i dokładnie taki wynik, jaki chcesz otrzymać.

Na przykład zapoznaj się z publicznymi zbiorami danych, takimi jak ogólny zbiór instrukcji Alpaca-cleaned czy Dolly od Databricks, albo z przeznaczonym do konkretnego zadania zbiorem banking77, który zawiera ponad 13 000 rzeczywistych zapytań do działu wsparcia przypisanych do 77 intencji.

W przypadku konkretnego zadania już od kilkuset do kilku tysięcy czystych, zróżnicowanych przykładów może zmienić zachowanie modelu – pod warunkiem że przykłady odzwierciedlają rzeczywiste dane wejściowe z produkcji, w tym przypadki brzegowe, i są spójnie sformatowane.

Nie masz jeszcze par wejście/wyjście? Zbuduj zbiór z danych, które już masz, na przykład ze zgłoszeń do działu wsparcia i najlepszych odpowiedzi na nie albo z dokumentów i ich streszczeń.

Jeśli masz tylko dane wyjściowe, użyj silniejszego modelu, aby wygenerować wiarygodne dane wejściowe dla każdego z nich, albo ręcznie napisz niewielki zestaw początkowy i rozszerz go za pomocą większego modelu „nauczyciela”, a następnie zachowaj najlepsze pary.

Na koniec podziel dane na zbiory treningowy, walidacyjny i testowy, aby móc mierzyć wyniki na przykładach, których model nie widział.

Krok 3: Wybierz model bazowy i metodę

Zacznij od małego modelu open source liczącego od 3 do 7 miliardów parametrów i metody dostrajania efektywnego parametrycznie, takiej jak LoRA lub QLoRA.

Otwarte rodziny modeli, takie jak Llama, Mistral i Qwen, zapewniają mocną bazę, którą możesz hostować samodzielnie, a metody PEFT utrzymują niskie wymagania sprzętowe: QLoRA kwantyzuje model bazowy do 4 bitów, więc dostrojenie modelu 7B wymaga jedynie konsumenckiej karty z 16–24 GB pamięci. Pełne dostrajanie tego samego modelu wymaga wielokrotnie więcej pamięci.

Krok 4: Ustaw hiperparametry trenowania

Oto kluczowe parametry dostrajania LLM i sugerowane zakresy początkowe:

  • Współczynnik uczenia określa, jak duża jest każda aktualizacja wag. Badanie Bidermana i in. z 2024 roku wykazało, że optymalne wartości dla LoRA były mniej więcej dziesięciokrotnie wyższe niż przy pełnym dostrajaniu – zwykle od 5e-5 do 5e-4 w porównaniu z zakresem od 1e-5 do 5e-5. Autorzy badania zalecają przeszukanie zakresu od 1e-5 do 5e-4 i wybranie najwyższej wartości, przy której trenowanie przebiega stabilnie.
  • Rozmiar partii (batch size) to liczba przykładów, na których model uczy się przed każdą aktualizacją wag. Na pojedynczym GPU użyj małej partii na urządzenie (od 1 do 8) oraz akumulacji gradientu, aby uzyskać efektywny rozmiar partii rzędu 16–64.
  • Liczba epok określa, ile razy model przejdzie przez cały zbiór danych. Przy trenowaniu modelu do wykonywania konkretnych zadań dobrą praktyczną zasadą są 1–3 epoki, ale przebiegi LoRA często wymagają ich więcej.
  • Ranga LoRA (r) określa pojemność adaptera, czyli to, ile jest on w stanie się nauczyć. Przy prostszych zadaniach zacznij od wartości od 8 do 32, a przy trudniejszych ją zwiększ: we wspomnianym wyżej badaniu LoRA Bidermana i in. dostrajanie instrukcyjne modelu 7B na kodzie wymagało rangi 256, aby dorównać pełnemu dostrajaniu, natomiast w zadaniach matematycznych ranga 64 pozwoliła zbliżyć się do tego wyniku.
  • Maksymalna długość sekwencji to najdłuższe dane wejściowe, jakie zostaną przetworzone podczas treningu. Ustaw ją tak, aby obejmowała Twoje najdłuższe przykłady (maksymalnie do rozmiaru okna kontekstowego modelu), ponieważ wszystko, co dłuższe, zostanie obcięte.
  • Rozgrzewka (warmup) i harmonogram określają, jak współczynnik uczenia narasta i zmienia się w trakcie treningu. Typowe ustawienia domyślne to krótka rozgrzewka i kosinusowe wygaszanie. Jednak badanie małych modeli przeprowadzone przez Pareję i in. wykazało, że rezygnacja z rozgrzewki nie pogorszyła końcowych wyników.

Traktuj te wartości jako punkty wyjścia do przeszukiwania hiperparametrów, a nie jako stałe ustawienia.

Krok 5: trenowanie i monitorowanie straty

W trakcie treningu obserwuj krzywe straty treningowej i walidacyjnej, aby sprawdzić, czy wszystko działa zgodnie z oczekiwaniami.

Strata (loss) mierzy, jak bardzo odpowiedzi modelu odbiegają od Twoich przykładów, i powinna płynnie spadać w miarę postępu treningu. Strata treningowa dotyczy danych, na których model się uczy. Strata walidacyjna jest obliczana na wydzielonych przykładach.

Jeśli strata treningowa i walidacyjna spadają jednocześnie, model uczy się uogólniać. Jeśli strata treningowa nadal maleje, ale strata walidacyjna się wypłaszcza lub rośnie, model zapamiętuje zbiór treningowy, zamiast uczyć się wzorca (przeuczenie, ang. overfitting).

Krok 6: ewaluacja, a następnie wdrożenie

Niska strata treningowa nie gwarantuje poprawnych odpowiedzi, dlatego oceń dostrojony model według kryteriów ustalonych w kroku 1.

Gdy model pomyślnie przejdzie ocenę, możesz go wdrożyć na dwa sposoby:

  • Udostępniaj adapter jako nakładkę na model bazowy i ładuj oba w czasie działania – dzięki temu adapter można łatwo wymienić.
  • Scal adapter z wagami modelu bazowego, aby uzyskać jeden samodzielny model, który łatwiej hostować.

Użyj Perplexity, aby zapewnić swojemu modelowi LLM dostęp do aktualnych informacji

Dostrajanie to właściwy wybór, gdy chcesz dostosować zachowanie modelu do swoich potrzeb.

Jeśli Twój model potrzebuje aktualnych informacji, zwłaszcza takich, które szybko się zmieniają, potrzebujesz RAG lub niezawodnego zewnętrznego narzędzia wyszukiwania.

Własny stos wyszukiwania (retrieval) sprawdza się najlepiej w przypadku zastrzeżonych zbiorów danych, takich jak wewnętrzna wiki, historia obsługi klienta, umowy czy dokumentacja produktu.

Gdy wiedza, z której chcesz korzystać, jest publicznie dostępna, nie ma potrzeby budowania własnej warstwy wyszukiwania. Perplexity to silnik odpowiedzi, który zwraca odpowiedzi z klikalnymi cytatami w tekście, pochodzącymi z aktualizowanego na bieżąco indeksu internetowego. Interfejs Agent API dostarcza takie odpowiedzi, oparte na danych z internetu i opatrzone cytatami, w jednym wywołaniu, dzięki czemu Twoja aplikacja może korzystać z aktualnych źródeł.

Najczęściej zadawane pytania dotyczące dostrajania modeli LLM

Czy można dostroić model LLM za darmo?

Tak, mały otwarty model LLM można dostroić za darmo. Na przykład bezpłatny plan Google Colab zapewnia wystarczającą moc GPU, aby uruchomić QLoRA na modelu o rozmiarze od 3B do 8B, co w zupełności wystarcza do konkretnego zadania. Płacić zaczynasz wtedy, gdy potrzebujesz więcej pamięci, dłuższych przebiegów lub większego modelu bazowego, niż pozwala na to bezpłatny plan.

Czy potrzebujesz własnego GPU, czy możesz dostrajać model w chmurze?

Nie musisz mieć własnego GPU, aby dostrajać modele LLM. Usługi zarządzane i dostawcy chmury GPU wynajmują sprzęt na godziny, więc jeden wynajęty GPU wystarczy do przebiegu QLoRA na małym modelu. Zakup GPU opłaca się tylko wtedy, gdy często dostrajasz modele lub musisz przechowywać wszystkie dane na własnych maszynach.

Jak długo trwa dostrajanie modeli LLM?

W przypadku małego modelu LLM przebieg może zająć od kilku minut do kilku godzin, w zależności od rozmiaru zbioru danych i sprzętu. Na przykład firma Oumi w pełni dostroiła model 0,8B w nieco ponad godzinę na swojej hostowanej platformie.

Większe modele lub dziesiątki tysięcy przykładów wydłużają ten czas do doby lub dłużej: przebiegi LoRA firmy Emburse na modelu 7B trwały 8 godzin dla 5000 przykładów i około 30 godzin dla 50 000 przykładów na jednym GPU z 40 GB pamięci.

Czy można na bieżąco aktualizować dostrojony model, gdy zmieniają się dane?

Możesz ponownie dostroić model na nowych danych, ale każda runda wymaga mocy obliczeniowej i niesie ryzyko katastrofalnego zapominania. W przypadku wiedzy, która często się zmienia, lepszym rozwiązaniem jest zwykle RAG, ponieważ aktualizujesz dokumenty źródłowe zamiast ponownie trenować model.