AI-автоматичне тегування контенту для мобільних додатків
Автотегування — це автоматичне призначення мітки контенту (фото, відео, документам, постам) без участі користувача. Реалізація залежить від типу контенту: для зображень — Vision/ML Kit, для тексту — NLP-моделі, для відео — аналіз ключових кадрів. Усі три сценарії зустрічаються в одному додатку.
Тегування зображень on-device
Стандартна комбінація: VNClassifyImageRequest (iOS) + ImageLabeler (Android). Повертають мітки типу "Food", "Sky", "Cat", "Outdoor". Достатньо для більшості додатків.
Проблема вбудованих міток: вони англійські та універсальні. Для додатків з предметною специфіцністю (маркетплейс одежі, рецепти, нерухомість) потрібна користувальницька таксономія.
Користувальницька класифікація через CreateML:
// Навчання через CreateML (запускайте на Mac, не на пристрої)
import CreateML
let trainingData = MLImageClassifier.DataSource.labeledDirectories(
at: URL(fileURLWithPath: "/training_data")
// Структура: /training_data/jacket/, /training_data/shoes/, /training_data/bag/
)
var params = MLImageClassifier.ModelParameters()
params.maxIterations = 25
params.validationData = .split(strategy: .automatic)
params.featureExtractor = .scenePrint(revision: 2) // Transfer learning від Apple
let model = try MLImageClassifier(trainingData: trainingData, parameters: params)
try model.write(to: URL(fileURLWithPath: "/model.mlmodel"), metadata: nil)
20–50 прикладів на категорію, 15–30 хвилин навчання на MacBook Pro M2 — отримуєте .mlmodel для деплою. Core ML Model Deployment (Apple API) дозволяє оновлювати модель без оновлення додатка.
Тегування текстового контенту
Для текстових постів, описів, коментарів — NLP-класифікація. Варіанти:
On-device через Create ML NLP Classifier:
let classifier = try NLModel(mlModel: textClassifierModel)
let labels = classifier.predictedLabelHypotheses(
for: "Отличный рецепт пасты с томатным соусом и базиликом",
maximumCount: 3
)
// Результат: ["Food": 0.91, "Recipe": 0.78, "Italian": 0.45]
Модель важить 1–5 MB для 50–100 категорій. Повністю офлайн.
На сервері через OpenAI / Claude — для складних таксономій або коли потрібна висока точність. Промпт: "Визначте 3–5 тегів для наступного тексту зі списку: [список тегів]". Парсіть JSON-відповідь на клієнті. Затримка — 0,5–2 секунди, підходить для контенту, створеного користувачем, а не для real-time потоку.
Ієрархічні теги
Простий список тегів — недостатньо. Потрібна ієрархія: "Їжа → Італійська кухня → Паста". Реалізуємо через дерево тегів:
// Android: TagTree
data class Tag(
val id: String,
val name: String,
val parentId: String?,
val synonyms: List<String> = emptyList()
)
// При тегуванні: якщо назначити тег "Паста" — автоматично додавайте батьківські
fun expandWithParents(tagId: String, tagTree: Map<String, Tag>): Set<String> {
val result = mutableSetOf(tagId)
var current = tagTree[tagId]
while (current?.parentId != null) {
current = tagTree[current.parentId]
current?.let { result.add(it.id) }
}
return result
}
Користувальницькі теги vs автоматичні
Автотеги — служебна інформація для пошуку та фільтрації. Користувальницькі теги — вони видні користувачу та редагуємі. В базі даних розділяємо:
CREATE TABLE content_tags (
content_id UUID,
tag_id UUID,
source ENUM('auto', 'user', 'admin'),
confidence FLOAT, -- для auto: вероятність
created_at TIMESTAMP
);
В UI показуємо тільки source = 'user'. Автотеги використовуємо лише в пошуку/фільтрах. Користувач може "прийняти" автотег, перевести його в user.
Тегування відео
Тегуємо відео за ключовими кадрами — кожні 2–5 секунд беріть кадр, класифікуйте як зображення, агрегуйте теги:
func tagVideo(at url: URL) async throws -> Set<String> {
let asset = AVURLAsset(url: url)
let duration = asset.duration.seconds
let generator = AVAssetImageGenerator(asset: asset)
generator.maximumSize = CGSize(width: 224, height: 224)
var allTags = Set<String>()
var time = 0.0
while time < duration {
let cgImage = try generator.copyCGImage(at: CMTime(seconds: time, preferredTimescale: 600), actualTime: nil)
let frameTags = try await classifyImage(cgImage)
allTags.formUnion(frameTags)
time += 3.0 // кожні 3 секунди
}
return allTags
}
Для довгого відео (10+ хвилин) — запустіть через BackgroundTask або на backend.
Часові рамки
On-device тегування зображень з готовими моделями — 3–5 днів. Користувальницька таксономія з навчанням під домен, тегування тексту та відео, ієрархічні теги — 2–4 тижні. Вартість розраховується індивідуально.







