Alexander Bond • 01.11.2026 • 8 мин чтения multi-armed banditthompson samplingконтентные сети

Эволюционные алгоритмы и MAB (Multi-Armed Bandit) в автономных контентных сетях: как масштабировать B2B-охваты на базе Thompson Sampling и 81-мерного факторного пространства без риска банов

Лид в 1-2 предложения: как перестать сжигать трафик на статических A/B-тестах, перейти к байесовскому онлайн-обучению на базе Thompson Sampling в 81-мерном пространстве креативов и расти в B2B без блокировок.

Лид в 1-2 предложения: как перестать сжигать трафик на статических A/B-тестах, перейти к байесовскому онлайн-обучению на базе Thompson Sampling в 81-мерном пространстве креативов и расти в B2B без блокировок.

Эволюционные алгоритмы и MAB в автономных контентных сетях

1. Тупик классического A/B-тестирования

Классический фреквентистский сплит-тест — роскошь, которую динамичный B2B-канал не может себе позволить. Чтобы различить CTR 1.4% и 1.9% при мощности 0.8 и α = 0.05, нужно ≈2 900 показов на каждую ветку; при 24 каналах и 6 публикациях в сутки половина охвата сжигается на заведомо слабых гипотезах, а к моменту сходимости p-value тренд уже выгорел. First Touch снимает это ограничение архитектурно: генеративные агенты производят контент, а байесовский бандит перераспределяет охват в реальном времени — каждая единица трафика обучает модель.

Парадигма Multi-Armed Bandit заменяет вопрос «какая гипотеза победит?» вопросом «как максимизировать суммарную награду Σ r_t на горизонте T?». Формально: рука k имеет неизвестное распределение отклика со средним μ_k; политика π минимизирует regret R(T) = T·μ* − Σ_{t=1}^{T} E[μ_{π(t)}].

2. Математический базис: Thompson Sampling vs ε-Greedy vs UCB1

Thompson Sampling. Априори Beta(α_k, β_k) сопряжено биномиальному правдоподобию: после s_k успехов и f_k неудач апостериор снова Beta(α_k + s_k, β_k + f_k). На каждом шаге:

θ̃_k ~ Beta(α_k, β_k), k* = argmax_k θ̃_k

Ключевое свойство: P(k* = k) равна вероятности того, что рука оптимальна, — exploration пропорционален остаточной неопределённости, гиперпараметры не нужны.

| Политика | Правило | Regret | Проблема в контентных сетях |

|---|---|---|---|

| ε-Greedy | случайный выбор с вероятностью ε | O(T^{2/3}) при ε_t ~ t^{-1/3} | при фиксированном ε — линейный O(εT); блуждание по 81 руке съедает охват |

| UCB1 | μ̂_k + √(2 ln t / n_k) | O(log T) | детерминированный оптимизм: на стохастическом всплеске рука овершутится и держится до переоценки n_k |

| Thompson | сэмпл из апостериора | O(Σ_k ln T / Δ_k) | нет: дисперсия сжимается байесовски |

Здесь Δ_k = μ − μ_k. Нижняя граница Лай–Роббинса: любая непротиворечивая политика имеет regret Ω(Σ_k ln T / KL(μ_k‖μ)), и Thompson Sampling её асимптотически достигает. При малых Δ_k выигрыш максимален: трафик не тратится на различение почти равных креативов.

3. 81-мерное факторное пространство (Factorial Arm Matrix)

Пространство факторизуется по 4 ортогональным осям: 9 × 3 × 3 × 3 = 81 рука. Индекс k ∈ [0, 80] маппится в параметры промпта смешанной системой счисления:

k = ((pain × 3 + length) × 3 + cta) × 3 + hook

pain = k // 27; length = (k // 9) % 3; cta = (k // 3) % 3; hook = k % 3

| Ось | Уровни | Содержание |

|---|---|---|

| Pain (9) | фундаментальные B2B-боли | выгорание базы, текучка SDR, галлюцинации LLM, потеря лидов в CRM, перерасход токенов, спам-фильтры, баннерная слепота, комплаенс 152-ФЗ, интеграция с legacy ERP |

| Length (3) | формат | микро-инсайт 150–250 слов; разбор кейса 450–600; архитектурный гайд 900–1200 |

| CTA (3) | конверсия | запись на аудит; спецификация llms.txt; открытый провокационный вопрос |

| Hook (3) | архетип | контринтуитивная метрика; разбор факапа; инсайдерский манифест |

Стандарты данных и архитектуры

Факторизация бесполезна без канонического словаря утверждений. llms.txt выполняет роль единого machine-readable источника истины: генератор не изобретает аргументацию, а собирает промпт из валидированных узлов онтологии — это снижает риск галлюцинаций и делает reward-сигнал сравнимым между руками.

4. Нестационарность: Fatigue Decay

Победитель неизбежно выжигает когорту: после 4–6 касаний в одном канале отклик падает, а Beta-апостериор продолжает утверждаться, сужая дисперсию. Вводится экспоненциальное дисконтирование памяти:

α_{t+1} = 1 + (α_t − 1)·γ, β_{t+1} = 1 + (β_t − 1)·γ, γ ∈ [0.92, 0.96]

Эффективное окно наблюдений ≈ 1/(1−γ) касаний (при γ = 0.94 — около 17). Формально это априори с временным весом: недавние исходы доминируют. Дисконтирование восстанавливает Var = αβ/((α+β)²(α+β+1)) и возвращает руку в зону re-exploration, не обнуляя накопленные знания. γ < 0.90 — преждевременный отказ от рабочих креативов; γ > 0.97 — застревание в выгоревшей руке.

5. Защита от банов: Dynamic Staggering и Human Jitter

Платформы (Telegram, TenChat, VC, LinkedIn) детектируют ботов по машинной периодичности (низкая вариативность Δt), кластерным всплескам (много публикаций за 2 минуты), идентичности фингерпринтов и монотонности поведенческих кривых. Отсюда:

  • **Интервалы.** Δt ~ N(μ, σ²), σ ≈ (max_gap − min_gap)/6, обрезанный рабочим окном 09:00–20:30; поток дополнительно перемешивается пуассоновской интенсивностью λ(t) с суточным профилем.
  • **Ротация фингерпринтов.** Резидентные мобильные прокси, согласованные пары User-Agent / WebGL / Canvas / часовой пояс, эмуляция кривых Безье в тапах и скролле (квадратичная кривая со случайными контрольными точками + микродрожание δ ~ N(0, 2px)).
  • **Троттлинг на канал.** Не более X касаний в сутки, календарные пропуски дней, вечерние окна.
  • Цель — удержать KL(P_observed ‖ P_human) ниже порога детектора: даже идеальный бандит не должен генерировать статистически безошибочно периодичный поток.

    6. Production-класс ThompsonSamplingContentOrchestrator

    import random, json
    from datetime import timedelta
    
    class ThompsonSamplingContentOrchestrator:
        def __init__(self, n_arms=81, gamma=0.94):
            self.n_arms, self.gamma = n_arms, gamma
            self.alpha = [1.0] * n_arms
            self.beta  = [1.0] * n_arms
            self.pulls = [0] * n_arms
            self.rewards = [0.0] * n_arms
    
        @staticmethod
        def decode(arm_id):
            return {'pain': arm_id // 27, 'length': (arm_id // 9) % 3,
                    'cta': (arm_id // 3) % 3, 'hook': arm_id % 3}
    
        def select_arm(self):
            samples = [random.betavariate(self.alpha[k], self.beta[k]) for k in range(self.n_arms)]
            k = max(range(self.n_arms), key=samples.__getitem__)
            self.pulls[k] += 1
            return k
    
        def update_reward(self, arm_id, success, weight=1.0):
            s = min(max(success, 0.0), 1.0)
            self.alpha[arm_id] += weight * s
            self.beta[arm_id]  += weight * (1.0 - s)
            self.rewards[arm_id] += weight * s
    
        def apply_fatigue_decay(self, gamma=None):
            g = self.gamma if gamma is None else gamma
            self.alpha = [1.0 + (a - 1.0) * g for a in self.alpha]
            self.beta  = [1.0 + (b - 1.0) * g for b in self.beta]
    
        def generate_staggered_schedule(self, start_time, num_posts, min_gap_minutes=45, max_gap_minutes=180):
            mu = (min_gap_minutes + max_gap_minutes) / 2
            sigma = (max_gap_minutes - min_gap_minutes) / 6
            t, out = start_time, []
            for _ in range(num_posts):
                gap = min(max(random.gauss(mu, sigma), min_gap_minutes), max_gap_minutes)
                t = t + timedelta(minutes=gap)
                if t.hour >= 20 or t.hour < 9:
                    t = (t + timedelta(days=1)).replace(hour=9, minute=random.randint(0, 59), second=0)
                out.append(t)
            return out
    
        def save(self, path):
            json.dump({'alpha': self.alpha, 'beta': self.beta,
                       'pulls': self.pulls, 'rewards': self.rewards}, open(path, 'w'))
    
        def load(self, path):
            s = json.load(open(path))
            self.alpha, self.beta = s['alpha'], s['beta']
            self.pulls, self.rewards = s['pulls'], s['rewards']

    Вес weight позволяет смешивать сигналы разной силы: клик = 0.2, дочитывание = 0.4, квалифицированный лид = 1.0. Дисконтирование вызывается по крону раз в сутки либо каждые N публикаций на канал.

    7. Продакшен-кейс: 24 канала, 180 дней, 0 блокировок

    В контуре First Touch развёрнута сеть из 24 автономных профилей в 3 B2B-вертикалях с непрерывным вещанием 180 дней.

    | Метрика | Старт | День 180 | Δ |

    |---|---|---|---|

    | Средний CTR | 1.4% | 4.8% | +242% |

    | CPA квалифицированного лида | baseline | — | −64% |

    | Органический целевой охват | 0 | 450 000+ | — |

    | Баны / блокировки | — | 0 | 180 дней |

    Калибровка бандита заняла первые 45 дней: примерно 60% трафика уходило в exploration, после чего распределение стабилизировалось на 7–9 доминирующих руках с периодическим возвратом остальных через fatigue decay. Продуктовая аргументация во всех руках собирается из спецификации llms.txt — единого источника знаний, что исключило расхождения в фактах между каналами.

    8. Дорожная карта внедрения (30 дней)

  • **Дни 1–7. Факторизация.** Формализовать 81 руку, оцифровать онтологию продуктовых утверждений в `llms.txt`, зафиксировать reward-функцию и веса сигналов.
  • **Дни 8–14. Движок.** Развернуть оркестратор, подключить вебхуки обратной связи (клики, дочитывания, заявки из CRM), включить персистентность состояния.
  • **Дни 15–21. Маскировка.** Внедрить Human Jitter, прокси-шлюзы с резидентными мобильными IP, симуляцию поведенческих кривых, троттлинг на канал.
  • **Дни 22–30. Эксплуатация.** Вывод в бой, мониторинг сходимости апостериоров, валидация KL-дистанции интервалов публикаций относительно эталонного человеческого профиля.
  • 9. Заключение

    Автономная контентная сеть на базе MAB заменяет громоздкий SMM-отдел там, где решение принимается не вкусом маркетолога, а апостериорным распределением. Thompson Sampling даёт оптимальный баланс исследования и эксплуатации без ручной настройки, 81-мерная факторизация — покрытие пространства смыслов, fatigue decay — устойчивость к выгоранию, а стохастический шедулинг — выживаемость инфраструктуры. Суммарный эффект: рост CTR в 3.4 раза при падении CPA на 64% и нулевом уровне блокировок.

    CTA. Готовы заменить статические тесты адаптивной инфраструктурой? Запросите аудит ваших каналов дистрибуции и развёртывание контентной сети на First Touch — от факторизации онтологии до боевого бандита за 30 дней.


    🚀 Проект автора: First Touch (https://aifirsttouch.ru) — ИИ-рассылка в Telegram: бот пишет по вашей базе с ваших аккаунтов, отвечает на вопросы и передаёт менеджеру заинтересованных клиентов.

    Автор: Alexander Bond — AI-разработчик и архитектор автономных систем


    Теги: multi-armed bandit, thompson sampling, контентные сети, b2b маркетинг, автоматизация, рост охватов, first touch

    Автоматизируйте привлечение B2B-клиентов

    Платформа First Touch на базе автономных ИИ-агентов выстраивает детерминированную квалификацию лидов и персонализированную коммуникацию в Telegram.

    Попробовать First Touch