Як працюють 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.клікаєш..., а вам потрібен метод, якого модель точно не бачила, вона однаково згенерує щось граматично й стилістично доречне — бо її робота продовжити текст, а не промовчати. Галюцинація — це не збій системи, а її природна поведінка на межі знань.
Що підвищує ризик: питання про рідкісні чи свіжі речі (конкретні версії, точні сигнатури 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 прискорює, відповідальність — на мені.
Джерела
- ISTQB Certified Tester Foundation Level (CTFL) v4.0 — базовий словник тестування, на який спирається весь розділ.
- ISTQB Certified Tester AI Testing (CT-AI) — офіційний силабус ISTQB з тестування AI: недетермінізм, імовірнісна поведінка, специфіка ML-систем, критерії якості.
- Google Machine Learning Glossary — канонічні означення термінів (token, large language model, generative AI, embedding) від Google.
Поясніть на пальцях, що 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: модель натренована звучати впевнено й догоджати, тож радше вигадає відповідь, ніж скаже «не знаю». Тому впевнений тон — це стиль, вихований RLHF, а не показник правоти. Впевненість і правильність у LLM не пов'язані, і плутати їх — типова пастка.
Що таке температура і як вона впливає на вивід
Температура (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) — момент, до якого зібрано тренувальні дані моделі; усе, що сталося після, у вагах просто відсутнє: нові версії бібліотек, свіжі CVE, зміни у вашому продукті минулого тижня. Небезпека в тому, що модель не скаже «я не в курсі» — вона впевнено видасть застаріле або галюцинацію. «Обходять» це не хитрощами, а джерелом інформації: різницею між параметричним знанням (у вагах, застигле) і контекстом (те, що ви подали в запиті зараз). Свіже й точне дають через контекст — вклеюють актуальну специфікацію, лог чи фрагмент коду прямо в промпт, і модель працює з ним, а не зі своїми застарілими здогадами. На системному рівні цю ідею масштабує RAG.
Яка різниця між параметричним знанням і контекстом
Параметричне знання (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, гарантія повноти покриття, судження про безпеку чи приватність. У всіх цих випадках вивід перевіряю виконанням або авторитетним джерелом, а не приймаю на віру через упевнений тон. І навпаки — довіряю як чернетці там, де потрібен правдоподібний структурований текст: каркас тесту, ідеї edge cases, переформатування вимог, пояснення незнайомої помилки. Червоний прапорець для інтерв'юера — відповідь «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-фічу не тестують порівнянням «рядок у рядок» з еталоном.
Галюцинації
- Можу пояснити, що галюцинація — не збій, а наслідок оптимізації правдоподібності замість істинності, і що вбудованої перевірки фактів немає.
- Знаю, що підвищує ризик (рідкісне/свіже, точні цифри, висока температура, довгі ланцюжки) і що знижує (факти в контекст, позначати невпевненість, перевірка виконанням).
Знання, контекст і knowledge cutoff
- Знаю різницю між параметричним знанням (у вагах, розмите, застигле) і контекстом (свіже, дослівне, обмежене вікном).
- Можу пояснити, що таке knowledge cutoff і чому модель не скаже «не знаю», а видасть застаріле.
- Розумію правило «не питай про те, що модель мала б пам'ятати — дай це в контексті» і як його масштабує RAG.
Embeddings
- Можу пояснити, що ембединг перетворює текст на вектор, і близькі за змістом тексти дають близькі вектори (cosine similarity).
- Знаю практичні застосування для QA: семантичний пошук, дедуплікація багів, кластеризація падінь, RAG.
LLM у роботі QA
- Знаю, де LLM сильна (чернетки, ідеї edge cases, каркас коду, пояснення, рерайт) і де слабка (повнота покриття, точні селектори/API, детермінізм, свіжі факти, арифметика, безпека).
- Можу сформулювати головний принцип: LLM — прискорювач чернеток та ідей, а не оракул істини.
- Розумію, чому зелений автотест від AI — привід придивитися, а не розслабитися, і можу назвати робочий цикл: згенерував → прочитав критично → перевірив → доробив.
Що велика мовна модель робить у своїй основі?
Питання
Next-token prediction — що це?