AI-система реактивації неактивних клієнтів

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1564 послуг
AI-система реактивації неактивних клієнтів
Середній
~1-2 тижні
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1348
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1247
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    949
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1183
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    642
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    921

80% спроб реактивації «сплячих» клієнтів провалюються через шаблонні листи та невірний таймінг. Залучення нового покупця обходиться в 5–7 разів дорожче, ніж повернення існуючого, але стандартні знижкові кампанії дають лише 2–5% відгуку. Ми розробляємо AI-систему, яка аналізує поведінку неактивних клієнтів, виділяє причини відтоку та формує персоналізовану пропозицію для кожного сегменту — від сегментації до відправки.

Чому стандартні реактиваційні кампанії не працюють?

Типова помилка — розсилка однакових купонів усій базі. В результаті 80% користувачів ігнорують листи, а 5% відписуються. Проблема в тому, що різні сегменти потребують різного підходу: хтось пішов через поганий сервіс, хтось — через високу ціну, а треті просто забули про магазин. Наша система виділяє 5–7 сегментів за допомогою customer churn аналізу та підбирає унікальну стратегію для кожного.

Як ми сегментуємо неактивних

Використовуємо комбінацію KMeans-кластеризації та LLM: модель групує клієнтів за числовими ознаками (дні неактивності, сума замовлень, частота, давність останньої покупки), а потім нейромережа описує кожен сегмент і пропонує реактиваційну стратегію. Нижче — приклад реалізації на Python з використанням Anthropic Claude API.

import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from anthropic import Anthropic

class InactiveCustomerAnalyzer:
    def __init__(self, inactivity_threshold_days: int = 90):
        self.threshold = inactivity_threshold_days
        self.llm = Anthropic()
        self.scaler = StandardScaler()

    def identify_inactive(self, customers_df: pd.DataFrame,
                           last_activity_col: str = 'last_purchase_date') -> pd.DataFrame:
        """Визначення неактивних клієнтів"""
        customers_df['days_inactive'] = (
            pd.Timestamp.now() -
            pd.to_datetime(customers_df[last_activity_col])
        ).dt.days

        inactive = customers_df[
            customers_df['days_inactive'] >= self.threshold
        ].copy()

        return inactive

    def segment_inactive(self, inactive_df: pd.DataFrame) -> pd.DataFrame:
        """Кластеризація неактивних за патерном поведінки"""
        features = pd.DataFrame()

        features['days_inactive'] = inactive_df['days_inactive']
        features['total_orders'] = inactive_df.get('total_orders', 1)
        features['avg_order_value'] = inactive_df.get('avg_order_value', 0)
        features['order_frequency'] = inactive_df.get('order_frequency', 0)
        features['last_order_value'] = inactive_df.get('last_order_value', 0)
        features['support_issues'] = inactive_df.get('support_tickets_total', 0)

        X = self.scaler.fit_transform(features.fillna(0))

        km = KMeans(n_clusters=5, random_state=42, n_init=10)
        inactive_df['segment'] = km.fit_predict(X)

        # Опис сегментів
        segment_profiles = features.copy()
        segment_profiles['segment'] = inactive_df['segment']
        segment_stats = segment_profiles.groupby('segment').mean()

        # LLM називає кожен сегмент
        for seg_id in range(5):
            if seg_id not in segment_stats.index:
                continue
            stats = segment_stats.loc[seg_id].to_dict()
            stats_str = ", ".join([f"{k}: {v:.1f}" for k, v in stats.items()])

            response = self.llm.messages.create(
                model="claude-3-5-sonnet-20241022",
                max_tokens=100,
                messages=[{
                    "role": "user",
                    "content": f"""Name this inactive customer segment (3-5 words) and suggest reactivation approach.

Stats: {stats_str}

Return: "Segment Name | 1-sentence strategy" """
                }]
            )
            print(f"Segment {seg_id}: {response.content[0].text}")

        return inactive_df


class ReactivationCampaign:
    """Кампанія реактивації з персоналізацією"""

    def __init__(self):
        self.llm = Anthropic()
        self.reactivation_offers = {
            0: {'discount': 20, 'message_theme': 'we_miss_you'},
            1: {'discount': 15, 'message_theme': 'best_of_what_they_liked'},
            2: {'discount': 10, 'free_shipping': True, 'message_theme': 'new_arrivals'},
            3: {'special_access': True, 'message_theme': 'exclusive_comeback'},
            4: {'survey': True, 'small_incentive': True, 'message_theme': 'help_us_improve'},
        }

    def create_reactivation_email(self, user: dict, segment: int) -> dict:
        """Персоналізований лист реактивації"""
        offer = self.reactivation_offers.get(segment, {'discount': 10})
        days_inactive = user.get('days_inactive', 90)
        past_categories = user.get('top_categories', ['products'])

        response = self.llm.messages.create(
            model="claude-3-5-sonnet-20241022",
            max_tokens=300,
            messages=[{
                "role": "user",
                "content": f"""Write a reactivation email for an inactive customer.

Customer: {user.get('first_name', 'Customer')}
Inactive for: {days_inactive} days
Past purchases: {', '.join(past_categories[:3])}
Offer: {offer}

Requirements:
- Subject line (engaging, personal, 50 chars max)
- Body (150 words max, warm tone, mention specific past interest)
- Clear CTA

Return JSON: {{"subject": "...", "body": "...", "cta": "..."}}"""
            }]
        )

        try:
            import json
            return json.loads(response.content[0].text)
        except Exception:
            return {'subject': f"We miss you, {user.get('first_name', '')}!",
                    'body': response.content[0].text[:400], 'cta': 'Come Back'}

    def predict_reactivation_probability(self, user: dict,
                                          offer: dict) -> float:
        """Ймовірність реактивації при даній пропозиції"""
        # Спрощена евристика (в реальності — навчена модель)
        base_prob = 0.05  # Базова ймовірність

        # Фактори, що підвищують ймовірність
        if user.get('total_orders', 0) > 5:
            base_prob += 0.05  # Лояльний клієнт
        if user.get('days_inactive', 999) < 180:
            base_prob += 0.08  # Нещодавно пішов
        if offer.get('discount', 0) >= 20:
            base_prob += 0.06  # Хороша знижка
        if user.get('email_open_rate', 0) > 0.3:
            base_prob += 0.04  # Відкриває листи

        return min(base_prob, 0.4)

Таблиця конверсій за часовими вікнами

Період неактивності Середній CRR Рекомендована пропозиція
0–90 днів 15–20% Нагадування + ексклюзивний контент
90–180 днів 10–15% Персональна знижка 15–20%
180–365 днів 5–10% Сильний оффер (знижка 25%+ або безкоштовна доставка)
> 365 днів 2–5% Опитування + невелика мотивація (5% знижка)

Що дає використання LLM в реактивації?

LLM (Large Language Models) дозволяють генерувати персоналізовані тексти, що враховують історію покупок та вподобання кожного клієнта. Замість шаблонного «Ми за вами сумуємо» модель створює лист із згадуванням конкретного товару або категорії, які клієнт купував раніше. Це збільшує відкриваність (OR) на 20–40% та конверсію (CRR) у 2–3 рази порівняно з масовими розсилками. Крім того, LLM інтерпретують сегменти — автоматично дають їм назви на кшталт «Цінові скептики» або «Ті, хто забув», що спрощує налаштування стратегій.

Порівняння підходів: традиційний vs AI

Критерій Традиційний підхід AI-підхід з LLM та ML
Сегментація За однією ознакою (давність покупки) Багатовимірна кластеризація + інтерпретація
Персоналізація Шаблонні листи Генерація унікального тексту під кожного
Таргетинг знижок Єдина знижка для всіх Диференційований оффер за сегментами
Час налаштування 1–2 дні 2–3 тижні (первинно), далі автоматично
CRR на тестовій вибірці 3–5% 12–20%

Кейс: повернення 12% клієнтів за місяць

Один із проєктів — інтернет-магазин електроніки з базою 50 000 неактивних. Ми впровадили описану систему, сегментували клієнтів на 6 груп, згенерували персоналізовані листи через Claude API. Результат: 12% повернулися протягом місяця, середній чек повторної покупки — 3 500 грн. Конверсія в 3 рази вища, ніж у попередній кампанії з шаблонними листами.

Що входить в роботу

  • Аудит бази: аналіз поточних даних, виявлення прогалин, рекомендації по збору відсутніх полів.
  • Розробка моделі сегментації: вибір ознак, кластеризація, інтерпретація сегментів через LLM.
  • Генератор персоналізованих листів: інтеграція з Anthropic/OpenAI, шаблони для різних сегментів, A/B-тестування заголовків.
  • Панель моніторингу: дашборд з метриками CRR, ROI, CTR, OR. Автоматичні звіти.
  • Інтеграція з CRM: модуль експорту сегментів та згенерованих пропозицій через REST/SOAP API.
  • Навчання команди: 2-годинна сесія з управління кампаніями та налаштування тригерів.
  • Гарантія результату: перші 3 місяці підтримки + коригування моделі під ваші дані.

Строки та вартість

Базова версія системи з однією кампанією запускається за 2–3 тижні. Повний цикл під ключ з декількома сегментами та інтеграцією — від 1 до 2 місяців. Вартість розраховується індивідуально залежно від обсягу бази та складності інтеграції. Оцінимо ваш проєкт за 1 день — пишіть.

Чому обирають нас: 5+ років досвіду в AI/ML, понад 20 успішних впроваджень в e-commerce та ритейлі. Сертифіковані спеціалісти по стеку Hugging Face, LangChain, Anthropic. Ми не просто запускаємо модель — ми гарантуємо зростання метрик і надаємо повну документацію.

Готові протестувати систему на своїй базі? Замовте демо — покажемо, як працює сегментація на ваших даних. Отримайте консультацію по вашому проєкту — напишіть нам.

Розробка рекомендаційних систем: від collaborative filtering до real-time serving

На одному проєкті для e-commerce з каталогом 300k SKU ми підняли CTR з 1,8% до 4,4% — у 2,4 рази. Перший ривок дала колаборативна фільтрація замість «популярне за останні 7 днів», другий — додавання контентних ознак та re-ranking. Різниця між «показуємо популярне» і «показуємо персоналізоване» — вимірна та суттєва. Нижче — інженерний досвід, який допоміг це зробити, і архітектури, які реально працюють у продакшені.

Collaborative Filtering: матрична факторизація та нейронні підходи

Matrix Factorization — класика для implicit feedback (кліки, перегляди, покупки без явного рейтингу). ALS (Alternating Least Squares) у бібліотеці Implicit обробляє матриці user×item із сотнями мільйонів ненульових значень за хвилини на GPU. Latent factors 64–256, регуляризація λ=0.01–0.1 — стартові параметри. Проблема cold start: для нового користувача або товару немає історії — класичний CF безпорадний, потрібні контентні ознаки або гібрид.

Neural Collaborative Filtering (NCF) замінює скалярний добуток на нейромережу. На практиці виграш над добре налаштованим ALS помірний, але NCF простіше розширювати додатковими ознаками (вік, категорія, час доби). Sequence-aware моделі (SASRec, BERT4Rec) враховують порядок взаємодій — state-of-the-art для сесійних рекомендацій.

Як вибрати архітектуру рекомендаційної системи?

Відповідь залежить від даних, навантаження та вимог до холодного старту. Нижче — три основні підходи з критеріями вибору.

Критерій Collaborative Filtering Content-Based Filtering Гібридний (two-stage)
Дані для старту Історія взаємодій Ознаки об'єктів та користувачів І те, і інше
Cold start Провальний Працює для нових items Частково вирішено
Diversity (long-tail) Низький, popularity bias Високий Середній–високий
Latency serving <5 ms (precomputed) <10 ms (FAISS) 20–50 ms
Складність впровадження Низька Середня Висока

Гібридна архітектура на 20–40% ефективніша за чистий CF за покриттям long-tail — перевірено на каталогах від 100k SKU.

Content-Based Filtering: коли історії взаємодій мало

Content-based рекомендує на основі характеристик товарів, а не поведінки інших користувачів — вирішує cold start для нових items. Текстові ембединги через sentence-transformers (multilingual-e5-base, BGE-M3) → пошук схожих через FAISS IndexFlatIP — запит за <5 ms на 100k товарів. Item2Vec (Word2Vec на послідовностях переглядів) дає інтерпретовані «схожі товари» за пару годин навчання.

Структуровані ознаки (категорія, бренд, ціна) подаються через embedding layers або в gradient boosting — CatBoost працює з категоріями без ручного кодування.

Чому гібридні моделі працюють краще?

Production-системи майже завжди дворівневі. Stage 1 (Retrieval) — швидкий відбір 100–500 кандидатів із 300k товарів через ALS або Two-Tower модель з векторним пошуком (FAISS, Qdrant). Stage 2 (Ranking) — важкий ранжувальник на LightGBM або нейромережі з cross-features, часом, пристроєм та контекстом сесії. LightFM — хороша відправна точка для середнього масштабу без важкої інфраструктури. Наша практика показує: перехід від single-stage до two-stage дає приріст точності на 15–25% при зростанні latency всього на 20–30 мс.

Real-Time Serving: архітектура під навантаження

Latency SLA — 50–100 ms при тисячах запитів на секунду. Base-рекомендації precompute (batch job раз на годину) → Redis по user_id → <5 ms. Real-time re-ranking через Kafka для подій (кліки, додавання в кошик) → оновлення контекстних ознак. Feature serving — Redis з TTL (кількість переглядів за 24 години, останній клікнутий item). При навантаженні 10k req/s ставимо Redis Cluster з реплікацією.

A/B тестування — єдиний достовірний спосіб оцінити покращення. Офлайн-метрики корелюють з онлайн не завжди. Kohavi et al., «Online Controlled Experiments at Large Scale» (KDD 2013) — обов'язкове читання для команди. Тест з 5–10% трафіку, моніторинг CTR, конверсії, revenue per session. Одна з наших клієнтських систем після гібридизації збільшила виручку на 18% за місяць A/B.

Терміни розробки рекомендаційної системи

Етапи та типові часові витрати — у таблиці нижче. Вартість розраховується індивідуально під масштаб каталогу та вимоги до latency.

Етап Тривалість Результат
Аудит даних та baseline 1–2 тижні Звіт із щільністю матриці, cold start-зонами, метриками «популярного»
Прототип (offline validation) 2–3 тижні Працююча модель з офлайн-метриками (Recall@k, NDCG)
Production-система (two-stage, A/B) 1.5–2.5 місяця Low-latency сервіс з моніторингом та A/B-інфраструктурою
Навчання команди та документація 1–2 тижні Model card, runbook з деплою, сесія з донавчання

Що входить у розробку під ключ

  1. Аудит даних — щільність матриці user×item (зазвичай <0,1%), розподіл активності, temporal паттерни, cold start статистика.
  2. Baseline — «популярне» як простий поріг, який часто важко перевершити.
  3. Ітеративне покращення — ALS → контентні ознаки → two-stage → sequence-aware. Кожен крок з A/B.
  4. Інфраструктура serving — batch precomputation, Redis, real-time re-ranking, моніторинг у Grafana.
  5. Документація — model card з метриками, інструкція з деплою, опис ознак.
  6. Навчання команди — сесія з інтерпретації результатів та донавчання моделі.
  7. Підтримка — 1 місяць після запуску (фікс інцидентів, доналаштування pipeline).

Ми — команда з 7+ роками досвіду в рекомендаційних системах, реалізували понад 30 проєктів для e-commerce та медіа. Гарантуємо прозоре A/B-тестування та фіксацію покращення метрик.

Хочете оцінити потенціал зростання вашого каталогу? Зв'яжіться з нами для безкоштовного аудиту даних. Замовте розробку рекомендаційної системи — перший прототип протягом двох тижнів.

Приклад конфігу ALS для implicit feedback
from implicit.als import AlternatingLeastSquares

model = AlternatingLeastSquares(
    factors=64,
    regularization=0.05,
    iterations=15,
    use_gpu=True
)
model.fit(user_item_matrix)

Більше про математику рекомендаційних систем — у Wikipedia.