Усі уроки · 44
Шлях 3 · Дорожня карта AI-інженера·Урок 17 з 33

Контекст і промпт-інжиніринг: що модель бачить насправді

Ваш промпт — це одне повідомлення, а контекст — усе, що бачить модель: системний промпт, пам’ять, знайдені документи, результати інструментів, історія. Чому контекстна інженерія стає ширшою дисципліною, ніж промпт-інжиніринг.

РівеньСереднійЧас~10 хв

Ви заповнюєте вікно, і промпт — лише його частина

Ось аналогія, якою я пояснюю це кожному новому колезі: контекстне вікно — це письмовий стіл моделі. Це єдина поверхня, яку модель бачить, поки працює. Ваше повідомлення — стікер, наклеєний на цей стіл. Усе інше теж лежить на цьому столі: системний промпт, прикріплений до стіни, вчорашні нотатки, документи, які хтось дістав з архіву, роздруківки, які щойно видав інструмент. Модель прочитує всю поверхню, перш ніж напише перше слово. Чого немає на столі, того для неї не існує.

Стіл невеликий, за кожен його сантиметр доводиться платити, а вирішуєте, що на нього покласти, ви — або ваш код. Від цього залежить, чи працюватиме асистент чітко, чи наче напідпитку.

Ось запитання, яке відділяє новачків від практикуючих AI-інженерів: коли ви надсилаєте моделі повідомлення, що модель насправді бачить?

Більшість людей уявляють повідомлення в чаті — те, що вони надрукували. Але це лише крихітна частка того, що йде мережею. Кожен виклик API передає моделі цілий контекст: системний промпт, історію розмови, усе, що дістали з пам’яті чи бази знань, результати попередніх викликів інструментів — а десь серед цього й ваше повідомлення.

Промпт-інжиніринг — це вміння сформулювати те, що кажете ви в одному повідомленні. Контекстна інженерія — це проєктування всього іншого, що модель бачить довкола нього. Промпт-інжиніринг і досі лишається навичкою. Але в реальних продуктах промпт зазвичай виявляється найменшою частиною.

Що входить до контексту

Типовий запит до моделі містить:

  • Системний промпт — постійні інструкції: роль, правила, тон, формат.
  • Історія розмови — усі попередні репліки цієї сесії.
  • Пам’ять — факти про користувача чи проєкт, перенесені з минулих сесій.
  • Знайдені документи — фрагменти, які RAG дістає з вашої бази знань під поточне запитання.
  • Результати інструментів — вивід пошуків, запитів до бази даних і викликів API, які модель зробила щойно.
  • Повідомлення користувача — часто менше п’яти відсотків від загального обсягу.

Зауважте, що більшість цього збирає код — під час роботи, за кожного запиту. Тому це й називають інженерією.

Пам’яті немає — є лише цей виклик

Кожен виклик API незалежний від попередніх (stateless). Модель не пам’ятає ваш попередній запит. Вона не знає, хто ви, що вона сказала хвилину тому і чим займається ваш продукт. Між викликами вона не зберігає нічого.

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

З цього випливають два наслідки, і в них уся дисципліна:

  • На кожен запит припадає рівно один артефакт: контекст. Модель бачить цей текст і більше нічого: ні прихованих нотаток, ні бази даних, ні пам’яті про минулий раз.
  • Чого немає у виклику, того не було. Якщо правило, факт чи обмеження не потрапили в тіло запиту, модель не може ними скористатися — і жодні хитрі формулювання в останньому повідомленні їх не викличуть.

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

Контекстне вікно — це бюджет

Модель може враховувати лише фіксовану кількість токенів — це й є контекстне вікно. Токен — це приблизно три чверті слова (фрагмент тексту, яким модель вимірює обсяг), і він править за одиницю і для вікна, і для рахунку за використання. Сучасні моделі приймають 128K, 200K, а подеколи й мільйон токенів, але вікно скінченне, а увага розподіляється по ньому нерівномірно. Ставтеся до вікна як до бюджету: кожен документ, кожне старе повідомлення, кожен вивід інструмента витрачає токени, які могли б піти на щось корисніше.

Ось як виглядає один реалістичний запит усередині вікна. Пройдіться по подіях — і зверніть увагу, куди потрапляє саме повідомлення користувача:

Один API-запит у розрізі
Повідомлення користувача — крихітна частка того, що читає модель
~0tokens
/ 8,000
press play to simulate
press play to simulate
0/7

Подивіться на цю смугу. Якщо ви витратите півдня на шліфування повідомлення в 180 токенів, а решту 7 800 токенів залишите на волю випадку, ви прикрашаєте дверну ручку будинку без даху.

Щоб відчути це, кодова база не потрібна. Вставте промпт нижче в ChatGPT і подивіться, як мало важить останнє запитання порівняно з тим, що стоїть над ним:

Скопіюйте й вставте в ChatGPT
Ти допомагаєш мені дещо перевірити. Нижче — розмова користувача
з асистентом, а потім завершальне запитання.

Відповідай ЛИШЕ на завершальне запитання, природно продовжуючи
розмову.

--- розмова до цього моменту ---
Користувач: Я маю невелику пекарню. Терпіти не можу довгих листів.
Асистент: Прийнято. Відтепер короткі відповіді й контекст пекарні.
Користувач: Житнього борошна в нас не буде до четверга.
Асистент: Зрозумів — жодних житніх виробів до четверга.
--- кінець ---

Завершальне запитання: Можна замовити житній хліб на заквасці на завтра?

Відповідай одним коротким реченням.

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

Чому контекстна інженерія стає ширшою дисципліною

Три зсуви висунули контекст на перший план:

  1. Застосунки стали багатокроковими. Агент робить десяток викликів інструментів на одне завдання, і кожен результат повертається в контекст. «Промпт» тепер — це потік, який збирає код.
  2. У моделей з’явилися довгі вікна. Коли доступно 128K токенів, вузьке місце змістилося з «як це сказати» на «що взагалі туди покласти».
  3. Збої стали збоями контексту. Коли асистент у реальній експлуатації видає хибну відповідь, винна найчастіше застаріла пам’ять, нерелевантний знайдений фрагмент або суперечлива стара інструкція, що досі лежить в історії. Формулювання останнього повідомлення тут рідко має значення.

Промпт-інжиніринг — це шар усередині контекстної інженерії: повідомлення й далі важливе, але це останні 200 токенів у завданні проєктування, що охоплює тисячі.

Правило в один рядок

Перш ніж винуватити модель, прочитайте весь контекст, який вона отримала. У дев’яти випадках із десяти відповідь там: забагато шуму, замало сигналу або потрібний факт закопано посередині.

Перевірте себе

Здається, асистент пам’ятає, що ви сказали десять хвилин тому. Що відбувається насправді?

Асистент у реальній експлуатації починає видавати дивні відповіді. Формулювання повідомлення користувача не змінювалося. Куди ви подивитеся насамперед?

Що з цього НЕ входить до контексту, який бачить модель?

Чому велике контекстне вікно не скасовує контекстну інженерію?

Підсумок

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

Є запитання?

Приєднуйтеся до Telegram-каналу — залюбки обговоримо проєктування контексту й поділимося прикладами.