vyvchy
    Теми розділу

    14 · AI для QA

    Токени, контекст і вартість

    Зміст

    Кожен запит до LLM — це рахунок за токени й гонка з лімітом контексту. Модель не бачить ваш текст як букви чи слова: вона ріже його на токени, і саме за токени ви платите, саме в токенах вимірюється, скільки модель здатна «тримати в голові» за один раз. Для QA це не бухгалтерія, а щоденні рішення: чому генератор автотестів «забув» половину специфікації, чому один і той самий промпт українською дорожчий за англійський, чому агент після сотні кроків починає гальмувати й помилятися.

    Зрозумієш механіку токенів і контексту — і навчишся свідомо керувати якістю, швидкістю та вартістю роботи з AI, а не покладатися на «якось воно порахується». Ця глава — місток між «Як працюють LLM» і практичним промптингом: без неї промпти пишуться наосліп.

    Токен: одиниця, якою мислить модель

    Токен (token) — це шматок тексту, яким оперує модель: частіше за все це не ціле слово й не окрема буква, а підслівний фрагмент (subword). Токенізатор (tokenizer) — алгоритм, що ріже текст на такі шматки; більшість сучасних моделей використовують різновид BPE (byte-pair encoding), який збирає найчастіші послідовності символів в окремі токени.

    Груба, але робоча оцінка для англійського тексту: приблизно 4 символи на токен, або близько ¾ слова на токен (100 токенів ≈ 75 слів). Тобто коротке речення — це кілька десятків токенів.

    Ключова пастка для нас: українська коштує дорожче. Токенізатори тренують переважно на англомовних даних, тож кирилиця ріжеться на дрібніші шматки — слово нерідко розпадається на кілька токенів. Той самий зміст українською може займати у 2–3 рази більше токенів, ніж англійською. Практичний наслідок: якщо женете великі обсяги (наприклад, генеруєте тест-кейси з україномовної специфікації), і токен-ліміт, і рахунок будуть відчутно більші, ніж підказує «на око».

    Код і структуровані дані токенізуються ще менш очевидно: відступи, дужки, лапки, довгі ідентифікатори — усе це окремі токени. Мінімізований JSON або лог на кілька екранів легко зʼїдає тисячі токенів.

    І останнє: різні моделі — різні токенізатори. Той самий рядок дасть різну кількість токенів у різних провайдерів і навіть у різних поколінь однієї моделі. Тому не можна оцінювати токени для однієї моделі лічильником від іншої (класична помилка — рахувати токени умовного Claude бібліотекою, написаною під GPT). Для точного числа є ендпоінти підрахунку токенів і офіційні токенізатори провайдера.

    Контекстне вікно: скільки модель бачить за раз

    Контекстне вікно (context window) — це максимальна кількість токенів, яку модель здатна обробити за один запит. У нього має вміститися все: системний промпт, уся історія діалогу, вкладені документи чи логи, поточне питання — і ще лишитися місце під відповідь, бо згенеровані токени теж рахуються у вікно.

    Контекстне вікно — напр. 200 000 токенів

    Системний промпт

    Історія діалогу

    Документи / логи

    Поточне питання

    Місце під відповідь (output)

    Контекстне вікно — напр. 200 000 токенів

    Системний промпт

    Історія діалогу

    Документи / логи

    Поточне питання

    Місце під відповідь (output)

    Розміри дуже різні: від кількох тисяч токенів у старих чи маленьких моделей до 200 000 і навіть 1 000 000 у сучасних. Зазвичай є ще окремий ліміт на довжину відповіді (max output) — навіть із мільйонним вікном модель не видасть вам мільйон токенів тексту за раз.

    Що критично зрозуміти QA: API моделі не має памʼяті між запитами — він stateless. «Чат» лише створює ілюзію памʼяті: клієнт щоразу надсилає всю історію повідомлень заново. Тому з кожним ходом діалогу вхід росте й рано чи пізно впирається у вікно. Коли контекст переповнюється, варіанти невеселі: помилка запиту, обрізання старих повідомлень або примусове стиснення історії — і модель справді «забуває» те, що ви їй казали двадцять реплік тому.

    Чому довгий контекст ≠ кращі відповіді

    Велике вікно спокушає: «закинемо туди все — і специфікацію, і код, і логи». Але місткість вікна й здатність моделі якісно цим користуватися — різні речі.

    Добре задокументований ефект — «загублене посередині» (lost in the middle): моделі надійніше знаходять інформацію на початку та в кінці контексту, ніж усередині. Помістіть потрібний факт у середину довгого документа — і шанс, що модель його «не помітить», зростає. Є й ширше явище деградації: що більше зайвого в контексті, то дужче розпорошується увага, і на дуже довгих входах якість, стабільність і точність можуть просідати.

    Для QA висновок прямий: не вивалюйте на модель усе підряд. Довгий контекст — це і дорожче, і повільніше, і не обовʼязково точніше. Краще подати релевантний зріз: потрібний фрагмент логу, а не весь файл; конкретний розділ вимог, а не весь Confluence. Це той самий принцип, що й у ручному тестуванні, — сфокусована перевірка бʼє «протестуй усе».

    Скільки це коштує: input проти output

    Оплата — за токени, зазвичай за мільйон (позначають MTok або /1M). Два тарифи рахуються окремо:

    • вхідні (input) токени — усе, що ви надіслали: промпт, історія, документи;
    • вихідні (output) токени — усе, що модель згенерувала.

    Головне правило: вихідні токени коштують у кілька разів дорожче за вхідні — типово в 5–6 разів. Наприклад, для моделей рівня Opus станом на липень 2026 вхід — порядку кількох доларів за мільйон токенів, а вихід — кількох десятків (співвідношення 1:5); точні цифри залежать від моделі й регулярно змінюються, тож звіряйтеся з прайсом провайдера. Врахуйте й те, що токени «міркування» (reasoning), якщо модель їх генерує, теж ідуть у вихідні.

    Звідси неочевидний наслідок — діалог дорожчає нелінійно. Оскільки історію щоразу пересилають повністю, десятий хід оплачує всі попередні девʼять як вхід:

    // Кожен наступний виклик пересилає всю історію — вхід росте з кожним ходом
    const messages = [{ role: "system", content: SPEC }]; // великий стабільний префікс
    messages.push({ role: "user", content: "Згенеруй тест-кейси для логіну" });
    messages.push({ role: "assistant", content: reply1 }); // відповідь теж лягає в історію
    messages.push({ role: "user", content: "А тепер негативні сценарії" });
    // другий запит оплачує SPEC + перше питання + першу відповідь ЗНОВУ

    Довга агентна сесія з десятками кроків і великими логами в контексті може коштувати помітно більше, ніж здається з одного «дешевого» запиту.

    Prompt caching: платити один раз за спільний префікс

    Якщо багато запитів починаються з того самого великого шматка (системний промпт, велика специфікація, приклади), цей початок можна кешувати. Prompt caching (кешування промпта) зберігає вже оброблений префікс, і наступні запити з тим самим початком читають його з кешу — набагато дешевше й швидше, ніж рахувати заново.

    Порядок цін у Anthropic станом на липень 2026: читання з кешу коштує близько 10% від звичайної ціни вхідного токена, а перший запис у кеш — трохи дорожче за звичайний вхід (1.25x за стандартного TTL). В інших провайдерів механіка й множники свої, тож звіряйтеся з документацією. Тобто вже з другого-третього повторення кеш окупається.

    Запит 2 — той самий префікс

    Запит 1

    запис у кеш ~1.25x

    читання ~0.1x замість повної ціни

    Стабільний префікс:
    системний промпт + специфікація

    Питання A

    Стабільний префікс:
    системний промпт + специфікація

    Питання B

    Кеш префікса

    Запит 2 — той самий префікс

    Запит 1

    запис у кеш ~1.25x

    читання ~0.1x замість повної ціни

    Стабільний префікс:
    системний промпт + специфікація

    Питання A

    Стабільний префікс:
    системний промпт + специфікація

    Питання B

    Кеш префікса

    Критичний нюанс — це збіг за префіксом (prefix match): кеш працює, лише поки початок запиту побайтово однаковий. Одна змінена дужка, вставлена дата чи переставлений ключ у JSON на початку — і весь кеш після цієї точки анулюється. Тому стабільне (незмінний системний промпт, документ) кладуть на початок, а мінливе (поточне питання, timestamp) — у кінець. У кеша ще є час життя (TTL; у Anthropic за замовчуванням 5 хвилин), після якого префікс треба «прогріти» заново.

    Це концептуально та сама ідея, що й HTTP-кеш (див. Кешування): зберегти вже пораховане, щоб не рахувати вдруге, з тим самим питанням валідності. Для QA це прямий важіль: якщо ви ганяєте сотню промптів проти однієї великої специфікації (генерація кейсів, ревʼю), кешування спеки економить і час прогону, і бюджет.

    Як економити контекст і гроші

    Кілька практичних прийомів, що випливають з усього вище:

    • Подавайте зріз, а не все. Релевантний фрагмент логу чи вимог замість цілого файлу — дешевше і точніше.
    • Тримайте стабільне на початку, мінливе — в кінці, щоб працювало кешування.
    • Стискайте історію. У довгих діалогах підсумовуйте попереднє замість того, щоб тягнути кожну репліку дослівно; починайте нову сесію, коли тема змінилася.
    • Використовуйте вибірку замість «запхати весь корпус». Підхід, коли в контекст підтягують лише потрібні шматки з бази знань (RAG), — окрема велика тема, але принцип той самий: менше нерелевантного в контексті.
    • Рахуйте перед відправкою. Для важливих чи масових прогонів прикидайте токени лічильником потрібної моделі, а не «на око».

    Вибір моделі під задачу

    Немає «найкращої» моделі — є доречна. Провайдери зазвичай мають лінійку: від маленьких швидких і дешевих (клас Haiku) до великих потужних і дорогих (клас Opus), з проміжними (клас Sonnet). Компроміс завжди між трьома осями: якість — швидкість — вартість.

    Орієнтир:

    • прості, масові, чітко окреслені задачі (класифікація баг-репортів, витяг полів, коротке підсумовування) — маленька швидка модель; часто різниця в якості мізерна, а в ціні й латентності — кратна;
    • складне міркування, генерація й ревʼю коду, багатокрокові агентні задачі — велика модель;
    • проміжне — середня.

    Класична помилка — брати найпотужнішу модель на все «про запас». Для тисяч дрібних викликів це спалює бюджет і час без виграшу в якості. Зворотна помилка — тягнути найдешевшу модель на задачу, де вона систематично галюцинує чи не витягує логіку. Розумний підхід — підбирати модель під конкретний крок, а в агентних системах комбінувати: дешева модель на рутину, дорога — на складні рішення.

    Типові помилки

    • Виглядає як «модель забула контекст» — а насправді історія вилізла за межі вікна й старі повідомлення обрізало. Не баг моделі, а переповнене вікно.
    • Виглядає як «токенів приблизно стільки ж» для англійської та української — а насправді той самий текст українською займає у 2–3 рази більше токенів. Оцінка за словами вводить в оману.
    • Виглядає як «великий контекст = точніше» — а насправді через lost in the middle факт у середині довгого документа модель може проігнорувати, і якість на довгому вході просідає.
    • Виглядає як «кеш не працює, хоча промпт майже той самий» — а насправді змінився початок префікса (дата, id, порядок ключів), і збіг за префіксом зламався.
    • Виглядає як «вартість = ціна одного запиту» — а насправді в діалозі історія пересилається щоразу, тож вартість росте з кожним ходом; вихідні токени ще й дорожчі за вхідні.
    • Виглядає як «візьмемо найпотужнішу модель, щоб напевно» — а насправді на простих масових задачах це зайві гроші й латентність без виграшу в якості.

    Підсумок

    • Модель оперує токенами, не словами; українська й код коштують більше токенів, ніж здається, а різні моделі рахують токени по-різному.
    • Контекстне вікно — спільний бюджет на промпт, історію, документи й відповідь; API stateless, тож історію пересилають щоразу, і вона впирається у вікно.
    • Довгий контекст не гарантує кращих відповідей: працює lost in the middle і загальна деградація — подавайте релевантний зріз.
    • Платять за токени; вихідні дорожчі за вхідні в кілька разів, а діалог дорожчає нелінійно через повторне пересилання історії.
    • Prompt caching здешевлює спільний префікс, але тримається на побайтовому збігу початку; модель обирають під задачу за трикутником якість/швидкість/ціна.

    Що питають на співбесіді

    • «Що таке токен і чому це важливо для роботи з LLM?» — інтервʼюер хоче почути, що модель оперує підслівними токенами, що від них залежать і ліміт контексту, і вартість, і що українська та код токенізуються дорожче.
    • «Що таке контекстне вікно і що станеться, якщо його перевищити?» — очікують згадку, що у вікно входить усе (промпт + історія + відповідь), що API stateless, і що при переповненні буде помилка, обрізання або стиснення, а не магічна памʼять.
    • «Чому не варто просто закидати в модель усі логи й вимоги?» — перевіряють розуміння деградації на довгому контексті (lost in the middle) і вартості; сильний кандидат говорить про подання релевантного зрізу.
    • «Чим відрізняється ціна input і output і як здешевити роботу з LLM?» — дивляться, чи знаєте, що output дорожчий, що діалог пересилає історію, і чи назвете prompt caching, стиснення контексту, вибір меншої моделі.
    • «Як обрати модель під задачу?» — хочуть побачити мислення в осях якість/швидкість/вартість, а не «беру найкращу»; плюс — приклад, де дешева модель доречна.

    Джерела