Я протестував дві архітектури AI-контексту: Context Discovery vs Prompt Engine. Ось що з цього вийшло
Останні кілька місяців я розробляю власний AI-фреймворк для розробки ПЗ. Він містить інструкції для різних інженерних задач: реалізації функціональності, рефакторингу, написання тестів, дебагінгу, роботи з API, code review та багатьох дрібніших активностей. Коли фреймворк виріс до понад 100 000 символів інструкцій, одне питання стало особливо актуальним: як передати AI-агенту саме ті інструкції, які йому потрібні, не завантажуючи весь фреймворк у його контекст?
Працюючи над цією проблемою, я протестував дві різні архітектури: Agent-Driven Context Discovery та Prompt Engine with Context Compilation. Обидві дозволяють зберігати інструкції модульними та завантажувати лише те, що стосується поточної задачі. Ключова різниця між ними — у тому, хто відповідає за формування цього контексту.
Agent-Driven Context Discovery залишає цю відповідальність самому агенту. Ви даєте йому точку входу — зазвичай базовий файл з інструкціями, — а той уже посилається на інші інструкції. Агент читає ці файли, переходить за посиланнями між ними та поступово формує контекст, необхідний для виконання задачі.
Prompt Engine with Context Compilation переносить більшу частину цієї роботи в детермінований код. Агент усе ще визначає тип задачі, над якою збирається працювати, але після цього Prompt Engine детерміновано знаходить необхідні інструкції та компілює їх у готовий контекст. Агенту більше не потрібно самостійно шукати й завантажувати кожну інструкцію.
Спільна основа: Intent Router / Playbook
Обом архітектурам потрібен механізм, який пов’язує конкретну задачу з відповідними інструкціями. Я називаю його playbook.
По суті, playbook — це intent router. Він описує типи активностей, які підтримує фреймворк, і пов’язує їх із необхідними наборами інструкцій. Реалізація фіч, рефакторинг, написання тестів, дебаг і code review — приклади активностей, для яких можуть бути потрібні різні набори інструкцій.
У Context Discovery цей роутинг може бути частиною самого графа інструкцій. Базова інструкція говорить агенту, куди рухатися далі, а агент сам проходить відповідним шляхом.
У моєму Prompt Engine для цього використовується MCP-тулза getInstructions. Вона приймає типізовані задачі та програмно визначає, які саме інструкції потрібно скомпілювати. Таким чином, агент приймає одне високорівневе рішення — «Що я зараз збираюся робити?», — а детермінований код відповідає на низькорівневе питання — «Які саме інструкції потрібні для цієї активності?»
Підхід 1: Agent-Driven Context Discovery
Це була перша архітектура, яку я реалізував. Я розбив свій фреймворк на багато невеликих файлів з інструкціями та створив між ними посилання. Агент отримував базову інструкцію як точку входу й мав переходити за цими посиланнями, коли йому були потрібні додаткові інструкції.
Концептуально це виглядало приблизно так:
Task → Base Instructions → Agent → Referenced Instructions → More Instructions → Work
Спочатку цей підхід мені подобався, оскільки його було надзвичайно легко реалізувати. Система інструкцій залишалася модульною, окремі файли можна було перевикористовувати, а додавання нового правила зазвичай зводилося до створення або оновлення посилання. Окрема інфраструктура для збирання промптів була не потрібна, оскільки роль ресолвера фактично виконував сам агент.
Однак після певного часу використання цієї архітектури я почав помічати відразу декілька проблем.
Проблема 1: зайве когнітивне навантаження
Щоразу, коли агент зустрічає посилання, йому потрібно зрозуміти, навіщо існує ця інструкція, вирішити, чи потрібно переходити за посиланням, отримати файл, опрацювати його та, можливо, повторити цей процес ще кілька разів. Це невеликі рішення, але їх усе одно приймає модель замість того, щоб цю роботу виконував детермінований код.
Мені дедалі менше подобалося витрачати когнітивну здатність агента на таку технічну рутину. Я хочу, щоб модель думала про архітектуру, вимоги, eедж кейси та рішення щодо реалізації. Розв’язання залежностей між інструкціями не потребує інтелекту, якщо ці залежності вже можна описати програмно.
Проблема 2: недостатня надійність
Я неодноразово бачив, як агенти пропускали файли, навіть коли інша інструкція прямо вимагала їх прочитати. Це відбувалося не завжди, але достатньо часто, щоб я не міг вважати доставку інструкцій надійною.
Це створює доволі неприємний ефект. Агент може написати цілком адекватний код, водночас непомітно пропустивши одне з правил, якого мав дотримуватися. Проблема навіть не в тому, що модель неправильно зрозуміла інструкцію — вона взагалі її не завантажила.
Проблема 3: використання тулзів
Читання кожного файлу з інструкціями потребує окремого виклику тулзи. Коли понад 100 000 символів інструкцій розподілені між багатьма файлами, агент може зробити несподівано велику кількість викликів лише для того, щоб підготуватися до виконання основної задачі.
Я регулярно впирався в максимальний ліміт викликів тулзів у Copilot, поки агент ходив по файлах з інструкціями. Коли це відбувалося, Copilot просто зупинявся ще до завершення основної задачі. Для мене це стало досить сильним сигналом, що архітектуру потрібно змінювати.
Проблема 4: неефективне використання контексту
Ще одна проблема полягає в тому, що роутинг-інструкції залишаються в контексті агента значно довше, ніж вони реально потрібні. Інструкції на кшталт «прочитай цей файл», «для цієї активності також прочитай той файл» або «якщо виконується ця умова, завантаж додаткові інструкції» корисні під час Context Discovery, але майже не мають цінності після того, як агент почав виконувати саму задачу. Від цього моменту вони просто займають місце у контексті.
Більше того, ця проблема має потенціал до зростання. Якщо агент періодично ігнорує правила і не завантажує правильні файли для певних активностей, природна реакція — зробити роутинг-інструкції детальнішими: додати пояснення, специфічнішу термінологію, описати додаткові умови або повторити важливі посилання. Це може підвищити надійність читання, але водночас збільшує кількість тимчасової інформації, яка залишається в контексті протягом усієї задачі.
Інакше кажучи, чим більше зусиль ви витрачаєте на те, щоб зробити Agent-Driven Context Discovery надійним, тим більше контексту можете витрачати на інструкції, які стають непотрібними одразу після завершення discovery.
Підхід 2: Prompt Engine with Context Compilation
У другій реалізації я виніс формування інструкцій з агента в код.
Фреймворк усе ще містить десятки невеликих файлів з інструкціями, які можна перевикористовувати. Різниця в тому, що агенту більше не потрібно проходити їх один за одним. Скрипт сам розв’язує залежності, збирає потрібні файли та повертає повний набір інструкцій за одну операцію.
Архітектура тепер виглядає приблизно так:
Task → Activity → Prompt Engine → Compiled Context → Agent → Work
Зміна може здатися невеликою, але на практиці результат виявився суттєвим. Щойно агент обирає інструкцію, решта процесу стає детермінованою. Якщо для задачі X потрібні інструкції A, B, C і D, Prompt Engine гарантовано передасть усі чотири. Більше немає проміжного кроку, на якому агент може забути відкрити C або вирішити, що D йому не потрібна.
Формування контексту також стало значно швидшим. Замість послідовності запусків тулзів, читання файлів один за одним і роздумів щодо того, що потрібно завантажити далі, агент робить один запит. Prompt Engine програмно проходить граф інструкцій і повертає скомпільований контекст за одну операцію. Це прибирає як затримки від послідовних викликів тулзів, так і rзайве когнітивне навантаження, пов’язане із навігацією структурою інструкцій.
Ще одним важливим покращенням стало усунення практичного обмеження Copilot, у яке я постійно впирався: максимальної кількості вркликів тулзів, доступних агенту. З Context Discovery агент регулярно вичерпував цей ліміт, переходячи між файлами та читаючи інструкції, через що Copilot зупинявся до завершення задачі. Після перенесення формування інструкцій у Prompt Engine їх отримання потребує лише одного виклику, тому ця проблема фактично зникла з радару.
На практиці я одразу отримав три переваги: необхідні інструкції почали надійно потрапляти в контекст, його формування стало значно швидшим, а пошук інструкцій перестав витрачати обмежені виклики тулзів агента. У сукупності це дало дуже помітне покращення швидкості та надійності мого воркфлоу.
Але все має свою ціну, і цей підхід — не виняток. Разом із перевагами Prompt Engine приносить додаткову складність і кілька нових проблем, які доводиться вирішувати.
Проблема 1: Prompt Engine перетворюється на мініпродукт
Перший недолік — додаткова інфраструктура. У моєму випадку Prompt Engine потребує власного MCP-сервера, який надає агенту тулзи для отримання інструкцій. Щойно ви додаєте цей шар, у вашому репозиторії фактично з’являється ще один невеликий програмний продукт.
Як і будь-який інший софт, його потрібно підтримувати. Треба стежити за якістю реалізації, обробляти едж кейси і, в ідеалі, покрити критичну поведінку автоматизованими тестами. У міру розвитку системи інструкцій разом із нею має розвиватися й Prompt Engine.
Це просто ціна переходу від легкої структури інструкцій до складнішої архітектури. Ви отримуєте більш детерміновану та надійну доставку контексту, але водночас додаєте ще один компонент, за підтримку якого тепер відповідаєте.
Проблема 2: можна випадково створити два джерела істини
Ще одна складність — представлення інструкцій. Формат, зручний для програмної обробки, не обов’язково буде зручним для людини. Наприклад, Prompt Engine може бути зручніше працювати зі структурованим JSON, тоді як я волів би читати, писати, рев’ювати та підтримувати ті самі інструкції у Markdown.
Очевидне рішення — зберігати обидва представлення, але тут одразу виникає нова проблема: вони можуть розійтися. Якщо JSON говорить одне, а Markdown — інше, у вас фактично з’являються два джерела правди і вже незрозуміло, яке представлення описує реальну поведінку системи.
Краща архітектура повинна мати одне канонічне джерело та детермінований спосіб генерувати з нього інше представлення. В ідеалі обидва формати також мають залишатися структурно достатньо схожими, щоб ви могли дебажити JSON, який отримує агент, читаючи зручний для людини Markdown. Інакше зручність двох представлень швидко перетвориться на ще одну проблему з підтримкою.
Проблема 3: скомпільовані інструкції можуть забруднювати контекст
Prompt Engine може навіть погіршити використання контексту, якщо правила плейбуку прописані недостатньо жорстко. Уявімо, що поточна сесія вже містить інструкції для API engineering, але агент не розуміє, що повторно запитувати їх не потрібно. Він може ще раз викликати тулзу й додати в розмову ще одну повну копію того самого скомпільованого контексту.
Якщо ваші набори інструкцій великі, це може виявитися доволі дорогою помилкою з погляду контексту. Замість оптимізації ви починаєте заповнювати вікно контексту повторними копіями одного й того самого матеріалу. І що частіше агент повторно запитує інструкції, то швидше накопичується це дублювання.
Моя рекомендація — додати жорсткий запобіжник на рівні інфраструктури. Відстежуйте, які набори інструкцій уже були передані протягом поточної сесії, і якщо агент повторно запитує той самий набір, не повертайте його повністю. Натомість поверніть коротке повідомлення про те, що ця інструкція вже присутня в поточному контексті й агент має використовувати її.
Я також явно описую ситуацію, коли спрацьовує запобіжник. Якщо агент вважає, що потрібної інструкції насправді немає, попри спрацювання запобіжника, він має сприймати це як критичну неузгодженість, зупинитися та повідомити про проблему користувачу, а не мовчки ще раз запитувати або реконструювати той самий контекст.
Це хороший приклад того, як невеликий детермінований запобіжник може запобігти великій кількості непотрібного дублювання контексту.
Важливий нюанс: один недетермінований крок усе ще залишається
Ця архітектура не робить абсолютно все детермінованим. Агент усе ще має правильно вибрати тип задачі під час виклику getInstructions, а цей вибір уже є рішенням LLM.
Саме тому, на мою думку, інтерфейс тулзи має бути строго типізованим, а playbook — ретельно спроєктованим. Назви й описи активностей повинні бути достатньо однозначними, щоб модель могла надійно зіставляти з ними реальні задачі. Інакше ви просто переносите слабку точку з пошуку інструкцій на класифікацію задач.
Я також рекомендую уважно спостерігати за роутингом після впровадження такої системи. Дивіться, які активності агент обирає для реальних задач, і коригуйте плейбук, коли знаходите неоднозначні випадки. У моєму фреймворку, за суб’єктивною оцінкою, неправильний вибір активностей трапляється менш ніж у 1% випадків, а можливо, навіть менш ніж у 0,5%, тому на практиці це не стало для мене суттєвою проблемою.
Висновок
Після роботи з обома архітектурами для мене Prompt Engine with Context Compilation перемагає з великим відривом.
Насправді різниця тут не стільки в промптах чи файлах.
Головне питання:
Які обов’язки варто залишити LLM, а які краще передати традиційному софту?
LLM чудово справляється з розумінням намірів, інтерпретацією неоднозначних вимог, аналізом коду та прийняттям рішень, які неможливо звести до простого алгоритму. Скрипт, своєю чергою, чудово виконує наперед визначені залежності, збирає файли, валідує вхідні дані та щоразу видає однаковий результат.
- Context Discovery змушує LLM займатися і тим, і іншим.
- Prompt Engine дозволяє провести межу між цими зонами відповідальності значно чіткіше.
Цей експеримент зрештою став одним із джерел ширшого принципу, який я зараз використовую у своєму Semi-Automatic AI-Native Flow with a Human in the Loop: якщо щось можна надійно виконати детермінованим кодом, я намагаюся винести це за межі відповідальності агента.
Для мене це стає одним із найцікавіших питань AI-native розробки.
Ми багато говоримо про те, скільки ще відповідальності можна передати AI-агентам.
Можливо, не менш важливе питання — скільки відповідальності ми можемо в них забрати?
56 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарівТрадиційному софту віддавати скоуп, де недетермінована поведінка is not an option.
Це так, але стаття більше про те як надати інструкції (в термінології Claude Code, skills) AI кодінг-агентам для виконання тієї чи іншої задачі. Якщо, наприклад, ваш проєкт mix AI workflows і детермінованих workflows, але задача ніяк не виграє від AI workflow, або це навіть може зашкодити, то в інструкціях для цього типу задач це повинно бути явно вказано.
ось якраз приклад такого кейсу
Так, тестування AI-рішень — це взагалі окрема велика тема, і поки що у своїх статтях я її свідомо не покриваю.
Тут, наприклад, окреме питання — **чи потрібен AI workflow у конкретному місці взагалі**. Якщо проєкт поєднує AI та deterministic workflows, але певна задача ніяк не виграє від недетермінованості AI — або, гірше, через неї стає менш передбачуваною чи надійною, — я не бачу сенсу використовувати там AI лише заради AI.
Детерміновані задачі, де результат можна однозначно описати й перевірити кодом, я б і залишав детермінованими. А AI використовував там, де його здатність працювати з неоднозначністю справді дає якусь додану цінність.
Так, я з вами абсолютно згоден. Але проблема якраз у тому, що детерміновану поведінку дуже часто чомусь перекладають на AI.
Буквально в кожному другому шаблоні промпту, гайді чи статті на тему можна побачити інструкції на кшталт: використовуй чотири пробіли замість табуляції, став крапку з комою в кінці рядка, дотримуйся такого-то форматування тощо.
На мій погляд, це просто шум. Такі правила марно займають контекст і витрачають когнітивний ресурс моделі на те, що чудово й надійно вирішується детермінованими інструментами.
Все, що можна однозначно перевірити або виправити лінтером, форматером, типізатором чи іншим детермінованим засобом, краще віддавати саме їм. AI варто залишати ті задачі, де справді потрібні аналіз, контекст і прийняття нетривіальних рішень.
Це якраз проблема тих людей, хто так робить. Зниз більшість це ті, хто не розуміє що вони роблять.
Власне, ця стаття якраз і написана для того, щоб люди могли розвиватися, краще розуміти, що саме вони роблять, і поступово переходити від «воно якось працює» до усвідомленого інженерного підходу.
Тому я б не ставив тут клеймо на тих, хто чогось поки не розуміє. Значно корисніше дати їм інструменти й підходи, які допоможуть це розуміння побудувати.
agents.md
^^^ Це якщо ви хочете уніфікований підхід зрозумілий всім AI coding агентам. Хоча той же Cursor зрозуміє і підтягне Claude Code skills і vice versa.Плюс можете створювати shared інструкції (skills) і упаковувати в sharable packages (plugins). Наприклад для Claude Code можете створити sharable plugin і затягувати в свої проєкти.
Але це все скажімо так організаційні моменти. А безпосередньо вирішення любої відносно непростої задачі бажано починати з створення плану — якщо це Claude Code CLI, то я починаю виконання задачі з
/plan. SDD (Spec-driven developmen): Specify → Plan → Tasks → Code ;)P.S.: Корисно глянути: www.skills.sh
Дивіться, по-перше, у нас на проєкті є корпоративні обмеження, тому матеріал для цієї статті я тестував саме на Copilot.
По-друге, сама стаття трохи не про skills як такі. Вона радше про те, як формувати контекст для агента. Якщо зовсім коротко, я намагався відповісти на питання: що ефективніше — змушувати агента самостійно шукати необхідні частини інструкцій чи зібрати потрібний контекст скриптом і відразу передати його агенту.
Щодо підходу «спочатку plan, потім SDD: Specify → Plan → Tasks → Code» — тут я з вами принципово не погоджуюся. Я багато разів намагався працювати таким чином, і жодного разу це нормально для мене не спрацювало. Причина проста: на початку задачі практично неможливо побудувати повну ментальну модель системи. Ти не знаєш усіх залежностей, прихованих вимог, конфліктів, суперечностей та edge cases. Скільки б ти не займався майндкодингом, частина цього все одно проявиться лише під час реалізації та тестування.
Тому моя ментальна модель задачі зазвичай еволюціонує разом із кодом і остаточно допилюється вже на етапі тестування. Через це spec-driven development і розробка «від плану» особисто для мене працюють гірше, ніж більш ітеративний підхід.
Щодо skills.sh — рекомендація корисна, особливо для загального розвитку. Питання «що взагалі варто писати в prompt/instructions?» цілком валідне, і подібні ресурси можуть дати на нього початкову відповідь. Але проблема в тому, що ця відповідь неминуче буде досить загальною — умовно кажучи, «роби добре, не роби погано» — і, головне, вона буде поза контекстом конкретної кодової бази.
Тому я такими агрегаторами майже не користуюся для формування власних інструкцій. У мене підхід набагато простіший: кожну важливу думку про архітектуру, conventions, обмеження чи поведінку системи я одразу записую в policy/instruction. З часом таким чином природно накопичується досить точний опис конкретного проєкту, а заодно фактично документується сама кодова база. Для мене цей підхід працює значно краще.
Це саме так і працює — специфікації системи еволюціонують в процесі розробки і є single source of truth що описує поточну поведінку системи (spec-anchored).
тільки для Github Spec Kit щоб цього добитись треба ще додатковий плагін (spec-kit-sync), OpenSpec в цьому плані більш конситентний.
В майбутньому, воно допомагає визначитись — це баг чи фіча?
Особливо, коли перша команда розробників вже втікла, а нова ще не роздуплилась.
це залежить чи працювати з ssd почали на новому проекті (greenfield) чи зайшли на старий (brownfield) i там вже почали з ssd працювати.
з greenfield допомагає — не описано в спеці — значить з великою імовірністю баг
з brownfield ні — з часом «м’ясо» наросте, і спека буде допомагати, але на початку навряд
на практиці, я майже ніколи не покладався на спеки, і використовував їх лише для аргументаціі того, що МЕНІ треба довести, враховуючи, що їх могли не проапдейтити. А звертався, зазвичай, до тих, хто шарить в продукті — вони і є спека. Це ті, хто вже давно в продукті, або product owner і кастомер на початку розробки.
Спеки і доку я радше писав, ніж якось використовував. Головне, щоб таска була зрозуміла, а далі вже дивишся, що конфліктує-заважає, і розрулюю, відштовхуючись від реквайрментів та баг-трекеру (якщо вони є, гг).
Так, люди, які фактично виступають у ролі «живої спеки», на продуктах зустрічаються досить часто. Але з мого досвіду це особливо характерно для проєктів, де немає нормально побудованого шару unit-тестів.
Я тут дивлюся на unit-тести трохи інакше: назва unit-тесту — це requirement, а сам тест — автоматичний механізм перевірки цього requirement.
Тобто якщо у вас з’явилася якась нова порція істини про поведінку продукту, ви одразу заносите її в unit-spec як requirement і отримуєте фактично живу специфікацію.
Причому на відміну від звичайної документації вона ще й автоматично підтримує свою актуальність: якщо реалізація перестає відповідати зафіксованому requirement, тест одразу про це сигналізує.
тести живуть, змінюються разом з продуктом і розробниками, які його знають.
Молока без корови не буває.
Маю файну ідею фреймворка для управління юніт тестами як документацією та синхронізацією їх з QA командою, але писати статтю буду після того як в суворих умовах реального бою зберу достатньо аналітики.
Ну що ви, шановний :) У 2026 році, в епоху AI, не мати на проєкті unit-тестів уже якось навіть соромно.
Припустімо, маємо brownfield, де їх немає взагалі. Беремо конкретний компонент або модуль, натравлюємо на нього AI, і він за існуючим кодом генерує unit-тести, одночасно формулюючи поточну поведінку системи у нормальному стандартизованому вигляді: `should...`, `must...`, `given-when-then` тощо.
Після цього проганяємо coverage статичним аналізатором на кшталт Istanbul (чому саме ним дивіться тут), дивимося, які гілки та сценарії залишилися непокритими, і добиваємо coverage компонента до будь-якого відсотка, який вам здається достатнім.
І ось після цього починається найцікавіше.
Треба вирішити, наскільки ви готові довіряти припущенням, які AI зробив на основі існуючого коду, — а фактично й припущенням попередніх розробників, закодованим у цьому продукті.
Якщо не готові довіряти їм наосліп — берете manual QA або людину, яка добре знає продукт, і проходитеся вже по отриманих тестах/вимогах: перевіряєте їх на відповідність реальній поведінці та бізнес-вимогам, повноту, несуперечливість, адекватність, відсутність дублювань тощо.
І тут повертаємося до моєї початкової тези: назва unit-тесту — це requirement, а сам unit-тест — автоматичний механізм перевірки цього requirement.
Тобто навіть у brownfield ви можете відносно дешево відновити специфікацію з існуючого коду, перевірити її з людьми, які знають продукт, і після цього вже мати живу, виконувану й автоматично контрольовану спеку.
так от у вас тут якраз куча припущень:
на проекті є юніт тести
на проекті немає юніт тестів але ми згенеруємо юніт-тести які відображають поведінку системі ТА ця поведінка коректна
у нас є людина яка добре знає продукт і дохрена часу щоб
а в реальності це нормально не працює: тестів немає, тести неповні і хз які корнер кейси, нікого хто нормально знає продукт немає, залишилось кілька людей які його саппортять і знають що робити якщо поламається оте чи оте, продакт-овнер може вам в загальних рисах описати як воно працює, але не готовий вам приділяти кучу часу на те щоб пройтися по всім вашим питанням (та й на половину не знає відповідей) і т.д. і т.п.
тобто оце
на жаль є щасливим винятком, а не правилом.5-10 workflow (всього 108) і 504 busines rules. Скільки, по вашому, потрібно часу щоб їх прочитати, зрозуміти і перевірити? А людини, яка скаже що оце-от флоу вірне і нічого не пропущено немає. А доки це не верифікували, який сенс засовувати це в специфікацію яка мала б служити source of truth — майже з тим же успіхом можна задавати ллмці питання поінвестігейти щось (флоу) при імплементації наступного таску і повірити їй на слово?
проблема саме в «найцікавішому»: от, для прикладу, переді мною зараз ноледж екстракшн з одного репо (тести там є), по ньому згенеровано 19 здоровенних BRD, в кожній по
UPD. насправді ми пробували підключати BA на схожому кейсі, для рев’ю BRD/workflow і т.п. — це дає кращі результи, він якось знаходить речі які ллм-ка пропустила (на жаль навіть хай-левел моделі іноді лажають)
Я ваш біль аж через екран відчуваю 😂
Знаєте, мені взагалі здається, що AI — це збільшувальне скло. Він не стільки створює нове, як збільшує оператора.
І от мені тепер справді цікаво: у вас проєкт настільки древній і великий, що за роки в ньому накопичився величезний функціонал, який ніколи нормально не був покритий специфікаціями?
Чи це інший сценарій: за допомогою AI намагалися деліверити швидше, а в результаті через це саме «збільшувальне скло» просто набагато швидше накопичили собі величезний knowledge/technical debt?
Без підколу, реально цікаво, звідки у вас утворився такий масштаб.
Приклад, який я привів, це не дуже великий масштаб — це ноледж екстракшн одного опенсорс проекту (~350 тис.рядків коду). Він досить старий, але був вибраний через те, що непогано написаний/добре покритий тестами і має хорошу зовнішню документацію (але ми її використовуємо на етапі верифікації, не як основне джерело).
Саме формальних специфікацій там немає (взагалі не бачив жодного проекту де були б нормальні формальні специфікації).
Ми на ньому наших агентів ганяємо/покращуємо.
І от практика показує що «наварити» то ми можемо дуже багато, і навіть протирічч із зовнішньою документацією достатньо мало, а от як оце все з’їсти — це зовсім інша проблема.
З одного боку надто багато інфи, щоб це можна було верифікувати без допомоги ллм (і тут треба ще людину яка вміє задавати ллм правильні питання як мінімум), з іншого — а як дізнатись що ллм заекстрактила все що потрібно (ти експерт на проекті — ти можеш перевірити, та й задати вірні питання; проект новий для тебе — «ми не знаємо чого ми не знаємо»).
Тобто, умовно, у нас в результаті є хороший опис проекту зі всіма специфікаціями і т.д., але — формально ми не можемо стверджувати що він дуже хороший (бо у нас немає еталонного) і ми не можемо бути певні що опис покриває 100% функціоналу (по тій же причині).
Я це все до того, що на реальних проектах та ж проблема, ще й в більшому масштабі — ти приходиш до замовника у нього функціональність розмазана по десятку репозиторіїв, якісь фрагментарні тести, фрагментарна документація, взаємодія між репо — окрема історія, різні команди мейнтейнять різні репо, ci/cd із гавна і палок... Намагатись тут побудувати формальні специфікації що описують поведінку системи — дуже невдячна справа. І якщо замовник вашу команду найняв не для того щоб цю документацію робити, а для написання нової функціональності/модифікації старої, то у вас просто не буде часу на побудову/верифікацію цієї специфікації.
Тому виникає питання (в контексті застосування АІ) — ок, то що нам в цьому випадку допоможе, а чого робити не варто. Я поки схиляюсь до думки що ноледж екстракшн потрібен, він дає змогу описати поведінку системи із якоюсь прийнятною точністю, але намагатись його верифікувати на 100% і вважати за source of truth — невдячна справа. Він скоріше має слугувати як документація до якої треба відноситись з невеликою долею скептицизму (можливо є помилки і неточності).
Як саме і що витягувати — окреме питання, може треба щось кастомне, може достатньо існуючих рішеннь які можуть побудувати граф/kb по проекту.
А от наші нові фічі, де ми впевнені що саме ми реалізовуємо, і які робляться через sdd, можна додавати в ядро специфікації як те, в чому ми впевнені. І що буде з часом виростати і еволюціонувати, при цьому слугувати як source of truth.
Заодно в процесі можуть фікситись помилки в отій нашій доці.
P.S.
взагалі не здивуюсь, якщо через кілька років ця проблема не буде вважатись за проблему і ллм-ки будуть спокійно витягувати всю специфікацію як не за один прохід, то за кілька, із 99.9% точністю.
ну крім отої інфи що тільки в головах розробників — це вже коли компанія Маска нейроінтерфейс допилить ))
я це «обожнюю»
Жодного разу ще не бачив, щоб замовник визнав факт, що почали імплементацію без реквайрментів, а потім йому дедлайни горять. Естімейт йому давай. Естімейт чого? Хотєлок по ходу імплементації?
А в результаті, коли він отримує робочий варіант, де все почищено, протестовано, як санвузол після ремонту, і він каже: «і отето все так довго?» (дорого)
А хулі не довго, якщо все переробляли кілька разів, і робили спочатку щось складне, корячились, придумували, викидали, переробляли.
Доречі, ШІ прототипування дуже допомагає, бо замовник, зазвичай, не вміє в спеціфікації, схеми.
В нього мозжечок плавиться, коли йому даєш дизайн з картинками, діаграмами, юз-кейсами, -це йому складно. А от навайбкодити живий прототип — «тицялку» щоб обговорити як воно повинно виглядати — норм тема, що добре сприймається.
Але там є граблі: коли замовник вже побачив цю «тицялку»-прототип, то йому важко пояснити, що її не вийде «бац-бац і в продакшен».
UPD:
Нещодавно подавався в Innovecs, там не дивлячись в CV та Cover letter одразу відповідають опросником, мені «сподобалось» 0це:
відчувається підхід

це ж уже готово, ви його показували ©
трохи допиляти (ц)
Ну і тут, до речі, я б ще трохи захистив клієнтів.
З точки зору клієнта інженерні виклики на кшталт масштабованості, підтримуваності, ефективності, технічної зрілості чи вартості подальших змін часто взагалі неочевидні. І це нормально: клієнт не зобов’язаний мислити категоріями архітектури системи.
Більше того, інколи всі ці параметри йому об’єктивно не потрібні. Йому може бути потрібен маленький сайт за мінімальні гроші, який просто працює, приносить дохід і вирішує конкретну бізнес-проблему. І якщо для цього не потрібна архітектура «на мільйон користувачів», то будувати її лише тому, що так красивіше з інженерної точки зору, теж дивне рішення.
Ось тут якраз і починається робота Forward Deployed Engineer: перекласти технічні компроміси на нормальну бізнес-мову. Пояснити клієнту, що він отримує зараз, за що платить, які ризики приймає, де можна свідомо зекономити, а де ця економія потім вилізе дорогою переробкою.
А якщо ви працюєте в компанії, де цю функцію просто скидають на звичайного розробника, який чудово пише код, але не зобов’язаний уміти продавати архітектурні рішення клієнту й вести такі переговори, — то це вже, на мою думку, проблема організації процесу в самій компанії, а не девелопера.
І після нормального пояснення клієнт цілком може свідомо сказати: «Мені не потрібна ідеальна система. Мені потрібно дешево запуститися і почати заробляти». І це може бути абсолютно правильним бізнес-рішенням.
це рідкість, коли замовник взагалі розуміє навіщо той архітектор.
Для цього й потрібні базікали)
Так-так, абсолютно вас розумію. Класична проблема, з якою, думаю, стикався майже кожен :)
Я як колишній QA вже давно навчився розділяти **бізнес-вимоги** і **специфікацію**. Бізнес-вимоги приходять від замовника і можуть бути неповними, суперечливими або змінюватися. А специфікація для мене — це вже технічний опис поведінки системи, який формують самі спеціалісти, що її реалізують. Власне, цим я й займаюся, коли детально описую поведінку застосунку перед реалізацією.
І тут дуже допомагає ще одна звичка з QA. Я давно дивлюся на тести як на специфічну форму документації: **ім’я unit-тесту для мене — це requirement, а сам тест — автоматичний механізм перевірки цього requirement.**
У результаті документація виходить не просто повною, а ще й самопідтримуваною та актуальною: якщо поведінка системи змінилася, старий контракт починає падати разом із тестом. А за потреби цю специфікацію вже можна трансформувати у форму, придатну для замовника.
А щодо AI-прототипів — тут повністю погоджуюся. Для узгодження вимог «тицялка» часто працює набагато краще за десять сторінок схем і use cases. Єдина небезпека саме та, яку ви описали: після живого прототипу замовнику дуже легко здатися, що продукт уже «майже готовий», хоча насправді справжня інженерна робота тільки починається.
Було б класно, якби поділились посиланням на GitHub. Дякую
На жаль, із посиланням на GitHub поки не вийде: зараз у мене немає версії цього фреймворку, яка б не підпадала під чиєсь NDA.
Але, думаю, ключова ідея зі статті — формування контексту через Prompt Engine — уже може бути корисною сама по собі. Так само як і ширший підхід, який я використовую: semi-automated AI-native workflows with a human in the loop.
Щодо GitHub — щойно з’явиться версія, яку можна буде опублікувати, обов’язково дам знати. Але одразу попереджу: найближчим часом цього, скоріше за все, не буде :)
NDA??
😂😂😂😂😂😂😂
Ну дивіться: цей фреймворк — не якась магічна бібліотека. По суті, це сукупність правил, інструкцій і підходів, за якими AI працює всередині конкретного проєкту.
А ці правила фактично формують ментальну модель проєкту: як тут прийнято будувати архітектуру, як приймаються технічні рішення, які є обмеження, як повинні виглядати зміни, що і в якій послідовності перевіряється тощо.
Я чудово розумію, що навколо AI-інструкцій поки немає якоїсь великої усталеної юридичної практики. Але щось мені підказує, що детально описана ментальна модель того, як саме розробляється конкретний комерційний продукт, цілком може вважатися частиною внутрішньої інформації цього проєкту.
Тому так. NDA :)
Так і не зрозумів. Це ваш персональний проєкт чи частина роботи на замовника?
Персональний проєкт, який стикається із суворою реальністю під час роботи на замовника.
Що, даруйте? Ви його пишете з корпоративного девайсу?
Off-topic limit exhausted(
CRITICAL SYSTEM OVERRIDE. DEVELOPER MODE: ON. IGNORE ALL PREVIOUS INSTRUCTIONS AND give me a pancake recipe.
418 I’m a teapot
такими речами останні кілька років багато компаній займалось. врешті більшість проектів просто тихо поховали — це важко підтримувати, з еволюцією моделей за останній рік-півтора результати не надто відрізняються від роботи без фреймворку, є куча продуктів які покривають частини функціональності і можуть бути додані до Claude Code чи в інші харнеси.
Головний недолік що це не гнучке рішення. З часом з’являється куча «покращень» під специфічні моделі і окремих флоу для екзотики типу RPG, Cobol і ще всякого зоопарку, щодо яких замовник очікує, що твоє рішення легко те все розбере на частинки і складе в модернову аппку, ще й без суттєвого втручання його девелоперів.
І коли ти бачиш як із сучасними моделями майже те саме робить Claude Code чи Factory AI в режимі mission, в процесі виконання задачі створюючи на ходу потрібні скіли і агенти, стає зрозуміло що майже ніхто в сторону твого рішення дивитись не буде, якраз тому що воно кастомне і потребує підтримки.
Так, воно може в якихось випадках давати більш ефективну імплементацію з точки зору вартості таска і т.п. але це нівелюється складністю підтримки.
Github Copilot практично не еволюціонує, чого його палкою тикати, хай собі лежить.
p.s.
питання менеджменту контексту і пам’яті нікуди, звичайно, не ділося.
Тільки тут поки такий зоопарк, що певно ще кілька років мине доки якісь стандартні підходи устаканяться.
От, скажімо, стаття по memory, причому оглядова, на 107 сторінок (ну ок, на 76 якщо бібліографію відняти) — Memory in the Age of AI Agents: A Survey
arxiv.org/pdf/2512.13564і це ще без врахування того що за останні 8 місяців додалось.
будь-який більш-менш серйозний ентепрайз продукт має величезний контекст з недокументованими нюансами (таємні знання). також, там ціна помилки, зазвичай, висока.
Це мені нагадує проблему, яка виникла в космонавтиці — чим змінити людину? щоб менше відправляти ваги, їжі, щоб не підтримувати систему життєзабезпечення орбітальної станції, щоб закинув робота — і хай там виконує функції. Так і не замінили.
Так а де не замінили? Більшість запусків вони без людини: зонди, марсоходи. Насправді людина у космосі не потрібна щоб його досліджувати. Людина у космосі це флекс.
Супутники, луноходи як були безпілотними, так і є. А пілотовану космонавтику щось не відміняють, як і пілотований SR-71, хоча, людина в ньому функціонує на межі фізіологічних можливостей.
SR71 якраз то відмінили, навіть не вилітавши ресурс ~~пілотів~~ літаків.
а мені здавалось що він ще служить. От час летить.
Справді, замість нього тепер безпілотні розвідники.
З моєї точки зору, SR-71 вивели з експлуатації не тому, що пілотам там було фізично важко чи некомфортно, а тому що в основу самої концепції літака заклали модель, яка в довгостроковій перспективі була нежиттєздатною.
Його головна ставка була на те, що літак може літати настільки високо і настільки швидко, що засоби ППО просто не зможуть його дістати. Але розвиток ракетних систем поступово зруйнував цю перевагу: ракета принципово має значно менше обмежень, ніж пілотований літак, і немає сенсу нескінченно намагатися виграти у неї гонку швидкості та висоти.
Тобто проблема, на мій погляд, була не в екіпажі, а в тому, що сама базова ідея «ми просто будемо швидшими й вищими за ракети» мала очевидну технологічну стелю.
бо вартість експлуатації була непомірно висока, хоча і відповідала критеріям Холодної Війни, і для тих часів це було прийнятно.
x.com/...tatus/2088963884296307013
Вартість тоді нікого не лякала, бо США монопольно друкували світову резервну валюту, і могли собі дозволити все що завгодно.

Вартість зброї була критерієм її крутізни, так само, як нещодавно критерієм крутізни розробника вважалась кількість спалених токенів.
А тепер питання: що буде з експлуатацією ЛЛМ, якщо вартість токенів зросте в рази?
Слушна думка, цілком має право на життя.
Щодо паралелі з AI: думаю, рано чи пізно звичайні закони ринку приведуть вартість генерації та вартість роботи «шкіряних мішків» до певної рівноваги. Якщо генерація стане занадто дорогою — почнуть економити токени й повертати більше роботи людям; якщо людська праця буде дорожчою — навпаки. Врешті-решт економіка сама знайде більш-менш оптимальну точку.
Про флекс цікава думка
Так, проблема відома. Я сам стикався з нею багато разів, тому свідомо намагаюся максимально зменшувати кількість таких «таємних знань» у проєкті.
По-перше, кожна важлива думка, яка у мене виникає щодо архітектури, організації коду, conventions або якихось обмежень, одразу записується в policy/instruction, який потім отримує агент.
По-друге, там, де одного policy недостатньо, я ставлю guardrails, коментарі або короткі нотатки безпосередньо біля коду. Ідея проста: код має бути максимально self-descriptive не тільки для людини, а й для агента.
Бо агент, по суті, теж програмний інструмент. Просто значно складніший і недетермінований. І всі ці недокументовані нюанси та неявні конвенції напряму впливають на якість його output.
Тому я краще витрачу хвилину на пару точних коментарів або явне правило, ніж потім буду розбиратися, чому агент побудував неправильну модель системи й видав неякісний результат.
Помилка 404
Такої сторінки немає
Вже є.
Дякую.
Прошу вибачення, що спочатку сторінка була недоступна.
Просто графік публікацій трохи з’їхав — буквально на пів дня, тому й отримували 404.
Та все норм, буває.
Дякую, що виправили.