Разработка AI-системы персонализации гостевого опыта

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1 услугВсе 1566 услуг
Разработка AI-системы персонализации гостевого опыта
Средняя
~1-2 недели
Часто задаваемые вопросы
Направления AI-разработки
Этапы разработки AI-решения
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1240
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1167
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    867
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1084
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    563
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    829

AI-система персонализации опыта гостей отеля

Персонализация в отеле — от рекомендации подушек до предугадывания предпочтений по меню. Hilton и Marriott используют AI для загрузки профиля гостя до заезда, автоматической настройки номера и проактивных предложений. Результат: +15-20% к RevPAR (Revenue Per Available Room) и NPS +12-18 пунктов.

Профиль гостя и предзаезд персонализация

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

class GuestProfileManager:
    """Управление профилем гостя из всех источников данных"""

    def build_unified_profile(self, guest_id: str,
                               booking_history: pd.DataFrame,
                               feedback_data: pd.DataFrame,
                               crm_data: dict) -> dict:
        """Объединённый профиль из истории, отзывов и CRM"""
        guest_stays = booking_history[booking_history['guest_id'] == guest_id]

        if guest_stays.empty:
            return {'guest_id': guest_id, 'is_new_guest': True}

        # Предпочтения из истории
        profile = {
            'guest_id': guest_id,
            'is_new_guest': False,
            'total_stays': len(guest_stays),
            'avg_spend_per_night': guest_stays['revenue_per_night'].mean(),

            # Предпочтения номера
            'preferred_room_type': guest_stays['room_type'].mode().iloc[0] if len(guest_stays) > 0 else 'standard',
            'preferred_floor': self._infer_floor_preference(guest_stays),
            'prefers_high_floor': (guest_stays['floor'] > 5).mean() > 0.6,
            'prefers_quiet_room': guest_stays.get('quiet_room_requested', pd.Series([False])).mean() > 0.5,

            # Предпочтения питания
            'preferred_breakfast': guest_stays.get('breakfast_option', pd.Series(['buffet'])).mode().iloc[0],
            'dietary_restrictions': crm_data.get('dietary', []),
            'avg_restaurant_spend': guest_stays.get('f_and_b_spend', pd.Series([0])).mean(),

            # Дополнительные услуги
            'typically_uses_spa': guest_stays.get('spa_used', pd.Series([False])).mean() > 0.4,
            'typically_uses_gym': guest_stays.get('gym_visits', pd.Series([0])).mean() > 0.5,
            'late_checkout_history': guest_stays.get('late_checkout', pd.Series([False])).mean() > 0.3,

            # Поведенческий профиль
            'travel_purpose': self._infer_travel_purpose(guest_stays, crm_data),
            'loyalty_tier': crm_data.get('loyalty_tier', 'standard'),
        }

        # Анализ отзывов для выявления паттернов
        guest_feedback = feedback_data[feedback_data['guest_id'] == guest_id]
        if not guest_feedback.empty:
            profile['sentiment_themes'] = self._extract_sentiment_themes(guest_feedback)

        return profile

    def _infer_floor_preference(self, stays: pd.DataFrame) -> str:
        if 'floor' not in stays.columns:
            return 'no_preference'
        avg_floor = stays['floor'].mean()
        if avg_floor > 8:
            return 'high'
        elif avg_floor < 3:
            return 'low'
        return 'mid'

    def _infer_travel_purpose(self, stays: pd.DataFrame, crm: dict) -> str:
        if crm.get('company_name'):
            return 'business'
        # По дням заезда: пт-вс = leisure, пн-чт = business
        if 'checkin_weekday' in stays.columns:
            weekend_ratio = stays['checkin_weekday'].isin([4, 5, 6]).mean()
            return 'leisure' if weekend_ratio > 0.6 else 'business'
        return 'mixed'

    def _extract_sentiment_themes(self, feedback: pd.DataFrame) -> list[str]:
        positive_reviews = feedback[feedback['rating'] >= 4]['text'].tolist()
        themes = []
        # Упрощённое извлечение тем — в production: NLP topic modeling
        keywords = {'bed': 'comfortable_bed', 'pool': 'pool_lover', 'service': 'service_focused',
                    'quiet': 'prefers_quiet', 'breakfast': 'breakfast_fan'}
        for review in positive_reviews[:10]:
            for kw, theme in keywords.items():
                if kw in review.lower() and theme not in themes:
                    themes.append(theme)
        return themes[:5]


class PreArrivalPersonalizer:
    """Персонализация до заезда гостя"""

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

    def prepare_room_settings(self, guest_profile: dict,
                               available_rooms: list[dict]) -> dict:
        """Подготовка номера под предпочтения гостя"""
        preferred_type = guest_profile.get('preferred_room_type', 'standard')
        prefers_high = guest_profile.get('prefers_high_floor', False)
        prefers_quiet = guest_profile.get('prefers_quiet_room', False)

        # Выбор лучшего доступного номера
        scored_rooms = []
        for room in available_rooms:
            score = 0
            if room.get('type') == preferred_type:
                score += 3
            if prefers_high and room.get('floor', 0) > 5:
                score += 2
            if prefers_quiet and room.get('wing') == 'quiet':
                score += 2
            # Лояльные гости получают апгрейд
            if guest_profile.get('loyalty_tier') in ['gold', 'platinum']:
                if room.get('is_upgrade_eligible'):
                    score += 1
            scored_rooms.append({**room, 'score': score})

        best_room = max(scored_rooms, key=lambda x: x['score']) if scored_rooms else {}

        # Настройки номера к приезду
        room_setup = {
            'room_number': best_room.get('number'),
            'temperature_c': 21 if guest_profile.get('travel_purpose') == 'business' else 22,
            'pillow_type': 'firm' if 'comfortable_bed' not in guest_profile.get('sentiment_themes', []) else 'soft',
            'welcome_amenities': self._select_amenities(guest_profile),
            'minibar_stocked': guest_profile.get('avg_spend_per_night', 0) > 150,
        }

        return room_setup

    def _select_amenities(self, profile: dict) -> list[str]:
        amenities = ['welcome_card']
        if profile.get('total_stays', 0) > 5:
            amenities.append('loyalty_gift')
        if profile.get('travel_purpose') == 'business':
            amenities.extend(['bottled_water', 'charging_station'])
        if profile.get('typically_uses_spa'):
            amenities.append('spa_welcome_kit')
        return amenities

    def generate_pre_arrival_email(self, guest_profile: dict,
                                    booking: dict) -> str:
        """Персонализированное письмо до заезда"""
        response = self.llm.messages.create(
            model="claude-3-5-sonnet-20241022",
            max_tokens=300,
            messages=[{
                "role": "user",
                "content": f"""Write a personalized pre-arrival email for a hotel guest.

Guest: {guest_profile.get('total_stays', 0)} previous stays, {guest_profile.get('loyalty_tier')} member
Travel purpose: {guest_profile.get('travel_purpose', 'leisure')}
Arrives: {booking.get('checkin_date', 'soon')}
Special preferences: {guest_profile.get('sentiment_themes', [])}

Write in Russian. Include:
1. Warm personalized welcome (mention loyalty status if gold/platinum)
2. One specific upgrade or perk based on their profile
3. 2 relevant offers (spa/restaurant/local experiences)
4. Check-in info (online check-in available)

Avoid generic phrases. Be specific and genuine. 150-200 words."""
            }]
        )
        return response.content[0].text


class DynamicRevenueOptimizer:
    """Revenue management с AI персонализацией"""

    def calculate_personalized_rate(self, guest_profile: dict,
                                     base_rate: float,
                                     hotel_occupancy: float) -> dict:
        """Персонализированная ставка с учётом ценности гостя"""
        # Лояльные гости получают скидку
        loyalty_discount = {
            'standard': 0.0,
            'silver': 0.05,
            'gold': 0.10,
            'platinum': 0.15
        }.get(guest_profile.get('loyalty_tier', 'standard'), 0.0)

        # Динамический коэффициент загрузки
        if hotel_occupancy > 0.85:
            occupancy_multiplier = 1.2
        elif hotel_occupancy > 0.70:
            occupancy_multiplier = 1.0
        else:
            occupancy_multiplier = 0.9

        final_rate = base_rate * occupancy_multiplier * (1 - loyalty_discount)

        return {
            'base_rate': base_rate,
            'personalized_rate': round(final_rate, 2),
            'loyalty_savings': round(base_rate * loyalty_discount, 2),
            'rate_type': 'member_rate' if loyalty_discount > 0 else 'standard'
        }

Персонализация опыта в hospitality работает лучше всего для повторных гостей (30%+ базы в luxury сегменте). Система окупается через upsell: спа, рестораны, апгрейды. Средний incremental revenue с персонализированного гостя: +$45-80 за ночь против стандартного stay.