Як працюють 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): людям показують кілька відповідей моделі, вони обирають кращі, і модель підлаштовується під ці вподобання — бути кориснішою, безпечнішою, ввічливішою.
Для 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.click(...) чи page.waitFor..., а вам потрібен метод, якого модель точно не бачила, вона однаково згенерує щось схоже за формою — граматично й стилістично доречне — бо її робота продовжити текст, а не промовчати. Галюцинація — це не збій системи, а її природна поведінка на .
Що підвищує : питання про рідкісні чи свіжі речі (конкретні версії, точні сигнатури API), прохання назвати точні цифри чи джерела, вища температура, довгі ланцюжки міркувань. Що знижує: дати моделі факти прямо в промпт (замість покладатися на пам'ять), просити позначати невпевненість, перевіряти вивід виконанням. Для QA висновок жорсткий: будь-який факт від LLM, що впливає на рішення, підлягає перевірці — детальніше у главі «Верифікація результатів AI».
Одне уточнення про межу терміна. Галюцинація — не єдиний клас дефектів виводу: силабус ISTQB CT-GenAI ціллю GenAI-3.1.1 (K1) вимагає розрізняти три, і решта два з галюцинацією не збігаються.
- (reasoning error) — модель хибно тлумачить логічну структуру: причинність, умовну логіку, покрокове розв'язання. Причина названа в силабусі прямо —
Unlike humans, LLMs lack true logical reasoning and rely on pattern matching. Факти при цьому можуть бути справжніми, хибний — саме перехід між ними. Типові задачі, де це вилазить, — планування тестування й пріоритизація кейсів. - Упередження (bias) — походить із даних навчання й схиляє вивід до певних типів інформації, підходів чи припущень. Для QA це, наприклад, перекіс генерації в бік функціональних перевірок на шкоду нефункціональним.
Різниця не термінологічна: способи виявлення в силабуса для кожного класу різні. Галюцинацію ловлять звіркою з документацією й перевіркою узгодженості; помилку міркування — прогоном згенерованого артефакту й перевіркою логічного ланцюга; упередження — рев'ю на предмет того, чи справді відповідає тест-стратегії.
Знання vs контекст і knowledge cutoff
Розрізняймо два джерела, звідки модель бере інформацію для відповіді.
Параметричне знання (parametric knowledge) — те, що «зашите» у вагах під час навчання. Воно велике, але має дві вади: розмите (модель пам'ятає патерни, а не точні цитати) і застигле в часі. Момент, до якого зібрано тренувальні дані, називають межею знань (knowledge cutoff). Після цієї дати модель просто не знає, що сталося: нові версії бібліотек, свіжі , зміни у вашому продукті минулого тижня. Вона не скаже «я не в курсі» — радше впевнено видасть застаріле або галюцинацію.
Контекст (context) — те, що ви подали в самому запиті: текст промпта, вставлені логи, фрагмент коду, документація, історія діалогу. Це джерело свіже й точне, і модель спирається на нього безпосередньо. Фактично контекст «перекриває» параметричну пам'ять: якщо ви вклеїли актуальний фрагмент API прямо в промпт, модель здебільшого працюватиме з ним, а не зі своїми застарілими здогадами.
| Параметричне знання | Контекст | |
|---|---|---|
| Звідки | Ваги (навчання) | Ваш промпт зараз |
| Свіжість | До knowledge cutoff | Актуальне, ваше |
| Точність | Розмите, наближене | Дослівне |
| Обсяг | Величезний | Обмежений вікном контексту |
Практичне правило народжується саме звідси: не питай LLM про те, що вона мала б пам'ятати — дай їй це в контексті. Треба тест на новий ? Вклей його специфікацію в промпт, а не сподівайся, що модель угадала. Саме на цій ідеї — «підтягнути потрібні факти в контекст перед відповіддю» — побудований підхід (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 варіацій , накидати скелет page object, пояснити незнайому помилку), але відповідальність за результат лишається на вас. Робочий цикл — «згенерував → прочитав критично → перевірив → доробив», а не «згенерував → скопіював → пішов далі».
Типові помилки
- Виглядає як «модель знає відповідь», а насправді вона продовжує текст найправдоподібніше. Впевнений тон — це стиль, натренований 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 прискорює, відповідальність — на мені.
Джерела
- ISTQB CT-GenAI Syllabus v1.1 — канонічне означення LLM, архітектура-трансформер і передбачення наступного токена під час висновування; звідси й
But plausible is not necessarily correct. - Google — Machine Learning Glossary — токен як атомарна одиниця, на якій модель навчається й робить передбачення, і означення великої мовної моделі через кількість параметрів.
- Brown et al. — Language Models are Few-Shot Learners (arXiv:2005.14165) — авторегресивність у першоджерелі: задачі й приклади задаються суто текстовою взаємодією, без оновлення ваг.
Претрейн і донавчання на пальцях
- ISTQB CT-GenAI Syllabus v1.1 — три категорії, що виникають із послідовних етапів навчання: foundation на широкому претрейні, instruction-tuned на парах «промпт — очікувана відповідь» і reasoning поверх них.
Температура, семплінг і недетермінізм
- ISTQB CT-AI Syllabus v2.0 — недетермінізм як властивість, а не дефект: системи на базі AI фундаментально ймовірнісні, тож ті самі входи не завжди дають той самий вихід.
- ISTQB CT-GenAI Syllabus v1.1 — механізм і межа: зниження температури звужує розподіл імовірностей,
seedпокращує відтворюваність, але повної гарантії немає. - OpenAI Docs — Prompt engineering — той самий факт із боку API: вміст, який генерує модель, недетермінований, і навіть різні знімки одного сімейства дають різні результати.
- ISTQB CT-GenAI Syllabus v1.1 — означення галюцинації, три різні класи дефектів виводу з ціллю
GenAI-3.1.1і окремі способи виявлення для кожного. - Google — Machine Learning Glossary — та сама думка коротше: правдоподібний на вигляд, але фактично неправильний вивід, поданий як твердження про реальний світ.
- ISTQB CT-AI Syllabus v2.0 — чому це не випадковий збій: упередження в даних і схильність до впевнених, але неправильних передбачень.
- OWASP Gen AI Security Project — Top 10 for LLM Applications (2025) — дезінформація як окремий ризик переліку (
LLM09:2025), тобто самостійний клас, а не побічний ефект.
Знання vs контекст і knowledge cutoff
- Lewis et al. — Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks (arXiv:2005.11401) — вада параметричної памʼяті нормативно: знання зберігається у вагах, але доступ до нього обмежений, а оновлення лишається відкритою проблемою.
- Claude Platform Docs — Context windows — контекстне вікно як робоча памʼять, що відрізняється від корпусу, на якому модель навчали.
- Claude Platform Docs — Tool use with Claude (overview) — розрив визнаний на рівні інструментів: пошук існує саме щоб діставати інформацію поза межею знань.
- ISTQB CT-GenAI Syllabus v1.1 — канонічне означення: ембединги кодують семантичні, синтаксичні й контекстні звʼязки, а токени зі схожим значенням стоять у просторі близько.
- Google — Machine Learning Glossary — інший бік того самого: масив чисел із прихованого шару, значення якого визначаються навчанням, а не задаються випадково.
- Lewis et al. — Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks (arXiv:2005.11401) — де ембединги працюють у RAG: щільний векторний індекс, доступний через попередньо навчений нейронний ретривер.
Що LLM робить добре і погано для QA
- ISTQB CT-GenAI Syllabus v1.1 — канонічний перелік того, що модель тягне добре (чернетки кейсів, скриптів, оснастки), і межа під ним: правдоподібне не означає правильне.
- ISTQB CT-AI Syllabus v2.0 — правий стовпець таблиці в канонічній формі: проблема тест-оракула й потреба експертного судження там, де правильність визначити важко.
Поясніть на пальцях, що LLM робить у своїй основі
(large language model, LLM) працює через передбачення наступного токена: вона дивиться на весь текст перед собою й прикидає, який фрагмент найімовірніше йде далі. Токен (token) — не обов'язково ціле слово, а шматок тексту: коротке слово повністю, частина довгого слова, розділовий знак чи пробіл. На кожному кроці модель рахує ймовірності для всього свого словника, обирає один токен, дописує його й повторює цикл уже з довшим входом; таку послідовну генерацію, що спирається на власний попередній вивід, називають авторегресивною (autoregressive). Тобто відповідь не з'являється цілком, а народжується по одному токену. Практичний наслідок: модель не «розуміє» ваш застосунок і не тримає в голові готову відповідь — вона щоразу продовжує текст найправдоподібнішим чином.
Чому кажуть, що в моделі немає окремої «бази фактів»
Бо знання не лежить довідником, який модель гортає, — воно розподілене по вагах (weights), мільярдах числових параметрів, налаштованих під час навчання так, щоб добре передбачати текст. Модель не зчитує факт, а відтворює статистичну закономірність мови, у якій цей факт колись траплявся. Тому вона не шукає правильну відповідь, а генерує найправдоподібніше продовження. Здебільшого правдоподібне збігається з правильним — саме тому LLM узагалі корисна. Але коли правдоподібне й правильне розходяться, модель без вагань видасть правдоподібне; звідси і , і застаріла інформація.
Чим претрейн відрізняється від донавчання
Це два різні етапи. Претрейн (pre-training) — базове навчання на гігантському корпусі тексту, де модель мільярди разів передбачає наступний токен; ручна розмітка не потрібна, бо правильна відповідь уже є в самому тексті (наступне слово), тому навчання називають самокерованим (self-supervised). Результат претрейну — потужний автодоповнювач, який усотав граматику, факти й патерни коду, але ще не вміє слідувати проханням: на «напиши тест-кейс» він може дописати щось недоречне, бо просто продовжує текст. Донавчання (fine-tuning) робить із автодоповнювача помічника: спершу instruction tuning на парах «інструкція → добра відповідь», потім часто RLHF. Для QA важливо, що поведінка моделі — наслідок навчання на текстах і людських уподобаннях, а не «чиста логіка».
Що таке RLHF і як воно впливає на поведінку моделі
RLHF (reinforcement learning from human feedback, навчання з підкріпленням на людських оцінках) — етап донавчання, де анотатори порівнюють кілька варіантів відповіді моделі й відзначають кращий, а модель поступово зсувається в бік того, що людям подобається: корисність, безпечність, ввічливість. Наслідок, що прямо стосується QA: модель натренована звучати впевнено й догоджати, тож радше вигадає відповідь, ніж скаже «не знаю». Тому переконлива інтонація — вивчена манера, а не сигнал істинності: модель звучить однаково впевнено і коли має рацію, і коли галюцинує. Плутати тон із правотою — типова пастка.
Що таке температура і як вона впливає на вивід
Температура (temperature) керує тим, наскільки «сміливо» модель обирає наступний токен із розподілу ймовірностей. Близько нуля модель майже завжди бере найімовірніший токен — вивід передбачуваний і стабільний, але одноманітний. Вища температура «згладжує» розподіл, даючи шанс рідкіснішим токенам, — вивід різноманітніший і креативніший, але зростає дурниць і галюцинацій. Точні межі залежать від провайдера (десь 0–1, десь до 2), тож важлива не цифра, а принцип: нижче — стабільніше й нудніше, вище — різноманітніше й ризикованіше. Для QA це важіль: коли треба відтворюваність (генерація за суворим форматом), температуру опускають; коли потрібні ідеї для мозкового штурму — піднімають.
Чим top_k відрізняється від top_p
Обидва обмежують, з яких токенів модель узагалі семплить, відкидаючи «хвіст» малоймовірних. top_k лишає фіксовану кількість — k найімовірніших токенів, решту відсікає. top_p (nucleus sampling) працює за сумарною ймовірністю: бере найменший набір найімовірніших токенів, чия сумарна вага досягає p, і семплить лише з них — тобто розмір набору «дихає» залежно від того, наскільки модель упевнена. Разом із температурою це інструменти балансу «стабільність проти різноманітності». На практиці їх крутять рідше за температуру, але розуміти механізм корисно, щоб не сприймати вивід моделі як магію.
Чому та сама модель на той самий промпт відповідає по-різному
Бо на кроці вибору токена працює семплінг (sampling) — випадковий вибір із розподілу ймовірностей, а не завжди найімовірніший варіант. Це закладено в механізм, а не збій: варіативність — норма, за неї відповідають семплінг і температура. Понизити температуру майже до нуля — вивід стане стабільнішим, ближчим до (greedy decoding). Для тестувальника це фундаментальний зсув: ми звикли, що той самий вхід дає той самий вихід, інакше це дефект, а з LLM однаковість двох прогонів більше нічого не гарантує. Тому на точний збіг відповіді з еталонним рядком — погана перевірка для LLM-фічі.
Чи гарантує температура 0 однаковий вивід щоразу
Ні. Низька температура робить вибір майже жадібним і суттєво стабільнішим, але повної повторюваності не дає навіть на нулі. Причина не в моделі як такій, а в інфраструктурі: обчислення з рухомою комою (floating point), паралельність на GPU й пакетна обробка запитів роблять так, що той самий вхід може зрідка дати інший вихід. Практичний висновок для QA: якщо тест на LLM-фічу спирається на «за температури 0 буде байт-у-байт те саме», він рано чи пізно . Стабільність треба спеціально вимагати й усе одно не розраховувати на стовідсоткову гарантію.
Що таке галюцинація і чому вона стається
Галюцинація (hallucination) — це коли модель упевнено видає правдоподібну, але хибну чи вигадану інформацію: неіснуючий метод бібліотеки, вигаданий селектор, посилання на неіснуючу статтю, хибний номер RFC. Причина прямо випливає з механізму: модель оптимізована передбачати правдоподібний текст, а не істинний, і в неї немає вбудованої перевірки фактів чи способу відрізнити «я справді це знаю» від «це звучить так, ніби могло б бути правдою». Коли ви просите те, чого модель точно не бачила, вона однаково згенерує граматично й стилістично доречну відповідь — бо її робота продовжити текст, а не промовчати. Тому галюцинація — не випадкова вада, а природна поведінка на . Слабка відповідь на співбесіді — «модель іноді бреше»; сильна пояснює причину й способи знизити ризик.
Що підвищує ризик галюцинацій і як його знизити
Ризик росте на рідкісних чи свіжих речах (конкретні версії, точні сигнатури API), на проханнях назвати точні цифри чи джерела, за вищої температури й на довгих ланцюжках міркувань. Знижують його кількома прийомами: подати факти прямо в замість покладатися на пам'ять моделі, попросити явно позначати невпевненість і — головне для QA — перевіряти вивід виконанням чи авторитетним джерелом. Правило жорстке: будь-який факт від LLM, що впливає на рішення, підлягає окремій верифікації. Це не недовіра до інструмента, а розуміння, що він оптимізує правдоподібність, а не істину.
Що таке knowledge cutoff і як його «обійти»
Межа знань (knowledge cutoff) — момент, до якого зібрано тренувальні дані моделі; усе, що сталося після, у вагах просто відсутнє: реліз бібліотеки, що вийшов пізніше, свіжа , учорашня зміна у вашому продукті. Небезпека в тому, що модель не скаже «я не в курсі» — вона впевнено видасть застаріле або галюцинацію. «Обходять» це не хитрощами, а джерелом інформації: різницею між параметричним знанням (у вагах, застигле) і контекстом (те, що ви подали в запиті зараз). Свіже й точне дають через контекст — вклеюють актуальну специфікацію, лог чи фрагмент коду прямо в промпт, і модель працює з ним, а не зі своїми застарілими здогадами. На системному рівні цю ідею масштабує .
Яка різниця між параметричним знанням і контекстом
Параметричне знання (parametric knowledge) — те, що зашите у вагах під час навчання: величезне за обсягом, але розмите (модель пам'ятає патерни, а не дослівні цитати) і застигле на knowledge cutoff. Контекст (context) — усе, що приїхало в запиті зараз: сам промпт, вклеєні логи чи шматок коду, фрагмент документації, попередні репліки діалогу; воно свіже, дослівне, але обмежене вікном контексту. Ключове: контекст фактично перекриває параметричну пам'ять — якщо вклеїти актуальний фрагмент API в промпт, модель спиратиметься на нього, а не на застарілий здогад. Звідси практичне правило: не питай LLM про те, що вона мала б пам'ятати, — дай їй це в контексті.
Що таке embeddings і навіщо вони QA
(embeddings) — спосіб записати шматок тексту як вектор, тобто довгий список чисел (сотні чи тисячі вимірів). Ключова властивість: тексти зі схожим змістом отримують близькі вектори, навіть якщо слова різні — «кнопка не клікається» і «елемент не реагує на натискання» ляжуть поруч у цьому просторі, а «рецепт борщу» — далеко; близькість міряють, наприклад, косинусною подібністю (cosine similarity). Для QA це відмикає кілька речей: семантичний пошук по документації, тест-кейсах і багах (шукаємо за змістом, а не за збігом слів), дедуплікацію баг-репортів чи тест-кейсів, сформульованих різними словами, кластеризацію схожих падінь. І, звісно, RAG — знайти релевантні фрагменти через ембединги й подати в контекст перед відповіддю.
Що таке RAG і яку проблему він розв'язує
RAG (retrieval-augmented generation, генерація з доповненням пошуком) — підхід, коли перед відповіддю в контекст моделі підтягують потрібні факти: знаходять релевантні фрагменти (часто через embeddings за змістом) і вклеюють їх у промпт. Це прямо лікує дві вади параметричного знання — застарілість (можна підтягнути свіже) і розмитість (модель працює з дослівним джерелом, а не з наближеним спогадом). По суті це системна автоматизація правила «дай факти в контекст». Для QA сама RAG-система стає об'єктом тестування: чи знайшлися правильні фрагменти, чи не загубився релевантний документ, чи модель не проігнорувала поданий контекст на користь власного здогаду.
Чому не можна тестувати LLM-фічу порівнянням «рядок у рядок» з еталоном
Бо вивід недетермінований: семплінг і температура роблять так, що той самий промпт легітимно дає різні формулювання, і навіть за температури 0 стовідсоткової повторюваності немає. Асерт «результат точно дорівнює еталонному рядку» червонітиме на цілком коректних відповідях — тест стане не через баг продукту, а через природу інструмента. Оцінювати треба властивості відповіді, а не її буквальний текст: чи є потрібні поля, чи валідний формат, чи виконується згенерований код, чи семантично збігається з очікуваним. Це окрема велика тема, але корінь — саме в недетермінізмі.
AI згенерував автотест, і він одразу зелений. Чому це радше привід придивитися
Бо зелений колір нічого не доводить сам по собі: LLM легко пише тест, який завжди проходить, бо в ньому немає жодної реальної перевірки — асерт відсутній, пом'якшений або перевіряє тавтологію. Модель оптимізує правдоподібність коду, а не його доказову силу, і «виглядає як робочий тест» не дорівнює «перевіряє те, що треба». Ніхто нічого не запускав і не звіряв, поки ви цього не зробили. Тому зелений тест від AI — сигнал уважно прочитати, що саме він стверджує, і переконатися, що він упаде, коли фіча зламається. Робочий цикл — «згенерував → прочитав критично → перевірив → доробив», а не «згенерував → скопіював → пішов далі».
Коли б ви НЕ довіряли виводу LLM
Скрізь, де результат впливає на рішення й вимагає точності, свіжості чи гарантованої коректності: конкретні селектори й сигнатури API певної версії, точна арифметика й підрахунки «скільки саме», актуальні факти після knowledge cutoff, гарантія повноти , судження про безпеку чи приватність. У всіх цих випадках вивід перевіряю виконанням або авторитетним джерелом, а не приймаю на віру через упевнений тон. І навпаки — довіряю як чернетці там, де потрібен правдоподібний структурований текст: каркас тесту, ідеї , переформатування вимог, пояснення незнайомої помилки. Червоний для інтерв'юера — відповідь «AI все зробить сам»; сильний кандидат каже, що AI прискорює, а відповідальність лишається на людині.
Три ситуації, у яких розуміння механізму LLM вирішує, чи ти правильно читаєш поведінку інструмента: чому та сама генерація дає різний код, чому впевнена відповідь містить неіснуючий метод, і як за типом задачі одразу зрозуміти — брати вивід як чернетку чи верифікувати. Скрізь — що відбувається під капотом і яке рішення з цього випливає.
Кейс 1. Той самий промпт — два різні тести. Це баг генератора?
Ти двічі просиш AI-помічника накидати тест на форму логіну однаковим і отримуєш два різні файли: різні назви тестів, різний порядок кроків, десь getByRole, десь getByLabel. Перша реакція — «інструмент зламався, треба фіксити». Насправді це очікувана поведінка, і плутати її з дефектом — типова пастка новачка в роботі з LLM.
Під капотом на кожному кроці модель рахує розподіл ймовірностей по наступному токену й обирає з нього випадково (семплінг). Уяви проміжок, де модель добирає слово після «Тест впав, бо елемент не»:
знайдено 0.42
видимий 0.31
клікабельний 0.18
активний 0.06
... ...
За температури близько нуля модель майже завжди візьме «знайдено» — і два прогони збігатимуться. За вищої температури інколи випаде «видимий» чи «клікабельний», і далі текст піде іншою гілкою, бо кожен наступний токен залежить від уже обраних (авторегресивність). Звідси й два різні файли з одного промпту.
Що з цього випливає для рішення:
- Не згенерований код байт-у-байт і не сприймати розбіжність як генератора.
- Якщо потрібна стабільніша форма (той самий каркас, той самий формат) — опустити температуру; але пам'ятати, що навіть на нулі повної повторюваності немає через floating point, GPU й батчинг.
- Оцінювати не текст, а властивості результату: чи компілюється, чи запускається, чи асерт реальний, а не тавтологія.
Кейс 2. AI впевнено кличе метод, якого не існує
Просиш дочекатися видимості кнопки — і отримуєш правдоподібний на вигляд рядок:
// метод waitForSelectorVisible у Playwright не існує
await page.waitForSelectorVisible('#submit');
Виглядає переконливо: у Playwright є waitForSelector, є isVisible, тож склеєна назва waitForSelectorVisible «звучить» так, ніби мала б бути. Але її немає — при запуску впаде помилка, що метод не є функцією.
Це , і механізм пояснює її без містики. Модель оптимізована продовжувати текст правдоподібно, а не звірятися з реальним API. На (точна сигнатура конкретної версії) вона не мовчить, а генерує граматично й стилістично доречний варіант — з тією ж інтонацією впевненості, що й правильний код. Впевнений тон тут — вихований RLHF стиль, а не гарантія існування методу.
Лікування — дати факти й перевірити виконанням, а не сперечатися з моделлю:
// коректний варіант: явне очікування стану через locator
await page.locator('#submit').waitFor({ state: 'visible' });
Що з цього випливає для рішення:
- Свіжу чи точну довідку (сигнатури, селектори, назви методів версії X) не брати з пам'яті моделі — вклеїти актуальний фрагмент API в контекст або звірити з автодоповненням IDE й документацією.
- тут — типи, лінтер і реальний запуск: те, що компілюється й проходить, а не те, що впевнено написано.
Кейс 3. Довіряти виводу чи верифікувати: таблиця рішень
Рівень довіри до відповіді LLM задає не інтонація тексту, а природа задачі. Груба, але робоча орієнтовна таблиця для щоденних QA-задач:
| Задача | Режим довіри | Що зробити перед використанням |
|---|---|---|
| Чернетка тест-кейсів із вимог | Чернетка | Вичитати на повноту, дописати edge cases вручну |
| Каркас page object чи скелет тесту | Чернетка | Запустити; переконатися, що асерт реальний і падає на зламаній фічі |
| Конкретний селектор чи сигнатура методу версії X | Не довіряти | Звірити з доками або автодоповненням IDE, запустити |
| Пояснення падіння за логом, вставленим у промпт | Вища (факти в контексті) | Все одно звірити ключовий висновок зі стектрейсом |
| Підрахунок «скільки саме тестів/елементів» | Не довіряти | Порахувати самому чи скриптом |
| Факт про нову версію бібліотеки | Не довіряти (knowledge cutoff) | Перевірити в офіційних доках або дати їх у контекст |
| Рерайт вимоги у Given/When/Then | Чернетка | Звірити, що зміст не спотворено |
Логіка одна: там, де достатньо правдоподібного структурованого тексту на широких патернах (чернетки, ідеї, переформатування, пояснення), LLM економить години й бере роль прискорювача. Там, де потрібні точність, свіжість чи гарантована коректність (селектори, API, арифметика, повнота, безпека), вивід — гіпотеза, яку верифікуєш виконанням або джерелом. Відповідальність за результат при цьому лишається на людині: AI прискорює чернетки, а не приймає рішення.
Механізм генерації
- Можу пояснити, що в основі LLM — передбачення наступного токена, а не «розум», який тримає готову відповідь.
- Знаю, що таке токен і що він не дорівнює слову (може бути частиною слова, знаком, пробілом), і розумію авторегресивність: кожен новий токен дописується до входу, і цикл повторюється.
- Можу пояснити, чому в моделі немає окремої «бази фактів»: знання розподілене по вагах як статистика мови.
Як модель навчають
- Знаю різницю між претрейном (self-supervised передбачення токена на корпусі) і донавчанням (робить із автодоповнювача помічника).
- Можу пояснити, що дає instruction tuning і що — RLHF.
- Розумію, чому впевнений тон — наслідок RLHF, а не показник правоти: впевненість і правильність у LLM не пов'язані.
Семплінг і недетермінізм
- Розумію, що таке температура і як вона зсуває баланс «стабільно/нудно» проти «різноманітно/ризиковано».
- Знаю різницю між
top_kіtop_p(nucleus sampling). - Можу пояснити, чому та сама модель дає різні відповіді (семплінг — випадковий вибір із розподілу), і знаю, що навіть за температури 0 повна повторюваність не гарантована (floating point, GPU, батчинг).
- Розумію, чому LLM-фічу не тестують порівнянням «рядок у рядок» з еталоном.
Галюцинації
- Можу пояснити, що — не збій, а наслідок оптимізації правдоподібності замість істинності, і що вбудованої перевірки фактів немає.
- Знаю, що підвищує (рідкісне/свіже, точні цифри, висока температура, довгі ланцюжки) і що знижує (факти в контекст, позначати невпевненість, перевірка виконанням).
- Не зводжу всі дефекти виводу до галюцинацій: розрізняю ще (reasoning error — хибна логіка на справжніх фактах) і упередження (bias — перекіс із даних навчання), і знаю, що виявляють їх по-різному.
Знання, контекст і knowledge cutoff
- Знаю різницю між параметричним знанням (у вагах, розмите, застигле) і контекстом (свіже, дослівне, обмежене вікном).
- Можу пояснити, що таке knowledge cutoff і чому модель не скаже «не знаю», а видасть застаріле.
- Розумію правило «не питай про те, що модель мала б пам'ятати — дай це в контексті» і як його масштабує .
Embeddings
- Можу пояснити, що перетворює текст на вектор, і близькі за змістом тексти дають близькі вектори (cosine similarity).
- Знаю практичні застосування для QA: семантичний пошук, дедуплікація багів, кластеризація падінь, RAG.
LLM у роботі QA
- Знаю, де LLM сильна (чернетки, ідеї , каркас коду, пояснення, рерайт) і де слабка (повнота , точні селектори/API, детермінізм, свіжі факти, арифметика, безпека).
- Можу сформулювати головний принцип: LLM — прискорювач чернеток та ідей, а не істини.
- Розумію, чому зелений автотест від AI — привід придивитися, а не розслабитися, і можу назвати робочий цикл: згенерував → прочитав критично → перевірив → доробив.
Квіз
Перед стартом
- Питань: 14
- Поріг «зараховано»: ≥70% правильних відповідей.
- Результат впливає на прогрес; завалені питання підуть у чергу повторення.
- Квіз впливає на компліт теми: тема стає «пройдено», лише коли прочитано теорію І квіз складено на ≥70%.
Питання
Next-token prediction — що це?