Промпти: system, user, few-shot
Запит до чат-моделі складається з повідомлень із ролями: system (правила, роль, формат; найвищий пріоритет), user (запит людини), assistant (попередні відповіді моделі), tool (результати викликів інструментів).
Базові техніки:
- Zero-shot — лише інструкція без прикладів;
- Few-shot — кілька прикладів «вхід → очікуваний вихід» у промпті; найкращий спосіб закріпити формат;
- Structured output — вимагати JSON за схемою; відповідь потім валідується (JSON Schema / zod), бо модель все одно може порушити формат;
- Chain-of-thought — просити міркувати кроками перед відповіддю; підвищує точність на складних задачах, але додає токени.
Для QA промпт — це код: його зміна може зламати поведінку так само, як зміна функції. Тому промпти лежать у git, версіонуються і покриваються eval-набором при кожній зміні.
RAG: embeddings, chunking, retrieval
RAG (retrieval-augmented generation) — модель відповідає на основі документів, які система знайшла й додала в контекст. Це спосіб дати моделі актуальні або приватні дані без донавчання.
Конвеєр: документи → chunking (нарізка на фрагменти) → embeddings (вектор, що кодує зміст) → vector DB → за запитом знаходимо top-k найближчих фрагментів → вставляємо в промпт → модель відповідає, бажано з посиланнями на джерела.
Де RAG ламається — це і є місця для тестів:
- Retrieval не знайшов потрібний фрагмент (поганий chunking, неякісні embeddings, k замало): модель відповідає без джерела або вигадує;
- Нерелевантний чи застарілий фрагмент потрапив у контекст;
- Модель ігнорує знайдений контекст і відповідає з «пам'яті»;
- Відповідь не спирається на документи (groundedness) або цитує не те джерело;
- Права доступу: користувач отримав фрагмент документа, до якого не мав доступу.
Тому retrieval і generation оцінюють окремо: recall@k / precision@k для пошуку і faithfulness / answer relevance для відповіді.
Tool calling, агент і MCP
Tool calling (function calling): ми описуємо моделі інструменти (ім'я, опис, JSON Schema параметрів). Модель не виконує їх сама: вона повертає «хочу викликати search_orders з такими аргументами», наш код виконує виклик і повертає результат у контекст, після чого модель продовжує.
Агент — це цикл: модель отримує ціль → вирішує, який tool викликати → бачить результат → вирішує далі → … → фінальна відповідь або зупинка за лімітом. На відміну від звичайного чат-бота, агент має дії із побічними ефектами (створити тікет, надіслати лист, змінити дані) і сам обирає їх послідовність.
while (steps++ < MAX_STEPS) {
const reply = await model.call(messages, tools);
if (!reply.toolCalls.length) return reply.text; // фінальна відповідь
for (const call of reply.toolCalls) {
const result = await runTool(call.name, call.args); // наш код, а не модель
messages.push(toolResult(call.id, result));
}
}
throw new Error('Agent exceeded step limit');
MCP (Model Context Protocol) — відкритий протокол, яким застосунок з моделлю підключає зовнішні tools, ресурси й промпти через стандартний інтерфейс: один MCP-сервер працює з різними клієнтами. Для QA це ще одна поверхня: контракт tools, їхні схеми, права й обробка помилок сервера.