Проблема: почему готовые планы не работают
Пользователь скачивает фитнес-приложение, отвечает на пару вопросов и получает шаблон «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-ассистента уже сегодня. Узнайте стоимость разработки под ваш проект — оставьте заявку.







