Токенізація — це шлюз, через який необроблений текст перетворюється у формат, придатний для використання великими мовними моделями (LLM), такими як GPT. Він діє як міст між зрозумілим для людини вмістом і числовими даними, які обробляються моделями. Перш ніж модель зможе зрозуміти або створити зв’язний текст, вона повинна розбити вхідні дані на менші одиниці, які називаються токенами .
В архітектурі GPT токенізація є фундаментальною для продуктивності та можливостей моделі, впливаючи на ефективність, використання контекстного вікна та якість виведення. Токенізація — це процес розбиття тексту на менші одиниці, звані токенами, які можуть представляти слова, підслова, символи або навіть спеціальні символи. Ці маркери є основними будівельними блоками, які обробляє модель. Спосіб токенізації тексту безпосередньо впливає на те, наскільки ефективно модель може обробляти дані, скільки інформації вміщується в контекстне вікно та якість відповідей, які вона генерує.
Контекстне вікно — це максимальна кількість токенів, які модель може обробити за одну операцію, включаючи як вхідні, так і згенеровані вихідні дані. Наприклад, модель із контекстним вікном із 32 000 токенів має вмістити все — ваш введений текст, системні інструкції та відповідь моделі — у межах цього ліміту. Ефективна токенізація зменшує кількість токенів, необхідних для представлення певного тексту, що дає змогу включати більше вмісту або отримувати довші, багатші виходи, не перевищуючи обмеження. З іншого боку, погана токенізація може без потреби збільшити кількість токенів, втрачаючи цінний простір у вікні контексту та обмежуючи зручність використання моделі для більш тривалих завдань.
Після того, як текст токенізовано, кожен токен перетворюється на числове вбудовування — математичне представлення у багатовимірному просторі (часто сотні чи тисячі вимірів). Це вбудовування фіксує значення та зв’язки лексеми в контексті всього словника. Наприклад, лексеми для подібних слів, як-от «бігти» та «біг», будуть розташовані ближче до цього місця, ніж непов’язані лексеми, як-от «бігти» та «стіл». Ці вбудовування дозволяють моделі зрозуміти послідовність токенів і передбачити найбільш ймовірний наступний токен під час генерації тексту. Саме цей процес дозволяє GPT виробляти узгоджені, контекстуально релевантні результати, будь то відповідь на запит, завершення речення чи генерування творчого вмісту.
По суті, токенізація — це не просто етап попередньої обробки — це критично важливий засіб для ефективного функціонування моделей GPT і надання високоякісних результатів.
Токенізація не є універсальним процесом; він змінюється залежно від попередньо визначених правил або алгоритмів, призначених для розбиття тексту на керовані одиниці, які називаються маркерами.
Ось більш глибокий погляд на те, як це працює:
Розщеплення
Це передбачає поділ тексту на менші одиниці, такі як слова, підслова або символи. Сучасні LLM часто покладаються на токенізацію підслів , оскільки вона забезпечує баланс між ефективністю та надійністю. Цей баланс виникає через те, що токенізація підслів може обробляти рідкісні або невідомі слова, розбиваючи їх на більш дрібні, більш поширені компоненти, водночас кодуючи часті слова як окремі лексеми.
приклад :
Розглянемо слово unhappiness
. Використовуючи токенізацію підслова, воно може зламати:
un
, happi
і ness
.Такий підхід забезпечує:
un
і ness
повторно використовуються в різних словах, зменшуючи розмір словника.unhappiness
все ще можна обробити, розділивши їх на відомі підкомпоненти, уникаючи проблем із словниковим запасом.
На практиці це дозволяє моделям краще узагальнювати різноманітні текстові введення без надмірного роздування словникового запасу.
Кодування
Кодування призначає унікальне ціле число кожному токену на основі попередньо визначеного словника — сукупності всіх можливих токенів, які розпізнає модель. У контексті GPT та подібних моделей словник створюється під час навчання та являє собою набір підслів (або символів), які модель використовує для розуміння та створення тексту.
Наприклад, у GPT:
hello
може бути одним маркером із цілим представленням, наприклад 1356
.micropaleontology
можна розбити на лексеми підслів, як-от micro
, paleo
та ntology
, кожна з яких має своє ціле число.
Для ChatGPT це означає, що коли користувач вводить текст, токенізатор відображає вхідний рядок у послідовність цілих чисел на основі словника моделі. Ця послідовність потім обробляється нейронною мережею. Розмір словникового запасу впливає на використання пам’яті моделлю та ефективність обчислень, встановлюючи баланс між обробкою складних мовних конструкцій і підтриманням продуктивності системи.
Розшифровка
Декодування — це зворотний процес: перетворення послідовності цілих чисел маркерів назад у зрозумілий людині текст. Для токенізації підслів це передбачає перекомпонування підслів у повні слова, де це можливо.
Як це працює :
приклад :
Припустимо, модель генерує токени для un
, happi
і ness
. Декодування перетворює це на unhappiness
шляхом об’єднання підслів. Правильне використання пробілів гарантує, що un
не розглядатиметься як окреме слово.
Ця система дозволяє моделям на основі підслів ефективно генерувати текст, зберігаючи здатність правильно представляти рідкісні або складні терміни.
У той час як ChatGPT API обробляє токенізацію автоматично, розробники використовують tiktoken
безпосередньо, щоб отримати точніший контроль над своїми програмами. Це дозволяє попередньо перевіряти та керувати обмеженнями маркерів , гарантуючи, що введений текст і відповіді відповідають обмеженням моделі. Це особливо важливо для уникнення помилок при роботі з довгими розмовами або документами. Крім того, розробники можуть оптимізувати використання токенів , щоб зменшити витрати на API, обрізаючи або підсумовуючи вхідні дані.
tiktoken
також допомагає у вирішенні проблем токенізації , забезпечуючи прозорість того, як текст токенізується та декодується. Для обробки довгих введених даних tiktoken
може розділяти текст на менші фрагменти, що дозволяє обробляти великі документи частинами. Нарешті, для складних випадків використання, таких як вбудовування або маніпуляції на рівні токенів, tiktoken
забезпечує точний контроль над тим, як генеруються та обробляються токени.
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"])
Цей підхід забезпечує як оптимальну продуктивність, так і економічну ефективність під час розробки на основі API ChatGPT.
tiktoken
: Tokenizer GPT Бібліотека tiktoken
OpenAI розроблена для ефективної токенізації та розуміння обмежень моделей GPT. Давайте дослідимо, як це працює:
Ось приклад Python, як токенізувати текст за допомогою tiktoken
. Мені подобається використовувати https://colab.research.google.com/ для запуску моїх блокнотів Python.
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.
Під час використання API ChatGPT розуміння токенізації допомагає оптимізувати:
Ось практичний приклад розрахунку використання маркера під час запиту до 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'])
Цей код допомагає контролювати використання токенів, що має вирішальне значення для оптимізації витрат і продуктивності.
Розуміння токенізації має важливе значення для інженерів, які створюють програми ШІ, оскільки це безпосередньо впливає на те, як текстові дані обробляються мовними моделями. Токенізація передбачає розбиття необробленого тексту на менші значущі одиниці, такі як слова, підслова або символи, які є основними вхідними даними для цих моделей. Цей процес дозволяє розробникам точно керувати розмірами вхідних даних, оптимізувати витрати за рахунок зменшення непотрібного використання маркерів і покращити продуктивність моделі, забезпечивши сегментацію тексту таким чином, щоб зберегти контекстне значення. Крім того, включення токенізації безпосередньо в код на стороні клієнта може оптимізувати операції за рахунок зменшення витрат на передачу даних і затримки, забезпечуючи ефективніше кешування та швидшу попередню обробку. Освоївши токенізацію, інженери можуть створювати системи штучного інтелекту, які є одночасно надійними та економічно ефективними, зрештою підвищуючи швидкість реагування та масштабованість своїх програм.