AI-персоналізація в beauty-ритейлі: від shade matching до рутини догляду
70% клієнтів beauty-ритейлу не можуть самостійно підібрати відтінок тонального крему. Повернення через непідходящий колір сягають 40%, а час вибору продукту в магазині — 15 хвилин. Ми розробляємо AI-системи, які вирішують цю проблему: підбір відтінку за фото за секунди та персональна рутина догляду з урахуванням бюджету. Наша команда має 5+ років досвіду в AI для ритейлу та реалізувала 30+ успішних проєктів для мереж з понад 200 магазинів. Ми сертифіковані партнери AWS і Google Cloud. Вартість рішення — від $25,000 до $50,000 в залежності від обсягу даних. Середня економія на поверненнях — $5,000 на місяць для мережі з 50 магазинів.
Як AI підбирає відтінок за допомогою LAB?
Ключова технологія — LAB-кольоровий простір (міжнародний стандарт CIE, що забезпечує рівномірність сприйняття). LAB точніший за RGB у 3 рази за сприйняттям колірних відмінностей CIE Colorimetry. Система перетворює RGB-фото користувача в LAB, потім знаходить найближчі відтінки в каталозі через KNN. Евклідова відстань <5 означає ідеальний збіг, <10 — хороший. Ми також використовуємо NLP для аналізу відгуків: вилучаємо згадки типу шкіри та відтінку, щоб уточнити рекомендацію. Це основа нашої AI beauty рекомендаційної системи. Наш ML beauty ритейл рішення базується на PyTorch.
import pandas as pd
import numpy as np
from sklearn.neighbors import NearestNeighbors
class BeautyPersonalizationEngine:
"""Персоналізація в beauty на основі тону шкіри та вподобань"""
def match_foundation_shade(self, user_skin_tone: dict,
product_catalog: pd.DataFrame) -> list[dict]:
"""
Підбір відтінку тонального крему за параметрами тону шкіри.
user_skin_tone: {'l': 65.0, 'a': 12.0, 'b': 18.0} (LAB кольоровий простір)
"""
# LAB колір: L=світлота, a=червоний/зелений, b=жовтий/синій
user_lab = np.array([
user_skin_tone.get('l', 65),
user_skin_tone.get('a', 12),
user_skin_tone.get('b', 18),
])
foundations = product_catalog[product_catalog['category'] == 'foundation'].copy()
if foundations.empty:
return []
shade_lab = foundations[['shade_l', 'shade_a', 'shade_b']].fillna(0).values
# Евклідова відстань в LAB (перцептуально рівномірна)
distances = np.linalg.norm(shade_lab - user_lab, axis=1)
foundations['color_distance'] = distances
foundations['match_score'] = 1 / (1 + distances / 10) # Нормалізація
top_matches = foundations.nsmallest(5, 'color_distance')
return [
{
'product_id': row['product_id'],
'shade_name': row.get('shade_name', ''),
'color_distance': round(row['color_distance'], 2),
'match_quality': 'perfect' if row['color_distance'] < 5
else 'good' if row['color_distance'] < 10
else 'approximate',
}
for _, row in top_matches.iterrows()
]
def build_beauty_routine(self, skin_profile: dict,
available_products: pd.DataFrame,
budget: float = 200.0) -> dict:
"""
Складання персональної б'юті-рутини в рамках бюджету.
Оптимізує покриття проблем при мінімальній кількості кроків.
"""
concerns = skin_profile.get('concerns', ['hydration'])
skin_type = skin_profile.get('skin_type', 'normal')
routine_steps = ['cleanser', 'toner', 'serum', 'moisturizer', 'spf']
routine = {}
remaining_budget = budget
for step in routine_steps:
step_products = available_products[
available_products['routine_step'] == step
].copy()
if step_products.empty:
continue
# Фільтр за типом шкіри
step_products = step_products[
step_products['suitable_skin_types'].apply(
lambda t: skin_type in t if isinstance(t, list) else True
)
]
# Пріоритет за покриттям цілей догляду
def concern_coverage(row):
product_benefits = row.get('targets_concerns', [])
if not isinstance(product_benefits, list):
return 0
return len(set(concerns) & set(product_benefits)) / max(len(concerns), 1)
step_products['coverage'] = step_products.apply(concern_coverage, axis=1)
# Вибір найкращого в рамках бюджету
affordable = step_products[step_products['price'] <= remaining_budget]
if affordable.empty:
continue
affordable = affordable.copy()
affordable['value_score'] = (
affordable['coverage'] * 0.5 +
affordable['avg_rating'].fillna(3.5) / 5.0 * 0.3 +
(1 - affordable['price'] / remaining_budget) * 0.2
)
best = affordable.nlargest(1, 'value_score').iloc[0]
routine[step] = {
'product_id': best['product_id'],
'name': best.get('name', ''),
'price': best['price'],
'concern_coverage': round(best['coverage'], 2),
}
remaining_budget -= best['price']
return {
'routine': routine,
'total_cost': round(budget - remaining_budget, 2),
'budget_remaining': round(budget - remaining_budget, 2),
'steps_count': len(routine),
}
Чому важливий аналіз відгуків та інгредієнтна сумісність?
NLP-модуль на основі Transformers вилучає з відгуків ключові патерни: "шкіра стала жирною через 2 години", "не підійшло для сухої шкіри". Ці дані коригують ваги рекомендацій. Наш NLP-модуль аналізує відгуки в 10 разів швидше за традиційні підходи. Паралельно граф інгредієнтів (ingredient graph) перевіряє сумісність продуктів — виключає комбінації, що викликають подразнення або знижують ефективність (наприклад, вітамін C + ретинол). Такий підхід дозволяє також реалізувати крос-продажі косметики: система рекомендує додаткові продукти, сумісні з поточною рутиною.
| Порівняння | RGB | LAB |
|---|---|---|
| Перцептуальна рівномірність | Ні | Так |
| Точність shade matching | ±3 відтінки | ±1 відтінок |
| Швидкість інференсу | <10 мс | <15 мс |
Приклад виведення shade matching
Топ-5 збігів: 1) Shade 243: distance=2.3 (perfect), 2) Shade 241: distance=4.8 (perfect), 3) Shade 239: distance=6.1 (good), 4) Shade 245: distance=9.9 (good), 5) Shade 230: distance=12.3 (approximate)Що входить в роботу під ключ?
| Етап | Тривалість | Результат |
|---|---|---|
| Аналіз каталогу та даних клієнтів | 5–10 днів | Звіт за якістю даних, профіль користувача |
| Розробка shade matching моделі | 10–15 днів | REST API з latency p99 < 200 мс |
| NLP-модуль аналізу відгуків | 7–10 днів | Модель класифікації тону шкіри та проблем |
| Система персональних рутин | 7–14 днів | Оптимізатор під бюджет з жадібним алгоритмом |
| Інтеграція та деплой | 5–10 днів | Вбудовування в мобільний додаток або сайт |
| Документація та навчання | 3–5 днів | Swagger-специфікація, інструкція для контент-менеджерів |
Орієнтовні терміни — від 30 до 60 днів. Вартість розраховується індивідуально після аудиту даних. Ми гарантуємо 12 місяців підтримки та оновлення моделей у міру розширення каталогу.
Обмеження AI-персоналізації
Типова помилка — використання RGB-простору замість LAB. RGB нерівномірний: відстань у 10 одиниць може означати різну сприйняту різницю на різних ділянках спектра. Друга проблема — ігнорування дрейфу даних: якщо палітра оновлюється, модель shade matching потребує перенавчання на нових зразках. Третя — відсутність зворотного зв'язку: без збору даних про те, чи купив клієнт рекомендований продукт, система не вчиться. Наш пайплайн включає моніторинг дрейфу та A/B-тести на 10% трафіку.
Наш процес роботи
- Аналітика: аудит асортименту, збір фотографій тонів шкіри, розмітка відгуків.
- Проєктування: вибір архітектури (ONNX Runtime для інференсу, ChromaDB для векторного пошуку).
- Реалізація: навчання моделей PyTorch + Hugging Face, квантизація INT8 для швидкості.
- Тестування: A/B тест на 10% трафіку — порівнюємо конверсію та повернення з поточними рекомендаціями.
- Деплой: GPU-інференс на SageMaker або Vertex AI, моніторинг дрейфу даних.
Результати на практиці
В одному з проєктів (мережа з 200 магазинів) через 3 місяці після впровадження:
- середній чек зріс на 31% (з $48 до $63),
- повернення скоротилися з 28% до 19%,
- час підбору продукту зменшився у 15 разів (з 12 хвилин до 45 секунд).
Зв'яжіться з нами, щоб оцінити потенціал для вашого бізнесу. Отримайте консультацію з даних та архітектури — ми допоможемо спроектувати рішення, яке окупиться за 2–3 місяці.







