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

    14 · AI для QA

    Як працюють LLM

    Зміст

    Перш ніж просити LLM написати тест-кейси, згенерувати автотест чи пояснити падіння, варто зрозуміти одну річ: модель не «знає» відповідь і не «розуміє» ваш застосунок. Вона робить одне — передбачає наступний шматочок тексту, і робить це статистично. Якщо тримати це в голові, стає очевидно, чому та сама модель на той самий промпт (prompt) двічі відповідає по-різному, чому впевнено вигадує неіснуючий метод Playwright і чому не знає про бібліотеку, що вийшла минулого місяця. Без цієї моделі в голові ви або переоцінюєте AI («він же розумний, значить, правий»), або недооцінюєте («знову збрехав, викидаю»).

    Ця глава — фундамент усього розділу «AI для QA». Далі будуть токени й контекст, промптинг, генерація тест-артефактів і верифікація виводу — але всі вони спираються на розуміння механізму. На співбесідах це питають рідше, ніж класичний тест-дизайн, але коли питають — одразу видно, хто розуміє інструмент, а хто просто «пробував ChatGPT».

    Генерація наступного токена

    LLM (large language model, велика мовна модель) — це, по суті, дуже потужний передбачувач наступного токена (next-token prediction). Токен (token) — це шматок тексту: ціле коротке слово, частина довгого слова, знак пунктуації чи пробіл. Модель бачить весь текст перед собою й відповідає на одне питання: «який токен найімовірніше йде далі?»

    Але вона не видає один готовий токен. На кожному кроці модель обчислює розподіл імовірностей (probability distribution) по всьому своєму словнику — від десятків до сотень тисяч можливих токенів. Наприклад, після «Тест впав, бо елемент не» найімовірніші продовження — «знайдено», «видимий», «клікабельний», кожне зі своєю вагою. Потім спеціальний механізм вибирає один токен із цього розподілу, дописує його до тексту й повторює весь цикл спочатку — уже з новим, довшим текстом на вході. Так по одному токену народжується вся відповідь. Цю властивість — генерувати послідовно, спираючись на власний попередній вивід, — називають авторегресивністю (autoregressive).

    Текст на вході

    Модель рахує
    ймовірності всіх токенів

    Механізм вибору
    обирає один токен

    Дописати токен
    до тексту

    Текст на вході

    Модель рахує
    ймовірності всіх токенів

    Механізм вибору
    обирає один токен

    Дописати токен
    до тексту

    Звідси — перший важливий висновок. У моделі немає окремої «бази фактів», яку вона читає. Є ваги (weights) — мільярди числових параметрів, налаштованих так, щоб добре передбачати текст. «Знання» розмазане по цих вагах як статистичні закономірності мови. Тому LLM не шукає правильну відповідь, а продовжує текст найправдоподібнішим чином. Здебільшого правдоподібне збігається з правильним — але не завжди, і саме тут коріння всіх проблем.

    Претрейн і донавчання на пальцях

    Модель проходить два принципово різні етапи навчання.

    Претрейн (pre-training) — базове навчання. Модель «згодовують» гігантським обсягом тексту (книжки, код, статті, форуми) і змушують передбачати наступний токен мільярди разів. Ніхто не розмічає ці дані вручну — правильна відповідь щоразу вже є в самому тексті (наступне слово), тож навчання називають самонаглядовим (self-supervised). Саме на цьому етапі модель «вбирає» граматику, факти, стилі, патерни коду. Але результат претрейну — це просто дуже добрий автодоповнювач: попросиш «Напиши тест-кейс», а він може продовжити «...і ще п'ять таких завдань до понеділка», бо в текстах таке трапляється.

    Донавчання (fine-tuning) робить із автодоповнювача помічника. Спершу модель учать на прикладах «інструкція → хороша відповідь» (instruction tuning), щоб вона слідувала проханням. Потім часто застосовують навчання з підкріпленням на основі людських оцінок (reinforcement learning from human feedback, RLHF): людям показують кілька відповідей моделі, вони обирають кращі, і модель підлаштовується під ці вподобання — бути кориснішою, безпечнішою, ввічливішою.

    Гігантський корпус тексту

    Претрейн:
    передбачати наступний токен

    Базова модель
    розумний автодоповнювач

    Донавчання:
    instruction tuning + RLHF

    Модель-помічник
    слідує інструкціям

    Гігантський корпус тексту

    Претрейн:
    передбачати наступний токен

    Базова модель
    розумний автодоповнювач

    Донавчання:
    instruction tuning + RLHF

    Модель-помічник
    слідує інструкціям

    Для QA тут два практичні наслідки. По-перше, поведінка моделі — це не «чиста логіка», а результат навчання на текстах і на людських уподобаннях; звідси і схильність звучати впевнено, і бажання догодити (модель радше вигадає відповідь, ніж скаже «не знаю»). По-друге, знання моделі застигли на момент, коли зібрали тренувальні дані — до цього ми ще повернемось у розділі про knowledge cutoff.

    Температура, семплінг і недетермінізм

    Повернімось до кроку «механізм вибору обирає один токен». Як саме він обирає? Якби модель щоразу брала найімовірніший токен (це називають жадібним вибором, greedy decoding), відповіді були б одноманітні й часто гірші за якістю. Тому зазвичай застосовують семплінг (sampling) — випадковий вибір із розподілу з урахуванням ваг: імовірніший токен випадає частіше, але не завжди.

    Керують цим кілька параметрів:

    ПараметрЩо робить
    Температура (temperature)Керує «сміливістю» вибору. Ближче до 0 — модель майже завжди бере найімовірніший токен (передбачувано, детерміновано). Вище — розподіл «згладжується», рідкісні токени отримують шанс (різноманітніше, креативніше, більше ризику дурниць).
    top_kОбмежує вибір k найімовірнішими токенами, решту відкидає.
    top_p (nucleus sampling)Бере найменший набір найімовірніших токенів, чия сумарна ймовірність досягає p, і семплить лише з них.

    Точні діапазони залежать від провайдера (десь температура від 0 до 1, десь до 2) — важлива не цифра, а принцип: нижча температура = стабільніше й нудніше, вища = різноманітніше й ризикованіше.

    Звідси — недетермінізм (non-determinism), ключова властивість для QA. Той самий промпт дає різні відповіді, бо на кожному кроці працює випадковий вибір. Це не баг — це закладено в механізм. Понизити температуру майже до нуля — стане стабільніше, але навіть за температури 0 повна повторюваність не гарантована: через особливості обчислень із рухомою комою (floating point), паралельності на GPU та пакетної обробки запитів той самий вхід може зрідка дати інший вихід.

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

    Галюцинації

    Галюцинація (hallucination) — це коли модель упевнено видає інформацію, яка звучить правдоподібно, але є хибною чи вигаданою: неіснуючий метод бібліотеки, вигаданий CSS-селектор, посилання на статтю, якої немає, невірний номер RFC.

    Тепер, знаючи механізм, легко зрозуміти чому. Модель оптимізована передбачати правдоподібний текст, а не істинний. У неї немає вбудованої перевірки фактів і немає способу відрізнити «я це справді знаю» від «це виглядає так, ніби могло б бути правдою». Якщо в тренувальних текстах методи Playwright часто називаються page.клікаєш..., а вам потрібен метод, якого модель точно не бачила, вона однаково згенерує щось граматично й стилістично доречне — бо її робота продовжити текст, а не промовчати. Галюцинація — це не збій системи, а її природна поведінка на межі знань.

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

    Знання vs контекст і knowledge cutoff

    Розрізняймо два джерела, звідки модель бере інформацію для відповіді.

    Параметричне знання (parametric knowledge) — те, що «зашите» у вагах під час навчання. Воно велике, але має дві вади: розмите (модель пам'ятає патерни, а не точні цитати) і застигле в часі. Момент, до якого зібрано тренувальні дані, називають межею знань (knowledge cutoff). Після цієї дати модель просто не знає, що сталося: нові версії бібліотек, свіжі CVE, зміни у вашому продукті минулого тижня. Вона не скаже «я не в курсі» — радше впевнено видасть застаріле або галюцинацію.

    Контекст (context) — те, що ви подали в самому запиті: текст промпта, вставлені логи, фрагмент коду, документація, історія діалогу. Це джерело свіже й точне, і модель спирається на нього безпосередньо. Фактично контекст «перекриває» параметричну пам'ять: якщо ви вклеїли актуальний фрагмент API прямо в промпт, модель працюватиме з ним, а не зі своїми застарілими здогадами.

    Параметричне знанняКонтекст
    ЗвідкиВаги (навчання)Ваш промпт зараз
    СвіжістьДо knowledge cutoffАктуальне, ваше
    ТочністьРозмите, наближенеДослівне
    ОбсягВеличезнийОбмежений вікном контексту

    Практичне правило народжується саме звідси: не питай LLM про те, що вона мала б пам'ятати — дай їй це в контексті. Треба тест на новий ендпоінт? Вклей його специфікацію в промпт, а не сподівайся, що модель угадала. Саме на цій ідеї — «підтягнути потрібні факти в контекст перед відповіддю» — побудований підхід RAG (retrieval-augmented generation), про який мова у главах про тестування AI-застосунків. А межі самого контекстного вікна і його вартість — тема наступної глави «Токени, контекст і вартість».

    Embeddings оглядово

    Щоб «підтягнути потрібні факти», спершу треба їх знайти за змістом, а не за точним словом. Тут працюють embeddings (векторні представлення).

    Ембединг — це перетворення шматка тексту на вектор, тобто список із сотень чи тисяч чисел. Ключова властивість: тексти, близькі за змістом, дають близькі вектори, навіть якщо в них різні слова. «Кнопка не клікається» і «елемент не реагує на натискання» опиняться поруч у цьому просторі, а «рецепт борщу» — далеко. Близькість вимірюють, наприклад, косинусною подібністю (cosine similarity).

    Де це стає в пригоді QA:

    • Семантичний пошук по документації, тест-кейсах, історії багів — знайти схоже за змістом, а не за збігом ключових слів.
    • RAG — знайти релевантні фрагменти документації через ембединги й подати їх у контекст моделі перед відповіддю.
    • Дедуплікація — знайти дублікати баг-репортів або тест-кейсів, сформульованих різними словами.
    • Кластеризація — згрупувати схожі падіння чи скарги користувачів.

    Глибше в архітектуру трансформерів (transformer) чи математику векторів на рівні trainee лізти не треба — достатньо розуміти ідею: текст стає числами, а близькість чисел означає близькість змісту.

    Що LLM робить добре і погано для QA

    Зведімо механізм у практичну картину. LLM сильна там, де потрібен правдоподібний, добре структурований текст на основі широких патернів, і слабка там, де потрібні точність, свіжість і гарантована коректність.

    LLM робить добреLLM робить погано
    Чернетки тест-кейсів і чек-листів з вимогГарантія повноти покриття
    Генерація ідей та edge cases для мозкового штурмуТочні, реально існуючі селектори й API конкретної версії
    Каркас автотесту, шаблонний кодДетермінований, стабільний результат
    Пояснення помилки, підсумок довгого логаАктуальні факти після knowledge cutoff
    Переформатування (вимоги → Given/When/Then), regex-чернеткиТочна арифметика, підрахунки, «скільки саме»
    Переклад, рерайт, спрощення формулюваньСудження про безпеку/приватність без нагляду

    Головний принцип роботи з AI у QA випливає прямо з механізму: LLM — прискорювач чернеток та ідей, а не оракул істини. Вона економить години на рутині (набити 40 варіацій тестових даних, накидати скелет сторінкового об'єкта, пояснити незнайому помилку), але відповідальність за результат лишається на вас. Робочий цикл — «згенерував → прочитав критично → перевірив → доробив», а не «згенерував → скопіював → пішов далі».

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

    • Виглядає як «модель знає відповідь», а насправді вона продовжує текст найправдоподібніше. Впевнений тон — це стиль, натренований RLHF, а не показник правоти. Впевненість і правильність у LLM не пов'язані.
    • Виглядає як баг («чому щоразу інша відповідь?!»), а насправді це вбудований недетермінізм. Семплінг і температура роблять варіативність нормою; сталість треба спеціально вимагати (низька температура), і навіть тоді 100% гарантії немає.
    • Виглядає як факт із авторитетного джерела, а насправді це галюцинація. Вигаданий метод, неіснуючий селектор, фальшивий номер RFC подаються з тією ж інтонацією, що й правда. Модель не вміє відрізняти «знаю» від «звучить правдоподібно».
    • Виглядає як «модель у курсі свіжого», а насправді її знання застигли на knowledge cutoff. Про нову версію бібліотеки чи вчорашню зміну в продукті вона видасть застаріле — якщо ви не дали свіже в контекст.
    • Виглядає як «AI сам усе перевірив і код робочий», а насправді ніхто нічого не запускав. LLM може написати автотест, який завжди зелений, бо в ньому немає жодної реальної перевірки. Зелений тест від AI — привід придивитися уважніше, а не розслабитися.

    Підсумок

    • LLM генерує текст по одному токену, щоразу обираючи наступний з розподілу ймовірностей; вона не шукає відповідь, а продовжує текст найправдоподібніше.
    • Знання живе у вагах (розмите, застигле на knowledge cutoff) і в контексті (свіже, дослівне, обмежене вікном); свіже й точне давайте через контекст.
    • Недетермінізм вбудований: семплінг і температура роблять варіативність нормою; навіть за температури 0 повна повторюваність не гарантована.
    • Галюцинація — не збій, а наслідок механізму: оптимізується правдоподібність, а не істинність, і вбудованої перевірки фактів немає.
    • Для QA LLM — прискорювач чернеток та ідей, а не джерело істини: усе, що впливає на рішення, верифікуй окремо.

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

    • «Поясніть своїми словами, як LLM генерує відповідь». Інтерв'юер перевіряє, чи розумієте ви механізм next-token, а не сприймаєте AI як магію. Сильна відповідь згадує ймовірнісний вибір токена за токеном і авторегресивність.
    • «Чому та сама модель на той самий промпт відповідає по-різному?» Очікують слова «семплінг», «температура», «недетермінізм». Бонус — згадка, що навіть за температури 0 повна детермінованість не гарантована.
    • «Що таке галюцинація і чому вона стається?» Дивляться, чи пов'язуєте ви це з механізмом (правдоподібність замість істинності), а не описуєте як випадкову ваду. Слабка відповідь — «модель іноді бреше»; сильна — пояснює причину й способи знизити ризик.
    • «Що таке knowledge cutoff і як його обійти?» Хочуть почути різницю «знання у вагах vs контекст» і що свіже подають у промпт (аж до RAG).
    • «Коли б ви НЕ довіряли виводу LLM?» Червоний прапорець для інтерв'юера — «AI все зробить сам». Сильний кандидат каже: усе, що впливає на рішення (факти, селектори, код), перевіряю виконанням чи джерелом; AI прискорює, відповідальність — на мені.

    Джерела