Какво е LLM и как мисли в токени
Солидна основа без излишна математика. Ще разбереш как трансформърът обработва текст, защо контекстният прозорец е най-важният ти ресурс, защо българският текст струва повече токени и как embeddings правят смисъла изчислим.
01Какво ще научиш
- Какво е LLM и как self-attention „свързва“ думите в изречението.
- Кога ти трябва inference, кога fine-tuning и защо pre-training почти никога.
- Как размерът на модела и квантизацията определят нужната памет.
- Какво е токен, защо българският струва повече токени и как това удря бюджета.
- Какво е контекстен прозорец и три начина да го управляваш.
- Какво са embeddings, как се сравняват и кой модел да избереш за RAG на български.
02Преди да започнеш
- Основи на Python — ще четеш и пускаш кратки примери.
- Интуиция за вектор като „списък от числа“ — без линейна алгебра на изпит.
- По желание: Python 3 с
pip install tiktoken🔒 локално, за да броиш токени сам. - По желание: Ollama 🔒 локално с embedding модел — за примера с косинусова близост.
03Стъпки
-
Какво е LLM — трансформърът без дълбока математика
Large Language Model (LLM) е невронна мрежа, обучена да предсказва следващия токен (парче от дума) въз основа на всички предишни токени. Простото предсказване на „следващата дума“, повторено милиарди пъти, поражда привидно разбиране на езика.
Преди трансформъра (2017, Google, „Attention Is All You Need“) мрежите четяха текста последователно, дума по дума — и краят на изречението „забравяше“ началото. Трансформърът решава това със self-attention: всяка дума може да „погледне“ всяка друга едновременно.
Етап Какво става 1. Вход текстът се реже на токени: „Котката“ · „яде“ · „риба“ 2. Векторизация всеки токен става вектор (embedding) + позиция в изречението 3. Обработка self-attention + feed-forward мрежа, повторени в много слоеве (десетки) 4. Вероятности logits — вероятност за всеки възможен следващ токен 5. Избор sampling с настройки като temperature и top_p Self-attention е по-просто, отколкото звучи: за всяка дума механизмът пита „кои други думи са важни, за да разбера тази?“. В „Котката яде риба, защото е гладна“ при „е“ вниманието отива към „Котката“, не към рибата. Тази способност за далечни връзки прави трансформърите силни.
💡Аналогия: вниманието при четенеКогато четеш, не даваш еднакво внимание на всяка дума. В „Той върна книгата в библиотеката, защото я дочете“ — „я“ се свързва с „книгата“, не с „библиотеката“. Self-attention изчислява такива връзки автоматично. -
Pre-training, fine-tuning, inference — кога кое
Трите фази имат коренно различни нужди от ресурси, данни и цел. Смесването им е честа грешка при планиране на AI проект.
Фаза Какво се прави GPU Данни Кога Pre-training учим модела от нулата върху огромен корпус хиляди GPU · месеци трилиони токени само големи лаборатории (OpenAI, Meta, Mistral…) Fine-tuning дообучаваме готов модел за конкретна задача 1–8 GPU · часове/дни стотици до хиляди примера домейн (медицина, право, фирмен стил) Inference ползваме обучен модел за отговори 1 GPU (или CPU) · секунди само входният промпт всеки ден, във всяко приложение ✅Правило за 95% от проектитеЩе работиш почти само с inference. Fine-tuning е нужен, когато промпт инженерингът и RAG не стигат. Pre-training — практически никога, освен ако нямаш бюджет от милиони за изчисления. -
Размер на модела — параметри и памет
„7B“, „13B“, „70B“ е броят параметри (тегла). Повече параметри = по-добро разбиране, но повече памет и по-бавен отговор. Грубо: памет ≈ параметри × байтове на тегло. Квантизацията (напр. Q4 ≈ половин байт на тегло) намалява размера многократно при малка загуба на качество.
Размер fp16 (без квантизация) Q4 Практически 7B ~14 GB ~4 GB бърз, добър за прости задачи; върви на обикновена карта 13B ~26 GB ~8 GB балансирано качество · карта от класа 16–24 GB 34B ~68 GB ~20 GB Q4 се побира в една 24 GB карта; fp16 — сървърен клас 70B ~140 GB ~40 GB сървърен хардуер или машина с голяма обща памет ⚠️Халюцинации — основният рискLLM генерира статистически правдоподобен текст, не проверени факти. Може да измисли имена, дати и цитати с пълна увереност. Затова RAG (Retrieval-Augmented Generation) е толкова важен — „заземява“ модела в реални документи. -
Какво е токен — и защо българският е по-скъп
Токенът не е дума. BPE (Byte Pair Encoding), най-разпространеният алгоритъм, реже текста по честота на символните комбинации: честа дума = 1 токен, рядка дума = няколко, по-рядко срещан в обучението език = повече токени.
Текст Думи Токени · GPT-4 (cl100k) Токени · GPT-4o (o200k) „Изкуственият интелект промени света“ 4 16 10 „Artificial intelligence changed the world“ 5 6 5 „невроендокринен“ (рядка медицинска дума) 1 10 6 📏ОБНОВЕНО · 01.10.2026 — измерено, не на окоСтарият урок даваше 11 / 5 / 6 токена „за GPT-4“ и „~2,5× повече за български“. Преброихме с tiktoken 0.14. Върху целия текст на урока (същото съдържание на двата езика): българският е ~3,1 токена на дума при GPT-4 и ~2,2 при GPT-4o, английският ~1,4. Тоест българският струва ~2× повече токени при GPT-4 и ~1,5× при GPT-4o. По-новите токенизатори са по-добри към кирилицата — но тя остава по-скъпа.💰Токените имат пряка ценаПри API плащаш на токен. GPT-4o 🌐 глобален: $2,50 за 1 млн. входни токена (цена на OpenAI, в USD, към 01.10.2026). 10 000 документа на месец × 500 думи × ~2,2 токена = ~11 млн. токена ≈ $27,50 само за входа. Оптимизирането на промптите не е естетика, а финансово решение.
ОБНОВЕНО · 01.10.2026 — старият урок ползваше първоначалната цена $0,005 / 1K ($5 / 1 млн.) и ~700 токена за 500 думи; вярното е ~1100.Python · преброй токените сам 🔒 локалноimport tiktoken enc = tiktoken.encoding_for_model("gpt-4o") # o200k_base; за GPT-4: get_encoding("cl100k_base") for s in ["Изкуственият интелект промени света", "Artificial intelligence changed the world"]: print(len(enc.encode(s)), s) -
Контекстен прозорец — работната памет на модела
Контекстният прозорец е максималният брой токени, които моделът „вижда“ наведнъж — системният промпт, историята и текущото запитване заедно. Всичко извън него е невидимо.
Модел Прозорец Бележка GPT-3.5 Turbo 🌐 16K стар модел — за сравнение; ~12 000 думи на английски GPT-4o 🌐 128K ~200 страници английски текст Claude Sonnet 5.5 🌐 1M Claude Haiku 4.5 — 200K Gemini 3.1 Pro (preview) 🌐 1M 1 048 576 входни токена Llama 3.2 🔒 локално 128K 1B и 3B; типично за отворените модели 🔄ОБНОВЕНО · 01.10.2026 — прозорците растатСтарият урок сочеше „GPT-4o / Claude Sonnet — 128K“ и „Gemini 1.5 Pro — 1M“. Claude Sonnet вече е с 1M, а Gemini 1.5 е спрян — заменихме го с Gemini 3.1 Pro (Gemini 2.5 Pro вече е достъпен само за досегашни потребители; проверено 01.10.2026). Числата се менят често: провери в документацията на доставчика преди проект. Помни и че в български текст една страница струва повече токени.Пример за разпределение в дълъг разговор: системен промпт ~15%, история ~45%, текущо запитване ~20%, свободен буфер ~20%. При 128K прозорец 57K токена история × $2,50 / 1 млн. ≈ $0,14 на всяко запитване — затова управлението на историята е критично за разходите.
Три основни стратегии, когато историята напълни прозореца:
Python · три стратегии за управление на контекста# Стратегия 1: плъзгащ се прозорец — пазим системния промпт + последните N съобщения def sliding_window(messages, max_messages=10): system = [m for m in messages if m["role"] == "system"] history = [m for m in messages if m["role"] != "system"] return system + history[-max_messages:] # Стратегия 2: обобщение — старата история се свива до няколко изречения async def summarize_history(old_messages, llm_client): prompt = f"""Обобщи тази разговорна история в 3–5 изречения, запазвайки ключовите факти и решения: {old_messages}""" summary = await llm_client.complete(prompt) # твоят клиент към модела return [{"role": "system", "content": f"Обобщение: {summary}"}] # Стратегия 3: бюджет на токени — броим и режем най-старото import tiktoken def count_tokens(messages, model="gpt-4o"): enc = tiktoken.encoding_for_model(model) return sum(len(enc.encode(m["content"])) + 4 for m in messages) # +4 ≈ служебни токени def trim_to_budget(messages, max_tokens=100_000): while count_tokens(messages) > max_tokens: for i, m in enumerate(messages): if m["role"] != "system": messages.pop(i) break else: break # останаха само системни — спираме return messages⚠️Капан: tiktoken брои само за OpenAItiktoken е токенизаторът на моделите на OpenAI. Claude, Gemini и отворените модели ползват свои токенизатори — там броят ще е различен. За тях ползвай инструмента за броене на съответния доставчик или токенизатора на самия модел. (ОБНОВЕНО · 01.10.2026 — старият урок твърдеше, че tiktoken е съвместим с Claude.) -
Embeddings — думите като координати
Embedding е плътен вектор от числа, който представя смисъла на текст. Ключовото свойство: близки по смисъл текстове имат близки вектори. Това е основата на RAG, семантичното търсене и класификацията.
🔑Разстояние = смислова близоствектор("крал") − вектор("мъж") + вектор("жена") ≈ вектор("кралица")
Класическият пример показва, че embeddings кодират аналогии, синоними и противоположности като геометрия в многомерно пространство.Представи си карта: „котка“, „куче“, „риба“, „птица“ са в един ъгъл; „кола“, „влак“, „самолет“, „кораб“ — в друг; „свобода“, „демокрация“, „права“ — в трети. В реалността векторите имат стотици до хиляди измерения (напр. 384, 768, 1024, 1536), не две — но принципът е същият. Стандартната мярка е косинусова близост: тя гледа ъгъла между векторите, не дължината им.
Python · embeddings с локален модел чрез Ollama 🔒 локалноimport ollama import numpy as np # Локално: без интернет и без такса на токен. Първо: ollama pull bge-m3 def embed(text: str) -> list[float]: r = ollama.embed(model="bge-m3", input=text) # многоезичен, 1024 измерения return r.embeddings[0] def cosine_similarity(v1, v2) -> float: a, b = np.array(v1), np.array(v2) return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))) for w1, w2 in [("котка", "коте"), ("котка", "куче"), ("котка", "автомобил")]: print(f"{w1} ↔ {w2}: {cosine_similarity(embed(w1), embed(w2)):.3f}") # Очакване: „котка–коте“ най-близо, „котка–автомобил“ най-далеч. # Точните числа зависят от модела — пусни и виж.Модел Измерения Езици Размер Бележка bge-m3 🔒 1024 многоезичен (100+) ~1,2 GB добър старт за български · в Ollama · прозорец 8K nomic-embed-text 🔒 768 основно английски ~274 MB бърз, прозорец 2K · в Ollama mxbai-embed-large 🔒 1024 основно английски ~670 MB силен за английски · прозорец 512 · в Ollama all-MiniLM-L6-v2 🔒 384 английски ~90 MB много бърз · за системи само на английски text-embedding-3-small 🌐 1536 многоезичен само API OpenAI · $0,02 / 1 млн. токена · не е локален 🎯ОБНОВЕНО · 01.10.2026 — препоръката за български е смененаСтарият урок препоръчваше nomic-embed-text и mxbai-embed-large като многоезични. Проверено: и двата са обучени основно на английски (картите им на Hugging Face са с етикет „en“). За RAG на български започни с многоезичен модел като bge-m3 и винаги тествай с реални документи от твоя домейн — разликите в качеството са големи.
04Проверка
1. Кой фактор НАЙ-СИЛНО определя нужната памет при inference?
2. Медицинска фирма иска AI асистент за клинични протоколи. Кое е НАЙ-подходящото като първа стъпка?
3. Български текст от 500 думи — колко токена приблизително (GPT-4 / GPT-4o)?
4. Защо косинусовата близост се предпочита пред евклидовото разстояние при embeddings?
Обобщение
- LLM предсказва следващия токен чрез self-attention — не „мисли“, а прилага статистически шаблони.
- Pre-training ≠ fine-tuning ≠ inference — смесването им е скъпа грешка.
- Параметри × квантизация = памет: 7B Q4 ≈ 4 GB · 70B Q4 ≈ 40 GB.
- Токен ≠ дума. Българският струва ~1,5–2× повече токени от английския за същото съдържание.
- Контекстният прозорец е работната памет — всичко извън него е невидимо.
- Embeddings = смислови координати; сравняват се с косинусова близост.
- За RAG на български — многоезичен embedding модел, тестван върху твоите документи.
05Какво следва
06Източници
- „Attention Is All You Need“ (2017) — оригиналната статия; раздел 3 описва слоевете.
- The Illustrated Transformer — Jay Alammar — най-доброто визуално обяснение.
- 3Blue1Brown — Transformers, the tech behind LLMs — видео, ~27 мин (по-рано озаглавено „But what is a GPT?“).
- OpenAI Tokenizer — въведи текст и виж токените.
- tiktoken — библиотеката на OpenAI за броене на токени.
- OpenAI — цени на API — GPT-4o и text-embedding-3-small.
- Anthropic — преглед на моделите Claude — контекстни прозорци.
- Google — модели Gemini — лимити на токените.
- bge-m3, nomic-embed-text, mxbai-embed-large — embedding моделите в Ollama.
- MTEB Leaderboard — класиране на embedding модели по задачи.
- Собствено измерване на КАГАМИ, 01.10.2026: tiktoken 0.14 върху текста на този урок на двата езика.