Перейти до вмісту

Власний блог NewsCatcher став інструкцією для ШІ-агентів

ШІ-агенти налаштували безкоштовний пошук у Google News для мого проєкту про великих котів

Морда тигра заповнює кадр у різкому фокусі: помаранчево-чорна смугаста шерсть, довгі білі вуса й бурштинові очі. Паща трохи розкрита, видно нижні ікла, поки тигр жує тонкий зелений листок. Розмите листя й стовбур дерева утворюють плямисте, залите сонцем рослинне тло.
Фото автора. Зоопарк Гамбурга, Німеччина.

Минулого року я нарешті автоматизував свій новинний конвеєр про великих котів. Шукаю, інколи перекладаю та публікую новини про великих котів із 2007 року. Я швидко зрозумів, що в мене немає ресурсів підтримувати й розширювати його самотужки. Потім на основній роботі я почав працювати з ШІ-агентами й побачив, що можу керувати ними так само, як керую джуніор-розробниками. Саме це й зробило мій особистий проєкт життєздатним для однієї людини з допомогою ШІ.

Я перебудував один конкретний шар: сам пошук. Решту конвеєра я написав вручну впродовж 2025 року: переклад, аналіз, редагування, повторний аналіз. Він працював справно. Пошук працював на безкоштовному тарифі NewsCatcherAPI для некомерційних проєктів. Безкоштовний тариф поновлюється кожні кілька місяців, але лише якщо попросити й показати, що проєкт досі живий і досі некомерційний. 1 вересня 2025 року мій доступ закінчився. Я не попросив про поновлення. На той момент я вже був перевантажений іншими справами й не повертався до особистого проєкту кілька місяців.

На початку 2026 року моя підписка NewsCatcherAPI знову запрацювала на кілька днів. Не знаю чому. Якісь статті потрапили до моєї черги на перегляд і нагадали, що проєкт усе ще існує. На той час я вже щодня користувався ШІ-агентами на роботі, а ще почав використовувати їх для власного коду. Я також згадав пару статей у блозі NewsCatcher про те, як збудувати сервіс на кшталт їхнього з нуля. Я вирішив скерувати ШІ-агента, щоб він прочитав ті статті та перебудував пошук.

У 2025 році я збудував систему ШІ-агентів, не знаючи, що це саме вона. Не було жодного туторіалу. Конвеєр прокручує кілька ШІ-моделей циклами, перемикаючи провайдерів, коли один із них падає. Модель-редактор і модель-аналізатор пересилають статтю туди-сюди, доки не перестануть знаходити проблеми або не впруться в ліміт циклів. Наприкінці 2025 року я почав працювати з ШІ-агентами на основній роботі. Я керую командою третьої лінії підтримки, і більшість мого часу йде на розслідування багів та керування продуктом у продакшені. Щойно я опанував термінологію, впізнав те, що збудував.

Я скерував ШІ на блог NewsCatcher і попросив зробити ще й ширше дослідження. ШІ повернувся з тим, що мені було потрібно для пошуку, зокрема з постом NewsCatcher, який з'ясував параметри запиту Google News RSS, що їх сам Google не документує. Звідти я звелів йому реалізувати пошук. Найважче було розшифрувати URL-адреси, які повертає Google News. Google не повертає URL статті напряму; повертає редирект із закодованим вмістом, а зчитати той вміст — нетривіально. ШІ написав декодер, який коректно опрацьовував це кодування.

Протягом наступних кількох тижнів виринали й інші дрібниці. Мені довелося додати крок очищення поверх пошуку, бо безкоштовні джерела повертають сирий HTML із шаблонним сміттям, рекламою та навігацією, що їх платний продукт NewsCatcher вирізав для мене. Був ще баг із запитом Google News, де підстановні знаки в позитивних пошукових термінах на кілька годин мовчки не повертали жодного результату. Я впізнав цей патерн із продакшену на роботі, і виправлення було простим. У GDELT теж була проблема з лімітом запитів, де логіка повторних спроб лише все погіршувала; логи показували, що успіхом завершується менш ніж 5% повторів. Виправленням було їх прибрати. Новий пошук вписався в конвеєр рівня статті з 2025 року. Та сам конвеєр не стояв на місці, поки я працював над пошуком.

Усе на основній роботі я розслідую за логами. Цю саму дисципліну я переніс на особистий проєкт. Я звелів ШІ з самого початку додати добре логування, аналізувати логи та звітувати мені. Саме так я виявив, що багато статей зривалися - сайти, які нічого корисного не повертали на звичайний HTTP-запит. Я звелів ШІ дослідити самохостний скрапер і додати його в ланцюжок резервних варіантів. ШІ опирався використанню headless-браузера. Казав, що браузери важкі, повільні та ще одна штука, яка може зламатися. Я дозволив йому спершу спробувати легший варіант. Потім я подивився, що повертається, і легшого варіанта виявилося замало. Я звелів йому додати резервний варіант із headless-браузером попри все.

Усі зміни конвеєра у 2026 році закодовано ШІ під моїм керівництвом, так само, як і перебудову пошуку. Найбільше ітерацій дісталося виявленню «фліп-флопів». Я доручив ШІ реалізувати його у 2026 році, бо аналізатор і застосовувач прокручували надто багато циклів на статтях, де ці дві моделі не могли дійти згоди. Я плачу за токени, які споживає конвеєр, тож зростання ітерацій помічаю у своєму рахунку раніше, ніж у логах.

Перша версія хешувала статтю цілком і шукала повні відкоти. ШІ перевів його на пореченнєве хешування, щоб ловити часткові відкоти, а потім на виявлення пар-виправлень для дрібніших фліп-флопів, що трапляються всередині речень. Коли фліп-флоп підтверджується після двох перевірок поспіль, окремий виклик ШІ обирає кращу з двох конкурентних версій і відправляє статтю назад до аналізатора на фінальний прохід. Це лишає ескалацію як крайній засіб, а не як автоматичний наступний крок. ШІ звітував про кількість ітерацій; я вирішував, що виправляти далі.

Застосовувач потребував власних виправлень. Застарілі завдання Apply стикалися з активними завданнями Analyze, кінцеві символи накопичувалися з циклу в цикл редагування, бракувало запобіжників за кількістю речень, а діф-верифікатор, крок, що перевіряє, що змінилося між двома версіями, не отримував потрібних правок, щоб опрацьовувати об'єднання й розбиття.

Запуск нового пошуку щогодини також оголив проблеми на рівні воркера черги. ШІ збудував пул воркерів, що масштабувався сам, механізм відновлення після примусового завершення для довгих завдань, які середовище хостингу раз у раз зупиняло, і виправлення для запусків воркерів, що мовчки зривалися, бо запускалася не та версія PHP. Нічого з цього не є новаторською роботою. Кожна продакшен-система, що масштабно обробляє завдання, рано чи пізно це розв'язує. Розв'язати це на особистому проєкті однієї людини означало використати ті самі патерни, які я використовую на роботі для продакшен-продукту.

Продукт NewsCatcherAPI - найсильніший у своєму роді. Я порівнював його з іншими сервісами, а решта - слабші. Безкоштовний доступ для некомерційних та академічних проєктів - щедрий. Для комерційного використання я б платив за нього сам. NewsCatcherAPI - компанія, заснована українцями, і оскільки я шукаю новини вже 19 років, мені дуже подобається, що такий сервіс збудували українці. Мій власний проєкт публікує свої новини українською, у чому й полягає весь сенс того, щоб його взагалі вести. Ця перебудова - не скарга на NewsCatcherAPI. Вони повертають більше новин, ніж одна людина здатна переглянути вручну, і перебудова пасує до розміру проєкту, який я веду наодинці, щоб тримати свої навички в тонусі.

Проєкт знову життєздатний. Новий пошук працює щогодини, а ШІ-агенти позначають те, що потребує перегляду людиною. Я переглядаю те, що вони позначають, так само, як переглядав би те, що приносить мені асистент. Якщо ти сам керуєш ШІ-агентами, мені було б цікаво почути, як ти з цим даєш раду.

Увімкніть коментарі, прийнявши куки.

Необхідні куки працюють завжди. Куки для статистики та коментарів використовуються лише з вашої згоди. Докладніше