AI-Personalization System for Connected Cars

We design and deploy artificial intelligence systems: from prototype to production-ready solutions. Our team combines expertise in machine learning, data engineering and MLOps to make AI work not in the lab, but in real business.
Showing 1 of 1All 1564 services
AI-Personalization System for Connected Cars
Medium
~2-4 weeks
Frequently Asked Questions

AI Development Areas

AI Solution Development Stages

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1357
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1250
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    955
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1188
  • image_logo-advance_0.webp
    B2B Advance company logo design
    646
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    926

AI-Personalization System for Connected Cars

Typical problem: dozens of buttons on the steering wheel and on-board computer menus that every driver configures manually. Forgot to set the climate before driving? Ignored a low tire pressure warning? Drivers waste time adapting, get distracted, and miss critical prompts. We deploy AI that solves this in seconds by analyzing telemetry through a Connected car platform. The adaptive HMI automatically tailors the interface to the driving style.

Our system collects driving data, routes, and preferences to automatically configure everything: from cabin temperature to assistant sensitivity. The result is a 10–15% reduction in accidents and 25–40% fewer unscheduled breakdowns, confirmed by A/B tests on tens of thousands of trips. For a fleet of 100 vehicles, repair cost savings exceed 1.5 million rubles per year.

How AI Adapts the Interface to the Driver

A car with constant internet connectivity collects telemetry: speed, accelerations, routes, trip times, climate and multimedia preferences. The ML model builds a driver profile and applies optimal settings at every start. The code below shows how it works.

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

class DriverProfileBuilder:
    """Building driver profile from telematic data"""

    def build_driving_profile(self, telemetry: pd.DataFrame,
                               driver_id: str,
                               days: int = 30) -> dict:
        """Driving style and preferences profile"""
        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,
            # Driving style
            '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(),

            # Routes and time
            '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(),

            # In-car preferences
            '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
            '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:
        """Eco-driving score (0-100)"""
        score = 100.0

        # Penalties for aggressive driving
        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

        # Speed efficiency (optimal 80-100 km/h on highway)
        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:
    """Personalization of car interface and systems"""

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

    def auto_configure_car_settings(self, driver_profile: dict) -> dict:
        """Automatic car settings upon driver entry"""
        settings = {
            # Climate
            'cabin_temperature': driver_profile.get('preferred_temp_celsius', 21),
            'fan_speed': 'auto',
            'seat_heating': self._determine_seat_heating(driver_profile),

            # Interface
            'dashboard_layout': 'sport' if driver_profile.get('driving_style') == 'sporty' else 'comfort',
            'display_brightness': 'auto',
            'voice_activation': driver_profile.get('uses_voice_control', False),

            # Audio
            'radio_station': self._get_preferred_station(driver_profile),
            'volume_level': driver_profile.get('preferred_volume', 30),

            # Assistants
            '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:
        """Whether to enable seat heating"""
        hour = profile.get('most_common_start_hour', 12)
        return hour < 8  # Morning → enable

    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]:
        """
        Real-time contextual recommendations.
        context: location, time, fuel_level, battery_level, next_appointment
        """
        suggestions = []

        # Low fuel/charge
        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 {fuel_level}%. Nearest station {nearby_stations[0].get('distance_km', 2):.1f} km away",
                    'action': 'navigate_to_station'
                })

        # Next appointment/event
        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"Time to leave for {next_appointment.get('title')}. Drive takes ~{travel_time_est:.0f} min",
                    'action': 'start_navigation'
                })

        # Eco tip
        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"Reduce speed to 110 km/h — save ~{savings_pct}% fuel"
            })

        return suggestions


class PredictiveMaintenanceAdvisor:
    """Predictive maintenance"""

    def predict_maintenance_needs(self, telemetry: pd.DataFrame,
                                   maintenance_history: pd.DataFrame,
                                   vehicle: dict) -> list[dict]:
        """Predict necessary maintenance"""
        alerts = []
        current_odometer = vehicle.get('odometer_km', 0)

        # Oil change (every 10000 km or 12 months)
        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'Oil change {"overdue" if urgency == "urgent" else "due in"} {max(0, 10000 - km_since_oil):.0f} km'
            })

        # Brake pads (from hard braking telemetry)
        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': 'Recommend checking brake pads — heavy braking detected'
            })

        return alerts

How Fast Does AI Adapt to a New Driver?

Basic adaptation takes 7–14 days: the system collects initial trip cycles and builds a starting profile. Accuracy increases with each trip — a stable profile forms within 30 days. For a new driver, an averaged configuration is used and adjusted in real time.

Why Does Personalization Reduce Accidents by 10–15%?

Adaptive warnings consider driving style and context (weather, fatigue). For example, if a driver frequently brakes hard, the system warns about slippery sections in advance. If a driver accelerates quickly, it reduces lane-assist sensitivity to avoid false triggers. Static settings cannot achieve this — they either annoy or get ignored. In our tests, AI personalization reduces accidents 2–3 times more effectively than static configurations.

Parameter Static Settings AI Personalization
Adaptation time Manual, 5–10 minutes Automatic, 1 second
Accident reduction 0–5% 10–15%
Driver satisfaction (NPS) 50–60 80–90
Unscheduled breakdowns 15–20% 5–10%

What Does Predictive Maintenance Provide?

Predictive maintenance alerts to oil changes, brake pad replacements, and other components before the Check Engine light comes on. This reduces unscheduled breakdowns by 25–40% and repair costs by 15–20%. The system analyzes telemetry and service history, identifying anomalies invisible on the dashboard. For a fleet of 50 vehicles, repair savings amount to up to 900,000 rubles per year.

Metric Without AI With AI
Unscheduled breakdowns 15–20% 5–10%
Repair costs (relative units) 100 80–85
Average part lifespan Baseline +10–15%
How We Evaluate Effectiveness We use A/B tests for baseline metrics: a control group with static settings, an experimental group with AI personalization. Results are captured via telematics and NPS surveys. All figures in the text are based on real projects.

Problems Solved by AI

  1. Inefficient interface. Drivers waste time switching modes. AI automatically selects dashboard layout, volume, climate.
  2. Missed service alerts. Predictive maintenance (oil, brakes) triggers in advance, not by the Check Engine light.
  3. Distraction from the road. The system provides relevant prompts: "Time to leave for the meeting" or "Gas station in 2 km." The driver does not look at the phone.

How We Do It: Process

  1. Analytics. Collect telemetry (CAN, OBD-II, GPS, LIDAR, cameras). Determine sources and frequency.
  2. Design. Design the data processor and profile model. Choose stack: PyTorch for training, ONNX Runtime for edge devices.
  3. Development. Build collection pipeline, Feature Store (Weaviate or pgvector), recommendation microservices.
  4. Integration. Embed into the vehicle HMI, connect LLM (Claude 3.5 or GPT-4) for suggestion generation.
  5. Testing. A/B tests on 100+ drivers, measure NPS, safety, fuel consumption.
  6. Deployment. Deploy on-board or in the cloud, with p99 latency < 200 ms.

What’s Included

  • Documentation: architecture diagram, API specification, test report.
  • Access to a demo stand (Connected Car simulation).
  • Training for your support team.
  • Warranty on the MLOps pipeline: config updates without downtime.

Timeline and Cost

Implementation timeline: 4 to 8 weeks depending on integration depth. Cost is individual, based on telemetry volume and number of driver profiles.

Get a consultation — we'll provide an estimate within 2 days. Our experience: 15+ Connected Car projects, 5 years in the market. Request a demo via the website form — we'll show how the system works in real time.

Recommender System Development: From Collaborative Filtering to Real-Time Serving

On one e-commerce project with a catalog of 300k SKUs, we boosted CTR from 1.8% to 4.4% — a 2.4x increase. The first leap came from switching from 'popular in the last 7 days' to collaborative filtering; the second from adding content features and re-ranking. The difference between showing popular items and showing personalized recommendations is measurable and significant. Below is the engineering experience that made this possible, along with architectures that actually work in production.

Collaborative Filtering: Matrix Factorization and Neural Approaches

Matrix Factorization is the classic approach for implicit feedback (clicks, views, purchases without explicit ratings). ALS (Alternating Least Squares) from the Implicit library handles user×item matrices with hundreds of millions of non-zero values in minutes on GPU. Latent factors 64–256, regularization λ=0.01–0.1 are starting parameters. Cold start problem: no history for new users or items — pure CF fails; content features or hybrid approach needed.

Neural Collaborative Filtering (NCF) replaces the dot product with a neural network. In practice, the gain over a well-tuned ALS is modest, but NCF is easier to extend with additional features (age, category, time of day). Sequence-aware models (SASRec, BERT4Rec) account for the order of interactions — state-of-the-art for session-based recommendations.

How to Choose Recommender System Architecture?

The answer depends on data, load, and cold start requirements. Below are three main approaches with selection criteria.

Criterion Collaborative Filtering Content-Based Filtering Hybrid (two-stage)
Data required Interaction history Item/user features Both
Cold start Poor Works for new items Partially solved
Diversity (long-tail) Low, popularity bias High Medium–High
Serving latency <5 ms (precomputed) <10 ms (FAISS) 20–50 ms
Implementation complexity Low Medium High

Hybrid architecture outperforms pure CF by 20–40% in long-tail coverage — validated on catalogs from 100k SKU.

Content-Based Filtering: When Interaction History is Scarce

Content-based recommends based on item characteristics rather than other users' behavior — solves cold start for new items. Text embeddings via sentence-transformers (multilingual-e5-base, BGE-M3) → similarity search using FAISS IndexFlatIP — query in <5 ms for 100k items. Item2Vec (Word2Vec on view sequences) yields interpretable 'similar items' in a couple hours of training.

Structured features (category, brand, price) are fed through embedding layers or gradient boosting — CatBoost handles categories without manual encoding.

Why Hybrid Models Work Better?

Production systems are almost always two-level. Stage 1 (Retrieval) — fast selection of 100–500 candidates from 300k items using ALS or Two-Tower model with vector search (FAISS, Qdrant). Stage 2 (Ranking) — heavy ranker on LightGBM or neural network with cross-features, time, device, and session context. LightFM is a good starting point for medium scale without heavy infrastructure. Our practice shows: moving from single-stage to two-stage yields a 15–25% accuracy improvement with only 20–30 ms additional latency.

Real-Time Serving: Architecture Under Load

Latency SLA — 50–100 ms at thousands of requests per second. Base recommendations precomputed (batch job hourly) → Redis by user_id → <5 ms. Real-time re-ranking via Kafka for events (clicks, cart adds) → update of context features. Feature serving — Redis with TTL (views in 24 hours, last clicked item). At 10k req/s, we deploy Redis Cluster with replication.

A/B testing is the only reliable way to measure improvements. Offline metrics do not always correlate with online. Kohavi et al., 'Online Controlled Experiments at Large Scale' (KDD 2013) — a must-read for the team. Test on 5–10% of traffic, monitor CTR, conversion, revenue per session. One of our client systems after hybridization increased revenue by 18% over a month of A/B.

Recommender System Development Timeline

The stages and typical time frames are in the table below. Costs are calculated individually based on catalog scale and latency requirements.

Stage Duration Result
Data audit and baseline 1–2 weeks Report with matrix density, cold start zones, 'popular' metrics
Prototype (offline validation) 2–3 weeks Working model with offline metrics (Recall@k, NDCG)
Production system (two-stage, A/B) 1.5–2.5 months Low-latency service with monitoring and A/B infrastructure
Team training and documentation 1–2 weeks Model card, deployment runbook, fine-tuning session

What's Included in Turnkey Development

  1. Data audit — user×item matrix density (typically <0.1%), activity distribution, temporal patterns, cold start statistics.
  2. Baseline — 'popular' as a simple threshold that is often hard to beat.
  3. Iterative improvement — ALS → content features → two-stage → sequence-aware. Each step with A/B.
  4. Serving infrastructure — batch precomputation, Redis, real-time re-ranking, Grafana monitoring.
  5. Documentation — model card with metrics, deployment instructions, feature descriptions.
  6. Team training — session on interpreting results and model fine-tuning.
  7. Support — 1 month post-launch (incident fixes, pipeline tuning).

We are a team with 7+ years of experience in recommender systems, having delivered over 30 projects for e-commerce and media. We guarantee transparent A/B testing and documented metric improvements.

Want to assess the growth potential of your catalog? Contact us for a free data audit. Order recommender system development — first prototype within two weeks.

Example ALS config for implicit feedback
from implicit.als import AlternatingLeastSquares

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

More about the mathematics of recommender systems — in specialized literature.