Дыягностыка агентаў AI па слоях: запрос, контэкст, выкарыстанне або цыкл
Модэль з слоямі для аналізу неудач AI-агентаў: як разніцяюцца падходы prompt, контэкст, harness і loop engineering, а таксама прыем падчас першага аналізу для выявлення таго, які слой зламаўся.
Калі агент AI пасяброўвае ў працэсе выканання, каманды часта спарчваюцца пра слоўнік у замест на доказы: адны інжынеры хочуць кращы запит, іншыя звалачаюць віну на контэкст, троеція — на інфраструктуру. Інжынерыя запитоў, контэкста, інфраструктуры та цыклаў не ёсць супернічаючымі падходамі; гэта чатыры шары, і кожны з яных пасяброўвае сваім уласным, адразу вядомым спосабам. У гэтым кярыранце кожны шар апісаны на прыкладзе маленькага кодаванага агента, пасля чаго прыводзіцца алгорытм, як спачатку выявіць, який шар насправды зламаўся, перш чым зменіць будзь-які код.
Короткая версія
- Інжынерыя запитоў формуе інструкцыі, якія даюцца модэлю.
- Інжынерыя контэкста вялікае, што модэль бачыць пры адпаведзенні.
- Інжынерыя інфраструктуры стварае сераўак, у якім працюе модэль: інструменты, памяць, файлы, права доступу та механізмы вяснавання.
Сярод усіх дорогіх інцидэнтав з агентамі найчыстае калі ўсунуць проблему ў аднам з гэтых слоёў.
Калі дама праходзіць, а практычнае выкарыстоўванне — ні
Цяперашняе сцэнарыю знайома: агент выглядае бездоганна ў даме. Чэрез калькі дней пасля запуску ён начынае цыклізаваць, выкарыстоўваючы токены, забывае тое, што яму сказалі гадзіну раней, або зламваецца, калі інструмент вяртае неспадзеваны пакет данных.
Команда дзеліцца на групы. Адны пропануюць перапісацю інструкцый, іншыя называюць гэта проблемай контексту, а троечыя падазрываюць у самай структуре. Без спяльнага спосабу выявлення нештафтання, двадзённы рэшэнк стаецца двухнедзельной перапісваю, таму што кожны патч прыкладзаецца да слою, які раней працаваў нормальна.
Гэта практычная прычына, чаму трэба разлікаваць гэтыя чатыры тэрміны. Кожны з іх пазначае адзінкавую сферу, дзе можа выйсці проблема, і калі ўжо можна ўпісаць іх адзін ад другога, налагоджэнне прыстрою становіцца процесам, а не гэмой з дагадкамі.
PACT: мнемонічны прыём для чатырох слоёў
Компактны спосаб прыгадаць слоі пад час інцидэту — PACT: Prompt, Awareness, Control, Trajectory. Кожна слова пасвячаная адной запытце:
- Prompt: чыясна была задана задача?
- Awareness: чы модель отримала інфармацыю, якая ёй была патрэбна для гэтага крока?
- Control: чы рантайм можа безпечна і надзеянна выконаць тое, пра што прабавала модель?
- Trajectory: чы паўтараючыся процес прыводзіць да завершэння, якое можна параболіць?
Мэтам не ўтвараць яшчо адны слой жаргану. Цель — зробіць межы між типамі неудач настолькі зрозумелымі, каб ў можна было легка запамятаць іх, калі ўсё спалахвае.
Як з’явіліся ці слоі і чаму важлаўны порядак
Тэрміны з’являліся прыблізна па порядку, калі кожны з агентаў атрымваў новую можлівасць:
- Інжыніроўка запитаў (прыблізна з 2022 по 2024 год) была першай навыком: формулювання, прыклады, абмежэнні і шаблоны для канкрэтных запитоў да моделі.
Этыя даты паказваюць, калі гэтыя тэрміны сталаў популярнымі, а не формальныя вехі; кроме таго, на момент напісання гэтага тексту тэрмінологія ўсё яшчэ развіваецца. Важнае зауважэнне — нічога не было заменена. Кожны слой дадавалі на базе пярэдньаго, таму ўсёлякія падыгрой у автономнасці вымагалі сваёй сабе системы кантролю.
Інжыніерыя запрошэнняў: локальны контракт
Інжыніерыя запросаў — это мастацтва формулювання, структурування і адгукавання аднае інструкцыі так, каб адпаведны ўтварэнне было болей прыгаднае. Без ягоя атрымліваюцца нечысткія інструкцыі, нестабільныя форматы выходных даных і модель, якая змушана здогадвацца, што вы мелі на увазе.
У агенте для програмавання запрос на перагляд коду можа выглядаць так:
SYSTEM: You are a code reviewer.
Given a diff, output ONLY valid JSON:
{"issues": [{"line": int,
"severity": "low|medium|high", "note": str}]}
No prose. No markdown fences.
If there are no issues, return {"issues": []}.
Этот запрос задае локальны контракт. Ён прызначае ролі, описвае процес трансформацыі (разлік увайшоў, спіс проблем у выходзе), фіксуе формат выходных даных аж да назв поль і дозволеных значэнняў серьознасці, а таксама визначае сцэнарый пустога результата, каб пасляэтапная обробка ніколі не мусела разбіраць прозу чы ўтрату ключоў.
Часта тэза гласіць, што інжынерыя прамптав ўстарэлі. Гэта не так; яна ёсць найвнутрэшнім слоем. Кожны процес обработкі контексту в канцэ ўсуне модэлю інструкцыю, а слабая інструкцыя ў чудоўным каркасе все рава дае слабыя рэзультаты, толькі тепер упакаваныя ў вражаючую інфраструктуру.
Інжынерыя контексту: куратура за межамі бюджэту
Інжынерыя контексту — цэе выбіранне для кожнага запытку тых дакументаў, історыі, вялічынь інструментаў і спамяцей, якія маюць прайсці ў склад контексту, а таксама ціх, якія не маюць. Калі гэта ігнаруецца, модэль адпавядае на базе застарелай інформацыі, паслухае нерэлевантныя фрагменты або траціць фокус, бо контекст заполнены матэрыялам, дадзеным толькі на всякі случай.
Стваральнік контексту для агента-програміста можа выкарыстоўваць кандыдатав, переранжаваць іх і стискаць історыю:
def build_context(query, full_history, kb):
relevant = retrieve(query, kb, top_k=8)
reranked = rerank(relevant, query)[:3]
summary = summarize_if_long(
full_history, max_tokens=800
)
return {
"docs": reranked,
"history": summary,
"query": query,
}
Этот прыцэп можна розумець як воронку. Працэўніца з адзысканням дадзеных распростраńяе шырокі «сет» з восьмі кандыдатаў, а практыка пераранжавання заставляе застацца толькі трох апошніх, найболей рэлевантных. Історыя кансацій сумараваецца да прыблізна 800 токэнаў толькі тады, калі яна становіцца дужа дзюльгаватай. Функцыя вяртае невялікі, структураваны пакет дадзеных, а не сырые матэріялы. Ключовыя навыкі, якія тут выкарыстоўваюцца, — это выбіранне, ранжаванне і стысненне дадзеных, а не ўвесь їх об’ём.
Самэ таму найпашырэнейшая пахамленне, што інжынерыя контэксту значыць даўанне модэлю большых вялікасцей дадзеных, зазвычай ўсунутая. Большы контэкст часта містіць больш шуму: застарэлыя інструкцыі, павтараючыся факты і суперсучасныя доказы. Большая частка роботы заключаецца у выборы таго, што трэба адхіліць.
Інжынерыя контэксту є шырэй, чым RAG
Генераванне з падагоджэнням на адказы — гэта адна з тэхнік у рамках інжынерыі контексту, якая абараецца крокам адзыскання інформацыі. Прыемпляр RAG можа запрашваць васьмыя фрагменты і переранжаваць іх у тры, як паказана вышэй. Інжынерыя контексту таксама включае стисненне історыі, форматаванне апісаў інструментаў, падтрымкю критычнага стану задачы, падачу рэзультатаў пераканання назад у модель і адліквідацыю таго, што трэба выключыць.
Агент для кодавання, які не мае жаднага сховішча вектароў, все раве сталкнуцца з рэальной проблемай контексту, яку трэба рашыць. Статус Git, ачыненыя файлы, памылкі компілятора, рэзультаты тэставання, чырговы план і лог пярэдніх дзеянняў — усё гэта павінна досягнуць моделі у вядомай для ўжытку форме.
Інжынерыя адпрацоўкі інформацыі: межа межы намеру і адказу
Харчувальная система ўскладнення яўляецца нечастым элементам системы: інструменты і доступ да файлаў, памяць, якая застаецца, правіла дазволу, сандбоксы, аналіз працы і все тое, што выканаецца у разы неудачы. Без хорашай харчувальной системы у нас будзе агент, які добра разумее ситуацыю, але не можа на гэтыя данні дзейсцаваць, або агент, які дзейснюе дзеяння, але не мае надзеяго спосабу вярнуцца да стану нормы, калі выклік інструмента завершаецца памылкай.
Прыклад інструменту-выкліку ілюструе гэю ідею:
def call_tool(tool_name, args, retries=2):
for attempt in range(retries + 1):
try:
result = TOOLS[tool_name](**args)
log_trace(tool_name, args, result, status="ok")
return result
except ToolError as e:
log_trace(tool_name, args, str(e), status="failed")
if attempt == retries:
return {"error": str(e), "recoverable": False}
args = repair_args(args, e)
Этот вайпер не прабуе рашыць задачу. Ён кантролюе межу між тым, што запрашае модель, і тым, што робіць рэальная система. Кожны выклік фіксуецца разам з його аргументамі, рэзультатам і статусам. Неудача спрыяе павторным выклікам з праверанымі аргументамі, а калі павторныя спробы заканчываюцца, вайпер вяртае структураваную памылку, якая пазначаецца як нерэкаверабельная, тады калекуўальнік отрымае данні, па якіх можа рашыць, а не эксцэпцыю, якая зупініць роботу.
Існуе прагненне прырównваць харнес з якой-небудзь рамкай агента, яку вы запусцілі. Рамка служыць каркасам; харнес – це сукупнас конкрэтных рашэнняў, якія вы прыменяеце на ёй: што фіксуецца, шта робіць пасля невялікага вызову, який стан застаецца пасля збою, якія команды дазволены і як рэзультаты выканання прадаюцца назад модэлю.
Інжынерыя ціклу: контракт завершэння
Інжынерыя ціклу визначае задачы кожной ітерацыі, спосаб, яким агент пераканваецца, чы не праўільна ёго дзейнасць, і, гэта найважлівейша частка, умовы завершэння. Яго типовыя проблемы – це несканавальны цікл: агент, який продовжае вызываць інструменты і витрачаць токены, таму што ніхто не паведаміў яму, што ён завершыў або застряг.
Мінімальны кантролер выглядае так:
def run_loop(task, harness, max_iters=15, stall_limit=3):
state = init_state(task)
stalls = 0
for i in range(max_iters):
action = plan_next_step(state)
result = harness.call_tool(action.tool, action.args)
state = update_state(state, result)
if is_goal_met(state):
return state, "success"
if made_no_progress(state):
stalls += 1
if stalls >= stall_limit:
return state, "stalled — escalate"
else:
stalls = 0
return state, "max iterations reached"
Ёсць калькі лімітаванняў, які працуюць тут адночасна. max_iters лімітуе загальную колькасць ітерацый, is_goal_met дазваляе выйсці з циклу у разе досягнення меты, а лічыльнік застою фіксуе спакойныя ітерацыі без прагрэсу, перазначаючыся кожны раз, калі прагрэс вяртаецца. Пасля stall_limit застойных крокаў цикл вяртае адзінаковы статус, які вымагае паднятка проблемы, а не проста продовжэння роботы. Кожны шлях выйсця вяртае чыстаю прычыну, што спакойна дапамагае класіфікаваць рэзультаты праз аднойчы.
Цэнтральная ідея — контракт завершэння: чыстая мета, показнікі прагрэсу, якія можна змерыць, ліміт пракатанняў, бюджэты на час і токены, крок верыфікацыі, а таксама чыткая політыка ў разе зупінкі прагрэсу. Па імплементацыях тых сабе ідэй у TypeScript адзірніце bounded agentic loops для выкарыстоўвання інструментаў LLM.
Інжынерыя ціклу і інжынерыя крэйтавання інструментаў часта плутаюцца. Інструменты вярнююць, чаму агент можа касацца і як распрацоўваюцься аблыканні на рэвэле індывідуальных інструментаў. Цыкл знаходзіцца вышэй і вяршыць рашэнняя пра поведзенне на кожны крок, укладаючы момент, калі весь процес павінен завершыцца.
Чатыры слоі па боку ад боку
- Prompt (P): адмініструецца інструкцыяй. Тыповая працоўнае супершчэнства: модель неправа расцёнівае намер або вяртае некоректны формат. Першы элемент, які трэба пераглядзець: сам выходны тэкст.
- Context (A): адмініструецца станом, гатовым для викорыстання модэллю. Тыповая працоўнае супершчэнства: модель дзейнае на застарелай, відсутней або відволакаючай інфармацыі. Першы элемент, які трэба пераглядзець: кадры контексту пасля кожнага раунду.
- Harness (C): адмініструецца выкананнем і вяснаванням супершчэнства. Тыповая працоўнае супершчэнства: апыткі вызвання інструментаў выклікаюць адказы, прабыванняя вызванняў без разумнае адгукі або немагчыма вяснаваць прычыны. Першы элемент, які трэба пераглядзець: неудачныя запісы ў лог-файле інструментаў.
- Loop (T): адмініструецца працэсам прыбліжэння да рашэння і зупінкай. Тыповая працоўнае супершчэнства: агент ніколі не прыбліжаецца да рашэння або ніколі не зупіняецца. Першы элемент, які трэба пераглядзець: павтаральныя успешныя вызванняя з майже ідэнтычнымі параметрамі.
Разлік бага ў системе harness ад бага ў цыклі
Самым часоэконамным спосабом аналізу є тое, што два разныя багі ззовні выглядаюць ідэнтычна. Агент, застрялі ў цыкле через неадекватны кантролер, і агент, застрялі через несправны апарат, практычна завжды показуюць адныя і тыя ж сімптамы: ўсё продовжаецца працаваць, сумы растуць, а ніхто не разумее прычыны. Короткі чарт контроля дапамагае адзначыць іх ад іншых проблем.
1. Аналізуюце лог вызоў апарата
Якшы ўсе вызовы апарата завершаюцца успешна з правдападобнымі рэзультатамі, але агент продовжае выканання таго ж апарата з практычна незменнымі параметрамі, гэта вказвае на цыкл.
2. Шукаеце паўтарыяся неудачы апарата
Якшо апарат знову і знову не функцыонуе, а агент працюе далей без змян у своіх методах, трэба падазрываць систему керавання.
3. Аналізуюце тое, што мог убачыць модэль
Якщо модель, здаецца, забывае факт падчас адпрацоўкі задання, пераканайцеся ў структураванні контэксту: чы не ёсць скрацення, замены, стиснення або як перадаецца стан між крокамі.
4. Пераканайцеся ў выходным рэзультате пасляўсі
Якщо інструменты працавалі, контэкст быў точны і цикл завершыўся правільна, але адпаведзь все ўсё ж некоректная, пагляньце на запрос.
Елементарная правіла
Багі ў цыкле крыюцца ў рашэнні пра тое, што будзе далей. Багі ў функцыях крыюцца ў там, што выходзіць з-пад кантролю, калі ўсё ламаецца. Багі ў контэксте крыюцца ў там, што можа бачыць модель. Багі ў запросе крыюцца ў там, што вы прасілі.
Адпаведзьце, які з чатырох пытанняў паспелівае, перш чым ўсё правяць.
Практычны прыклад: рэвізор патронажнага запросу, які не хочаць зупыняцца
Уявіце команду, яка выкладае агента для кодавання, який пераглядае запиты на зміны. Тэставанне праходзіць гладка. У рэальных умовах дзеянне дзеяння агента над певным запитам на зміны трывае больш чым 40 хвілін і прычынюе неспакоўны рахунок.
Першая тэорыя — запит занадта нечысты, і агент занадто багато думае. Запит перапішываюць; нічога не змініваецца. Другая тэорыя — контекст: можа, агент на кожным кроцы перачытае весь репазітарый. Але даныя паказваюць іншае: запрашэнне адбываецца правільна, і прыўлекаюцься толькі важлівыя файлы.
Потым хтось адзёрна ўважна чытае лог выканання інструментоў. Агент парадкоўна вызывае свой інструмент для адканання тэстаў, і кожны вызыв завершаецца без адхыленняў. Усё-такі набор тэстаў не працуе, і гэта вызвана ненадзейным тэстам інтеграцыі, які не мае стосунку да прагласу. Агент продовжае прымыкатися да гэтай проблемы за дапамогою несвязаных змян у кодзе і парадкоўных запускаў тэстаў, адколі нічога не паведамляе яго пра тое, што ён выканаў достатню колькасць спроб па гэтай задачы і трэба зупініцца, а таксама паведаміць вышэйшыя інстанцыі.
Гэта не проблема з запитам, не проблема з контекстам і не проблема з канструкцыяй; інструменты працавалі абсолютна так, як было запланавана. Це чыстая баг-петля. Паследовы анаіз кожнага крока паказвае, як дасягнуць такога вывару.
Крок 1: падтвердзіце, што інструменты працуюць
Успешныя выканання, зафіксаваные ў логу, апраношваюць найпростыяія проблемы канструкцыі, такія як команда, якая ніколі не выканаецца, або адаптар, який парадкоўна выклікае прычыны адхыленняў.
Шаг 2: параболіце стан межы ітерацый
Рэзультат тэста ўключаны ў контекст агента, і выкарыстанне дакументаў адбываецца правільна, таму модэль не прыпускаеся пасляўдак.
Шаг 3: перакананне ў збліжэнні
У репазітарые змяніюцца ў кожной ітерацыі, але сигнал пераканання, які мае значэнне, ніколі не павышаецца. Не існуе датчыка застою і няма ліміту прабаў для адной і той жа пад-меты.
Шаг 4: навучэнне кантролера выкрыты ўстою
Рашэнне — это невялікі фрагмент логіки кантролера, який параболіце сягнак прыбылі межы шагамі:
if progress_signature == previous_signature:
stagnant_steps += 1
else:
stagnant_steps = 0
if stagnant_steps >= 3:
escalate("no measurable progress")
stop()
progress_signature можа быть чым заводзе, што адражоўвае значыцый працэс, напрыклад, сумка неудачных тэстоў паўтараючыся ўсія іхе сообщэнняя пра адказ. Якщо ён не змінюецца, лічылка застою расте; пасля трох працэсаў застою кантролер паднімае проблему з адказам і зупыняецца. Будзь-яя рэальная зміна перазначае лічылку.
Можна пайсці даўжэй і абмежыць колькасць спроб для кожнай сігнатуры неудачы, а не толькі загальную колькасць ітэрацый. Разлік важны: падзесяць продуктыўных ітэрацый можа быць абсалютна нормальным, тады калі падзесяць спроб проты адной невыправнай неудачы тэста — глыбока трата часу. Рэальныя рашэнняе — не робіць модель менш упарчай, а даўаць кантролеру чыстае вяскаванне пра застой.
Аналіз прыкладу: абмежэнне, якое зникае з контексту
Уявіце агента, які на пачатку міграцыі пераканаецца, што нічога не павінна нашкодзіць існуючым кліентам. Чэрез сорак ходоў дыялог стае сконцентраваным, і гэтыя абмежэння зникаюць у падсумку. Тады агент пропануе змяну схемы, якая можа нашкодзіць.
Це выглядае як некоректныя міркуванні, але прычына крыўдзіцца інде. Пораўняйце контэкст, які модель фактычна отрымала на разныя ходы. Якщо абмежэння было на пятым ходу, але з’явілася на сораковым, то рашэнне лежыць у інжынерыі контэкста: зберагаць критычныя інваріанты окрема ад дыялогу, прымусваць падсумкі перадаваць явныя абмежэння і перастаць вважаць сырыю історію ўсёй правдай.
Фраза «модель забыла» ніколі не ёсць повным дыагназам. Корыстны вопыт — што фактычна было данае модэлі.
Шары, а не замены
Кожная новая даспэктна базуецца на старэйшых, а не заменяе іх. Агент для вырабаткі паводзіць ясны запрос у рэтельна выбраным контексте, запускае яго ў надзеянай супорцы і керуе всім цым за дапамою спецыяльнага циклу. Перадача тэрмінаў адбываецца па меры таго, калі командам даводзілася дадаць новыя элементы: спачатку яснейшыя інструкцыі, потым краща выбраная інфармацыя, пасля — серавак для выканання модэлю, і нарэшце — кантролер, які дазволяе гэтаму сераваку працаваць без нагляду. Якщо вы вирашыце, чыя ж адпаведальнасць — ваша сэрвісная супорта чы ўзорк, — то парабян сэрвісных супорт і складзеных узоркаў паказвае ўсі перады і недагоды.
Па PACT:
- Запрос: адзначыць інструкцыю.
Потым паспраўце рашэнне да асоблівасці канфузіі. Модель, якая неправаляўна адыначва чыста заданую задачу, патрабуе негледзячай роботы. Модель, якой не хапае фактов, на якія яна завісіць, патрабуе роботы з контекстам. Рашэнні, якія не ператвараюцца на надзеяныя дзеянні, патрабуе роботы з адаптаванням. Дзеянні, якія ўспыхваюць, хоча загальны процес ніколі не даходзіць да канвергенцыі, патрабуе роботы з цикламі.
Частае запытання
Ці інжынерыя harness — гэта проста іншая назва для фрэймворку агента?
Няма. Фрэймворк суплікуе элементы для будавання. Комплект з’яўляецца з рашэнняў, якія вы прыменяеце пад час ўскладнэння іх: аднос да несправнасці інструмента, захаваны стан, логаванне, правыя доступу і спосаб вярнення рэзультатаў у модель.
Чы трэба інжынерыі циклаў для асистента, які задае адна запытанне?
Не сапраўды. Інжынерыя циклаў становіць значэнне тады, калі агент выканае калькі дзеянняў па заданню і мусі сам або за дапамогою коду кантролера рашыць, чы работа завершана. Бот для запытанняў і адказоў з аднай транзакцыі майже не мае циклаў, якія трэба было б проектаваць.
Кой шар трэба выучыць першы?
Пачніце з інжынерыі запытанняў і контэкста, пасля чаго перайдзіце да комплекту і циклаў. Перш чым можаце дэбагаваць час выканання і код кантролера, вам трэба розразліць паслабленыя інструкцыі ад відсутнасці стану.
Чы адні багі можаць распрастароўвацца на калькі шароў?
Так, і самэ гэта частаюць найвялікімі сложнасцямі. Баг у контэксте можа сховаць сигнал прыгрошку ад ціклу, і тады гэта выглядае як баг ціклу. Неабходна дакладная пераследованне прычыны адзінай за адной, а не толькі устранэнне першага видныя симптому.
Ключовыя выводы
- Чатыры тэрміна описваюць механізмы керавання, а не супэрнічаючыя тэндэнціі: інструкцыю, стан готовасці модэлю, выконанне і вяснаванне, а таксама практычны прыгрошак з правіламі абаранення.
- Кожную расследаванне трэба пачынаць з аналізу лог-данных, а не з запита: трэба спытацца, што бачыў модэль, што рабіў час выконання, што змянілася между ітерацыямі, і чаму керавальны механізм выбраў продажчэнне.
- Успешныя вызовы інструментаў, якія павтараюцца з майже ідэнтычнымі аргументамі, указваюць на проблему ў цікле; павтараючыся няудачы з бездумным перапрыбуткамі указваюць на проблему ў системе падтрымкі.
- Для ціклаў неабходна чыстая дэфініцыя стану застою, жадаўна па сігнатуре кожнай няудачы, а таксама шлях для падняць проблемы на вышэйшы ранг.
Спаднёе чытанне
- Як протакол Model Context Protocol дапамагае агентам AI аднаходзіць і выклікаць інструменты — чытрае поясненне MCP: як хосты, кліенты і серверы дапамагаюць прыкладненням AI аднаходзіць інструменты, выклікаць іх з структураванымі данымі, а таксама якія ў іх є меры.
- CodeBuddy: Расумнейшыя методы выкарыстоўвання контэксту для агентаў AI, якія кодуюць — поясненне таго, як система выкарыстоўвання контэксту на аднойчыне з графам дапамагае агентам AI, якія кодуюць, ухіліцца ад недастатку і перанасылення контэкстам у вялікіх кодавых базаах.
- З адаптавання коду на Kotlin да керавання агентамі: новая роля інжынера мобайльных працоў — Как кодаванні агентамі змяняе работу інжынера Android на акцэнт на спецыфікаціях, контексте, архітектурных обмежэннях і перакананні, а таксама якія фундаментальныя прынцыпы становяцца ўсё важлівейшымі.