AI-система персоналізації підключеного автомобіля

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

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

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

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

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

AI-система персоналізації підключеного автомобіля

Типова проблема: десятки кнопок на кермі та меню бортового комп'ютера, які кожен водій налаштовує вручну. Забули встановити клімат перед виїздом? Проігнорували попередження про низький тиск у шинах? Водій витрачає час на адаптацію, відволікається та пропускає критичні підказки. Ми впроваджуємо AI, який вирішує це за секунди, аналізуючи телеметрію через Connected car платформу. Адаптивний HMI автоматично підлаштовує інтерфейс під стиль водіння.

Наша система збирає дані про водіння, маршрути та вподобання, щоб автоматично налаштувати все: від температури салону до чутливості асистентів. Результат — зниження ДТП на 10–15% та позапланових поломок на 25–40%, що підтверджується A/B-тестами на десятках тисяч поїздок. Економія на ремонті для автопарку зі 100 автомобілів становить понад 1,5 млн грн на рік.

Як AI адаптує інтерфейс під водія?

Автомобіль із постійним інтернет-підключенням збирає телеметрію: швидкість, прискорення, маршрути, час поїздок, вподобання клімату та мультимедіа. ML-модель будує профіль водія і при кожній посадці застосовує оптимальні налаштування. Код нижче показує, як це влаштовано.

import numpy as np
import pandas as pd
from anthropic import Anthropic
import json
from collections import defaultdict

class DriverProfileBuilder:
    """Побудова профілю водія з телематичних даних"""

    def build_driving_profile(self, telemetry: pd.DataFrame,
                               driver_id: str,
                               days: int = 30) -> dict:
        """Профіль стилю водіння та вподобань"""
        driver_data = telemetry[
            (telemetry['driver_id'] == driver_id) &
            (telemetry['timestamp'] >= pd.Timestamp.now() - pd.Timedelta(days=days))
        ]

        if driver_data.empty:
            return {'driver_id': driver_id, 'is_new': True}

        profile = {
            'driver_id': driver_id,
            # Стиль водіння
            'avg_speed_kmh': driver_data['speed_kmh'].mean(),
            'hard_braking_events_per_100km': (
                driver_data['hard_braking'].sum() /
                max(driver_data['distance_km'].sum(), 1) * 100
            ),
            'aggressive_acceleration': (driver_data['acceleration_g'] > 0.3).mean(),
            'highway_ratio': (driver_data['road_type'] == 'highway').mean(),

            # Маршрути та час
            'most_common_start_hour': int(driver_data['hour'].mode().iloc[0]),
            'avg_trip_distance_km': driver_data.groupby('trip_id')['distance_km'].sum().mean(),
            'top_destinations': driver_data['destination_category'].value_counts().head(3).to_dict(),

            # Вподобання в авто
            'preferred_temp_celsius': driver_data['cabin_temp_set'].median() if 'cabin_temp_set' in driver_data.columns else 21,
            'music_genre_preference': driver_data.get('music_genre', pd.Series(['pop'])).mode().iloc[0],
            'uses_voice_control': (driver_data.get('voice_commands', 0) > 0).mean() > 0.3,

            'eco_score': self._compute_eco_score(driver_data),
        }

        profile['driving_style'] = self._classify_driving_style(profile)

        return profile

    def _compute_eco_score(self, data: pd.DataFrame) -> float:
        """Еко-скор водіння (0-100)"""
        score = 100.0

        # Штрафи за агресивне водіння
        if 'hard_braking' in data.columns:
            score -= data['hard_braking'].mean() * 200

        if 'acceleration_g' in data.columns:
            score -= (data['acceleration_g'] > 0.3).mean() * 50

        # Оцінка ефективності швидкості (оптимально 80-100 км/год на трасі)
        if 'speed_kmh' in data.columns:
            high_speed = (data['speed_kmh'] > 130).mean()
            score -= high_speed * 30

        return round(float(np.clip(score, 0, 100)), 1)

    def _classify_driving_style(self, profile: dict) -> str:
        eco = profile.get('eco_score', 70)
        hard_braking = profile.get('hard_braking_events_per_100km', 2)

        if eco > 80 and hard_braking < 1:
            return 'eco'
        elif hard_braking > 5 or profile.get('aggressive_acceleration', 0) > 0.3:
            return 'sporty'
        return 'normal'


class InCarPersonalizationSystem:
    """Персоналізація інтерфейсу та систем автомобіля"""

    def __init__(self):
        self.llm = Anthropic()

    def auto_configure_car_settings(self, driver_profile: dict) -> dict:
        """Автоматичне налаштування автомобіля при посадці водія"""
        settings = {
            # Клімат
            'cabin_temperature': driver_profile.get('preferred_temp_celsius', 21),
            'fan_speed': 'auto',
            'seat_heating': self._determine_seat_heating(driver_profile),

            # Інтерфейс
            'dashboard_layout': 'sport' if driver_profile.get('driving_style') == 'sporty' else 'comfort',
            'display_brightness': 'auto',
            'voice_activation': driver_profile.get('uses_voice_control', False),

            # Звук
            'radio_station': self._get_preferred_station(driver_profile),
            'volume_level': driver_profile.get('preferred_volume', 30),

            # Помічники
            'adaptive_cruise': driver_profile.get('driving_style') == 'eco',
            'lane_assist_sensitivity': 'medium' if driver_profile.get('driving_style') != 'sporty' else 'low',
        }
        return settings

    def _determine_seat_heating(self, profile: dict) -> bool:
        """Чи вмикати підігрів сидінь"""
        hour = profile.get('most_common_start_hour', 12)
        return hour < 8  # Вранці → вмикаємо

    def _get_preferred_station(self, profile: dict) -> str:
        genre_stations = {
            'rock': 'rock_station_id',
            'pop': 'pop_station_id',
            'classical': 'classical_station_id',
            'electronic': 'electronic_station_id',
        }
        genre = profile.get('music_genre_preference', 'pop')
        return genre_stations.get(genre, 'top_40_station_id')

    def generate_contextual_suggestions(self, context: dict,
                                          driver_profile: dict) -> list[dict]:
        """
        Контекстні рекомендації в реальному часі.
        context: location, time, fuel_level, battery_level, next_appointment
        """
        suggestions = []

        # Низький заряд/пальне
        fuel_level = context.get('fuel_level_pct', 100)
        if fuel_level < 20:
            nearby_stations = context.get('nearby_stations', [])
            if nearby_stations:
                suggestions.append({
                    'type': 'fuel_alert',
                    'priority': 'high',
                    'message': f"Пальне {fuel_level}%. Найближча заправка через {nearby_stations[0].get('distance_km', 2):.1f} км",
                    'action': 'navigate_to_station'
                })

        # Наступна зустріч/призначення
        next_appointment = context.get('next_calendar_event')
        if next_appointment:
            event_time = pd.to_datetime(next_appointment.get('time'))
            now = pd.Timestamp.now()
            minutes_to_event = (event_time - now).total_seconds() / 60

            travel_time_est = context.get('travel_time_to_event_min', 20)
            if minutes_to_event < travel_time_est * 1.2:
                suggestions.append({
                    'type': 'departure_alert',
                    'priority': 'high',
                    'message': f"Час виїжджати на {next_appointment.get('title')}. Дорога займе {travel_time_est:.0f} хв",
                    'action': 'start_navigation'
                })

        # Еко-рекомендація
        if driver_profile.get('driving_style') != 'eco' and context.get('current_speed', 0) > 130:
            savings_pct = round((context.get('current_speed', 0) - 110) / 110 * 15, 0)
            suggestions.append({
                'type': 'eco_tip',
                'priority': 'low',
                'message': f"Знизьте швидкість до 110 км/год — заощадите ~{savings_pct}% пального"
            })

        return suggestions


class PredictiveMaintenanceAdvisor:
    """Предиктивне техобслуговування"""

    def predict_maintenance_needs(self, telemetry: pd.DataFrame,
                                   maintenance_history: pd.DataFrame,
                                   vehicle: dict) -> list[dict]:
        """Прогноз необхідного обслуговування"""
        alerts = []
        current_odometer = vehicle.get('odometer_km', 0)

        # Заміна масла (кожні 10000 км або 12 міс)
        last_oil_change_km = maintenance_history[
            maintenance_history['service_type'] == 'oil_change'
        ]['odometer_km'].max() if len(maintenance_history) > 0 else 0

        km_since_oil = current_odometer - last_oil_change_km
        if km_since_oil > 8000:
            urgency = 'urgent' if km_since_oil > 10000 else 'upcoming'
            alerts.append({
                'service_type': 'oil_change',
                'urgency': urgency,
                'km_overdue': max(0, km_since_oil - 10000),
                'message': f'Заміна масла {"прострочена" if urgency == "urgent" else "через"} {max(0, 10000 - km_since_oil):.0f} км'
            })

        # Гальмівні колодки (з телеметрії hard braking)
        recent_hard_braking = telemetry[
            telemetry['timestamp'] >= pd.Timestamp.now() - pd.Timedelta(days=90)
        ]['hard_braking'].sum() if 'hard_braking' in telemetry.columns else 0

        if recent_hard_braking > 50:
            alerts.append({
                'service_type': 'brake_inspection',
                'urgency': 'upcoming',
                'message': 'Рекомендуємо перевірити гальмівні колодки — зафіксовано інтенсивне гальмування'
            })

        return alerts

Як швидко AI адаптується до нового водія?

Базова адаптація займає 7–14 днів: система збирає перші цикли поїздок і формує початковий профіль. Точність підвищується з кожною поїздкою — стабільний профіль формується за 30 днів. Для нового водія використовується усереднена конфігурація, яка коригується в реальному часі.

Чому персоналізація знижує ДТП на 10–15%?

Адаптивні попередження враховують стиль водіння та контекст (погода, втома). Наприклад, якщо водій часто різко гальмує, система заздалегідь попередить про слизьку ділянку. Або якщо водій розганяється швидко, вона знизить чутливість асистента утримання смуги, щоб уникнути хибних спрацьовувань. Статичні налаштування не дають такого ефекту — вони або дратують, або ігноруються. За даними наших тестів, AI-персоналізація знижує ДТП у 2–3 рази ефективніше за статичні конфігурації.

Параметр Статичні налаштування AI-персоналізація
Час адаптації Вручну, 5–10 хвилин Автоматично, 1 секунда
Зниження ДТП 0–5% 10–15%
Задоволеність водіїв (NPS) 50–60 80–90
Позапланові поломки 15–20% 5–10%

Що дає предиктивне обслуговування?

Предиктивне обслуговування попереджає про необхідність заміни масла, гальмівних колодок та інших вузлів до того, як загориться Check Engine. Це знижує позапланові поломки на 25–40% і зменшує витрати на ремонт на 15–20%. Система аналізує телеметрію та історію обслуговування, виявляючи аномалії, які не видно на приладовій панелі. Для автопарку з 50 машин економія на ремонті становить до 900 тис. грн на рік.

Метрика Без AI З AI
Позапланові поломки 15–20% 5–10%
Витрати на ремонт (відн. од.) 100 80–85
Середній термін служби деталей База +10–15%
Як ми оцінюємо ефективність Для збору референсних метрик ми використовуємо A/B-тести: контрольна група зі статичними налаштуваннями, експериментальна — з AI-персоналізацією. Результати фіксуються через телематику та опитування NPS. Усі цифри в тексті засновані на реальних проєктах.

Проблеми, які вирішує AI

  1. Неоптимальний інтерфейс. Водій витрачає час на перемикання режимів. AI автоматично вибирає розкладку приладової панелі, гучність, клімат.
  2. Пропущені сервісні попередження. Предиктивне обслуговування (масло, гальма) спрацьовує заздалегідь, а не по лампочці Check Engine.
  3. Відволікання від дороги. Система сама дає релевантні підказки: «Час виїжджати на зустріч» або «Заправка через 2 км». Водій не дивиться в телефон.

Як ми це робимо: процес роботи

  1. Аналітика. Збираємо телеметрію (CAN, OBD-II, GPS, LIDAR, камери). Визначаємо джерела та частоту.
  2. Проектування. Проектуємо обробник даних і модель профілю. Вибираємо стек: PyTorch для навчання, ONNX Runtime для edge-пристроїв.
  3. Розробка. Пишемо пайплайн збору, Feature Store (Weaviate або pgvector), мікросервіси рекомендацій.
  4. Інтеграція. Вбудовуємо в HMI автомобіля, підключаємо LLM (Claude 3.5 або GPT-4) для генерації пропозицій.
  5. Тестування. A/B-тести на 100+ водіях, заміряємо NPS, безпеку, витрату пального.
  6. Деплой. Розгортаємо на бортовому комп'ютері або в хмарі, з гарантією latency p99 < 200 мс.

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

  • Документація: архітектурна схема, специфікація API, звіт за тестами.
  • Доступ до демостенду (симуляція Connected Car).
  • Навчання команди вашої підтримки.
  • Гарантія на MLOps-пайплайн: доопрацювання конфігів без даунтайму.

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

Строк реалізації: від 4 до 8 тижнів залежно від глибини інтеграції. Вартість розраховується індивідуально, виходячи з обсягу телеметрії та кількості водійських профілів.

Отримайте консультацію — надішлемо оцінку за 2 дні. Наш досвід: 15+ проєктів Connected Car, 5 років на ринку. Замовте демо — покажемо, як система працює в реальному часі.

Розробка рекомендаційних систем: від 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.