Реалізація Smart Reply у мобільному додатку
Smart Reply — це автоматично запропоновані відповіді на повідомлення: три кнопки під чатом з варіантами «Окей», «Буду о 18:00», «Не зможу». Google впровадив це в Gmail та Android Messages, Apple — в iMessage через iOS 17. Для користувацького додатку потрібно або використовувати готові SDK, або реалізувати власну модель.
ML Kit Smart Reply: швидкий старт
Google ML Kit містить готову SmartReply модель — працює on-device, підтримує англійську мову. Для Android:
val smartReply = SmartReply.getClient()
val conversation = messages.takeLast(10).map { msg ->
if (msg.isFromUser) {
TextMessage.createForLocalUser(msg.text, msg.timestamp)
} else {
TextMessage.createForRemoteUser(msg.text, msg.timestamp, msg.senderId)
}
}
smartReply.suggestReplies(conversation)
.addOnSuccessListener { result ->
if (result.status == SmartReplySuggestionResult.STATUS_SUCCESS) {
val suggestions = result.suggestions.map { it.text }
showSuggestions(suggestions)
}
}
.addOnFailureListener { /* нема пропозицій — приховати UI */ }
Модель не генерує текст, а вибирає з попередньо навчених шаблонів відповідей. Плюс — дуже швидко (< 20 мс). Мінус — обмежений набір шаблонів, не враховує специфіку додатку, тільки англійська.
Для iOS — аналог через NaturalLanguage framework або Apple Intelligence API (iOS 18+), але рівень підтримки Smart Reply як окремого use-case значно скромніший.
Користувацький Smart Reply на базі LLM
Для російськомовних додатків та специфічних доменів (підтримка, медицина, b2b) ML Kit не підходить. Потрібна LLM з промптом.
func generateReplySuggestions(
lastMessages: [ChatMessage],
count: Int = 3
) async -> [String] {
let context = lastMessages.suffix(5)
.map { "\($0.role): \($0.text)" }
.joined(separator: "\n")
let prompt = """
Ти допомагаєш користувачу швидко відповісти на повідомлення в чаті.
Історія діалогу:
\(context)
Запропонуй \(count) коротких варіанти відповіді користувача.
Кожна відповідь — одне речення, максимум 10 слів.
Формат: JSON масив рядків.
"""
let response = try await llmClient.complete(prompt: prompt, maxTokens: 100)
return parseJSONArray(response) ?? []
}
Затримка — критичний параметр. GPT-4o mini відповідає за 1–2 секунди, це прийнятно. Передбачуйте заранее, поки користувач читає повідомлення — до моменту, коли захочуть відповісти, варіанти вже готові.
UX: коли показувати та коли приховувати
Smart Reply повинен з'являтися тільки при вхідному повідомленні та зникати щойно користувач почав писати. Три пропозиції — оптимум (Google Research). Більше — перевантажує, менше — не дає вибору.
// Android: переключення між Smart Reply та полем введення
editText.addTextChangedListener(object : TextWatcher {
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
smartReplyChips.isVisible = s.isNullOrEmpty()
// Приховуємо пропозиції щойно користувач печатає
}
override fun afterTextChanged(s: Editable?) {}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
})
Chips (горизонтальний скрол) — стандартний UI для пропозицій відповіді. MaterialChip в Android, користувацькі Button / Chip-компоненти в SwiftUI.
Адаптація до контексту
Поширена помилка — однакові пропозиції для всіх типів повідомлень. «Окей», «Зрозумів», «Дякую» — універсальні відповіді, які користувач швидко перестає помічати. Контекстний Smart Reply повинен розбиратися:
- Питання → запропонувати прямий ответ
- Запрос на зустріч → варіанти «Да, зручно», «Ні, не можу», «Запропонуй інший час»
- Подяка → «Будь ласка», «Не за що»
- Інформаційне повідомлення → «Зрозумів», «Прийнято», «Уточню»
Класифікація типу повідомлення (питання / запрос / інформація) — окремий лёгкий класифікатор або частина промпту до LLM.
Процес реалізації
Вибір підходу: ML Kit для англійської vs LLM для користувацьких сценаріїв. Реалізація попередньої загрузки пропозицій при отриманні вхідного повідомлення. UI-компоненти: chips, анімації появи/приховування. Логіка приховування при початку введення. Аналітика: скільки % користувачів використовує Smart Reply, який варіант частіше.
Орієнтири за часом
Smart Reply через ML Kit (Android, англійська) — 1–2 дні. Користувацький Smart Reply на базі LLM з контекстною класифікацією та аналітикою — 5–8 днів.







