Практычныя нататкі: як pi праектуе агента, здольнага працаваць доўга
Практычны разбор тэмы «як pi праектуе агента, здольнага працаваць доўгі час»: кантракты, праверкі і гатовыя фрагменты кода для каманд, якія ўкараняюць гэты падыход.
Крыніцы: How pi Designs an Agent That Can Run for a Long Time
Існавайце гэта як перапрацоўаны варыянт ідэй з статты “Як pi праектуе агента, які можа працаваць дзялейна”, адпрацоўваны для аператараў: чыстыя этапы, аранжаваныя блакі коду і прыметкі з восстанавлення, якія застаюцца пасля перадачы.
AI
Этап лепшая працюе, калі яго розглядаць як вімерную паверхню. Запісаўце адна ідэальная транскрыпцыю, адзін прыклад неудачы і прыметкі з вярнення да пачатковага стану прычаму расшырэння масштаба. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісьць крок не выходзіце, прычына неудачы павінна вказываць на адную адпаведальнасць, а не на заплутаны ланцюг задач. Рэзервавайце стан графа ў простам і тыпізаваным фармаце. Вкладныя структуры маскуюць, які вузол запісаў кожны поле, і спакшваюць восстанавлення пасля перарываў.
Спецыфікацыя з 3,446 ліній робіць “чы можа ён продаваць працу з таго месца, дзе зупініўся” першай абмежэнням для всего часу выканання
Этап спефікацыі з 3 446 лініямі працюе наўжоўды лепш, калі яго розглядаць як вімерную паверхню. Запісаўце адна «золатая» версія транскрыпцыі, адзін прыклад неудачы і запіс пра вярнэнне да поперадньага стану пры расшырэнні масштаба. Разглядзайце гэты этап як кантракт межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаце крытэрыя успеху і не падзеўляйцеся частым, непূরным выкананнем задачы. Храніце стан графа як плоскі і з адначытаемымі дадзеннямі. Вкладаныя блокі дадзеных маскуюць інфармацыю пра тое, які вузел запісаў кожнае поле, і спакшуюць возз'яднанне пасля перарываў.
«Проста запісаць паведамленні» недастатня
Этап адміністрування паведамленняў працюе найэфектывнейша, калі яго розглядаюць як параметр, які можна вімерыць. Запісаўце адны ідэальны прыклад працы, адну справу з бягам і прымітку па поверненню да пачатковага стану, перш чым расшырваць сферу дзеяння. Запісвайце часы выканання і вартасць токеноў або запытаў разам з функцыйнальнымі рэзультатамі. Відразлівае прадставлення вартасцей запобегае неспакойным рахункам, калі працэс пераходзіць з дэмовай асяроддзя ў спяльнаныя сераверы. Храніце стан графаў у простам і тыпаваным фармаце. Вкладныя структуры маскуюць інфармацыю пра тое, які вузел запісаў канкрэтны поле, і спакшваюць продовжэнне працы пасля перэрываў.
Запісайце намер, а потым дзейвайце
Метод «Запісаць намерэнне, а потым перайшоў да наступнага этапу» працюе найэфектывней, калі яго розглядаць як вімерную плошчу. Зафіксавайце адны ідэальны прыклад працы, адзін прыклад неудачы і запіс пра вярнэнне да поперадньага стану пры розшырэнні масштаба. Зберагайце настройкі пазырочна ад коду прыемліка. Файлы сераўнавальнага сераўса, хранілішчы секрэтных даных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куда аператары можуць адбавляць контроль без неабяжнага чытання всіх дадзеных. Зберагайце стан графа ў простам і тыпаваным фармаце. Вкладныя структуры дадзеных маскуюць інфармацыю пра тое, які вузел запісаў які поле, і спакоююць продовжэнне працы пасля перэрываў.
Чатыры слоі стану сесіі
Чатыро слоёў этапы сесіі працуюць наякша, калі іх спрыяваць як мерыемую паверхню. Зберагучы адны ідэальны прыклад, адзін кейс неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расшырваць масштабы. Дакументаваць трэба як успішны, так і вярнучыся шляхы. Перапрыбуткі, людзкія контралі і обработка некорэктных паведамленняў ёсць часткай продукту, а не пасляднім дапрацоўкам. Станы графаў трэба падтрымваць у простым і тыпаваным фармаце. Вярнутыя блокі маскуюць інфармацыю пра тое, які вузел запісаў канкрэтны поле, і спакшваюць продовжэнне працы пасля перарываў. Чатыро слоёў этапы сесіі працуюць наякша, калі іх спрыяваць як мерыемую паверхню. Зберагучы адны ідэальны прыклад, адзін кейс неудачы і запіс пра вярнэнне да пачатковага стану, перш чым расшырваць масштабы. Спрыяваць гэтую стадыю як даговор межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даць назвы артыфактам, задаць крытэрыя успеху і не падзеўляцца частым, некорэктным завершэнням працы.
tree (shared, append-only) lanes
a ── b ── c ── d main → d (op log: …)
└── e ── f slack:171943… → f (op log: …)
global facts: name = "Refactor auth", label(b) = "checkpoint-1"
Тры відменнасці операцый
Для трохіць этапаў аператыў неабходна пазначыць вхідныя даны, адпаведальнага за кожную стэп і крытарыя завершэння працы перад змінайом коду. Аператары должны магчымае запускіць стэп з вядомай точкі контролю, не прабуючы вычуваць схованы стан. Запісвайце час выканання і вартасць токена або запыту разам з функцыйнальнымі рэзултатамі. Відразы вартасці з самага пачатку запобегае неспакоўным рахункам, калі працэс пераходзіць з дэмовай асяроддзя ў спакульную. Заставьце людзкія празборы на тых етапах, дзе вітрачаюцца грошы або зміняюцыся даны для працы. Компіляцыйныя налашчэння не ўзроўнаўцуюцься з павнайсткамасцю бізнес-процэсаў.
Кантэкст расце толькі ў канцы
Колькіх толькі кантэкст развіваецца на певным этапе, неабяжна ўзначыць вхідныя даны, адпаведальнага за крок і крытэрыя завершэння перад змінайом коду. Аперацыяныя працавнікі павінны магчымае перазапускаць крок з вядомай точкі контролю, не падозрываючы прыхованы стан. Конфігурацыю трэба знаходзіць за межамі коду прыкладнага праграмы. Файлы сераўіса, хранільнікі секрэтных даных і флагі функцый належаць у аднам месца, якое працавнікі можу аўдытуваць, не чытаяўшы весь ланцуг. Прызначыць людскія празгляды для рэшэнняў, якія вітрачаюць грошы або зменяюць даны у працэйнай сістэме. Падключэння ў час компілявання не адпавядае пачатковай цэлесообразнасі прыкладнага праграмы.
R step_attempt request in flight, context ends at user message U
session.appendMessage(M) caller resolves here
R write_deferred full payload, provisioned id
E assistant message A provider cached [.., U, A]
E message M checkpoint applies the write; tail append
Перэплненне мае толькі адну можлівасць
Калі праект Overflow мае толькі адзін этап, перад змянайом код неабходна ясная дэфініцыя вхідных даных, адпаведальнага за этап адпаведальнага і крэтарыяў выходу. Аператары должны магчыма было перазапускаць этап з вядомай точкі контролю, не падозрываючы прыхованы стан. Неабходна аддзеўнаваць дакументацыю як пра стандартны ход задачы, так і пра шляхі ўсунення праблем. Перапрыбуткі, людзкія пераказы і обработка некорэктных паведамленняў ёсць часткай продукту, а не дадатковым элементам пасляўпрацоўкі. Неабходна людзкая аправарэнне для тых крокоў, якія выкалічваюць грошы або змянююць даныя у працэсе віробніцтва. Компіляцыйныя налашчэнні не ўзроўнаваны з повнасцю функціоналу продукту. Калі праект Overflow мае толькі адзін этап, перад змянайом код неабходна ясная дэфініцыя вхідных даных, адпаведальнага за этап адпаведальнага і крэтарыяў выходу. Аператары должны магчыма было перазапускаць этап з вядомай точкі контролю, не падозрываючы прыхованы стан. Спрыяйце таму, каб гэты этап выступаў як контракт межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Дайце назвы всім элементам, задаць крэтарыяў успеху і не прабывайце прыймаць часткова завершаныя рэзультаты без паведамлення.
function isRecoverableLength(message: AssistantMessage, desiredMaxOutput: number): boolean {
if (message.stopReason !== "length") return false;
if (desiredMaxOutput > 0 && message.usage.output >= desiredMaxOutput) return false;
return true;
}
Пяць пунктав збою ў рамках адной вызову інструмента
Калі працюеце над пяцьма пунктамі збою, спачатку запісайце умовы вікорыстання: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага збою. Такі спіс дапамагае заліцварыць будучыя змены коду. Запісуйце час выканання і вартасьць токена або запіту разам з рэзультатамі функцыянальнай працы. Візуальны адглед костоў з самага пачатку запобегае неспакойным рахункам, калі працэс пераходзіць з дэмавайну у спяльныя сераўы. Запісуйце назву інструмента, хэш аргументаў, час затрымкі і рэзультат кожнага вызову. Без такога журналу дэбаггін агента губіць гады.
E assistant message, calls c1, c2
X1 before before_tool nothing durable for c1
H before_tool(c1)
X2 decision made, nothing written same as X1
R tool_started(c1)
X3 tool executing
H after_tool(c1)
X4 hook interrupted same durable state as X3
E tool result c1
X5 result durable c1 finished
Паставленыя на паузу працэсы выглядаюць так сама, як тыя, што збіліся
Калі працуеце з стадыяй «A – павернутая смуга», спачатку запісайце угоду: неабяжлівыя даны, сігнал успеху і тое, што выходзіць у разе частковага абякання. Такі спіс пераконтролюе чыстасць пазнейшых змян у кодзе. Зберагаюце канфігурацыю пазней да коду прыемлівача. Файлы сераўнавання, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавіць аўдыт без неабяжлівага чытання всей структуры. Ставяце контрольны пункт пасля дорогіх крокаў. Продовжэнне работы не должна занова ставіць плату за той самы вызов LLM, калі аператар перапрыяўляе працу да пазнейшага вузла.
Спачатку запісваецца бухгалтэрскі ўчот, а правільнасць вылагоджваецца пазней
Калі працуеце на стадыю «Запіс у кнігу рахункоў», спачатку запісайце контракт: неабходныя даны, сігнал успеху і тое, што выканаецца у разе частковай няудачы. Такі спіс пераканаецца дапамагае залічваць пазнейшыя змены коду чыста.
Конкурэнціі рашаюцца толькі двума способамі
Працэсы рашынгу працуюць наякша, калі іх розглядаць як вімерную паверхню. Зафіксавце адны «золаты» прыклад работы, адну справу з бягамі і прыметкі па поверненню да пачатковага стану пры перадзеяванні масштаба. Запісваўце часы выканання і косты токеноў або запытак праза функцыйнае рэзультат. Відкрытыя даныя пра косты з’являюцца рана, таму не будзе неспакою з рахункамі, калі працэс перэйдзе з дэма-сераверу ў спяльныя асяроддзя. Храніце стан графаў у простам і тыпаваным фармаце. Вкладзеныя блокі маскуюць інфармацыю пра тое, які вузел запісаў якое поле, і спакшваюць продажчэнне працы пасля перарываў.
Перакананне ў відновленні сама сябе
Практыка перагляду самога працэса восстановлення працюе найэфектывней, калі яе расследваць як мерыемую паверхню. Запісаце адна «золатая» копія дадзеных, адзін прыклад неудачы і запіска пра поверненне да пярвоначальнага стану пры расшырэнні масштаба. Храніце настройкі пазначыльна ад коду прыемлена. Файлы са станамі сераў, базы з таямнымі дадзеннямі і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавіць аўдыт без неабяжнага чытання всіх дадзеных. Храніце стан графа ў простам і тыпаваным фармаце. Вярнутыя структуры дадзеных маскуюць інфармацыю пра тое, калькі вузел запісаў калькі поле, і спакоююць працэс восстановлення пасля перарываў.
Тэставанне праз брутальную перыябрацію кожнай точкі зламу
Этап тэставання па методзе брутальнай сілы працуе наяўна, калі яго спрыяваць як мерыемую паверхню. Зафіксавайце адны ідэальны прымер працы, адзін кейс неудачы і прыметкі па адвярненню змян пры расшырэнні масштаба. Дакументавайце як шлях успеху, так і шлях вяснавання сітуацыі. Перапрыбуткі, людзкі контроль і обработка некорэктных паведамленняў ёсць часткай продукту, а не наступным этапам дорабачання. Храніце стан графаў у простам і тыпаваным фармаце. Вярнутыя структуры даных маскуюць інфармацыю пра тое, які вузел запісаў кожнае поле, і спакоююць працэс пасля перарываў. Этап тэставання па методзе брутальнай сілы працуе наяўна, калі яго спрыяваць як мерыемую паверхню. Зафіксавайце адны ідэальны прымер працы, адзін кейс неудачы і прыметкі па адвярненню змян пры расшырэнні масштаба. Спрыявайце гэты этап як кантракт між вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, задайце крытэрыя успеху і адмовіцеся ад мовчанкавага частковага завершэння.
Косцы
На стадыі вылічэння костоў неабходна прадзефінаваць вхідныя даны, адпаведальную особу за выкананне крока і крытэрыя завершэння пры перадзмене коду. Аператары должны магчыма было перзапускаць крок з вядомай точкі контролю, не прабуючы спадарацца пра схованы стан. Запісваюць час выканання і кост токенаў або запытаў разам з функцыйнальнымі рэзультатамі. Відразлівае прадставлення костоў запобегае неспакойным рахункам, калі працэс пераходзіць з дэмаверсіі ў спяльныя асяроддзя. Неабходна людская апрацоўка для тых крокаў, якія вітрачаюць грошы або зменяюць даны ў працэсе віробніцтва. Праця ў час компілявання не ёсць гарантыяй полнай адпаведнасці праекту бізнес-трэбованням.
Заключнэ
Для фінальнага этапу паказвайце вхідныя даны, адміністратара крока і крэтырыя для завершэння пры перадзеіснаванні коду. Аператары должны магчымаць перзапуск крока з вядомай точкі контролю, не спрабоўваючы здагадвацца пра схованы стан. Канфігурацыю трэба залічыць праза код аплікацыі. Файлы сераўнавання, храненні секрэтных даных і флагі функцый должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць, не чытаяўшы весь код. Прызначайце людскія апраўленні для рэлей, якія вітрачаюць грошы або зменяюць даны ў працэсе. Прыўязка на час компілявання не ёсць падтверджэннем полнайасці бізнес-процэсаў.
Чэк-ліст для эксплуатацыі
Калі працюеце над чэк-лістам для эксплуатацыі, спачатку запісайце умовы: неабходныя вхідныя даны, сігнал успеху і тое, што выканаецца у разе частковага абякання. Такі чэк-ліст дапамагае заставіць пасляэтапныя змены коду чыстымі.
Лепшыя маленькія, тэставальныя елементы чым велікія скрыпты. Калі якісь крок не выйшаў, адказчык за гэта падазрэнне павінен быць адзін, а не цэлы заплутаны ланцюг задач.
Зробіце контрольную точку пасля дорогіх крокаў. Продакт, які продовжае працу, не павінен занова ставіць плату за той самы вызыв LLM, калі аператар прабуе зноў выконаць пазнейшы вузел.
Фіксуйце версіі залежнасцяў і запішыце хэш адобраза, які выканаў дэманстрацыю. Возможнасць перадарабаткі важлівейшая, чым традыцыйныя знання.
Спрыятлівае ставленне да гэтага этапу як да кантракту межа вхіднымі дадзеннямі і перакананымі выходнымі рэзультатамі. Дайце назвы артыфактам, задаць крытэрыя успеху і адмовіцеся ад мовчанкавага частковага завершэння.
Зробіце контрольную точку пасля дорогіх крокаў. Продакт, які продовжае працу, не павінен занова ставіць плату за той самы вызыв LLM, калі аператар прабуе зноў выконаць пазнейшы вузел.
Перш чым запускаць стак, заморозьце версіі, зафіксавайце «золаты» транскрыпты для крытычных шляхоў і паказвайце спосабы атрыбуціі. У спадзяльных срэдах неабходны ліміты частоты запытоў, пераканання ў належнасці тэнанту і чысткі власнік для ротацыі секрэтных даных. Лепш выбраць простую надзею на надзейнасць, чым хітрыя експерыментальныя дэманстрацыі.
Прыметка для 58b36f32f593: не кладзіце ключы прадаўца ў рэпазітарый, задаце верхнюю межу токеноў на сесію і зберагачыце транскрыпты празаўсёды разам з фікстурамі для ацэнкі, каб пазнейшыя замены мадэляў заставаліся порównанневымі.
Калі працуеце над пунктом 0 з ударжання безпекі, спачатку запісайце умовы: неабходныя даныя, сігнал успеху і тое, што выходзіць на падчасныя абыекты. Такі чэк-ліст дапамагае заставаць пазнейшыя змены коду чыстымі. Дасведчывайце як «шчаслівы» шлях, так і шлях вяснавання разам. Перапрыбуткі, людзкія контралі і обработка некорэктных паведамленняў — гэта частка продукту, а не пазнейшая дапрацоўка.
Дзеянне паўжасткі 0/778: звярніце увагу на час выканання, клас памылкі і колькасць токенаў, выкарыстоўваных для гэтай змяны, а пасля, на аднойчынных пытаннях, а не на аналагіях, адначынна рашыце, чы хацеце застаўіць гэту змяну.
Этап 1 паўжасткі працюе найэфектывней, калі яго спрыяваць як меравальную плошчу. Запісаце адну ідэальную транскрыпцыю, адзін прыклад неудачы і змяну, якая павертае стан у пачатковы, прычаму расшыруваць масштаб не трэба. Спрыявайце гэты этап як кантракт межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даўце назвы артыфактам, задаце крытэрыя успеху і адмовіцеся ад мовчанкавага частковага завершэння.
Дзеянне паўжасткі 1/778: звярніце увагу на час выканання, клас памылкі і колькасць токенаў, выкарыстоўваных для гэтай змяны, а пасля, на аднойчынных пытаннях, а не на аналагіях, адначынна рашыце, чы хацеце застаўіць гэту змяну.
Для другага этапа практыкы зміцнення неабяжна пазначыць вхідныя даны, адпаведальнага за крок і крытэрыя завершэння пры зміне коду. Аператары должны магчымаць перзапуск кроку з вядомай точкі контролю, не падозрываючы прыхованы стан. Конфігурацыю трэба залічыць пазначальна ад коду прыкладнення. Файлы сераўнавання, хранільнікі секрэтных даных і флагі функцыйяў должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць, не чытаяўшы весь ланцуг.
Дзялейчык практыкі зміцнення 2/778: вы мераваеце час выканання, класыя ошыбакі і вітрату токенав для гэтай практыкі, а потым выявляеце, чы рашацься застаўіць змяну на адной пазначанай сэткі пытанняў, а не на адной лячбе.
Калі працуеце над 3-й стадзіяю практыкы забезпечэння безпекі, спачатку запісайце умовы кантракта: неабяжлівыя даныя, сігнал успеху і тое, што выходзіць на падзею частковага нявыпання. Такі спіс контроля дапамагае заліцвачыць пазнейшыя змены ў кодзе. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выйшае, прычына нявыпання павінна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач.
Дзеянне 3/778 практыкы забезпечэння безпекі: замерайце час выканання, класы каштоўкаў і вітраты токенав для гэтай практыкі, а потым вырашайце, чы робіць змены на адной основе фіксаванага набору пытанняў, а не на адной лячбе.
3-я стадзія практыкы забезпечэння безпекі працуе лепей, калі яе спрыяваць як меравальную плошчу. Запісайце адны ідэальны прыклад работы, адзін кейс нявыпання і прыказку па адкатаванні, перш чым расшырваць масштаб. Запісвайце часы выканання і вартасць токенав або запыткаў разам з функцыйнальнымі рэзултатамі. Відкрытая інформацыя пра вартасці запобегае неспакойным рашчыткам, калі працэс пераходзіць з дэмавайшнага рэжыма ў спяльныя асяроддзя.
Дзеянне паўжчання 4/778: звярніце увагу на час выканання, класыя ошыбак і колькасць токенаў, якія былі выкарыстаны для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на асобістых спазырэннях, выявіце, чы хацяце застаўіць змены.
Для 5-го этапу паўжчання неабходна перад змянай коду чытко апісаць вхідныя даны, адпаведальнага за этап і крэтыярыя завершэння. Аперацыёныя працавнікі должны магчымае перадзвануць гэты этап з вядомага пункта контролю, не прымуджаючыся здагадвацца пра схованы стан. Неабходна адзначыць як шлях успеху, так і шлях вярнення да нормальнага стану. Праказкі, перадпрыемы і обработка некорэктных паведамленняў ёсць часткай продукту, а не чымось, што дадаецца пазней.
Дзеянне паўжчання 5/778: звярніце увагу на час выканання, класыя ошыбак і колькасць токенаў, якія былі выкарыстаны для гэтага запісу, а пасля, на аднойчынай базе фіксаванага набору пытанняў, а не на асобістых спазырэннях, выявіце, чы хацяце застаўіць змены.
Калі працуеце над 6-ю стадзіяй забезпечэння безпекі, спачатку запісайце контракт: неабяжлівыя даныя, сігнал успеху і тое, што выходзіць пад частковы нявыплэн. Такі спіс контроля дапамагае заставіць пазнейшыя змены коду быць чыстымі. Спрыятлівае ставленне да гэтай стадзіі як да контракта межа данымі і перакананымі выходамі. Дайце назвы элементам, задаце крытэрыі успеху і адмовіцеся ад тых частковых выплэнаванняў, якія залішаюцца непазначанымі.
Дзеянні забезпечэння безпекі 6/778: вымерыце час выканання, класію памылак і колькасць выкорыстоўваных токенав для гэтай змены, а пасля выберыце, чы робіць яе, на адной пазначанай сэткі пытанняў, а не на адной лячбе.
7-я стадзія забезпечэння безпекі працюе лепей, калі яе спрыятлівае ставленне як да вымержым параметрам. Запісайце адну ідэальную транскрыпцыю, адзін прыклад памылкі і змест запуску аператывнага вярнення раней, чым расшырваце сферу дзеяння. Зберагаюце настройкі за межамі коду прыемленае. Файлы сяродавішча, хранільнікі секрэтных дадзенняў і флагі функцый должны знаходзіцца ў аднам месцы, якое аператывныя працавнікі могу пераглядаць, не чытаючы весь граф.
Дзеянне паўжырання 7/778: зважыце час выканання, класію адказаў і колькасць токенаў, выкорыстаных для гэтага запісу, а пасля вырашыце, чы рашыцца застаўіць змяну на аднойчы назначанай сэткі пытанняў, а не на адзінокых прыкладах.
Для 8-го этапу паўжырання задаць неабходна вхідныя даны, адпаведальнага за крок і крытэрыя завершэння пры зміне коду. Аперацыйныя працавнікі должны магчымае перадзваначыць крок з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан. Лепш выбіраць маленькія, тэставаныя елементы замест абмоўжлівых скрыптав. Калі крок не выйшоў, прычына неудачы должна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны працэс.
Дзеянне паўжырання 8/778: зважыце час выканання, класію адказаў і колькасць токенаў, выкорыстаных для гэтага запісу, а пасля вырашыце, чы рашыцца застаўіць змяну на аднойчы назначанай сэткі пытанняў, а не на адзінокых прыкладах.