В одному абзаці
Growth hacking – це насамперед опис роботи: ставиш на одному каналі багато дешевих експериментів, лишаєш те, що дає вимірюваний результат, викидаєш решту, а наступного тижня починаєш знову. Тут цю роботу віддали програмі. Коли людина питає ШІ-асистента, як щось зробити на комп’ютері, асистент називає конкретну програму. Для компанії, що продає софт звичайним користувачам, ця відповідь тепер – канал, яким до неї приходять покупці, і на багатьох найважливіших запитах асистент називав конкурента. Тож один агент стежить за відповідями ШІ-асистентів і помічає, де згадують конкурента замість вас, другий готує правку сторінки, яку редактор вставить за п’ять хвилин, третій чотири тижні спостерігає за результатом і передає другому те, чого навчився. Четверта частина робить із трьох агентів колегу, а не скрипт за розкладом: це робочий пульт, де вся черга відсортована за вартістю, біля кожного твердження написано, звідки воно взялося, а людина щоранку витрачає п’ятнадцять хвилин на рішення. Двадцять три дні від першого коміту до циклу, що працює насправді, 107 функцій, випущених по одній, і все це свідомо більше арифметика, ніж штучний інтелект: до моделі звертаються лише чотири місця в коді.
Проблема мовою бізнесу
ШІ-асистенти, які замість списку посилань дають готову відповідь, непомітно стали каналом, що приводить людей на останньому кроці перед покупкою. І ті, хто приходить звідти, купують у кілька разів частіше, ніж відвідувачі зі звичайного пошуку, – але контентна команда цього каналу не бачить. Немає екрана, який сказав би: «сьогодні на це питання вас не згадали, а ось кого згадали». Тож робота, яка закрила б прогалину, лишається невидимою: треба помітити, що вас немає, зрозуміти, чим саме сторінка конкурента заслужила посилання, написати правку, опублікувати її, а через чотири тижні не забути перевірити, чи щось зрушило. Це п’ять різних ремесел і нагадування в календарі – на кожну сторінку й назавжди. Тому цього ніхто й не робить.
- Ніхто не знає, на які комерційні запитання ШІ-асистенти відповідають без вас.
- Сторінку конкурента читають очима й гадають, за що їй дістається посилання.
- Правку пишуть з нуля, з того, що автор пам'ятає про продукт.
- Її публікують і більше до неї не повертаються – результат лишається відчуттям, а не цифрою.
- Що спрацювало минулого кварталу, живе як фольклор у пам'яті тих, хто тоді був на нараді.
- Щоранку команда відкриває колоду карток, де найдорожчі прогалини лежать згори.
- На кожній картці – дослівна відповідь ШІ-асистента як доказ, за один клік.
- Разом із задачею приходить готовий до вставки фрагмент – куди вставити і що саме.
- Той самий запит перевіряють знову після 28 днів спостереження; картка показує до → після.
- Виміряні вдачі й невдачі автоматично враховуються в наступній чернетці.
Чим це відрізняється від агента, якого просто напустили на сайт
Головне рішення – зробити машину здебільшого без ШІ. Тут немає автономного агента, який сам обирає інструменти, немає планувальника, немає агента, що сам по щось ходить чи сам вирішує. До моделі звертаються лише чотири місця в коді: знайти прогалину, простежити за конкурентом, написати фрагмент, перевірити чернетку. А все, що читач сприйняв би як «агент вирішує», насправді арифметика, регулярні вирази й SQL: бали, рейтинг, оцінка вартості, баланс колоди, ваги навчання. Модель пише текст. Усе, що отримує бали, місце в рейтингу чи потрапляє на сайт, вирішує звичайний передбачуваний код. Завдяки такому поділу систему може перевірити людина, яка не пише коду, а поганий день моделі зіпсує одну пропозицію, але не порядок на дошці.
Друге рішення – машині заборонено торкатися сайту. Клієнт CMS, через який вона читає сайт, надсилає лише GET-запити й відхиляє будь-яку спробу запису ще на рівні з’єднання. Тож «тільки читання» – це правило, зашите в код, а не обіцянка в документі. А про всяк випадок і обліковий запис, з якого публікують, не має права редагувати. Усе, що видає цикл, – лише пропозиції, які потрапляють у чергу до людини. Третє рішення дивує найбільше: кожен промпт системи дослівно переписаний у запис архітектурного рішення (ADR), і тест побайтово звіряє записані промпти з тими, що працюють насправді. Змінив промпт, а ADR не оновив – збірка падає. Схоже на бюрократію, доки не побачиш, що це дає: документ, який описує, як думають агенти, ніколи тихцем не перетвориться на вигадку. А саме так рано чи пізно ламається кожна ШІ-система в реальній роботі.
| критерій | Автономний агент, який сам обирає інструменти | Модель лише пише, решту вирішує код, останнє слово за людиною обрано | Самі лише правила, без моделі взагалі |
|---|---|---|---|
| Може пояснити, чому картка стоїть саме тут | ні | так | так |
| Пише текст, готовий до публікації | так | так | ні |
| Що зіпсує поганий день моделі | весь сайт | одну пропозицію | нічого |
| Може перевірити людина, яка не пише коду | ні | так | частково |
| Вартість кожного запуску передбачувана | ні | так | так |
| Стає кращою разом із моделями | так | так | ні |
Три агенти, одна сесія
Машина пропонує, нарада вирішує
Цикл – це один і той самий хід знову й знову: знайти, де ШІ-асистент посилається на конкурента, зрозуміти, чим саме його сторінка заслужила посилання, підготувати правку, дати людині її опублікувати, а потім чотири тижні міряти, чи повернулася згадка про вас. Кожен із трьох агентів відповідає за свій етап, і етапи передають один одному дані, а не вказівки.
Кожну сесію супроводжують два файли. Перший – робоча домовленість: що можна випускати, чого не можна ніколи і які правила не порушуються за жодних умов. Другий – архітектурний запис, де дослівно зібрано всі промпти системи; він слугує контекстом саме тому, що тест звіряє його з кодом до байта.
Далі – три справжні робочі сесії, по одній на кожного агента, у тому порядку, в якому через них проходить картка. Кожна з них – про нову функцію, а не про пошук помилки: це момент, коли один з етапів growth hacker’а навчився судити сам.
Довіра до всього цього тримається на одній властивості: клієнт CMS уміє лише читати й відхиляє будь-який запис ще на рівні з’єднання. Машина може читати сайт хоч цілий день, але не змінить на ньому жодної літери.
SENSE вчиться розуміти, що саме знайшов
Агент, який генерує ідеї й кожну віддає тому самому виконавцеві, насправді не думає. Частина знахідок – маленький блок, який машина допише чисто; частина – трирічна стаття, якій потрібні людина й пів дня роботи. Якщо відправити друге в чергу на чернетки, згорить бюджет на модель, а гірше – терпіння людини, яка це перевіряє, на текст, що ніколи не мав шансу стати придатним.
Цікаво, звідки береться це судження. Очевидна підказка – дієслово в рекомендації, і вона майже правильна, доки не натрапиш на дві картки, які просять одного й того самого для сторінок із різницею у три роки. Варто зайти на самі сторінки й подивитися, скільки їм насправді років, – і правдоподібне правило стає правильним. А межу ставлять у порожній проміжок між даними, а не підкручують, доки відповідь не почне виглядати гарно.
Другий хід тут – свідома відмова. Напрошується наступний крок: навчити машину на тому, як часто люди її поправляють. Але вчитися поки нема на чому, тож зміна записує обидві думки в окремі колонки – і на цьому зупиняється. Розбіжності спершу треба навчитися рахувати, тоді вони стануть корисними; а якщо будувати навчання раніше, ніж з’являться дані, отримаєш систему, яка впевнено помиляється.
Для бізнесу це означає, що агент, який пише чернетки, витрачає час на роботу, яку здатен завершити, а те, що справді потребує автора, приходить із чесною позначкою, а не як чернетка, що розчаровує.
STEAL видає те, з чим редактор може працювати одразу
Більшість автоматизації контенту тихо провалюється саме між добрим аналізом і результатом, яким можна скористатися. Перша справжня чернетка цієї системи була технічно вражаючою й практично марною: десять пунктів під заголовком, що означає «задовго, не читав», скрипт структурованих даних, якого ніхто не просив, і внутрішній службовий коментар, який так і поїхав би на публічну сторінку.
Кожну з цих вад можна простежити до конкретного рядка в конкретному промпті, і це найкращий аргумент за те, щоб переписувати промпти в архітектурний запис: скаргу людини, яка не пише коду, можна розібрати так само, як розбирають код. Виправила справу не краща модель, а суворіші вимоги до відповіді. Тепер модель мусить спершу сказати, куди вставити фрагмент, і лише потім – що це за фрагмент, а автоматична перевірка тричі на кожен реліз звіряє, чи вона це зробила.
Глибша зміна – у самому підході. Правка більше не потребує тлумачення: вона сама і є інструкцією. Редактор відкриває один файл, читає, куди вставити й що саме, – і готово. Аналіз, яким обґрунтовували зміну, переїхав у задачу – туди, де працюють люди, яким це обґрунтування справді потрібне.
Для бізнесу це питання швидкості: правка на сторінці перестає бути дослідницькою запискою, яку ще треба перетворити на задачу, і стає п’ятьма хвилинами копіювання для будь-кого, у кого відкрита CMS. Саме цим система, що лише радить, відрізняється від системи, після якої зміни справді з’являються на сайті.
LEARN повертає виміряне в наступну чернетку
Більшість систем, які нібито вчаться, збирають дані з одного боку й ніколи не читають їх з другого. Ця була влаштована саме так: кожну опубліковану зміну міряли чотири тижні, вердикт зберігали, а агент писав уже сотий фрагмент, гадки не маючи, як спрацювали попередні дев’яносто дев’ять.
Щоб закрити цю прогалину, не знадобилося жодної нової колонки в базі. Приблизний тип зміни визначають за формулюванням рекомендації, прецеденти шукають серед змін того самого типу або на тій самій сторінці, а вдалі приклади разом із реальним приростом кліків додають у промпт для чернетки: повторюй те, що спрацювало, і не повторюй того, що провалилося. Якщо стара картка не зберегла, як саме зміну впровадили, агент читає живу сторінку й відновлює, що там опублікували. Це працює саме тому, що вдала зміна досі на сторінці – її можна прочитати.
Людське судження живе в правилі ранжування, і це правило свідомо не найкраще з погляду математики. Свіжість важить більше за масштаб, тож найновіша тактика йде першою, навіть коли старіший варіант дав кращий результат. Машина рахує кліки, а за те, як текст сприйме читач, відповідає нарада. І нарада вирішила лишити написаний людиною вступ поруч із блоком короткого підсумку, хоча сам підсумок без вступу зібрав більше кліків.
Щойно це запрацювало, в архітектурному записі опинилося хибне речення про систему, яку він описує, – і тест одразу про це сказав. У цьому вся дисципліна: документація не може тихцем перетворитися на вигадку, бо будь-яка розбіжність зупиняє збірку.
Свіжість важить більше за масштаб – навіть коли масштаб більший. Це рішення людське, а не математичне. Машина рахує кліки, а ми відповідаємо за те, як текст сприйме читач. Тому в опублікованому варіанті поруч із коротким підсумком лишився написаний людиною вступ – хоча голий підсумок зібрав більше кліків.
Що вже збудовано і чим машина може стати
Три агенти й пульт, за яким вони працюють. Позначки статусу чесні: «працює» означає, що це вже щодня крутиться на реальних даних, «в роботі» – що воно вже існує, але ще доводиться до ладу, «у планах» – що його спроєктовано, але ще не збудовано.
- ● 01стеження за згадкамикомерційні запити під наглядом, звірені з відповідями ШІ-асистентів
- ● 02пошук прогалинасистент посилається на конкурента, а не на нас → з'являється картка
- ● 03розбір прогалининаша сторінка проти їхньої → у чому різниця в будові, звичайним текстом
- ● 04аудит контентузвичайний код шукає на наших сторінках застарілий текст і недобір кліків
- ● 05розподіл картокправка чи передача авторові – вирішують, перш ніж запуститься наступний етап
- ◐ 06стеження за конкурентамизбудовано, але поки запускається лише вручну з командного рядка – у нічний розклад ще не включено
- ○ 07перевірка, чи запит нашвідсіяти запити, на які відповідає сам розробник платформи
- ○ 08ловля трендівсигнали з RSS і форумів → групуються в тижневий огляд
- ● 01аналіз прогалиничим саме сторінка тут заслуговує на посилання
- ● 02перевірка свіжостіпошук актуальних фактів в інтернеті – модель не має права вгадувати версію
- ● 03пошук прецедентівнаші виміряні вдачі й невдачі на змінах такого типу
- ● 04написання фрагментакуди вставити + готовий блок-доповнення, усе в одному файлі
- ● 05прискіплива рецензіядруга модель шукає привід відхилити чернетку; до двох переробок
- ● 06передача в задачуправка прикріплюється до задачі; сама інтеграція вмикається лише двома ключами
- – 07переписати сторінку цілкомсвідомо не беремося – такі картки йдуть авторові
- ● 01стеження за результатомчерез 28 днів після Done запит перевіряють знову й фіксують до → після
- ● 02підсумок еталонного наборуексперименти, поставлені ще до запуску, оцінюють за реальними кліками, а не за згадками
- ● 03збирання уроківвідхилені картки й результати стають уроками з вагою і позначкою походження
- ● 04перерозподіл колодипоправочний коефіцієнт у межах 0,4–1,15, видно на картці разом із причиною
- ● 05оцінка вартості, що вчитьсячастка повернення калібрується на наших результатах, щойно їх набереться понад 5
- ● 06прецеденти в чернетцівиміряні результати потрапляють у наступну чернетку
- ○ 07зв'язок із виручкоюспроєктовано, але свідомо відкладено, доки не доведено, що згадки повертаються
Четверта частина – пульт, куди звітують три агенти
Самі по собі три агенти – це три скрипти за розкладом, які пишуть рядки в базу даних. Growth hacker’ом, з яким команда працює разом, а не який просто шле їй листи, їх робить пульт перед ними, і на нього пішло майже стільки ж зусиль, скільки на самих агентів. Черга – це дошка, на якій людина перетягує картки, а відсортовані вони за тим, скільки коштує кожна можливість, а не за часом появи. Кожна картка має короткий ключ, тож її можна вставити в повідомлення в чаті, і будь-хто з команди відкриє її одним кліком. Поруч ведеться журнал коротких записів, де одразу видно, хто говорить, – що агенти зробили за ніч, що зрушило, що автоматично пішло в архів і чому. Саме це відрізняє систему, якій довіряєш, від системи, яку доводиться перевіряти.
Два рішення, які варто перейняти, – обидва про чесність. Перше: біля кожного числа на картці написано, звідки воно взялося. Оцінка, виведена з фіксованого початкового припущення, прямо так і каже, і називає себе «навченою» лише тоді, коли справді чогось навчилася. Картку, складену без доступу до тексту сторінки, позначено як «сліпу чернетку». Ніщо на пульті не має права видавати себе за вимір, якого не робили, – звучить очевидно, доки не виявиш, що половина дошки саме цим і грішить. Друге – гальмо для оператора: аварійний вимикач, що переживає перезапуск і перекриває агентам усі входи, і інтеграція з трекером задач, якій потрібні два незалежні ключі – один у налаштуваннях середовища, другий у запущеному застосунку, – перш ніж вона зможе бодай щось записати в будь-який трекер.
- ● 01дошка можливостейп'ять колонок, картки розбирають перетягуванням; у Done машина картку не перенесе
- ● 02журнал подійвидно, хто говорить – система, агент чи людина; масові дії згруповано
- ● 03картка + короткий ключуся історія рішення за одним посиланням, яке можна кинути в чат
- ● 04чесне походженнякожне твердження позначено: справжня модель, заглушка, сліпа чернетка, початкове припущення чи навчене
- ● 05панель свободи агентіваварійний вимикач, що не скидається після перезапуску; два ключі, перш ніж задача справді з'явиться в трекері
- ● 06аналітика + мітки публікаційграфіки головної метрики з позначкою на кожен день, коли команда опублікувала зміну
- ● 07правила для текстів інтерфейсуліміти символів задано один раз у коді, тест перевіряє їх на кожному екрані
- ○ 08здоров'я системивитрати токенів, навантаження сервера, резервні копії – спроєктовано, найнижчий пріоритет
Будували по одній функції за раз
Дисципліна, з якою все це випускали, тримає систему не гірше за архітектуру. Саме завдяки їй 107 функцій з’явилися за три тижні, а код не перетворився на болото. Кожна пройшла ті самі шість кроків.
- Одна функція – одна папка змін. Ще до першого рядка коду там лежать письмова пропозиція, специфікація, нотатка з дизайну й список задач, а ідентифікатор зміни, назва гілки й повідомлення коміту – той самий рядок.
- Будувати у фіксованому порядку: спершу інтерфейс, далі API, бізнес-логіка, база даних, тести, документація. Коли починаєш із того, що бачить людина, усе, що будується далі, мусить відповідати саме цьому.
- Кожен коміт несе доказ, що все справді працює. Команда та її вивід, журнал HTTP-запитів, запис екрана. Скрипт перевіряє це під час коміту: коміт без розділу з доказом не приймається.
- «Готово» – це одна команда. Форматування, перевірка стилю, перевірка типів у кожному пакеті, тести, збірка й сувора перевірка специфікації – усе в одному ланцюжку, який зупиняється на першій же помилці. Та сама команда запускається і в CI, і щоразу, коли код відправляють у репозиторій.
- Кожне архітектурне рішення має свій запис, і за записами стежить тест. Таких записів уже вісім. Кожен промпт системи дослівно переписаний в один із них, і тест побайтово звіряє їх із робочим кодом.
- Будь-яка зміна промпту наново запускає оцінювання на справжніх моделях – по три прогони на кожен сценарій; жорсткі перевірки зупиняють реліз, м’які лише попереджають.
Раніше ця перевірка проходила три рази з шести. Тепер пройшла три з трьох – разом шість із дев’яти, тобто десь дві третини. Один чистий прогін на моделі, яка щоразу відповідає трохи інакше, – це не «полагоджено», а «цього разу пощастило». Насправді змінилося інше: тепер промах зупиняє реліз, а не проскакує непоміченим.
Скільки варта одна закрита прогалина
Головне число на картці, за яким її сортують, – це оцінка, і варто розуміти, звідки вона береться: саме про неї щоранку сперечається нарада. Модель тут ні до чого – це арифметика над даними пошукової консолі: скільки показів має сторінка, наскільки її CTR (частка показів, що закінчилися кліком) нижчий, ніж мав би бути на її позиції, і яку частку цього недобору реальна зміна здатна повернути. Цю останню частку спершу взяли як обережне фіксоване припущення, а тепер вона вчиться на власних виміряних результатах видавця, щойно їх набирається щонайменше п’ять.
Як рахують вартість картки
Підставте дані своєї сторінки. Найчесніша частина тут – діапазон повернення: яку частку теоретичного недобору реальна зміна зазвичай повертає. Тому він навмисно заданий проміжком, а не одним числом.
працює у вашому браузері · 0 мережевих запитів · щоразу той самий результат
Значення за замовчуванням узято з реальної сторінки на живій дошці, і за ними стоїть ще одна історія: CTR 0,1% на позиції 8,4 при тридцяти тисячах показів на місяць – аномально мало для такої позиції. Щось перехоплює кліки ще до того, як людина дійде до сторінки, – і це та сама гіпотеза, заради перевірки якої існує вся система. Тут вона постає числом, а не аргументом.
Канал, який команда нарешті бачить
Цикл ще надто молодий, щоб чесно говорити про результати, тож чесно можна говорити про механіку: згадки, про які він звітуватиме, ще міряються в перших вікнах спостереження, і система прямо пише про це на кожній незавершеній картці, а не натякає на перемогу. Уже реальне інше: контентна команда бачить канал, якого три тижні тому не бачила зовсім, відсортований за вартістю, з дослівним доказом за один клік. А зміни, які вона публікує, тепер повертаються вимірами, а не думками. Найцікавіше попереду – наслідок другого порядку: щойно агент, що пише чернетки, читатиме сотню виміряних результатів замість чотирнадцяти, якість чернетки перестане залежати від того, яка модель зараз у моді.
Двадцять три дні. Один розробник. Три агенти, один пульт, з якого ними керують, 107 функцій і вісім архітектурних записів – growth hacker, який ніколи не питає дозволу подивитися і ніколи не діє без дозволу.
Цей кейс описує архітектуру й підходи. Видавця, його продукти, доменні імена й конкретні комерційні запити навмисно лишено за кадром: тут важить форма циклу й те, де в ньому сидить людина, а не чий каталог він обслуговує.