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

Як ламається контекст: коли більше — значить гірше

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

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

Контекст ще й псується

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

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

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

Контрінтуїтивна частина: більше контексту може знизити точність

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

  1. Відволікання. Нерелевантний матеріал модель не ігнорує, а використовує. Фрагмент, у якого лише збігаються із запитанням ключові слова, конкурує з правильним, і модель вплітає обидва в одну гладку відповідь. Якщо від 5 надійних фрагментів перейти до 25 «авось підійде», відповіді погіршаться.
  2. Позиція. Увага найсильніша на початку й наприкінці вікна та найслабша посередині. Тому новий контекст додає шум і заодно зсуває наявні факти в мертву зону. Факт, який був добре помітний у короткому промпті, може зникнути з поля зору, щойно довкола нього набереться зайвого тексту.
  3. Суперечність. Кожен доданий блок — ще один шанс внести друге, суперечливе правило. Тоді модель мовчки обирає одне сьогодні й інше завтра.

Для тих, хто витратив тижні на підвищення повноти пошуку (recall), висновок такий: точність (precision) зазвичай перемагає повноту. Десять фрагментів, яким ви довіряєте, кращі за п’ятдесят, у яких ви сподіваєтеся знайти відповідь. Коли якість падає, прибирати контекст майже завжди швидше, ніж додавати новий.

Отруєння: один зайвий фрагмент збиває все зі шляху

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

Simulated conversation
press the button below to send the first message
sent to the modelnothing yet — every message is sent in full

Ціна весь цей час була в контексті. Але фрагменти два й три, які знайшлися тому, що збіглося слово «полотно», забруднили вікно, і модель люб’язно переказала це забруднення у відповіді. З арифметикою моделі та її даними про ціни все було гаразд — брудним виявилося вікно.

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

Загублене посередині: мертва зона

Увага моделі розподілена по вікну нерівномірно. Факти на початку й наприкінці вона помічає, а факти, закопані посередині довгого контексту, стабільно використовує не на повну силу — так само, як читач гортає середні розділи довгого звіту. Це класичний ефект «загубленого посередині»: помістіть головне обмеження всередину 60K токенів — і модель може виконати всі інструкції, крім цієї.

Ось як це відбувається — на брифі з сорока інструкцій:

загублене посередині — наживо
press the button below to send the first message
sent to the modelnothing yet — every message is sent in full

Обмеження в 150 слів було інструкцією 20 з 40 — рівно в центрі стосу. Модель бездоганно виконала інструкції 1, 2 і 40. Тієї, що посередині, для неї не існувало.

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

Гниття: повільний розпад у довгих сесіях

Гниття контексту (context rot) — це поступове зниження якості в довгих сесіях. Сороківа репліка розмови тягне із собою відкинутий підхід із дванадцятої, три застарілі припущення й повідомлення про помилку, яке ніхто не прибрав. Кожен із цих елементів окремо виглядає безневинно; разом вони розмивають у моделі картину завдання. Симптоми: модель знову відповідає на вже розв’язані питання, плутає старі й нові вимоги, стає повільнішою й розпливчастішою. Допомагає те саме, що й у попередньому уроці: стиснення та новий старт, коли сесія стає довгою.

Суперечливі інструкції: тиха нічия

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

Запобігайте цьому, поводячись зі старими інструкціями як із кодом: ніколи не додавайте в історію «забудь усе, що я казав раніше». Або відредагуйте постійну інструкцію (системний промпт, пам’ять), або почніть нову сесію з уже вшитим новим правилом.

Як виявити й запобігти

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

Ритуал налагодження

Отримали хибну відповідь? Перш ніж переписувати промпт, дістаньте точний контекст, який було надіслано, прочитайте його згори донизу й запитайте себе: що тут ввело б в оману втомлену людину? Винуватця ви знайдете за кілька хвилин.

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

Ваш RAG-бот працює погано, і ви збільшуєте кількість знайдених фрагментів із 5 до 25. Що зазвичай відбувається?

Бот підтримки раз у раз додає до правильних відповідей зайві факти. Де, найімовірніше, помилка?

У вас три жорсткі обмеження й бриф на 60 сторінок. Куди помістити обмеження?

Формат виводу плаває від запиту до запиту, і нічого не падає. Найімовірніша причина:

Підсумок

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

Є запитання?

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