Wyzwania we wdrażaniu dużych modeli językowych

Duże modele językowe mają ogromny potencjał i zmieniają świat sztucznej inteligencji w tempie ekspresowym. Za ich pomocą można zbudować naprawdę niezwykłe aplikacje, lecz istnieją pewne wyzwania przy ich wdrażaniu produkcyjnym. Z dzisiejszego artykułu dowiecie się jakie. Zapraszamy do dalszej lektury!

Niejednoznaczność języka naturalnego

Jednym z czynników, który ma wpływ na wdrażanie aplikacji opartych o duże modele językowe, jest charakter języka naturalnego. Większość oprogramowania jest tworzona za pomocą języków programowania, które są bardzo precyzyjne i zrozumiałe dla komputerów. Z językiem naturalnym, w którym są pisane “instrukcje” dla modeli językowych, sprawa wygląda zupełnie inaczej. Język naturalny jest dużo bardziej elastyczny niż języki programowania. Ta elastyczność działa w dwóch kierunkach – w tym, jak użytkownicy tworzą prompty i w tym, jak model językowy generuje odpowiedzi. W przypadku odpowiedzi modelu językowego mogą wystąpić dwa problemy.

Pierwszym problemem jest niespójność formatów odpowiedzi. W prompcie użytkownik może określić, jakiego formatu oczekuje, ale model nie zawsze się do tego dostosuje.

Drugim problemem jest to, że mimo podania dokładnie tego samego promptu, model językowy może podać za każdym razem inne odpowiedzi. Można próbować rozwiązać ten problem przez ustawienie temperature = 0, lecz w takim przypadku model może nie dawać poprawnych wyników.

Jak poradzić sobie z tą niejednoznacznością? Według osób zajmujących się dużymi modelami językowymi, trzeba ją zaakceptować i organizować pracę tak, żeby brać to zawsze pod uwagę. Ułatwieniem jest stosowanie prompt engineeringu – metod pozwalających skutecznie pracować z modelami językowymi.

Technika few-shot learning

Jedną z technik prompt engineeringu jest few-shot learning. Polega na tym, że podajemy modelowi językowemu kilka przykładów w jednym prompcie, a on na ich podstawie wnioskuje, jak odpowiadać na kolejne przykłady zawarte w dalszej części prompta. 

Przykładowo, możemy podać modelowi kilka zdań wraz z ich tematami i poprosić go, żeby określił tematy zdań, które nie mają ich podanych. Poniżej znajduje się prompt i odpowiedź Barda:

Używając tej techniki, trzeba pamiętać o dwóch rzeczach:

  • – czy model rozumie przykłady podane w prompcie (żeby to sprawdzić, można ponownie podać ten sam prompt i zobaczyć, czy model nadal daje poprawne odpowiedzi);
  • – należy uważać, żeby model nie został “przeuczony” podanymi przykładami. Aby to sprawdzić, można użyć innych, nowych przykładów, żeby zobaczyć, czy model podaje poprawne odpowiedzi.

Wersjonowanie promptów

Kolejnym sposobem na ułatwienie pracy z modelem jest wersjonowanie promptów. Nawet najmniejsze zmiany w nich wprowadzane mogą dawać inne wyniki, dlatego tak ważne jest ich śledzenie. Można do tego celu używać systemów kontroli wersji lub innych narzędzi pozwalających przechowywać historię zmian (np. Google Docs/Sheets). 

Optymalizacja promptów

Prompty mogą być optymalizowane. OpenAI przygotowało wskazówki, jak można to zrobić. 

Oto niektóre z nich:

  • – instrukcje zawarte w prompcie muszą być zawsze dokładnie wyjaśnione;
  • – złożone zadania można podzielić na mniejsze, bardziej szczegółowe;
  • – dobrze jest poinstruować model, aby wyjaśnił swoją odpowiedź;
  • – można wygenerować wiele odpowiedzi na jeden prompt, a następnie poprosić model o wybranie najlepszej.

Koszt i opóźnienie

Kolejnymi czynnikami, które mają wpływ na wdrażanie i używanie dużych modeli językowych, są koszty i opóźnienia.

Koszt wytrenowania dużego modelu językowego jest naprawdę duży. W artykule o zastosowaniach LLMs przedstawiliśmy statystyki – przykładowo, model PaLM kosztował 8 milionów USD. Oczywiście można stworzyć o wiele tańsze modele, jednak nie z taką ilością parametrów. Do trenowania dużych modeli językowych potrzebna jest ogromna moc obliczeniowa.

Z drugiej strony, koszt używania płatnych modeli również nie jest mały. Chcąc stworzyć jak najbardziej szczegółowy prompt musimy liczyć się z tym, że im będzie dokładniejszy, tym będzie dłuższy, a opłaty są pobierane na podstawie liczby tokenów. Jeśli chcemy dodać jeszcze jakieś skany, dokumenty bądź dłuższy tekst, to opłata automatycznie będzie wyższa. Odpowiedź modelu również może być płatna, np. tak jak jest to w przypadku OpenAI. 

Dodatkowo, używanie dominującego języka na jakim model był uczony (zwykle angielskiego) skutkuje oszczędnością kosztów. Wynika to ze sposobu generowania tokenów. Dla słów w języku angielskim potrzeba mniej tokenów, ponieważ tokenizer został przygotowany głównie pod kątem właśnie tego języka. Przykładowo, możemy sprawdzić w tokenizerze od OpenAI  (korzysta z niego ChatGPT), ile tokenów zawiera słowo “szansa” i jego odpowiednik w języku angielskim – “chance”:

Słowo „szansa” składa się z aż 4 tokenów, a słowo „chance” tylko z 1 tokena. 

Jeśli chodzi o opóźnienie, to prompt wprowadzany przez użytkownika nie ma na to dużego wpływu, ponieważ tokeny są przetwarzane równolegle. Sprawa wygląda inaczej z odpowiedzią modelu – tokeny są generowane sekwencyjnie. Przykładowo, w przypadku GPT-3.5-Turbo opóźnienie dla 20 tokenów wynosi ponad 1 sekundę, a dla modelu GPT-4 opóźnienia są jeszcze większe. Dlatego stanowią one wyzwanie we wdrażaniu modeli używających API – przykładem są modele od OpenAI. Oczywiście opóźnienia mogą wynikać zarówno z cech modelu, jak i z tego, jakiego łącza internetowego używa użytkownik. 

Dziedzina przetwarzania języka naturalnego rozwija się w takim tempie, że analizy kosztów i opóźnień szybko stają się nieaktualne, mimo to te 2 czynniki nadal mają wpływ na sukces we wdrażaniu modeli językowych. Należy jednak pamiętać, że w niedalekiej przyszłości opóźnienia się zmniejszą – już się znacznie zmniejszyły na przestrzeni ostatnich miesięcy w przypadku modeli od OpenAI.

Douczanie modeli językowych

Duże modele językowe wymagają nieustannego douczania. Prompting i fine-tuning mogą służyć do tego, żeby pokazać modelowi, jak ma odpowiadać. 

Różnica między promptingiem a fine-tuningiem jest taka, że używając promptingu, użytkownik wyjaśnia modelowi (zazwyczaj jego bazowej wersji, która nie była poddana jeszcze fine-tuningowi) bezpośrednio w prompcie, jak ten ma odpowiedzieć. Prompting działa tylko w ramach danego prompta – to znaczy, że nie zmienia trwale modelu. W przypadku fine-tuningu model jest douczany przykładami, których później używa do odpowiedzi i w tym przypadku użytkownik nie musi w prompcie wyjaśniać, jaki jest oczekiwany format wyniku. Prompting jest lepszym wyborem, gdy użytkownik ma tylko kilka przykładów, a fine-tuning lepiej sprawdzi się przy dużej ilości danych do douczenia. W takim przypadku (gdy użytkownik chce douczyć model dużą ilością przykładów), fine-tuning wychodzi też korzystniej cenowo – po fine-tuningu użytkownik może budować krótsze prompty.

Kolejną metodą na usprawnienie działania modeli jest prompt tuning. Polega ona na tym, że zamiast zmiany samego promptu, można zmienić jego wektor, czyli numeryczną wersję rozumianą przez oprogramowanie. Jest to możliwe w modelach językowych typu open source.

Pozostając przy wektorach, tańszą opcją niż używanie płatnych modeli językowych do budowania aplikacji jest używanie do tego celu wektorów wygenerowanych przez modele. W takim przypadku poniesione koszty są związane z zamianą danych na reprezentację wektorową i zapisanie ich w bazie danych. Następnie wektory z bazy są używane podczas działania aplikacji, co pozwala uniknąć wielokrotnego odpytywania modelu i tym samym koszty są zredukowane. 

Jeszcze inna metoda to “fine-tuning with distillation”, czyli dostosowanie istniejącego już modelu (stosunkowo niedużego, zwykle open source) na podstawie przykładów wygenerowanych przez większy model. W efekcie nieduży model w ograniczonym zakresie zachowuje się tak, jak większy, ale przy niższych kosztach i mniejszych wymaganiach mocy obliczeniowej. 

Warto też pamiętać o kompatybilności między różnymi wersjami modelu. Jak już wyżej wspomnieliśmy, modele wymagają nieustannego douczania, żeby miały aktualne dane. W związku z tym należy mieć na uwadze aktualizacje promptów, ponieważ to, że działały w danej wersji modelu, nie oznacza, że będą działały tak samo w nowszej wersji. W niektórych przypadkach prompty należy napisać od nowa lub należy przeprowadzić testy jednostkowe.

Łączenie funkcjonalności

Modele językowe mogą być także jednym z komponentów bardziej złożonego programu – wtedy ich wdrożenie jest bardziej skomplikowane. Przykładowo, można stworzyć system, w którym użytkownik kieruje zapytanie do modelu językowego, ten łączy się z bazą danych, żeby wydobyć interesujące użytkownika informacje, a następnie odpowiada użytkownikowi językiem naturalnym. W takim przypadku cały system jest złożony z połączonych ze sobą funkcjonalności:

  • – Funkcjonalność 1: Konwersja pytania użytkownika zadanego modelowi językowemu na zapytanie do bazy danych
  • – Funkcjonalność 2: Wykonanie zapytania w bazie danych
  • – Funkcjonalność 3: Konwersja informacji z bazy danych na odpowiedź w języku naturalnym podaną przez model językowy użytkownikowi

Budując takie systemy, należy pamiętać, że każdy z komponentów powinien być odpowiednio przetestowany przed połączeniem ich. W przypadku niedziałania systemu możliwe, że zawodzi jeden z komponentów lub komponenty działają prawidłowo, ale podany wynik jest niepoprawny. 

Podczas wdrażania takich systemów, w których duży model językowy jest jednym z komponentów, należy pamiętać, że to skomplikowane zadanie wymagające działania w wielu kierunkach.

Podsumowanie

Duże modele językowe są w stanie wiele zaoferować swoim użytkownikom i niewątpliwie są przełomowymi narzędziami. Dzięki nim można tworzyć niezwykłe aplikacje, jednak wdrożenie tych modeli w praktyce nie jest pozbawione wyzwań. Dodatkowo, trzeba zawsze trzymać rękę na pulsie – dynamiczny rozwój tej dziedziny sprawia, że utrzymanie aktualności wiedzy na temat działania modeli jest kluczowe dla skutecznego wdrażania tych zaawansowanych technologii.

Jeśli szukasz specjalistów, którzy mogliby zająć się wdrożeniem Twojego własnego modelu językowego, to nasz zespół chętnie pomoże na każdym etapie projektu. Skontaktuj się z nami i przekonaj się sam!

Post a Comment