Реализация AI-рекомендаций по здоровью на основе данных в мобильном приложении
Большинство health-приложений показывают данные. Пользователь видит 7 340 шагов и закрывает приложение. Рекомендательная система меняет этот сценарий: вместо «вот ваши данные» — «вот что эти данные значат для вас сегодня».
Архитектура системы рекомендаций
Персонализированные рекомендации по здоровью — это не один ML-алгоритм. Это pipeline из нескольких слоёв:
- Сбор данных — активность (шаги, тренировки), сон, питание, биометрика (ЧСС, 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-уведомления
Правильный момент для рекомендации важнее правильного содержания. «Ложитесь спать пораньше» в 8 PM работает. В 11:30 PM — нет.
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 недель.







