Tokenizavimas yra vartai, per kuriuos neapdorotas tekstas paverčiamas formatu, kurį gali naudoti dideli kalbos modeliai (LLM), pvz., GPT. Jis veikia kaip tiltas tarp žmogaus skaitomo turinio ir skaitmeninių duomenų, kuriuos modeliuoja procesas. Kad modelis galėtų suprasti arba generuoti nuoseklų tekstą, jis turi suskaidyti įvestį į mažesnius vienetus, vadinamus prieigos raktais .
GPT architektūrose prieigos raktas yra labai svarbus modelio veikimui ir galimybėms, turintis įtakos efektyvumui, kontekstinio lango naudojimui ir išvesties kokybei. Ženklinimas yra teksto skaidymas į mažesnius vienetus, vadinamus žetonais, kurie gali reikšti žodžius, požodžius, simbolius ar net specialius simbolius. Šie žetonai yra pagrindiniai modelio apdorojami elementai. Teksto atpažinimo būdas tiesiogiai veikia tai, kaip efektyviai modelis gali apdoroti duomenis, kiek informacijos telpa jo konteksto lange ir jo generuojamų atsakymų kokybei.
Konteksto langas yra didžiausias žetonų skaičius, kurį modelis gali apdoroti per vieną operaciją, įskaitant įvestį ir sugeneruotą išvestį. Pavyzdžiui, modelis su 32 000 žetonų konteksto langu turi atitikti viską – įvesties tekstą, sistemos instrukcijas ir modelio atsakymą – neviršijant šios ribos. Veiksmingas prieigos raktas sumažina žetonų, reikalingų tam tikram tekstui, skaičių, todėl galite įtraukti daugiau turinio arba gauti ilgesnius, turtingesnius rezultatus neviršijant limito. Kita vertus, prastas prieigos raktas gali be reikalo padidinti žetonų skaičių, išeikvoti vertingą erdvę konteksto lange ir apriboti modelio naudojimą atliekant ilgesnes užduotis.
Kai tekstas yra įjungtas, kiekvienas atpažinimo ženklas paverčiamas skaitmeniniu įterpimu – matematinį atvaizdą didelės apimties erdvėje (dažnai šimtai ar tūkstančiai matmenų). Šis įterpimas fiksuoja žetono reikšmę ir ryšius viso žodyno kontekste. Pavyzdžiui, panašių žodžių, tokių kaip „bėgti“ ir „bėgti“, žetonai šioje vietoje bus dedami arčiau nei nesusiję žetonai, pvz., „bėgti“ ir „stalas“. Šie įterpimai leidžia modeliui suprasti žetonų seką ir nuspėti greičiausiai kitą žetoną generuojant tekstą. Šis procesas leidžia GPT sukurti nuoseklius, kontekstui svarbius rezultatus, nesvarbu, ar atsakant į užklausą, užbaigiant sakinį, ar kuriant kūrybinį turinį.
Iš esmės tokenizavimas nėra tik išankstinio apdorojimo žingsnis – tai labai svarbi priemonė, leidžianti GPT modeliams efektyviai veikti ir teikti aukštos kokybės rezultatus.
Tokenizavimas nėra universalus procesas; ji skiriasi priklausomai nuo iš anksto nustatytų taisyklių arba algoritmų, skirtų tekstui skaidyti į valdomus vienetus, vadinamus žetonais.
Čia išsamiau apžvelgsime, kaip tai veikia:
Skaldymas
Tai apima teksto padalijimą į mažesnius vienetus, tokius kaip žodžiai, požodžiai ar simboliai. Šiuolaikinės LLM dažnai pasikliauja požodžių žymėjimu , nes tai užtikrina efektyvumo ir tvirtumo pusiausvyrą. Ši pusiausvyra atsiranda dėl to, kad požodžių prieigos raktas gali apdoroti retus ar nežinomus žodžius, suskaidydamas juos į mažesnius, dažniau pasitaikančius komponentus, o dažnus žodžius vis tiek užkoduodamas kaip atskirus žetonus.
Pavyzdys :
Apsvarstykite žodį unhappiness
. Naudojant požodžio prieigos raktą, jis gali suskaidyti į:
un
, happi
, and ness
.Šis metodas užtikrina:
un
ir ness
pakartotinai naudojami skirtinguose žodžiuose, todėl sumažėja žodynas.unhappiness
vis tiek galima apdoroti suskirstant juos į žinomas sudedamąsias dalis, išvengiant problemų, susijusių su žodynu.
Praktiškai tai leidžia modeliams geriau apibendrinti įvairias teksto įvestis, per daug neišplečiant žodyno.
Kodavimas
Kodavimas kiekvienam prieigos raktui priskiria unikalų sveikąjį skaičių pagal iš anksto nustatytą žodyną – visų galimų žetonų rinkinį, kurį atpažįsta modelis. GPT ir panašių modelių kontekste žodynas sukuriamas mokymo metu ir atspindi požodžių (arba simbolių) rinkinį, kurį modelis naudoja tekstui suprasti ir generuoti.
Pavyzdžiui, GPT:
hello
gali būti vienas ženklas su sveikuoju skaičiumi, pvz., 1356
.micropaleontology
gali būti suskirstytas į požodžių žetonus, tokius kaip micro
, paleo
ir ntology
, kurių kiekvienas turi savo sveikąjį skaičių.
„ChatGPT“ atveju tai reiškia, kad kai vartotojas įveda tekstą, prieigos raktas susieja įvesties eilutę į sveikųjų skaičių seką pagal modelio žodyną. Tada šią seką apdoroja neuroninis tinklas. Žodyno dydis turi įtakos modelio atminties naudojimui ir skaičiavimo efektyvumui, užtikrinant pusiausvyrą tarp sudėtingų kalbos konstrukcijų tvarkymo ir sistemos našumo išlaikymo.
Dekodavimas
Dekodavimas yra atvirkštinis procesas: sveikųjų žetonų sekos konvertavimas atgal į žmogaus skaitomą tekstą. Naudojant požodį, tai apima, jei įmanoma, iš naujo sudėti požodžius į užbaigtus žodžius.
Kaip tai veikia :
Pavyzdys :
Tarkime, kad modelis generuoja un
, happi
ir ness
žetonus. Dekodavimas rekonstruoja tai į unhappiness
, sujungdamas požodžius. Tinkamas tarpų valdymas užtikrina, kad un
nebūtų traktuojamas kaip atskiras žodis.
Ši sistema leidžia antriniais žodžiais pagrįstiems modeliams efektyviai generuoti tekstą, išlaikant galimybę teisingai pateikti retus ar sudėtingus terminus.
Nors „ChatGPT“ API automatiškai apdoroja prieigos raktą, kūrėjai tiktoken
naudoja tiesiogiai, kad galėtų tiksliau valdyti savo programas. Tai leidžia iš anksto patikrinti ir tvarkyti prieigos raktų ribas , užtikrinant, kad įvesties tekstas ir atsakymai atitiktų modelio apribojimus. Tai ypač svarbu norint išvengti klaidų dirbant su ilgais pokalbiais ar dokumentais. Be to, kūrėjai gali optimizuoti prieigos raktų naudojimą , kad sumažintų API išlaidas, apkarpydami arba apibendrindami įvestis.
tiktoken
taip pat padeda derinti atpažinimo problemas ir suteikia skaidrumo, kaip tekstas yra ženklinamas ir dekoduojamas. Norėdami apdoroti ilgas įvestis , tiktoken
gali padalyti tekstą į mažesnius gabalus, kad būtų galima apdoroti didelius dokumentus dalimis. Galiausiai, išplėstinio naudojimo atvejais, pvz., įterpiant arba manipuliuojant žetonų lygiu, tiktoken
užtikrina tikslią žetonų generavimo ir apdorojimo kontrolę.
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"])
Šis metodas užtikrina optimalų našumą ir ekonomiškumą kuriant ChatGPT API.
tiktoken
tyrinėjimas: GPT žetonų priemonė OpenAI tiktoken
biblioteka sukurta taip, kad būtų galima efektyviai naudoti žetonus ir suprasti GPT modelių apribojimus. Panagrinėkime, kaip tai veikia:
Štai Python pavyzdys, kaip suvesti tekstą naudojant tiktoken
. Man patinka naudoti https://colab.research.google.com/ savo Python bloknotams.
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.
Naudojant „ChatGPT“ API supratimas apie prieigos raktą padeda optimizuoti:
Štai praktinis pavyzdys, kaip apskaičiuoti prieigos rakto naudojimą teikiant užklausą „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'])
Šis kodas padeda stebėti prieigos raktų naudojimą, o tai labai svarbu optimizuojant išlaidas ir našumą.
Tokenizacijos supratimas yra būtinas inžinieriams, kuriantiems AI programas, nes tai tiesiogiai veikia tai, kaip tekstiniai duomenys apdorojami kalbos modeliais. Ženklinimas apima neapdoroto teksto suskaidymą į mažesnius, reikšmingus vienetus, tokius kaip žodžiai, požodžiai ar simboliai, kurie yra pagrindinė šių modelių įvestis. Šis procesas leidžia kūrėjams tiksliai valdyti įvesties dydžius, optimizuoti išlaidas sumažinant nereikalingą prieigos rakto naudojimą ir pagerinti modelio našumą užtikrinant, kad tekstas būtų segmentuojamas taip, kad būtų išlaikyta kontekstinė reikšmė. Be to, tiesiogiai įtraukus prieigos raktą į kliento kodą, galima supaprastinti operacijas, sumažinant duomenų perdavimo sąnaudas ir delsą, o tai leidžia efektyviau kaupti talpyklą ir greičiau atlikti išankstinį apdorojimą. Įvaldydami žetonų naudojimą, inžinieriai gali sukurti DI sistemas, kurios būtų tvirtos ir ekonomiškos, o tai galiausiai padidins jų taikomųjų programų reagavimą ir mastelio keitimą.