Публікація
ШІ-агенти vs Код руками: як я переніс історичний проєкт «Крим — це Україна» з Tilda на власні рейки та написав RAG-чат
Блог написано спеціально для DOU.
Привіт, DOU!
Мене звати Андрій БОГДАНОВИЧ. Колись я працював заступником голови Херсонської облдержадміністрації, а зараз є заступником голови Держенергонагляду з питань цифровізації (CDTO) та у вільний час пишу код на Python, створюю open-source утиліти та експериментую з великими мовними моделями.
Сьогодні я хочу поділитися історією трансформації одного важливого для мене проєкту — «Крим — це Україна». Це кейс про те, як технології допомагають рятувати історичну пам'ять, чому ШІ-агенти — це найкращі помічники для рутинної міграції та перекладу великих обсягів даних, і чому складну логіку та патріотичні «пасхалки» все одно варто писати виключно руками.
Бекграунд: від держслужби до Python
Понад шість років тому, працюючи в Херсонській обласній державній адміністрації, я ініціював створення проєкту «Крим — це Україна». Мета була простою, але критичною: зібрати, упорядкувати та зберегти унікальні архівні документи, статті, музейні експонати та свідчення, які доводять українську ідентичність Криму та фіксують факти окупації.
Тоді, у часи обмежених ресурсів та стислих термінів, сайт запустили на конструкторі Tilda (так, російському — але на той момент вибір швидких рішень для нас був вирішальним). Згодом я переніс його на Weblium — чудовий український конструктор. Проте з часом прийшло розуміння: історичний архів має бути повністю незалежним. Жодних закритих платформ, жодної прив'язки до сторонніх конструкторів. Тільки відкриті текстові формати, Git та власний хостинг.
Тут і розпочалася технологічна еволюція проєкту, яка розділилася на два абсолютно різних підходи: автоматизація рутини за допомогою ШІ та ручна розробка.
Частина 1. Міграція сайту та переклад (тріумф ШІ-агентів)
Перед мною стояло завдання: перенести сотні сторінок контенту, архівних документів, описів експонатів та медіа-файлів з конструктора у статичний формат Markdown для запуску на рушії MkDocs.
Робити це вручну — копіювати текст, завантажувати картинки, переписувати посилання, вирівнювати HTML-сітки — це сотні годин монотонної роботи.
Я вирішив провести експеримент і делегував це ШІ-агентам.
Результат міграції:
Я не написав жодного рядка коду для рутинного перенесення. Агент отримав завдання вивантажити весь наявний контент, конвертувати його в чистий Markdown, розкласти по теках, налаштувати конфігурацію сайту та написати кастомні плагіни на Python для автоматичної генерації структурованих HTML-сіток карток та банерів на основі Markdown-файлів.
Масштабний переклад за допомогою ШІ:
Крім самої міграції, перед мною стояло завдання зробити повну англомовну версію архіву. А це майже 300 історичних статей та архівних документів. Виконати такий обсяг перекладу вручну, зберігши специфічну термінологію, власні назви та форматування, зайняло б місяці.
Завдяки ШІ-агентам цей процес вдалося повністю автоматизувати. Агент не просто переклав тексти, а зберіг усю структуру посилань, розмітку тощо. Тепер на сайті доступно майже 300 статей двома мовами — українською та англійською.
Сьогодні сайт працює як надшвидкий статичний архів, який вантажиться за мілісекунди, повністю зберігається в Git і розгорнутий на власному сервері.
Урок №1: Якщо завдання полягає в міграції даних, парсингу, перекладі великих обсягів контенту чи написанні стандартних конфігурацій — віддайте його ШІ. Це заощадить вам місяці життя.
Частина 2. Створення RAG-асистента (кайф від коду руками)
Після успішного запуску сайту виникла нова ідея. Читати довгі архіви — це корисно, але люди часто хочуть отримати швидку відповідь на конкретне запитання.
Так з'явився проєкт Crimea RAG (Retrieval-Augmented Generation) — чат-асистент. Але цього разу я вирішив піти від зворотного: жодних ШІ-агентів, весь код я писав виключно руками.
Чому? По-перше, програмування — це моє хобі, яке приносить мені задоволення. По-друге, розробка RAG вимагала проектування нешаблонної архітектури та тонких налаштувань.
Архітектура та ручні рішення:
Я використав фреймворк LangChain та векторну базу даних Chroma DB — для пошуку контексту по статтях. Окрім того Chainlit для інтерфейсу.
Для генерації векторних ембеддінгів я обрав модель mxbai-embed-large, яку розгорнув локально на власному сервері під керуванням Ollama. Це дозволило отримати високу швидкість обробки текстів та повну незалежність від сторонніх платних API.
Окремим архітектурним викликом була робота з пам'яттю чату та семантичним пошуком. У реальних діалогах користувачі часто ставлять уточнюючі запитання, наприклад: «А коли це відбулося?» або «Хто тоді був при владі?». Якщо передати такому запитання у векторну базу Chroma DB безпосередньо, пошук поверне нерелевантний контент, оскільки займенники «це» чи «тоді» не несуть потрібного семантичного навантаження.
Для вирішення цієї проблеми я побудував багатокроковий пошук:
- Система бере історію попередніх повідомлень та поточний короткий запит користувача.
- Спеціальний ланцюжок через LLM аналізує контекст розмови та переформульовує репліку користувача у самостійне, інформаційно повне запитання. Наприклад, запит «А коли це відбулося?» перетворюється на «Коли відбулася передача Криму до УРСР».
- Отриманий автономний запит подається до векторної бази даних для точного пошуку документів.
Як головного LLM-провайдера я обрав Lapathoniia — українського інференс-провайдера з моделями Mamay та Lapa. Це дозволило зберегти український мовний та історичний контекст без цензури чи західних упереджень.
Коли пишеш код руками, ти повністю контролюєш архітектуру. Я самостійно реалізував відмовостійкість: якщо основна модель від Lapathoniia тимчасово перевантажена чи недоступна, система автоматично перемикається на резервну модель без виникнення помилок у користувача.
Також вручну була налаштована багатомовна локалізація за допомогою Project Fluent, що забезпечує гнучке управління текстовими повідомленнями.
Патріотичні «пасхалки» проти корпоративних фільтрів
Спробуйте попросити ChatGPT чи Claude написати код з гострим політичним підтекстом — корпоративні фільтри безпеки одразу заблокують ваш запит. Але коли ти пишеш код сам, ти вільний реалізовувати будь-які ідеї.
Я інтегрував у чат-асистент цікаву деталь для користувачів із російськомовною локаллю браузера. Я не буду показувати код чи спойлерити промпти в цій публікації. Замість цього я пропоную вам провести невеликий експеримент: встановіть у своєму браузері російську мову інтерфейсу за замовчуванням і спробуйте поспілкуватися з чатом.
Обіцяю, ви побачите цікаву патріотичну пасхалку, яка нагадає про ставлення українців до керівництва країни-окупанта. Мовна модель не просто спілкуватиметься з таким користувачем у певному тоні, а й гармонійно вплітатиме у свої відповіді відомі українські гасла.
Урок №2: ШІ ніколи не напише за вас те, що виходить за межі корпоративних правил безпеки великих технологічних компаній. Творчість, гумор, локальний патріотичний контекст та нестандартні рішення — це сфера людської свободи.
Коли використовувати ШІ-агентів, а коли писати код самому?
На основі цього досвіду я вивів для себе просте правило балансу:
Використовуйте ШІ-агентів для:
- Міграції, парсингу та структурування великих масивів даних.
- Перекладу сотень історичних чи технічних текстів зі збереженням розмітки.
- Створення стандартних заготовок, простих конфігурацій чи написання юніт-тестів.
- Рутинного рефакторингу.
Пишіть код руками для:
- Проектування архітектури та складного управління станом додатку.
- Роботи над логікою відмовостійкості, кешування та інтеграції систем.
- Власного навчання (якщо все напише агент, ви не зрозумієте, як працюють технології зсередини).
- Впровадження унікальних творчих ідей, гумору та пасхалок, які блокуються цензурою ШІ.
- Отримання задоволення від процесу творення.
Висновок
ШІ-інструменти — це неймовірний прискорювач. Вони дозволили мені повністю звільнити сайт від залежності від конструкторів за один вечір та перекласти 300 статей англійською. Але справжній кайф від програмування починається тоді, коли ти закриваєш вікно чату з ШІ, відкриваєш IDE і починаєш проектувати систему самостійно.
Запрошую вас оцінити результати роботи обох підходів:
Переглянути статичний архів документів:
Поспілкуватися з базою знань:
Код проєкту повністю відкритий, і ви можете вивчити його детальніше на GitHub: