AI-генерація описів товарів в мобільних додатках
Продавець на маркетплейсі робить фото товару з телефону та натискає "Опублікувати". Йому незачем писати опис вручну — система повинна запропонувати готовий текст за фотографією та категорією товару. Це не фантастика: комбінація Vision API + LLM закриває завдання за 2–4 секунди.
Звідки берється контент для опису
Візуальний аналіз фотографій
Перший крок — вилучення характеристик з зображення. Google Cloud Vision Product Search або Azure Cognitive Services Computer Vision повертають: теги об'єктів, колір, бренди на упаковці, текст на етикетці (OCR). Для мобільного додатка зручніше не окремі викики, а мультимодальний LLM (GPT-4o, Gemini Pro Vision) — один запит із зображенням одразу аналізує та генерує текст.
Структуровані атрибути з форми
Користувач заповнює мінімум: категорія, ціна, стан (новое/б/у). Ці дані включаються в промпт як структурований контекст. Решту модель виводить із фото.
Як реалізовано на клієнті
Весь flow асинхронний: користувач вибирає фото, жме "Створити опис", бачить skeleton loader, через 2–3 секунди отримує редактивний текст.
// Android: відправка зображення на генерацію
class DescriptionGeneratorViewModel : ViewModel() {
fun generateDescription(imageUri: Uri, category: String) {
_uiState.value = UiState.Loading
viewModelScope.launch {
try {
val base64Image = imageUri.toBase64(contentResolver)
val response = descriptionApi.generate(
GenerationRequest(
imageBase64 = base64Image,
category = category,
language = Locale.getDefault().language,
maxLength = 300
)
)
_uiState.value = UiState.Success(response.description)
} catch (e: Exception) {
_uiState.value = UiState.Error(e.message)
}
}
}
}
На iOS аналогічно через async/await + URLSession:
func generateDescription(image: UIImage, category: String) async throws -> String {
let imageData = image.jpegData(compressionQuality: 0.8)!
let base64 = imageData.base64EncodedString()
let request = DescriptionRequest(imageBase64: base64, category: category, language: Locale.current.languageCode ?? "en")
let response = try await api.generateDescription(request)
return response.text
}
Стисніть зображення до JPEG quality 0.8 перед відправкою — це скорочує розмір payload з ~3 MB (RAW з камери) до ~300–500 KB без помітної втрати якості для Vision API.
Backend: prompt engineering для якісного результату
def build_prompt(category: str, image_tags: list, language: str) -> str:
return f"""
You are a professional copywriter for an online marketplace.
Write a product description based on the provided image.
Category: {category}
Detected attributes: {', '.join(image_tags)}
Language: {language}
Requirements:
- 2-3 sentences, 50-100 words
- Start with the main product feature, not "This is a..."
- Include detected color, condition, and brand if visible
- Use active voice
- No adjectives like "great", "amazing", "perfect"
"""
Заборона на "great", "amazing", "perfect" — не формалізм. Моделі за умовчанням піхають їх у кожне друге речення, описи стають неотличимі один від одного.
Streaming для кращого UX
Замість очікування повного ответа — стрімінг через Server-Sent Events. Текст з'являється у міру генерації, як у ChatGPT. На Android реалізується через okhttp3.EventSource, на iOS — URLSessionDataTask з делегатом didReceive data.
Варіанти структури опису
| Тип товару | Довжина | Акцент |
|---|---|---|
| Електроніка | 100–150 слів | Технічні характеристики + стан |
| Одяг | 60–80 слів | Розмір, колір, матеріал, стан |
| Меблі | 80–120 слів | Габарити, матеріал, стиль |
| Книги | 40–60 слів | Автор, тема, стан |
Процес
Проектування API: формат запиту, обробка помилок Vision API (нечітке фото, нема об'єктів).
Налаштування промпт templates по категоріям товарів.
Розробка клієнтського UI з skeleton loader та редактором результату.
Впровадження streaming для кращого UX при довгих описах.
Ориентири за часовими рамками
Базова інтеграція (фото → опис через GPT-4o / Gemini) — 3–4 дні. З налаштуванням промптів за категоріями та streaming — до 1 тижня.







