Tokenizace je brána, jejímž prostřednictvím se nezpracovaný text transformuje do formátu použitelného velkými jazykovými modely (LLM), jako je GPT. Funguje jako most mezi obsahem čitelným člověkem a numerickými daty, která modely zpracovávají. Než model pochopí nebo vygeneruje souvislý text, musí rozdělit vstup do menších jednotek nazývaných tokeny .
V architekturách GPT je tokenizace zásadní pro výkon a schopnosti modelu, ovlivňuje efektivitu, využití kontextového okna a kvalitu výstupu. Tokenizace je proces rozdělení textu na menší jednotky zvané tokeny, které mohou představovat slova, podslova, znaky nebo dokonce speciální symboly. Tyto tokeny jsou základními stavebními kameny, které model zpracovává. Způsob tokenizace textu přímo ovlivňuje, jak efektivně dokáže model zpracovávat data, kolik informací se vejde do jeho kontextového okna a kvalitu odpovědí, které generuje.
Kontextové okno je maximální počet tokenů, které může model zpracovat v jedné operaci, včetně vstupu i generovaného výstupu. Například model s kontextovým oknem s 32 000 tokeny se musí do tohoto limitu vejít vše – váš vstupní text, systémové instrukce a odezvu modelu. Efektivní tokenizace snižuje počet tokenů potřebných k reprezentaci daného textu, což vám umožňuje zahrnout více obsahu nebo získat delší a bohatší výstupy bez překročení limitu. Špatná tokenizace na druhou stranu může zbytečně navyšovat počet tokenů, plýtvat cenným místem v kontextovém okně a omezovat použitelnost modelu pro delší úkoly.
Jakmile je text tokenizován, je každý token převeden na numerické vložení — matematické znázornění ve vysokorozměrném prostoru (často stovky nebo tisíce dimenzí). Toto vložení zachycuje význam a vztahy tokenu v kontextu celé slovní zásoby. Například žetony pro podobná slova jako „běh“ a „běh“ budou v tomto prostoru umístěny blíže než nesouvisející žetony jako „běh“ a „stůl“. Tato vložení umožňují modelu porozumět sekvenci tokenů a předpovědět nejpravděpodobnější další token během generování textu. Tento proces umožňuje GPT vytvářet koherentní, kontextově relevantní výstupy, ať už jde o odpověď na dotaz, dokončení věty nebo generování kreativního obsahu.
Tokenizace v podstatě není jen krokem předběžného zpracování – je to kritický faktor, který umožňuje modelům GPT efektivně fungovat a poskytovat vysoce kvalitní výsledky.
Tokenizace není univerzální proces; liší se v závislosti na předem definovaných pravidlech nebo algoritmech navržených k rozdělení textu do spravovatelných jednotek nazývaných tokeny.
Zde je hlubší pohled na to, jak to funguje:
Štípání
To zahrnuje rozdělení textu na menší jednotky, jako jsou slova, podslova nebo znaky. Moderní LLM se často spoléhají na tokenizaci podslov , protože nabízí rovnováhu mezi efektivitou a robustností. Tato rovnováha vzniká, protože tokenizace podslov si dokáže poradit se vzácnými nebo neznámými slovy tak, že je rozdělí na menší, běžnější součásti, a přitom stále zakóduje častá slova jako jednotlivé tokeny.
Příklad :
Zvažte slovo unhappiness
. Pomocí tokenizace podslov se může rozdělit na:
un
, happi
, and ness
.Tento přístup zajišťuje:
un
a ness
jsou znovu použity v různých slovech, což snižuje velikost slovní zásoby.unhappiness
lze stále zpracovat jejich rozdělením do známých dílčích složek, čímž se vyhnete problémům mimo slovní zásobu.
V praxi to umožňuje modelům lépe zobecňovat různé textové vstupy, aniž by došlo k nadměrnému nafouknutí slovní zásoby.
Kódování
Kódování přiřazuje každému tokenu jedinečné celé číslo na základě předem definovaného slovníku – kolekce všech možných tokenů, které model rozpozná. V kontextu GPT a podobných modelů se slovní zásoba vytváří během tréninku a představuje sadu podslov (nebo znaků), které model používá k porozumění a generování textu.
Například v GPT:
hello
může být jeden token s celočíselnou reprezentací, například 1356
.micropaleontology
lze rozdělit na tokeny podslov, jako je micro
, paleo
a ntology
, z nichž každý má své vlastní celé číslo.
Pro ChatGPT to znamená, že když uživatel zadá text, tokenizer mapuje vstupní řetězec do sekvence celých čísel na základě slovníku modelu. Tato sekvence je následně zpracována neuronovou sítí. Velikost slovní zásoby ovlivňuje využití paměti modelu a výpočetní efektivitu, přičemž dosahuje rovnováhy mezi zpracováním složitých jazykových konstrukcí a udržováním výkonnosti systému.
Dekódování
Dekódování je opačný proces: převod sekvence tokenových celých čísel zpět na text čitelný pro člověka. U tokenizace podslov to znamená opětovné sestavení podslov do úplných slov, kde je to možné.
Jak to funguje :
Příklad :
Předpokládejme, že model generuje tokeny pro un
, happi
a ness
. Dekódování to rekonstruuje na unhappiness
zřetězením podslov. Správné zacházení s mezerami zajišťuje, že un
není považováno za samostatné slovo.
Tento systém umožňuje modelům založeným na podslovech efektivně generovat text při zachování schopnosti správně reprezentovat vzácné nebo složité termíny.
Zatímco rozhraní ChatGPT API zpracovává tokenizaci automaticky, vývojáři používají tiktoken
přímo k získání jemnější kontroly nad svými aplikacemi. Umožňuje předběžnou kontrolu a správu limitů tokenů a zajišťuje, že vstupní text a odpovědi odpovídají omezením modelu. To je důležité zejména pro zamezení chybám při práci s dlouhými konverzacemi nebo dokumenty. Kromě toho mohou vývojáři optimalizovat využití tokenů a snížit náklady na rozhraní API oříznutím nebo shrnutím vstupů.
tiktoken
také pomáhá při ladění problémů s tokenizací a poskytuje transparentnost v tom, jak je text tokenizován a dekódován. Pro zpracování dlouhých vstupů může tiktoken
rozdělit text na menší části, což umožňuje zpracování velkých dokumentů po částech. A konečně, pro pokročilé případy použití, jako je vkládání nebo manipulace na úrovni tokenů, tiktoken
zajišťuje přesnou kontrolu nad tím, jak jsou tokeny generovány a zpracovávány.
import openai import tiktoken openai.api_key = "your-api-key" # Initialize tokenizer for GPT-4 encoding = tiktoken.get_encoding("cl100k_base") # Function to count tokens def count_tokens(text): return len(encoding.encode(text)) # Example input user_input = "Explain the theory of relativity in detail with examples." conversation_history = [ {"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "What is the theory of relativity?"} ] # Combine inputs for token counting conversation_text = "".join([msg["content"] for msg in conversation_history]) + user_input # Pre-check input token limit (Use Case 1) token_limit = 4096 if count_tokens(conversation_text) > token_limit: print("Trimming conversation to fit within token limit.") conversation_history = conversation_history[1:] # Trim oldest message # Optimize input by summarizing if too long (Use Case 2) def summarize_if_needed(text, max_tokens=500): if count_tokens(text) > max_tokens: print("Input too long, summarizing...") response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[ {"role": "system", "content": "Summarize the following text."}, {"role": "user", "content": text} ], max_tokens=200 ) return response.choices[0].message["content"] return text long_text = "A very long text input that exceeds the desired token limit ... (more text)" optimized_text = summarize_if_needed(long_text, max_tokens=500) # Debug tokenization (Use Case 3) tokens = encoding.encode("OpenAI's ChatGPT is amazing!") print("Tokenized:", tokens) for token in tokens: print(f"Token ID: {token}, Token: '{encoding.decode([token])}'") # Handle long documents by splitting into chunks (Use Case 4) def split_into_chunks(text, chunk_size): tokens = encoding.encode(text) for i in range(0, len(tokens), chunk_size): yield encoding.decode(tokens[i:i + chunk_size]) document = "A very long document... (more text)" chunks = list(split_into_chunks(document, chunk_size=1000)) # Process each chunk separately responses = [] for chunk in chunks: response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": chunk}], max_tokens=300 ) responses.append(response.choices[0].message["content"]) full_response = " ".join(responses) # Advanced token manipulation (Use Case 5) custom_text = "Analyze the sentiment of this text." tokens = encoding.encode(custom_text) response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=[{"role": "user", "content": encoding.decode(tokens)}], max_tokens=100 ) print("Final Response:", response.choices[0].message["content"])
Tento přístup zajišťuje jak optimální výkon, tak efektivitu nákladů při budování na ChatGPT API.
tiktoken
: Tokenizer GPT Knihovna tiktoken
OpenAI je navržena tak, aby tokenizovala efektivně a rozuměla omezením modelů GPT. Pojďme prozkoumat, jak to funguje:
Zde je příklad Pythonu, jak tokenizovat text pomocí tiktoken
. Rád používám https://colab.research.google.com/ pro provoz svých pythonových notebooků.
import tiktoken # Choose a model-specific tokenizer encoding = tiktoken.get_encoding("o200k_base") # Input text text = "Tokenization is crucial for GPT models." # Tokenize text tokens = encoding.encode(text) print("Tokens:", tokens) # Decode back to text decoded_text = encoding.decode(tokens) print("Decoded Text:", decoded_text)
Tokens: [4421, 2860, 382, 19008, 395, 174803, 7015, 13] Decoded Text: Tokenization is crucial for GPT models.
Když používáte ChatGPT API, pochopení tokenizace pomáhá optimalizovat:
Zde je praktický příklad pro výpočet využití tokenu při dotazu na ChatGPT API:
import tiktoken import openai def calculate_tokens(api_input, model="gpt-3.5-turbo"): encoding = tiktoken.encoding_for_model(model) tokens = encoding.encode(api_input) return len(tokens) # Example API call with token usage calculation api_input = "Explain the significance of tokenization in LLMs." model = "gpt-4" token_count = calculate_tokens(api_input, model) print(f"Token count for input: {token_count}") response = openai.ChatCompletion.create( model=model, messages=[{"role": "user", "content": api_input}] ) print("API Response:", response['choices'][0]['message']['content'])
Tento kód pomáhá monitorovat využití tokenu, což je zásadní pro optimalizaci nákladů a výkonu.
Pochopení tokenizace je zásadní pro inženýry vytvářející aplikace AI, protože přímo ovlivňuje, jak jsou textová data zpracovávána jazykovými modely. Tokenizace zahrnuje rozdělení surového textu na menší, smysluplné jednotky – jako jsou slova, podslova nebo znaky – které jsou základními vstupy pro tyto modely. Tento proces umožňuje vývojářům přesně řídit vstupní velikosti, optimalizovat náklady snížením zbytečného používání tokenů a zlepšit výkon modelu zajištěním segmentace textu způsobem, který zachová kontextový význam. Začlenění tokenizace přímo do kódu na straně klienta navíc může zefektivnit operace snížením režie a latence přenosu dat, což umožňuje efektivnější ukládání do mezipaměti a rychlejší předběžné zpracování. Zvládnutím tokenizace mohou inženýři budovat systémy AI, které jsou robustní a nákladově efektivní, což v konečném důsledku zlepšuje odezvu a škálovatelnost jejich aplikací.