Kiedy mówi się o ChatGPT i innych dużych modelach językowych, słowo „token” pojawia się nieustannie. Model ma kontekst na określoną liczbę tokenów, API liczy tokeny wejściowe i wyjściowe, długi dokument zajmuje dziesiątki tysięcy tokenów, a zbyt długa rozmowa ostatecznie może przestać całkowicie mieścić się w kontekście.
Dlatego łatwo wyobrazić sobie, że token to po prostu techniczna nazwa słowa. Ale to nieprawda.
Token to jednostka informacji, na którą system dzieli tekst przed jego przekazaniem do modelu językowego.
Jedno krótkie słowo czasami może być jednym tokenem, dłuższe — kilkoma, a osobnymi tokenami mogą stać się znaki interpunkcyjne, części słów, cyfry, a nawet fragmenty razem z odstępami.
Dlatego liczba słów i liczba tokenów w tekście prawie nigdy się nie pokrywają.
Po co AI w ogóle potrzebne są tokeny
Człowiek widzi zdanie:
„Sztuczna inteligencja pomaga pracować z tekstem”.
Dla nas składa się ono ze słów i ma zrozumiałe znaczenie. Komputer natomiast musi ostatecznie pracować z liczbami.
Dlatego między ludzkim tekstem a siecią neuronową istnieje dodatkowy etap — tokenizacja.
Specjalny system, który nazywa się tokenizatorem, dzieli tekst wejściowy na określone fragmenty. Każdemu takiemu fragmentowi odpowiada numeryczny identyfikator. Już sekwencja tych liczb trafia do modelu językowego.
Umownie proces można przedstawić tak:
tekst → tokeny → numery ID → przetwarzanie przez model → nowe tokeny → tekst odpowiedzi
To znaczy, że kiedy piszemy do ChatGPT pytanie, model dosłownie nie otrzymuje zdania w takiej formie, w jakiej je widzimy.
To jeden z podstawowych szczegółów, bez którego trudno zrozumieć, jak działają nowoczesne modele językowe.
Token — to słowo, litera czy część słowa?
Może być wszystkim z wymienionych.
Wczesne systemy przetwarzania języka naturalnego często pracowały ze słowami. Takie podejście wydaje się logiczne: można stworzyć słownik, w którym każdemu słowu odpowiada własny numer.
Problem pojawia się niemal od razu. Języków jest niezwykle wiele, a liczba możliwych słów praktycznie nieograniczona.
W języku ukraińskim, na przykład, od słowa „pracować” powstają „pracuję”, „pracujesz”, „pracowali”, „pracować będziemy” i wiele innych form. Do tego dochodzą nazwiska, nazwy firm, slang, błędy drukarskie, nowe terminy, adresy URL, kod programowy itd.
Jeśli każde możliwe słowo uczynić osobną jednostką, potrzebny będzie gigantyczny słownik, który nigdy nie będzie pełny.
Inna skrajność to dzielenie wszystkiego na pojedyncze znaki. Wtedy słownik będzie mały, ale nawet krótkie zdanie przekształci się w bardzo długą sekwencję.
Nowoczesne modele językowe często stosują kompromis — tokenizację sub-słowną. Częste słowa lub fragmenty mogą pozostać całe, a rzadkie dzielą się na mniejsze części.
Na przykład angielskie zakończenie
-ing występuje tak często, że w tokenizatorach BPE może istnieć jako użyteczny powtarzający się fragment. Taki właśnie zasad OpenAI podaje w dokumentacji swojego tokenizatora
tiktoken. Jednocześnie „sub-słowny” nie oznacza tutaj, że tokenizator koniecznie znajduje prawdziwe rdzenie, sufiksy czy inne morfemy. Podział formuje się statystycznie, a tiktoken wykorzystuje rodzaj BPE, który działa na bajtach.
Z ukraińskimi słowami dzieje się coś podobnego, chociaż konkretny podział zależy od tokenizatora. To samo słowo w jednym modelu może składać się z dwóch tokenów, a w innym — z jednego lub trzech.
Dlatego przykład w stylu:
[neuro] [sieć]
może dobrze wyjaśniać samą zasadę, ale nie oznacza, że konkretny model koniecznie rozbije słowo „neuro sieć” w ten sposób.
Czym jest tokenizacja
Tokenizacja — to proces przekształcania danych wyjściowych w sekwencję tokenów, z którą może pracować model.
Dla dużych modeli językowych ważne jest znalezienie takiego sposobu podziału, który jednocześnie pozwala kompaktowo przedstawiać powszechne konstrukcje i nie gubić się w obliczu nieznanych słów.
Jednym z najwpływowych podejść stał się Byte Pair Encoding, czyli BPE.
Wielką rolę w rozpowszechnieniu tokenizacji sub-słownej w neuronowych systemach językowych odegrała opublikowana w 2016 roku praca Riko Senricha, Barry'ego Geddou i Alexandry Birch
„Neural Machine Translation of Rare Words with Subword Units”. Badacze pokazali, jak podział na sub-słowne jednostki pomaga neuronowemu tłumaczeniu maszynowemu pracować z rzadkimi i wcześniej nieznanymi słowami. Z czasem podejście to stało się niezwykle wpływowe dla NLP i systemów takich jak BERT i GPT.
W uproszczonej formie idea jest taka: tokenizator uczy się, które fragmenty często występują w danych, i formuje z nich słownik jednostek, wygodnych do kompaktowego przedstawienia tekstu.
Dlatego popularne krótkie słowo może otrzymać jeden token, a rzadkie długie słowo — rozpaść się na kilka.
Jak token przekształca się w coś zrozumiałego dla modelu
Po tokenizacji każdemu tokenowi odpowiada pewne ID — liczba całkowita.
Umownie:
„wieloryb” → token nr 18472
„śpi” → token nr 52931
Te numery podano tylko dla wyjaśnienia zasady — rzeczywiste ID zależą od konkretnego tokenizatora.
Sam numer nie zawiera znaczenia słowa. Token nr 18472 nie jest „bardziej koci” niż token nr 18473 i nie oznacza, że jeden token jest ważniejszy od drugiego. To przede wszystkim indeks, według którego system znajduje potrzebne przedstawienie.
Następnie token przekształca się w wektor — zbiór liczb, który model może matematycznie przetwarzać. Takie numeryczne przedstawienie nazywa się embedding, czyli osadzeniem.
Dlatego token i embedding — to nie to samo.
Token — jednostka, na którą podzielono tekst.
ID tokena — jego numer w słowniku.
Embedding — numeryczne przedstawienie, z którym już pracuje sieć neuronowa.
Do tego dochodzi informacja o pozycji tokena w sekwencji i inne mechanizmy modelu. Następnie Transformer analizuje powiązania między tokenami i formuje wewnętrzne przedstawienie kontekstu.
Jak ChatGPT generuje tekst token po tokenie
Tokeny są potrzebne nie tylko do odczytania zapytania. Odpowiedź modelu również jest tworzona przez nie.
Jeśli bardzo uprościć, model językowy otrzymuje już istniejącą sekwencję i określa prawdopodobieństwa możliwych następnych tokenów.
Na przykład:
„Stolica Ukrainy — ...”
Po tym model ocenia możliwe kontynuacje, a mechanizm generacji określa następny token.
Kiedy się pojawia, proces się powtarza:
kontekst → następny token → zaktualizowany kontekst → następny token → ...
W ten sposób stopniowo formuje się zdanie, akapit i cała odpowiedź.
Oczywiście nowoczesny duży model językowy jest znacznie bardziej skomplikowany niż prosta tabela prawdopodobieństw. Uwzględnia ogromną liczbę powiązań w kontekście, a nowoczesne systemy mogą dodatkowo wykorzystywać wyszukiwanie, narzędzia, pracę z plikami i mechanizmy rozumowania. Ale na poziomie samej generacji tekstu pojęcie tokena pozostaje fundamentalne.
Ile znaków lub słów zawiera jeden token
Nie ma uniwersalnej formuły.
OpenAI podaje dla języka angielskiego wygodną przybliżoną ocenę: jeden token często odpowiada około czterem znakom lub trzem czwartym słowa. Odpowiednio, 100 tokenów to orientacyjnie 75 angielskich słów. Jednocześnie firma podkreśla, że wynik zależy od języka, kontekstu, modelu i kodowania.
Tu szczególnie ważne jest doprecyzowanie — ta formuła dotyczy angielskiego.
Mechanicznie liczenie według niej ukraińskich tekstów nie ma sensu. Różne pisma, morfologia i to, jak skutecznie konkretny tokenizator przedstawia dany język, wpływają na liczbę tokenów.
Dlatego 1000 ukraińskich i 1000 angielskich słów wcale nie musi zajmować tej samej liczby tokenów.
Co więcej, nawet dwa prawie identyczne ciągi mogą być tokenizowane różnie z powodu wielkości liter, odstępu lub znaku interpunkcyjnego.
Dlaczego odstępy i znaki interpunkcyjne też mają znaczenie
Tokenizator nie pracuje z „pojęciami”, a z konkretną sekwencją znaków lub bajtów.
Dlatego:
„wieloryb”
„Wieloryb”
„ wieloryb”i
„wieloryb.”
mogą tworzyć różne zestawy tokenów.
W dokumentacji OpenAI znajduje się przykład ze słowem red: jego przedstawienie różni się w zależności od wielkiej lub małej litery, pozycji w zdaniu i obecności odstępu przed słowem.
Może się to wydawać nieistotnym szczegółem technicznym, ale wyjaśnia wiele dziwnego zachowania modeli językowych.
Dlaczego AI czasami źle liczy litery w słowach
Klasowy przykład — poprosić model językowy o policzenie liczby określonych liter w słowie.
Dla człowieka zadanie jest naturalne: możemy spojrzeć na słowo znak po znaku. Dla modelu językowego jednostką początkową często nie jest pojedyncza litera, a token, który może zawierać od razu kilka znaków.
Dlatego słowo, które człowiek widzi jako sekwencję dziesięciu liter, model może otrzymać w postaci kilku fragmentów.
To jedna z przyczyn, dla których modelom językowym historycznie trudniej było wykonywać niektóre zadania związane z dokładnym liczeniem znaków, anagramami czy manipulacjami z pojedynczymi literami, niż zadania, które wydają się znacznie bardziej skomplikowane semantycznie.
Nowoczesne systemy mogą kompensować ten problem rozumowaniem, kodem programowym lub innymi narzędziami, dlatego sama tokenizacja już nie oznacza, że model koniecznie się pomyli. Ale pomaga zrozumieć, skąd w ogóle bierze się taka dziwna słabość.
Czym jest okno kontekstowe i jakie ma to znaczenie dla tokenów
Termin „okno kontekstowe” opisuje zakres informacji, który model może uwzględnić podczas wykonywania zadania.
I ten zakres mierzy się właśnie w tokenach.
W kontekście mogą znajdować się nie tylko ostatnie pytanie użytkownika, ale także wcześniejsze wiadomości rozmowy, instrukcje systemowe, części dokumentów, wyniki pracy narzędzi i inne informacje potrzebne do odpowiedzi.
Umownie, jeśli model ma okno kontekstowe na 100 000 tokenów, to nie oznacza, że użytkownik może wstawić tekst dokładnie na 100 000 tokenów i otrzymać nieograniczoną odpowiedź. W wielu modelach całkowity limit obejmuje tokeny wejściowe i wyjściowe, a dokładne ograniczenia zależą od konkretnego modelu i usługi. Nowoczesne modele z dużym kontekstem mogą obsługiwać setki tysięcy tokenów.
Duże okno kontekstowe nie oznacza idealnej pamięci
Istnieje ważna pułapka: jeśli model technicznie może przyjąć bardzo długi dokument, to jeszcze nie oznacza, że wykorzysta każdą jego część równie dobrze.
W znanym badaniu
„Lost in the Middle: How Language Models Use Long Contexts” autorzy sprawdzali, jak modele językowe znajdują potrzebne informacje w dużych kontekstach. W badanych przez nich modelach wynik często był lepszy, gdy istotne informacje znajdowały się na początku lub na końcu kontekstu, a pogarszał się, gdy znajdowały się pośrodku.
Od tego czasu modele z długim kontekstem znacznie się rozwinęły, dlatego wyniki tej pracy nie powinny być automatycznie przenoszone na każdy nowoczesny model. Ale rozróżnienie między „może przyjąć N tokenów” a „jednakowo dobrze wykorzystuje wszystkie N tokenów” pozostaje ważne.
Dlatego bezmyślne dodawanie do zapytania dziesiątek dokumentów nie zawsze jest lepsze niż przekazanie mniejszego, ale istotnego zestawu informacji.
Kontekst i pamięć — to różne rzeczy
Dzięki tokenom łatwiej również zrozumieć różnicę między kontekstem a pamięcią AI.
Kontekst to informacje dostępne modelowi bezpośrednio podczas konkretnego zapytania. Można to sobie wyobrazić jako biurko robocze: model widzi to, co aktualnie na nim leży.
Pamięć w takich produktach jak ChatGPT to osobny mechanizm. Informacje z wcześniejszych interakcji mogą być przechowywane poza aktualnym kontekstem, a istotne dane mogą być wykorzystywane w następnych rozmowach w razie potrzeby.
To znaczy, że zwiększenie okna kontekstowego samo w sobie nie daje AI nieskończonej pamięci.
Czym są tokeny wejściowe i wyjściowe
W usługach dla programistów często można spotkać pojęcia input tokens i output tokens.
Tokeny wejściowe — to informacje, które system przekazał modelowi do przetworzenia: zapytanie użytkownika i inny kontekst.
Tokeny wyjściowe — to tokeny, które model stworzył w odpowiedzi.
W niektórych API istnieją też inne kategorie. Na przykład OpenAI osobno zlicza tokeny buforowane — tokeny danych wejściowych uzyskane z bufora — oraz tokeny rozumowania (reasoning tokens), które niektóre modele wykorzystują do wewnętrznych kroków przed sformułowaniem ostatecznej odpowiedzi. Te kategorie są odzwierciedlane w danych o użyciu API.
Dla zwykłego użytkownika, który po prostu korzysta z ChatGPT przez stronę internetową lub aplikację, te kategorie pozostają głównie technicznym szczegółem. Dla programisty, który pracuje przez API, mają one już bezpośredni wpływ na wykorzystanie zasobów i koszty.
Dlaczego za AI często płaci się właśnie za tokeny
Dla API dużych modeli językowych tokeny stały się wygodną jednostką miary użycia.
Zapytanie na dwa zdania i analiza 300-stronicowego dokumentu wymagają zupełnie różnego zakresu obliczeń. To samo dotyczy krótkiej odpowiedzi „tak” i szczegółowego raportu na kilka tysięcy słów.
Dlatego dostawcy usług AI często ustalają cenę w zależności od liczby przetworzonych tokenów.
W OpenAI API stawki dla modeli językowych, w tym, ustalane są osobno dla tokenów wejściowych, buforowanych wejściowych i wyjściowych, a ceny zazwyczaj podawane są za milion tokenów. Koszt zależy od konkretnego modelu.
Nie należy tego mylić z subskrypcją na ChatGPT: użytkownik zwykłego planu taryfowego ChatGPT nie otrzymuje osobnego rachunku za każdy użyty token. Model tokenowy obliczeń jest szczególnie ważny dla programistów, którzy integrują modele językowe w swoich aplikacjach przez API, a także dla poszczególnych korporacyjnych schematów użycia.
Dlaczego krótszy prompt nie zawsze jest lepszy
Jeśli tokeny wpływają na kontekst i koszty, może pojawić się logiczne pytanie: czy należy robić wszystkie zapytania maksymalnie krótkimi?
Niekoniecznie.
Niepotrzebne dwadzieścia zdań rzeczywiście mogą być zbędne. Ale nadmiernie krótka prośba może nie zawierać kontekstu potrzebnego do dobrej odpowiedzi.
Na przykład:
„Napisz list”.
zajmuje bardzo mało tokenów, ale prawie nic nie wyjaśnia modelowi.
Natomiast:
„Napisz krótki przyjazny list do klienta, któremu trzeba powiadomić o przeniesieniu spotkania z poniedziałku na środę. Bez nadmiernie oficjalnego tonu”.
będzie dłuższy, ale znacznie dokładniej określa zadanie.
Dlatego optymalizacja tokenów to nie sztuka pisania jak najmniej. Raczej to umiejętność nie marnowania kontekstu na informacje, które nie pomagają w wykonaniu zadania.
Dlaczego różne modele liczą ten sam tekst różnie
Nie ma jednego uniwersalnego tokenizatora dla całej sztucznej inteligencji.
Różne rodziny modeli mogą mieć różne słowniki, algorytmy tokenizacji i zasady przetwarzania tekstu. Nawet w obrębie jednej firmy różne pokolenia modeli mogą używać innego kodowania.
OpenAI wyraźnie zaznacza, że dokładna liczba tokenów zależy od modelu i kodowania, a do pracy z tokenizacją swoich modeli udostępnia bibliotekę tiktoken.
Dlatego zdanie „ten tekst ma 3000 tokenów” bez doprecyzowania tokenizatora czasami jest tylko przybliżone.
Poprawniej powiedzieć: „ten tekst ma około 3000 tokenów dla tego a tego modelu lub tego a tego kodowania”.
Czym są specjalne tokeny
Nie wszystkie tokeny muszą odpowiadać widocznym częściom zwykłego tekstu.
Modele i systemy wokół nich mogą używać specjalnych tokenów, które oznaczają strukturę informacji: na przykład granice określonych fragmentów lub elementy formatu. W samym tiktoken również przewidziano osobny mechanizm specjalnych tokenów.
Użytkownik zazwyczaj ich nie widzi.
To kolejny powód, dla którego liczba tokenów, faktycznie przekazanych modelowi, nie zawsze może być określona prostym zliczaniem znaków w widocznym komunikacie.
Czy tokeny mogą być nie-tekstowe
Tak. W systemach multimodalnych pojęcie tokena może być stosowane nie tylko do tekstu.
Jeśli model pracuje z obrazem, dźwiękiem lub innymi typami danych, tę informację również trzeba przekształcić w numeryczne przedstawienie, odpowiednie do przetwarzania przez sieć neuronową. Konkretny mechanizm zależy od architektury: obrazy mogą być na przykład przetwarzane przez oddzielne obszary lub łatki i przekształcane w sekwencję wewnętrznych przedstawień.
W nowoczesnych API OpenAI wykorzystanie modeli multimodalnych rzeczywiście może być uwzględniane jako osobne image tokens, audio tokens i text tokens.
Dlatego w szerszym kontekście technicznym słowo „token” już nie zawsze oznacza tylko kawałek napisanego słowa. Ale sposób tworzenia takich jednostek dla tekstu, obrazów i dźwięku może być zupełnie różny, dlatego nie należy ich wyobrażać jako jednego i tego samego mechanizmu.
Tokeny i parametry modelu — to też nie to samo
Jeszcze dwa pojęcia, które łatwo pomylić.
Tokeny — to jednostki informacji, które model otrzymuje lub generuje.
Parametry — to wartości numeryczne wewnątrz samej sieci neuronowej, uformowane w procesie uczenia.
Kiedy mówi się, że model uczył się na trylionach tokenów, chodzi o objętość danych treningowych w tokenizowanej formie.
Kiedy mówi się o modelu z miliardami parametrów, ma się na myśli już jego wewnętrzną strukturę.
To znaczy, że parametry należą do modelu, a tokeny przechodzą przez niego.
Dlaczego pojęcie tokena w ogóle jest ważne dla zwykłego użytkownika
Dla zwykłej rozmowy z ChatGPT znajomość tokenizacji nie jest konieczna. Można przez lata korzystać z AI i ani razu nie liczyć tokenów ręcznie.
Ale to pojęcie wyjaśnia wiele rzeczy, które w przeciwnym razie wydają się dziwne.
Dlaczego model nie może nieskończoności uwzględniać całej historii rozmowy? Ponieważ kontekst ma ograniczony rozmiar w tokenach.
Dlaczego ogromny dokument czasami trzeba dzielić na części? Ponieważ musi się zmieścić w dostępnym kontekście.
Dlaczego jedno ukraińskie słowo może zajmować więcej „miejsca” niż podobne pod względem długości angielskie? Ponieważ model nie pracuje ze słowami, a z tokenami konkretnego tokenizatora.
Dlaczego korzystanie z modelu językowego przez API ma różne koszty dla krótkich i długich zadań? Ponieważ objętość przetworzonej i stworzonej informacji często mierzy się tokenami.
I nawet znajoma fraza „AI czyta tekst” po tym wygląda trochę inaczej. Model językowy nie widzi strony tak, jak my ją widzimy. Najpierw zdanie jest rozkładane na małe jednostki maszynowe, one są przekształcane w liczby i numeryczne wektory, przechodzą przez sieć neuronową — i dopiero na końcu sekwencja wygenerowanych tokenów znowu staje się słowami, które pojawiają się na naszym ekranie.