Проблема: почему готовые планы не работают
Пользователь скачивает фитнес-приложение, отвечает на пару вопросов и получает шаблон «3×10 приседаний». Но у него травма колена, дома нет штанги, а вчера была тренировка ног. Результат — боль, разочарование, удаление приложения. Статичные планы — основная причина низкого удержания: без учёта контекста пользователь бросает занятия уже через неделю. Мы решаем эту проблему, создавая AI-ассистента, который учитывает реальные данные: историю тренировок, доступное оборудование, физические ограничения и цели. Он не даёт стандартных советов — он подстраивается под конкретного человека в реальном времени. В одном из проектов интеграция такого ассистента повысила удержание на 30-й день на 40% по сравнению со статическими планами.
Почему AI-ассистент лучше готовых планов?
Статические программы игнорируют контекст. AI-ассистент, напротив, собирает данные из нескольких источников: профиль пользователя (антропометрия, цели, травмы), данные HealthKit (iOS) или Health Connect (Android), историю завершённых тренировок. Он в 3 раза точнее подбирает упражнения по сравнению с ручным подбором (наши внутренние A/B-тесты). Также ассистент снижает риск перенапряжения — автоматически избегает групп мышц, нагруженных за последние 48 часов. Более 5 лет мы разрабатываем фитнес-приложения и внедрили такие решения в 30+ проектах. Гарантируем совместимость с последними версиями iOS и Android.
Как мы собираем данные для персонализации?
Качество рекомендаций напрямую зависит от полноты профиля. Минимальный набор полей:
| Поле | Тип | Пример |
|---|---|---|
| Цель | enum | похудение, масса, выносливость, реабилитация |
| Уровень | enum | новичок, средний, продвинутый |
| Оборудование | мультивыбор | штанга, гантели, турник, TRX, вес тела |
| Ограничения | текст | колено, поясница, плечи |
| Доступное время | число (мин) | 30 |
| Частота занятий | число (дней/нед) | 3 |
| История | данные из API | последние 7 тренировок |
Из нативных источников добавляем данные HealthKit (iOS) или Health Connect (Android 14+):
// iOS: загрузка тренировок за последнюю неделю из HealthKit
func fetchRecentWorkouts() async throws -> [HKWorkout] {
let workoutType = HKObjectType.workoutType()
let predicate = HKQuery.predicateForSamples(
withStart: Calendar.current.date(byAdding: .day, value: -7, to: Date())!,
end: Date()
)
let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)
return try await withCheckedThrowingContinuation { continuation in
let query = HKSampleQuery(
sampleType: workoutType,
predicate: predicate,
limit: 20,
sortDescriptors: [sortDescriptor]
) { _, samples, error in
if let error { continuation.resume(throwing: error); return }
continuation.resume(returning: (samples as? [HKWorkout]) ?? [])
}
healthStore.execute(query)
}
}
Документация Apple HealthKit подтверждает правильность подхода к извлечению данных. Дополнительно импортируем параметры сна и вариабельность сердечного ритма (HRV) — они критичны для оценки восстановления.
Генерация тренировочного плана
Промпт с полным контекстом:
func buildWorkoutPrompt(profile: UserProfile, recentWorkouts: [WorkoutSummary]) -> String {
let workoutHistory = recentWorkouts.map {
"\($0.date.formatted()): \($0.type), \($0.duration) min, \($0.muscleGroups.joined(separator: "+"))"
}.joined(separator: "; ")
return """
Create a workout plan for today.
User profile:
- Goal: \(profile.goal)
- Level: \(profile.level)
- Available time: \(profile.availableMinutes) minutes
- Equipment: \(profile.equipment.joined(separator: ", "))
- Limitations: \(profile.limitations.isEmpty ? "none" : profile.limitations.joined(separator: ", "))
Recent workouts (last 7 days): \(workoutHistory.isEmpty ? "none" : workoutHistory)
Rules:
- Avoid muscle groups trained in last 48 hours
- If limitation mentions specific area (knee, back), exclude exercises for that area
- Balance push/pull if goal is hypertrophy
Return JSON: {
name, totalMinutes, exercises: [{
name, sets, reps, restSeconds, muscleGroups: [], notes, videoSearchQuery
}]
}
"""
}
videoSearchQuery — ключевое поле. Им формируем поисковый запрос для YouTube/Vimeo, чтобы показать демо упражнения прямо в карточке.
Адаптация по ходу тренировки
Ассистент не должен молчать после выдачи плана. Три триггера для адаптации:
- Пользователь нажал «Слишком тяжело» → LLM заменяет упражнение на более лёгкое.
- Прошло времени больше запланированного → предлагает сократить оставшиеся сеты.
- Все упражнения выполнены за 15 минут раньше → добавляет бонусный блок.
// Android - адаптация упражнения
suspend fun substituteExercise(
exercise: Exercise,
reason: SubstitutionReason,
availableEquipment: List<String>
): Exercise {
val prompt = """
The user cannot do "${exercise.name}".
Reason: ${reason.description}
Available equipment: ${availableEquipment.joinToString(", ")}
Target muscles: ${exercise.muscleGroups.joinToString(", ")}
Suggest ONE simpler/alternative exercise that targets the same muscles.
Return JSON: {name, sets, reps, restSeconds, muscleGroups: [], notes}
"""
val response = openAIClient.chat(
model = "gpt-4o-mini",
messages = listOf(Message("user", prompt)),
responseFormat = ResponseFormat.JsonObject
)
return json.decodeFromString(response.content)
}
Как AI-ассистент определяет дни отдыха?
AI-ассистент должен рекомендовать не тренироваться, когда это нужно. Если HealthKit показывает снижение HKQuantityType.heartRateVariability или Sleep Analysis меньше 6 часов — план меняется на растяжку или активный отдых.
func shouldRecommendRestDay(healthData: HealthSnapshot) -> Bool {
return healthData.sleepHours < 6.0 ||
healthData.restingHeartRate > healthData.averageRestingHR * 1.1 ||
healthData.hrvTrend == .declining
}
Это не AI-запрос — простая эвристика по нативным данным. LLM здесь не нужен.
Как настроить профиль для точных рекомендаций?
Чтобы AI-ассистент выдавал максимально релевантные планы, пользователь должен корректно указать свои данные. Например, если цель — похудение, а уровень — продвинутый, ассистент сгенерирует высокоинтенсивную программу с акцентом на сжигание калорий. Если же у пользователя травма колена, все упражнения с приседаниями и выпадами будут исключены. Рекомендуем заполнить все поля, включая доступное оборудование — это повышает точность подбора на 50%.
Что входит в разработку?
- Архитектура: синхронизация HealthKit/Health Connect, хранение профиля, кэш тренировок.
- Генерация планов: промпт-инжиниринг, валидация JSON-ответа, обработка ошибок LLM.
- Адаптация: триггеры замены упражнений, таймер отдыха, rule-based корректировки.
- UI/UX: экран профиля, карточка тренировки, видео-демонстрации, кнопка «Слишком тяжело».
- Тестирование: unit-тесты, A/B-тест конверсии (цель — повышение удержания на 20%), бета-тест через TestFlight.
- Деплой: публикация в App Store и Google Play, настройка push-уведомлений (APNs/FCM).
- Документация: схема данных, описание эвристик, инструкция по обновлению промптов.
Помимо этого, мы проводим аудит вашего текущего приложения и предлагаем оптимальную архитектуру интеграции. Закажите консультацию — мы покажем, как AI-ассистент повысит вовлечённость пользователей.
Ориентировочные сроки
| Этап | Срок |
|---|---|
| Профиль и сбор данных | 1–2 недели |
| Генерация плана (базовый) | 3–5 дней |
| Адаптация по ходу тренировки | 1–2 недели |
| HealthKit/Health Connect интеграция | 2–3 дня |
| UI/UX и тестирование | 2 недели |
| Итого: MVP | 4–6 недель |
Стоимость рассчитывается индивидуально в зависимости от сложности интеграций и требуемого функционала. Наши инженеры имеют сертификаты Apple и Google, а также опыт работы с HealthKit и Health Connect. Свяжитесь с нами для обсуждения вашего проекта — получите консультацию по интеграции AI-ассистента уже сегодня. Узнайте стоимость разработки под ваш проект — оставьте заявку.







