AI-Рекомендації по здоров'ю на основі даних мобільного додатку
Більшість health-додатків показують дані. Користувач бачить 7 340 кроків і закриває додаток. Рекомендаційна система змінює цей сценарій: замість "ось ваші дані"—"ось що це означає для вас сьогодні".
Архітектура системи рекомендацій
Персоналізовані рекомендації по здоров'ю—це не один ML-алгоритм. Це конвеєр з кількох шарів:
- Збір даних—активність (кроки, тренування), сон, харчування, біометрика (ЧСС, SpO2, вага)
- Профіль користувача—вік, цілі, вихідні показатели, паттерни поведінки
- Feature engineering—агрегація в осмислені метрики
- Модель рекомендацій—rule engine + ML ranking
- Відображення—конкретне, релевантне, в нужний момент
Дані: HealthKit як єдина точка на iOS
class HealthDataAggregator {
private let store = HKHealthStore()
func weeklyStats() async throws -> HealthWeekSnapshot {
async let steps = fetchSum(.stepCount, days: 7)
async let sleepHours = fetchCategorySamples(.sleepAnalysis, days: 7)
async let restingHR = fetchAverage(.restingHeartRate, days: 7)
async let activeEnergy = fetchSum(.activeEnergyBurned, days: 7)
return try await HealthWeekSnapshot(
avgDailySteps: steps / 7,
avgSleepHours: sleepHours,
avgRestingHR: restingHR,
totalActiveKcal: activeEnergy
)
}
}
На Android—Health Connect SDK (HealthConnectClient) з аналогічним набором типів даних. HealthConnectClient.readRecords(StepsRecord::class)—запит кроків за період.
Rule Engine як основа рекомендацій
Rule-based підхід—не застаріий, а практичний. Правила прозорі, тестуємі, не потребують великого датасету для обучення. ML поверх правил додає персоналізацію в ранжируванні.
Приклад структури правил:
struct HealthRule {
let id: String
let condition: (HealthWeekSnapshot) -> Bool
let recommendation: Recommendation
let priority: Int
}
let rules: [HealthRule] = [
HealthRule(
id: "low_sleep",
condition: { $0.avgSleepHours < 6.5 },
recommendation: Recommendation(
title: "Недосип знижує восстановлення",
body: "Середний сон за тиждень—\($0.avgSleepHours.formatted(.number.precision(.fractionLength(1)))) ч. Спробуйте лягти на 30 хв раніше 3 дні підряд.",
category: .sleep,
urgency: .medium
),
priority: 8
),
HealthRule(
id: "elevated_resting_hr",
condition: { snapshot in
guard let hr = snapshot.avgRestingHR else { return false }
return hr > 80 && snapshot.avgSleepHours < 7
},
recommendation: ...,
priority: 9
)
]
Комбіновані умови важливі: "пульс у спокої 85 bpm" саме по собі може бути нормою для конкретної людини, але в сполученні з недосипом—маркер перетренованості або стресу.
ML-слой: ранжирование та персоналізація
Rule engine генерує список кандидатів—рекомендацій, умови яких виконані. Дальше ML-модель ранжирує їх за вероятностью виконання конкретним користувачем.
Для ранжирования використовуємо collaborative filtering або простой gradient boosting на фічах користувача + рекомендації:
- Історичний CTR рекомендацій цього типу для користувача
- Паттерн дня тижня (користувач більше гуляє по вихідним—рекомендації активності релевантніше в п'ятницю)
- Streak: користувач 5 днів виконував рекомендацію—підвищити пріоритет наступної
Обучаємо на implicit feedback: рекомендація показана→користувач відкрив→виконав (є дані з HealthKit) / проігнорував.
Timing та push-сповіщення
Правильний момент для рекомендації важливіше правильного вмісту. "Ложітесь спати пораніше" о 20:00 працює. О 23:30—ні.
func scheduleRecommendation(_ rec: Recommendation) {
let content = UNMutableNotificationContent()
content.title = rec.title
content.body = rec.shortBody
content.sound = .default
let bestTime = optimalDeliveryTime(for: rec, userSchedule: userProfile.typicalSchedule)
let trigger = UNCalendarNotificationTrigger(
dateMatching: Calendar.current.dateComponents([.hour, .minute], from: bestTime),
repeats: false
)
let request = UNNotificationRequest(identifier: rec.id, content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request)
}
optimalDeliveryTime—логіка на основі паттернів користувача: коли він зазвичай відкриває додаток, коли лягає спати (з HealthKit sleep data), коли робить тренування.
Що робить рекомендації рабочими
Одна конкретна рекомендація в день краще п'яти загальних. "Пройдіть 2 000 кроків сьогодні до 18:00, у вас зараз 1 200"—працює. "Більше рухайтесь"—ні.
Привязка до контексту реального часу: якщо CMMotionActivityManager показує, що користувач зараз гуляє—рекомендацію по активності не показуємо. Не дратуємо.
Процес розробки
Визначення джерел даних та schema моделі користувача. Розробка правил (15–30 для початкового набору). Реалізація pipeline агрегації з HealthKit / Health Connect. Обучение моделі ранжирования (потрібні дані—або синтетичні, або з pre-launch beta). Система доставки: in-app та push-сповіщення з оптимальним тайминго. A/B тестування ефективності.
Орієнтири за часом
Rule-based система з базовим набором рекомендацій та HealthKit інтеграцією—1–2 тижні. Повна персоналізована система з ML-ранжируванням та оптимальним тайминго—3–5 тижнів.







