AI-Асистент-Стиліст у мобільних застосунках
AI-стиліст у мобільному застосунку працює з двома завданнями: аналіз власного гардеробу (що я маю, що поєднується) та рекомендація нових речей за перевагами. Обидва вимагають роботи з зображеннями—це відрізняє стиліста від більшості інших AI-асистентів, де достатньо тексту.
Інвентаризація гардеробу: Vision API для одягу
Користувачі фотографують одяг, і асистент розпізнає:
- Тип речі (сорочка, джинси, сукня, пальто...)
- Колір та паттерн
- Стиль (casual, formal, sport, vintage...)
- Сезонність
GPT-4o Vision справляється з цим з коробки—жодної окремої моделі не потрібно:
// iOS: аналіз зображення одягу через GPT-4o Vision
func analyzeClothingItem(_ image: UIImage) async throws -> ClothingItem {
guard let imageData = image.jpegData(compressionQuality: 0.7) else {
throw AnalysisError.invalidImage
}
let base64Image = imageData.base64EncodedString()
let messages: [[String: Any]] = [{
"role": "user",
"content": [
["type": "image_url", "image_url": ["url": "data:image/jpeg;base64,\(base64Image)"]],
["type": "text", "text": """
Analyze this clothing item. Return JSON:
{
"type": "shirt|pants|dress|jacket|shoes|...",
"colors": ["primary color", "secondary color if exists"],
"pattern": "solid|striped|checkered|floral|...",
"style": ["casual", "formal", "sport", ...],
"season": ["spring", "summer", "autumn", "winter"],
"material_guess": "cotton|denim|leather|..."
}
"""]
]
}]
let response = try await openAIClient.chat(messages: messages, responseFormat: .jsonObject)
return try JSONDecoder().decode(ClothingItem.self, from: response.data(using: .utf8)!)
}
Для зберігання гардеробу використовуйте Core Data / Room з мініатюрними зображеннями та JSON-атрибутами. Повні фото в локальному сховищі, посилання в базі даних.
Рекомендації аутфітів із існуючого гардеробу
Коли гардероб заповнений, головна функція—«що надіти сьогодні?» Запит включає погоду, повід, переваги.
func suggestOutfit(
wardrobe: [ClothingItem],
occasion: String, // "work", "casual friday", "date", "sport"
weather: WeatherContext,
avoidItems: [String] // вже надіті сьогодні/вчора
) async throws -> OutfitSuggestion {
let wardrobeDescription = wardrobe.map {
"ID:\($0.id) - \($0.type), colors: \($0.colors.joined(separator: "/")), style: \($0.style.joined(separator: ","))"
}.joined(separator: "\n")
let prompt = """
Select a complete outfit from the wardrobe below.
Occasion: \(occasion)
Weather: \(weather.temperature)°C, \(weather.condition)
Avoid (recently worn): \(avoidItems.joined(separator: ", "))
Wardrobe:
\(wardrobeDescription)
Return JSON: {items: [id], reasoning: "brief style logic", alternatives: [[id]]}
"""
// ...
}
reasoning — текстове пояснення. Користувачі цінують розуміння, чому ця комбінація працює: «синя сорочка + світлі чіноси створюють контраст темне/світле, придатний для casual office».
Цветовая совместимость
LLM розуміють правила сполучення кольорів, але іноді галюцинують. Додайте детермінований фільтр на основі теорії кольору: комплементарні, аналогічні, триадні кольори через HSL-простір.
// Android - базова сумісність кольорів
fun areColorsCompatible(color1: HslColor, color2: HslColor): Boolean {
val hueDiff = abs(color1.hue - color2.hue)
val normalizedDiff = minOf(hueDiff, 360 - hueDiff)
return when {
normalizedDiff < 30 -> true // аналогічні
normalizedDiff in 150f..210f -> true // комплементарні
normalizedDiff in 110f..130f -> true // триадні
color1.saturation < 0.15f -> true // нейтральні з будь-яким
color2.saturation < 0.15f -> true // нейтральні з будь-яким
else -> false
}
}
Застосуйте цей фільтр перед запитами LLM: якщо модель пропонує несумісну пару, повертайте альтернативи.
AR-примерка
Функція примерки—високий пріоритет для fashion-застосунків. Варіанти реалізації:
Overlay на фото: користувач завантажує фото, одяг накладається зверху. На iOS використовуйте CoreML із сегментацією тіла (DeepLab v3+), потім CoreImage композитинг. Якість середня.
Сервіс віртуальної примерки: Kiri Engine, Fashn AI, Replicate's IDM-VTON—cloud API. Значно краща якість, але 5–15 секунд на генерацію. Для мобільного: асинхронний запит з push-сповіщенням про готовність.
func startTryOn(userPhoto: UIImage, clothingImage: UIImage) async throws -> String {
// Повертає jobId, результат приходить через webhook/polling
let jobId = try await tryOnAPI.submitJob(person: userPhoto, garment: clothingImage)
return jobId
}
func pollTryOnResult(jobId: String) async throws -> UIImage {
for _ in 0..<30 { // максимум 30 спроб x 2 сек = 60 сек
try await Task.sleep(nanoseconds: 2_000_000_000)
let status = try await tryOnAPI.checkStatus(jobId: jobId)
if status.isReady, let url = status.resultUrl {
return try await loadImage(from: url)
}
}
throw TryOnError.timeout
}
Орієнтири за часом
Базовий асистент із текстовими рекомендаціями—3–5 днів. Повний гардероб із Vision-аналізом фото + рекомендації аутфітів + цветовая сумісність—3–4 тижні. AR-примерка через cloud API—плюс 1–2 тижні.







