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

    14 · AI для QA

    Промптинг для QA

    Зміст

    Одна й та сама модель на запит «напиши тести для форми логіну» видасть банальний список із п'яти пунктів, а на добре зібраний — структуровану з негативними перевірками, й прив'язкою до технік тест-дизайну. Модель не змінилася між цими двома запитами. Змінився промпт. Промптинг (prompting) — це навичка формулювати завдання так, щоб дістати корисний результат, і для QA вона перетворилася на робочий інструмент: генерація тест-кейсів, , аналіз вимог, розбір падінь, чернетки автотестів.

    Промпт варто читати не як «запит у чат», а як технічне завдання виконавцю, який нічого не знає про ваш проєкт. Виконавець швидкий, ерудований і слухняний, але без контексту він домислює, а домисли LLM — це часто впевнено сформульована вигадка. Тому питання на співбесідах уже не «чи користуєтесь AI», а «покажіть промпт, яким ви генеруєте тест-кейси, і поясніть, чому він саме такий». Ця глава — про те, з чого промпт складається і які важелі реально впливають на якість виводу. Механіку того, чому модель узагалі реагує на приклади й формулювання, розібрано в главі «Як працюють LLM».

    Анатомія промпта

    Сильний промпт майже завжди має впізнавану структуру. Це не бюрократія — кожен блок закриває конкретний спосіб, яким модель може «промахнутися».

    • Роль і контекст — хто модель у цій задачі й що вона має знати про проєкт: стек, домен, конвенції. Модель не знає, що у вас Playwright на TypeScript і що severity ви ставите за вашою внутрішньою шкалою, доки ви не скажете.
    • Задача — одна чітка ціль, сформульована дієсловом: «згенеруй», «проаналізуй», «знайди суперечності». Дві незалежні задачі в одному промпті — привід розбити на два.
    • Вхідні дані — вимога, user story, шматок коду, лог. Їх варто відокремлювати від інструкцій — трьома бектиками або тегами-обгортками (<requirements>...</requirements>), щоб модель не сплутала дані з командами. Це заодно перший бар'єр проти prompt injection (див. нижче).
    • Обмеження й правила — що робити не можна: не вигадувати селектори, спиратися лише на надані вимоги, покрити й межі, не дублювати кейси.
    • Формат виводу — таблиця, JSON, Gherkin, Markdown-чеклист. Без цього модель обере формат сама, і він рідко збігається з тим, що ви очікуєте імпортувати в TMS.
    • Приклади — один-два зразки «вхід → бажаний вихід». Найсильніший важіль форми й стилю (про це — далі).

    Роль і контекст

    Промпт

    Задача

    Вхідні дані
    відокремлені

    Обмеження й правила

    Формат виводу

    Приклади

    Модель

    Вивід

    Роль і контекст

    Промпт

    Задача

    Вхідні дані
    відокремлені

    Обмеження й правила

    Формат виводу

    Приклади

    Модель

    Вивід

    Не кожна задача потребує всіх шести блоків. Але коли вивід розчаровує, діагностика починається саме з цього списку: якого блоку бракує? Порожній результат майже завжди означає, що бракує вхідних даних або критеріїв «що вважати хорошим кейсом».

    Якщо готуєтесь до сертифікації, звірте склад. ISTQB CT-GenAI теж дає шість компонентів (ціль GenAI-2.1.1 (K2), вправа HO-2.1.1), але набір інший: role, context, instruction, input data, constraints and output format. Тобто роль і контекст там розведені на два окремі компоненти, а прикладів у структурі немає взагалі — вони проходять як окрема техніка (, §2.1.2), яку зі структурою комбінують: This structure should be combined with the implementation of prompting techniques. На практиці обидва набори ведуть до того самого промпта, але на іспиті структура й техніки питаються окремо.

    Zero-shot і few-shot

    Zero-shot — це промпт без прикладів: ви просто описуєте задачу. Для поширених речей (пояснити , накидати очевидні перевірки) цього достатньо, бо схожі приклади модель бачила під час навчання мільйони разів.

    Few-shot — це промпт, у який ви вклали кілька зразків «вхід → вихід». Модель підхоплює патерн: формат, рівень деталізації, стиль назв, тон. Термін закріпився за статтею про GPT-3 «Language Models are Few-Shot Learners» — модель навчається патерну прямо з прикладів у промпті, без донавчання ваг (це називають in-context learning). One-shot — окремий випадок з одним прикладом.

    Чому це працює саме для QA. LLM продовжує патерн, а не «розуміє інструкцію» в людському сенсі. Тому одне речення «пиши в нашому форматі» слабше за один показаний зразок цього формату. Якщо у вас є house-стиль баг-репортів або конвенція назв тест-кейсів (назва описує перевірку, а не дію) — покажіть один готовий приклад, і решта згенерується під нього.

    Формат тест-кейсу — як у прикладі нижче.
    
    Приклад:
    Вхід: Поле "Email" обов'язкове.
    Вихід:
    - Назва: Форма відхиляє відправлення з порожнім email
      Кроки: 1) лишити email порожнім 2) натиснути "Зареєструватися"
      Очікуваний результат: помилка валідації, форма не відправлена
    
    Тепер згенеруй кейси для вимоги:
    Вхід: Пароль — від 8 до 64 символів.

    Практичне правило: починайте із zero-shot; щойно вивід «майже той, але не в тому форматі / не тієї деталізації» — додайте один-два приклади, і форма вирівняється. Два-три приклади зазвичай дають більший приріст, ніж сторінка словесних інструкцій про формат.

    Chain-of-thought: міркування вголос

    Chain-of-thought (CoT, ) — це прийом, коли ви просите модель спершу міркувати покроково, а вже потім давати відповідь. Ідею описано у статті Wei та ін. (2022): для задач із кількома логічними кроками проміжні міркування помітно підвищують якість відповіді, бо модель «розкладає» задачу, а не намагається вгадати підсумок одразу.

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

    Два важливі уточнення:

    • Сучасні моделі з режимом міркування (reasoning) роблять цей крок усередині, тож явне «think step by step» їм потрібне рідше. Але структурувати саму задачу на етапи все одно корисно — це різні речі.
    • Текст міркувань — це правдоподібне пояснення, а не доказ правильності. Модель може написати логічний ланцюжок і все одно дійти хибного висновку (або, навпаки, дати правильну відповідь із кривим поясненням). CoT покращує середню якість, але не звільняє від перевірки — див. главу «Верифікація результатів AI».

    Роль і персона

    Призначення ролі — «ти досвідчений QA-інженер, який спеціалізується на API-тестуванні» — зміщує словник і рамку відповіді: модель частіше говорить про статус-коди, схеми, , а не загальними словами. Це справжній, але обмежений важіль.

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

    Структурований вивід

    QA рідко потрібен «текст для читання» — частіше вивід кудись їде далі: імпорт у TMS, вставка в код, крок у . Тому формат треба задавати явно: таблиця з фіксованими колонками, Markdown-чеклист, Gherkin, JSON із конкретними полями.

    Є два рівні контролю формату:

    1. Проханням у промпті — «поверни JSON-масив об'єктів із полями title, steps, expected». Просто, працює для більшості задач, але модель може порушити формат на довгому виводі (загубити кому, додати пояснення до JSON).
    2. Гарантованою схемою на рівні API — structured output / function calling, де модель зобов'язана віддати вивід за JSON-схемою. Це надійніше для інтеграцій; механіку розбираємо в главі «Tool use і function calling».

    Ключове правило: навіть заданий формат треба валідувати. Не «довіряй, що JSON валідний», а розпарси й перевір поля — інакше зламаний вивід тихо потрапить у пайплайн.

    // Мінімальна валідація структурованого виводу перед використанням
    type TestCase = { title: string; steps: string[]; expected: string };
    
    function parseTestCases(raw: string): TestCase[] {
      const data = JSON.parse(raw); // кине помилку на битому JSON — і добре
      if (!Array.isArray(data)) throw new Error("Очікувався масив кейсів");
      for (const tc of data) {
        if (!tc.title || !Array.isArray(tc.steps) || !tc.expected) {
          throw new Error(`Неповний кейс: ${JSON.stringify(tc)}`);
        }
      }
      return data;
    }

    Ітеративне уточнення

    Промптинг — це діалог, а не постріл наосліп. Рідко коли перший промпт дає ідеальний результат; нормальний робочий цикл — отримати чернетку, вказати на конкретну ваду, попросити доробити.

    Ні

    Так

    Промпт

    Вивід

    Достатньо?

    Вказати конкретну ваду:
    додай негативні кейси,
    що ти пропустив?

    Прийняти й зберегти
    робочий промпт

    Ні

    Так

    Промпт

    Вивід

    Достатньо?

    Вказати конкретну ваду:
    додай негативні кейси,
    що ти пропустив?

    Прийняти й зберегти
    робочий промпт

    Уточнення працює краще, коли воно адресне: не «зроби краще», а «додай перевірки на порожні значення й unicode», «ти пропустив верхню межу 64 символи», «прибери дубль кейсів 3 і 5». Корисний окремий хід — попросити модель самокритику: «які сценарії ти не покрив?».

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

    І головне: вдалий промпт — це артефакт. Формат кейсів, правила, приклади, які спрацювали, варто зберегти й перевикористовувати, а не вигадувати щоразу. Як зафіксувати такі правила на рівні проєкту (файли на кшталт CLAUDE.md, , слеш-команди) — тема глави «Пам'ять, скіли та слеш-команди».

    Промпти для типових QA-задач

    Складаючи докупи все вище, ось патерни, які покривають більшість щоденних задач. Глибоко генерацію артефактів розбирає окрема глава «Генерація тест-артефактів» — тут лише каркас промптів.

    • Тест-кейси з вимоги — вхід: текст вимоги (відокремлений); правила: покрити , межі, негативні сценарії; формат: таблиця чи JSON; приклад одного кейсу для стилю.
    • Тестові дані — «згенеруй edge cases й невалідні значення для поля X»: порожнє, пробіли, максимальна довжина, unicode, спецсимволи, payload як smoke. Техніки тест-дизайну (класи еквівалентності, граничні значення) — окремий розділ теорії, на них варто прямо посилатися в промпті.
    • Аналіз вимог — «знайди суперечності, прогалини й неоднозначності в цій user story; що треба уточнити в аналітика?». Тут CoT особливо корисний.
    • Розбір падіння — вхід: лог//повідомлення помилки; задача: назвати ймовірну причину й де копати. Пам'ятайте, що модель дає гіпотезу, а не діагноз.
    • чи сніпет — «дай стабільний Playwright-локатор для цієї кнопки за наданим HTML; пріоритет getByRole/getByTestId». Обов'язково перевіряйте: модель охоче вигадує селектори, яких у розмітці немає.

    Компактний шаблон сильного QA-промпта:

    Роль: senior QA, стек Playwright + TypeScript.
    Задача: згенерувати тест-кейси для вимоги нижче.
    Вимога:
    <requirements>
    Пароль: 8–64 символи, мінімум одна цифра.
    </requirements>
    Правила: покрий класи еквівалентності та граничні значення;
    додай негативні сценарії; спирайся лише на вимогу, не вигадуй полів.
    Формат: JSON-масив об'єктів {title, steps, expected}.

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

    • Виглядає як «модель лінива», а насправді — бракує вхідних даних. Порожній чи банальний вивід на «напиши тести» — це не впертість моделі, а відсутність вимоги, контексту й критеріїв. Виконавцю не дали ТЗ.
    • Виглядає як промптинг, а насправді — роздача титулів. «Ти геніальний тестувальник» замість конкретної інструкції нічого не додає. Персона задає перспективу, а не знання.
    • Звучить упевнено — отже, правда. Ні. Модель однаково впевнено формулює і факт, і (вигаданий метод, неіснуючий селектор, вигадану вимогу). Впевнений тон — не сигнал достовірності.
    • CoT написав логічний ланцюжок — отже, відповідь правильна. Міркування — це раціоналізація, а не доказ. Перевіряти треба висновок, а не милуватися ходом думки.
    • Один гігантський промпт «на все». Три задачі, суперечливі правила й мегапортянка контексту в одному запиті — модель губиться й на довжині, і на конфлікті інструкцій. Дробіть.
    • Попросив формат — і довірився. Заданий JSON ≠ валідний JSON. Без розбору й перевірки полів зламаний вивід тихо просочиться далі.
    • Вставив неперевірений текст у промпт. Лог, тікет чи сторінка, які ви кладете у промпт як дані, можуть містити інструкції для моделі (prompt injection). Тому дані відокремлюють від інструкцій; докладно — у главі «Безпека й приватність при роботі з AI».

    Підсумок

    • Промпт — це ТЗ для виконавця без контексту; якість виводу впирається в якість промпта, а не в «настрій» моделі.
    • Приклади (few-shot) — найсильніший важіль форми й стилю: один показаний зразок б'є абзац словесних вимог.
    • Chain-of-thought підвищує якість на багатокрокових задачах, але міркування — не гарантія правильності; висновок усе одно перевіряють.
    • Вхідні дані відокремлюють від інструкцій, вивід задають форматом і валідують, а не приймають на віру.
    • Промптинг ітеративний: адресні правки, а не «зроби краще»; вдалий промпт зберігають як багаторазовий артефакт.

    Можливі питання

    • «Покажіть промпт, яким ви генеруєте тест-кейси». Інтерв'юер дивиться, чи є в промпті структура: контекст, відокремлені вхідні дані, правила (техніки тест-дизайну!), формат виводу, приклад. Промпт «напиши тести» — червоний .
    • «Чим few-shot відрізняється від zero-shot і коли що?» Хочуть почути, що приклади задають патерн формату/стилю, і що починають зазвичай із zero-shot, а приклади додають, коли треба вирівняти форму.
    • «Що таке chain-of-thought і чи гарантує він правильність?» Правильна відповідь — покрокове міркування допомагає на складних задачах, але це не доказ; результат перевіряють окремо.
    • «Модель дала впевнену відповідь — ви їй довіряєте?» Перевірка на зрілість: впевнений тон не корелює з достовірністю; галюцинації звучать так само переконливо.
    • «Як ви контролюєте, щоб вивід був у потрібному форматі?» Очікують: задаю формат явно (краще — схемою), і обов'язково валідую результат перед використанням.

    Джерела

    Анатомія промпта

    • ISTQB CT-GenAI Syllabus v1.1 — канонічна шістка компонентів role, context, instruction, input data, constraints and output format і вимога комбінувати структуру з техніками промптингу.
    • Claude Platform Docs — Prompting best practices — модель як новий співробітник без контексту; XML-теги, щоб однозначно розібрати промпт, коли він змішує інструкції, контекст і змінний ввід.
    • OpenAI Docs — Prompt engineering — те саме з боку другого провайдера: Markdown для секцій та ієрархії, XML-теги — щоб окреслити межі контенту.

    Zero-shot і few-shot

    • Brown et al. — Language Models are Few-Shot Learners (arXiv:2005.14165) — першоджерело терміна: задачі й демонстрації задаються суто текстовою взаємодією, без оновлення градієнтів чи донавчання.
    • ISTQB CT-GenAI Syllabus v1.1 — канонічне означення тріади zero-shot / one-shot / few-shot і коли брати саме few-shot: повторювані задачі з конкретним або обмеженим форматом виводу.
    • Claude Platform Docs — Prompting best practices — приклади як один із найнадійніших способів керувати форматом, тоном і структурою виводу, з вимогами до їхньої релевантності й різноманітності.
    • Google — Machine Learning Glossaryin-context learning як синонім few-shot і межа терміна: few-shot за означенням містить більше ніж один приклад, тож one-shot — окремий випадок.

    Chain-of-thought: міркування вголос

    Роль і персона

    • Claude Platform Docs — Prompting best practices — роль фокусує поведінку й тон, і навіть одне речення дає різницю; але агресивні формулювання на сучасних моделях ведуть до надмірного спрацьовування.
    • ISTQB CT-GenAI Syllabus v1.1 — що саме задає компонент Role: перспективу або персону, яка визначає відповідальність, тон і підхід, — і нічого понад це.

    Структурований вивід

    • OpenAI Docs — Function calling — різниця двох рівнів дослівно: без строгого режиму виклики best effort, а strict: true робить так, щоб вони надійно відповідали схемі; We recommend always enabling strict mode.
    • Claude Platform Docs — Tool use with Claude (overview) — те саме поле в другого провайдера: strict: true гарантує точний збіг викликів із вашою схемою.
    • Claude Code Docs — Run Claude Code programmatically (headless) — чому «схема пройшла» ще не означає «значення коректне»: format трактується як анотація й не примушується.

    Ітеративне уточнення

    • Claude Code Docs — Best practices for Claude Code — пряма порада замість боротьби правками: після двох невдалих спроб почати з чистого контексту й написати кращий початковий промпт.
    • Claude Platform Docs — Context windowscontext rot: зі зростанням кількості токенів точність і повнота пригадування деградують, тож курування вмісту важить не менше за розмір вікна.
    • N. F. Liu et al. — Lost in the Middle: How Language Models Use Long Contexts (arXiv:2307.03172) — виміряний бік того самого: релевантне посередині довгого контексту дістається гірше, ніж скраю.
    • Claude Platform Docs — Prompt engineering overview — чому цикл узагалі має вигляд циклу: промптингу передують критерій успіху й спосіб емпірично проти нього перевіряти, а не кожна вада лікується промптом.

    Промпти для типових QA-задач

    • ISTQB CT-GenAI Syllabus v1.1 — канонічний перелік задач, під які ці промпти й пишуть: аналіз на неоднозначності, генерація і кейсів, пропозиція технік, синтетичні тестові дані.
    • Claude Platform Docs — Prompting best practices — золоте правило перевірки промпта: дайте його колезі з мінімальним контекстом, і якщо він розгубиться — розгубиться й модель.
    • Playwright — Locators — чому в промпті на локатор саме такий пріоритет: рекомендація ставити на user-facing атрибути й ролі, а не на CSS чи XPath.

    Пояснення

    «Поясни» працює з власним API-ключем Anthropic: запит іде з вашого браузера прямо до Anthropic.

    Свій API-ключ (BYOK)

    Вставте власний ключ Anthropic — пояснення працюватиме на реальній моделі. Ключ зберігається лише у вашому браузері (localStorage), нікуди не надсилається, крім api.anthropic.com, і не логується.