Галоўная / Артыкулы

Сем ціхіх спосабаў, якімі забруджванне кантэксту ламае агентаў LangGraph

Састарэлы стан, велізарныя вывады інструментаў, дублікаты фрагментаў RAG, стратныя зводкі і раздутыя наборы інструментаў: сем збояў без памылак, іх выпраўленні і як выявіць кожны.

Выдавец: REACTAPP.TOP9 хв чытання2174 слоў

Крыніцы: 7 Ways Context Pollution Quietly Killed My LangGraph Agents

Уявіце агента LangGraph, які розповідае корыстніку, што яго праект „знаходзіцца на правільнай дорозе для выдання ў ліпені“. У календары паказваецца серпень. Журналы не паказваюць жадных асаблівостэй чыраў выканання інструментаў, і нігды не ёсць жадных паведамленняў пра проблемы. Па всіх показніках, якія сочыць каманда, агент працуе нормальна, і прычым тры дні ён таямна вводзіць людэй у глухар, пакуль хтось не з’ясавае правду.

Падобныя інцыдэнты маюць адной невідмай прычыне — забруднення кантэксту, і ўсе семь падаўжытых кейсоў маюць у сабе яго следы. Кожны з іх не стварыў жадных адмов. Ціе сцэнарыя ёсць складанымі іллюстрацыямі, у якіх назвы компаній і цыфры ёсць вымышленымі, але механізмы, якія за іх стоўяць, — гэта тые проблемы, з якімі рэгулярна сталкаюцца тыя, хто стварае агентов.

Забруднення кантэксту за две хвіліны

Калі агент выконвае логічныя расчынання, ён не бачыць вашу аплікацыю. Ён бачыць толькі адзін вялікі блок тэксту — вікно кантэкста, і нічога больш. Уявіце сабе стол: все, што на столе, можна выкарыстоўваць, а все, што за межамі стола, для агента не існуе, нават калі гэта знаходзіцца ў вашай базе дадзенаў за калькамі.

Кожны раз на гэты стол дадаецца калькі элементаў:

  • прамт сістэмы, тое ўсё, што являе сабою інструкцыі
  • вызначэнні інструментаў, тое, што агент можа выкарыстоўваць
  • історыя размовы, тое, што было сказана ўсё да гэтага часу
  • рэзультаты работы інструментаў, тое, што вернулі вашы API
  • стан, тое, што збераглі і перадалі вузлы LangGraph
  • даскладзеныя дакументы, калі вы вікорыстоўваеце RAG

Пачатківці рыдко чуюць гэта: у сістэмі ёсць обмежэння за розміром, і увага не розподыляецца рывномірно. Кантэнт можа тэхнічно існуваты, але на практыці залішатыся проігнорованім. Ён таксама можа буты застарылім, дубльованім або суперэчлівім, проце сістэма не будзе гэтага фіксуваты. Яна просто ігноруе ці проблемі без жодніх коментарыв.

Забруднення кантэксту — гэта неправільній, застарылій чы суперэчлівій матэрыал, які залішаецца у сістэмі і погіршуе іі працу, не віклікаючы жодніх помілок. У гэтым й полягае небезпека: збій можа вінікнуты опівночы, тоды як забруднення поступово робіць ваш агент на 20% некорэктнім на працягу трывалого часу.

У кожному з наведэніх ніжчэ віпадків опісано сімптом, корэневу прычыну, спосіб віправлення і метод іі віявлення у вашый сістэмі, аджэ проблема, яку неможліво віявіты, обов’язково повернецца.

Віпадок 1: агент застраг у ліпні

Сімптаматыка. Узьмем прыклад агента для звярнення дакументаў для выдуманага сервісу, назвамо яго Meridian Energy. Ён продаваў ціфры "гэтага месяца", якія на самай працы належалі пакануннему месяцу. Карыстальнікі крылі за гэта канвейер дадзеных, але ўсё было нормальна.

Асновная прычына. Пад час пачатку сесіі адны раз распрацоўшчык зберагаў актывае перыяд звярнення дакументаў у стане LangGraph (клуч пад назвай current_period, які мяў значэнне 2026-07), і пункт перапаўтарэння зберагаў гэта значэнне. Пазней карыстальнікі пачалі вяртацца да старых сесій, што ўсё часта рабілі, і зберажаны пункт перапаўтарэння прывёз з сабой даны за ліпень. Агент не памыляўся; ён следав своему кантэксту, а ў яго кантэксце было напісана "ліпень">.

Адаптацыя. Застосавьце правілу, якое змяніце дыяграму стану: ніколі не зберагаюце тое, што можна дашча вырахаваць. Тэчасовая дата, тэчасовы перыяд, любы элемент, пазначаны як „сёньдзе“, должны вырахоўвацца занова на пачатку кожнага запуску, а не зберагацца. Перанесенне current_period з стану, які фіксуецца, у невялікі вузел, які вырахоўвае яго ў кожны раз, коштае аднай лініі коду і усунеўце весь клас багоў.

Адкрыцце. У процэсе разработкі выдрукавайце словнік стану на пачатку кожнага запуску і пераканайцеся, чы не можа кожны ключ быць застарэлым і чы зможаце вы гэта зазначыць. Кожны ключ, які мае дату, статус або слова „тэчасовы“, ўважаецца падазроўным.

Случак 2: выкарыстоўванне інструменту з 8 000 токенамі, які зацьмарыў інструкцыі

Сімптамы. Агент пачаў ігнараваць правілы фарматавання. У інструкцыях сістэмы было напісана, што кожна адпаведзь трэба пачынаць з табелі-падсумку. Ён так і робіў, але іноды не робіў гэтага. Адбывалася гэта на абычны спосаб, што ёсць найгоршы відэк бага.

Канскрэтная прычына. Адны з інструментаў, які называецца API, падставляў необработаны JSON-адпаведзь у кантэкст. Для маленькіх запытанняў гэта станавіла 400 токенав, а для большых — колькасць перакрочвала 8 000 токенав у віглядзе вялікага, вложанага JSON, наполненага ID-амі, метаданнымі, польмі з значэнням null і дакументацыяй пагінацыі, якой ніхто не патрабаваў. Калі гэты матэрыял падставляўся ў серэдзіну кантэкста, ранейшыя чыстыя інструкцыі ператвараліся на тонкі голас у шумнай камнаце. Увага пераключалася на гранітную стэну з JSON-данымі, і правілы фарматавання практычна знікалі.

Няпрыемны факт заключаецца ў тым, што гэта адбывалася толькі з большымі адпаведзямі. Маленькія запытання працавалі нормальна, таму для з’ясоўвання звязку між „ненормальным паведамленнем агента“ і „вялікім запытанням корыстніка“ патрэбныя былі тыдні.

Рашэнак. Адпрамы должны вяртаць факты, а не весь масіў дадзеных. Неабходна дадаць слой трансфармацыі ў кожны адпрам, які выбірае тыя лако неабходныя поля, якія патрэбны агенту, формуе іх у компактны варыянт і адкідае рэшту. Одын такі адпрам скасаваў прыблізна 8 000 токенаў і застаўся з прыблізна 300.

# Before: return response.json()          # 8,000 tokens of noise
# After:
def summarize_response(data: dict) -> dict:
    return {
        "project": data["name"],
        "status": data["status"],
        "owner": data["owner"]["displayName"],
        "due": data["dueDate"],
        "open_risks": len(data.get("risks", [])),
    }                                       # ~300 tokens of signal

Адказванне. Зяўляйце логі з колькасцю токенаў у выходных даных кожнага інструмента. Інструмент, які можа вернуць больш токенаў, чым уваесь запрос сістэмы, являецца адказваннем, якое чакае на большы выкарыстоўваны тэкст.

Случак 3: карэкцыя, якая ніколі не заменіла первісны запрос

Сімптам. Пользоватэль прасіць про рэгіон Паўночны-Ўшчы, а потым негайна карэктуе свой запрос і прасіць про Паўночны-Захад. Агент правільна адказвае пра Паўночны-Захад. Пасля чатырох раундавых адказаў, без дадатковага запросу, агент зноў пераходзіць да рэгіону Паўночны-Ўшчы.

Асновная прычына. Історыя размовы за замовчаннем дазволяе толькі дадаваць новыя даны, таму як некалькі запросаў, так і карэкцыі застаюцца ў кантэксце назаўсёды. Зазвычай мадэль правільна ацэнюе новейшы запрос, але не завжды. Калі чат стаў большым, две версіі запросаў становяцца аднакова правдападобнымі фактамі. Агент не памятаў некалькі — ён памятаў занадто многа.

Рашэнне. Існуе два варыянты.

  1. Раслясіце проблему, не накаплівайце яе. Калі з’яўляецца можлівасць парадксу, не проста дадагайце яго. Запісуйце новую значэнню ў структураваны блок фактов у стане (рэгіон заданы як «Захад-Паўнеч»), які агент спрыяжае як автантонічны, тады не патрэбна будзе знову кожны раз спарчвацца пра некалькісны транскрыпт.
  2. Зменіце історыю. LangGraph дазволяе выкарыстоўваць функцыю выкорачвання чы перапісвання паведамленняя перш чым яны зноў увайдуць у кантэкст, таму застарэлыя інструкцыі можна проста адмаўіць.

Абшчая наука заключаецца ў тым, што історыя размовы — гэта лог, а не база знанняў. Не заставляйце агента кожны раз выводзіць правду з транскрыпту.

Адкрыцце. Дадайце пункт самапарадксуўвання ў вашыя тэсты: корыстувач кажа X, потым парадксуе на Y, а пасля задае ўсё больш пытанняў. Калі агент зноў пераходзіць на X, значы ёсць такі баг.

Случак 4: RAG адказаў аднам разам пяцьма адпаведзеннямі і сховаў правямое

Сімптамы. Людзі задалі запіт, на якій дакументацыя чыста адпаведзела, а агент дала нечыткае, непূরнае адпаведзенне. Логі збору дадзейнасці паказалі шасць знятых фрагментаў, таму здавалася, што прырода дадзейнасці выканала свою працу.

Асновная прычына. У корпусе былі майжэ дублікаты: адзін параграф правіл быў вставлены ў пяць разных дакументаў, як часта робяць рэальныя падпрыемства. Пошук супараднення працаваў ідэальна і вярнуў пяць майжэ ідэнтычных фрагментаў, якія зацьмарылі адзін іншы фрагмент, які меў правямую адпаведзенне. Пяць месца за столам пераўпалі той самы гасць.

Рашэнне. Адзначыце дублікаты пад час атрымання даных. Нават простая методыка добра работае: запрашайце 20 кандыдатаў, адмовіцеся ад тых, якія занадта супадаюць з ужэ выбранымі, і застаўце самыя разнарадныя варыянты. Калі ваш хранальнік вектараў падтрымляе максімальную рэлевантнасць, гэта тая ж ідэя, якая ўжо ўбудована. Якосьць адпаведзей на пытанні, касаючыяся правіл, адразу павысілася без якіх-леба змян у модэле чы прыказе.

Адкрыцьне. Запісвайце атрыманыя фрагменты і перачытвайце іх ўсё тыя ж недзелі. Калі якае-небудзь рэчыце рэгулярна з’являецца два разы ў пакеце, вы плаціце за дублікацыі рэлевантнасцю.

Случак 5: статызація, якая адмовілася ад важнага правіла

Сімптаматыка. Чырагліваць дарожнасць дзейнаў дужо дугага часу, каманда адключыла функцыю павольнага стварэння апূরкі: кожныя N разоў старэйшыя паведамленні становіцца скарыганымі. Гэта стандартна практыка, якая шырока рэкамендуецца. Праз гэта адпаведальны працоўнік начал перакладваць чэрнавіковыя запісы ў офіцыйныя атласы, нават па тое, што ўжо адзінадцаць разоў раней корыстувальнік прасіў "выключыць чэрнавікі".

Асновная прычына. Апূркавач паводзіўся як апূркавач. Ён захоўваў галоўную сюжэтную лінію (корыстувальнік хацеў рэгіональныя атласы і гаварыў пра ўстройстве) і адкідаў тое, што ён ацэніў як незначнае. Аднак просьба "выключыць чэрнавікі" не была незначнаю. Ёй была прызначана певная умова, і такія умовы не можна пераказваць іншым спосабам: яны альбо застаюцца недыскрэтаванымі, альбо знікаюць. З усіх семі неудач гэтая заслуговае на найбольшую абавесць, адтуды што функцыя стварэння апূркі ў дэманстрацыях выглядае як абсалютна эфектыўны рэшання.

Рашэнне. Перад будзь-якім скарыганнем раздзеліце памяць на два блокі.

  • Наратыў можа быць страцінаваны агрэсывна.
  • Абмежнення, рашэнні і пяраскліванні збіраюцца ў структураваныя спісы, якія ніколі не страцінваюцца. Элементы можна толькі дадаць або явна анулюваць, і весь спіс дадаеца ў кантэкст на кожны раз.

У запытэ на страцінаванне можна працягваць гэта яшчэ прымо: перад страцінаванням копіюйце кожную інструкцыю, абмежненне і рашэнні без змян у спіс абмежненняў.

Адказванне. У перыод разработкі прабавайце зробіць дыф-аналіз спіса абмежненняў да і пасля кожнага запуску страцінавання. Абмежненне, якое застаецца толькі ў параграфе страцінавання, значыць, што кампрэсар нарабляе паталогій у вашых правілах.

Случак 6: стэк-трэйс, які змусіў агента не давераць работаючаму інструменту

Сімптамы. Аднолькі з інструментаў на час зупыніўся на короткі час, але праз момент працаваў падчас наступнага запыту. Аднак працаваючы ў тым жа сеансе, агент продаваліў корыстнікам, што не можа з’ясавіцца з сістэмай адчытнаў, нават калі ёй вдалося успэшна з’ясавіцца з той сістэмай. Корыстнікі, як і ўжо звычайна, верылі словам агента больш, чым фактам.

Асновная прычына. Полны траглі фаркты, TimeoutError пасля 30 секунд, быў даданы да історыі і ніколі не знік. Для модэлю фраза „сістэма адчытнаў ненадзеяна“ стала усталеным фактам, і кожны наступны адказ быў пад яе вплывам. Аднолькі тымчасовы бяг прыняў форму стойкага забруднення.

Выправленне. Спрытваеце каштоўкі як дараджэнні, а не як факты. Пасля успешнай пракушанні заменіце каштоўку ў історыі на аднай-лінейны прыметак, напрыклад "(тымчасовая каштоўка, выправлена пасля пракушанні)". Калі інструмент не можа працаваць ніколі, даце агенту чысты, структураваны статус, а не стэк-трэйс. Стэк-трэйсы належыць у логі, а не ў кантэксце.

Адкрыцце. Ашукайце ў жывых кантэкстах строкі Error, Traceback і Exception. Кожны патрабунак ўскладнівае сітуацыю або застаецца ў історыі, і якія-небудзь з іх трэба адчыстыць.

Казус 7: дваццаць пяць інструментоў у аднам вікні

Сімптамы. За калькі месяцаў прыстрой стаў повольней і дорожэй, што было прыемліва, адколі дадаваліся новыя функцыі. Ён таксама пачаў выбіраць неправы інструмент для простых запітоў, напрыклад вяртаць экспорт дакументаў пры супалненні правілаў, калі чалавек хацеў толькі падсумак праекту. Нічога не было зламана; проста все стала болей заплутаным.

Асновная прычына. Набор інструментаў налічваў 25 інструментоў, кожны з якіх меў дзялёную апісацыю і схему JSON; ўсе яны разам выкарыстоўвалі пра 12 000 токенаў яшчэ до таго, калі корыстнік напісаў хоць адна слова. Кожны раз модэль расследаваў 25 варыянтов, багато з якіх мелі супародныя апісацыі, такія як «з’явіць даныя праекту», «заўязаць дэталі праекту» і «працягнуць інфармацыю праекту». Выбір інструмента ёсць задачай аналізу, а каманда ператворыла яе на экзамен з множынным выбарам, дзе было 25 супародных адпаведзей.

Рашэнне. Две часткі.

  1. Актыўна адсікайце зайвое. Аб’еднайце інструменты, які перакрываюцься, тут зменшыўшы іх колькасць з 25 да 11, і перапішыце кожны апісанне так, ўбачліваючы адпаведна на аднае пытанне: калі модэлю следуе выбраць гэты інструмент замест адной з суседніх?
  2. Завантажайце інструменты ў залежнасці ад кантэксту. Не кожны вузел патрэбуе кожны інструмент. У LangGraph лёгка прыўязаць да кожнага вузла толькі неабходны падскуп, так што вузел для стварэння атласа можа бачыць чатыры інструменты, а не 25.

Кост токенаў за раунд зменіўся прыблізна на трохце, а выбіранне неправільных інструментаў практычна знікло.

Адказванне на проблемы. Працаваючы толькі з колькасцю токенаў у вашых апісаннях інструментаў. Калі ўжо гэтая колькасць перавышае размер сістэмнага запіту і сярэдню дужыну размовы разам, ваш агент складае экзамен з відкрытым підручнікам, у яком большасць сторанак неправільныя.

Што спаўнае семеро

Пачаткуйце чытаць занова, і выявіцца аднолькі патэрн. Жадна з складовых не была зламана, і нічога не знікло. Забрудненне выражалася ў постаўленні занадто велікай колькасці, застарэлага чы або павтаруванага кантэнту.

Самэлькі тут не дапамагаюць. Інжынеры навучаны шукаць відсутнасць: неадрабатаныя прамені, непрацаваючыя перакіданні. Для борьбы з кантэкстовым забрудненнем патрэбныя працоўныя навыкі, калі трэба вучыцца шукаць тое, чаго не павінна быць.

Якшчы вы захочаце вырашыць адну прычыну, то чытайце неапрануты кантэкст вашага агента. Адкладзіце логі і панелі статыстык, а чытайце рэальны тэкст, які мадэль отрымае пад час рэальнай працы. Гэта найценнейшы час для тых, хто стварае агентов, і майжэ ніхто яго не выкарыстоўвае.

Чэрніцкі спіс з 60 секундамі пры прайменаванні

  1. Чы якая-небудзь значэнне стану — гэта дата, статус чы ўсё, што называецца „тэкучым“? (Каса 1)
  • Чы можа інструмент вернуць больш за колькісць токенаў, чым сам прыказ сістэмы? (Случай 2)
  • Калі корыстнік сам ся пасправляе, чы можа старая версія калі-небудзь перамагчы? (Случай 3)
  • Чы адзінакавыя часткі, якія беруцца, калі-небудзь павтараюцца? (Случай 4)
  • Чы можа абмежэнне застацца недастрыжаным пасля слова-підсумку? (Случай 5)
  • Чы следы ад памылак застаюцца ў історыі пасля вяснавання? (Случай 6)
  • Сколькі токенаў выкарыстоваюць апісанні інструментаў прычымо, калі корыстнік нічога не запісвае? (Случай 7)
  • Сем запытанняў. Будзь-якая адпаведź «вядома, але не вярны» — гэта інцыдэнт, які чакае на свой момент.