Реализация AI-предиктивного ввода данных в формах мобильного приложения
Predictive input — это не автокоррекция iOS/Android. Это контекстное предсказание значений полей на основе истории пользователя, текущего контекста и паттернов. Пользователь начинает вводить имя получателя — приложение уже знает, что в пятницу вечером он чаще всего переводит одному и тому же человеку.
Источники предсказаний
История пользователя. Наиболее мощный сигнал. Частые получатели, типичные суммы по дням недели, повторяющиеся назначения платежей — всё это паттерны, которые экстрактируются из локальной или серверной истории.
Контекст сессии. Если пользователь пришёл из push-уведомления «пора оплатить коммунальные», первое поле формы платежа разумно предзаполнить реквизитами управляющей компании.
LLM-генерация на основе частичного ввода. Пользователь набрал «за арен» — модель предсказывает «за аренду офиса, ноябрь 2025». Реализуется через streaming completions с маленьким fast-моделью (gpt-4o-mini) с низкой latency.
Реализация предсказаний с debounce
Запрос к LLM при каждом нажатии клавиши — расточительно. Стандартный подход: debounce 300–500мс, запрос отправляется только когда пользователь сделал паузу.
// iOS — Swift, SwiftUI
class PredictiveInputViewModel: ObservableObject {
@Published var suggestions: [String] = []
private var debounceTask: Task<Void, Never>?
func onTextChange(_ text: String, fieldType: FormFieldType, context: FormContext) {
debounceTask?.cancel()
guard text.count >= 3 else { suggestions = []; return }
debounceTask = Task {
try? await Task.sleep(nanoseconds: 400_000_000) // 400ms debounce
guard !Task.isCancelled else { return }
let predictions = await fetchPredictions(text: text, fieldType: fieldType, context: context)
await MainActor.run { self.suggestions = predictions }
}
}
private func fetchPredictions(text: String, fieldType: FormFieldType, context: FormContext) async -> [String] {
// Сначала ищем в локальной истории (быстро, без сети)
let localMatches = userHistory.search(query: text, fieldType: fieldType)
if localMatches.count >= 3 { return Array(localMatches.prefix(3)) }
// Если недостаточно — запрос к AI
return await aiSuggestionService.predict(text: text, fieldType: fieldType, context: context)
}
}
Локальный кэш vs серверные предсказания
Простые предсказания (часто используемые получатели, типичные суммы) — хранить локально и не гонять в сеть. SQLite + FTS5 для быстрого поиска по истории даёт latency < 5мс.
LLM-предсказания оправданы только для сложных текстовых полей (назначение платежа, адрес, описание). Здесь локальный поиск не даст качественных результатов.
UX предсказаний
Предсказания показываются в виде chip-подсказок под полем или в инлайн-dropdown — не в системном suggestion bar (его контролирует OS, а не приложение). Tap по подсказке — моментально заполняет поле без анимации. Важно: предсказания должны работать при медленном соединении, для этого локальный кэш — не опция, а необходимость.
Ориентиры по срокам
Предсказания из локальной истории — 2–3 дня. Гибридная система с LLM для текстовых полей и debounce — 3–5 дней.







