Реализация AI-автозаполнения адреса по частичному вводу в мобильном приложении
Пользователь набирает «Ленина 1» — и приложение должно угадать что он имеет в виду: Ленина 12 в его городе, или улица Ленина в соседнем районе где он часто бывает, или адрес который он уже вводил на прошлой неделе. Стандартный Google Places Autocomplete без учёта контекста даст длинный список со всей страны. AI-автодополнение работает иначе — ранжирует с учётом геолокации, истории и паттернов ввода.
Что такое AI-автодополнение в отличие от стандартного
Классическое автодополнение (Google Places API / Dadata / Nominatim): запрос «Ленина 1» → полнотекстовый поиск по базе → топ результатов по релевантности строки.
AI-подход добавляет три слоя:
Геоконтекст. Текущая позиция пользователя (или последняя известная) применяется как location bias. Google Places API поддерживает locationBias нативно. Для собственной модели — умножаем score каждого кандидата на exp(-distance_km / decay_radius), где decay_radius 5-10 км для городских адресов.
Персональная история. Адреса из прошлых заказов/поиска хранятся локально (SQLite, зашифрованный) и в профиле. При частичном вводе — сначала матчим историю, затем внешний API. Совпадение «дом», «работа» — выводим без внешнего запроса.
Нечёткий поиск / опечатки. «Ленина» vs «Лениня», «пр-т» vs «проспект» vs «просп». Нормализация: разворачиваем сокращения через словарь (ул. → улица, пр-кт → проспект), применяем Levenshtein distance с порогом 2. Для русского языка: дополнительно транслитерация и Soundex-аналог для кириллицы.
Выбор геокодирующего API
| Провайдер | Сильные стороны | Лимит бесплатно |
|---|---|---|
| Google Places Autocomplete | Качество, охват | $200 кредит/мес |
| Dadata | РФ/СНГ, подъезды, КЛАДР | 10 000 req/сут |
| Яндекс Геокодер | РФ/СНГ, точнее в регионах | 1 000 req/сут |
| Nominatim (OSM) | Бесплатно, self-host | 1 req/сек публичный |
| Pelias (self-hosted) | Полный контроль, GDPR | — |
Для РФ/СНГ аудитории: Dadata + кэш Redis = оптимальный баланс цена/качество. Для международного — Google Places с locationBias.
Реализация на мобиле
Дебаунс запросов
Запрос при каждом нажатии клавиши — слишком часто. Дебаунс 300-400ms: таймер сбрасывается при каждом символе, запрос уходит только после паузы.
iOS (Combine): Publisher на UITextField.textPublisher → .debounce(for: .milliseconds(350), scheduler: RunLoop.main) → .removeDuplicates() → flatMap { autocomplete(query: $0) }.
Android (Kotlin Flow): MutableStateFlow на TextFieldValue → .debounce(350) → .distinctUntilChanged() → flatMapLatest { fetchAutocomplete(it) }.
Минимальная длина запроса: 2-3 символа. Меньше — результаты бесполезны и трафик впустую.
Кэш на клиенте
NSCache / LruCache с ключом = нормализованная строка запроса. TTL 10 минут. При повторном вводе похожей строки (backspace + другая буква) — сначала смотрим кэш соседних запросов через prefix-match.
Offline fallback
Для приложений где адрес нужен без интернета (доставка, такси в зоне плохого покрытия): SQLite-база с адресами города (ФИАС для РФ — бесплатно, ~2-5 ГБ сжатый, можно предзагрузить нужные регионы). Поиск по базе через FTS5 MATCH — быстро даже на мобиле.
Подтверждение через геокодер
После выбора адреса пользователем — reverse geocoding для подтверждения: передаём выбранный адрес, получаем обратно lat/lon + нормализованный адрес в стандартном формате. Показываем пользователю на карте — маркер на выбранной точке. Если место не то — он видит сразу.
Локализация и форматы
Адреса в РФ: «улица», «проспект», «переулок», «шоссе» + дом, корпус, строение, квартира. Dadata возвращает структурированный КЛАДР-объект — парсим в форму автоматически. Google Returns address_components[] — парсим аналогично.
Поддержка украинского/белорусского написания улиц (если аудитория СНГ): словарь транслитерации + Dadata поддерживает UA как отдельную базу.
Сроки
Реализация AI-автодополнения адреса с историей, геобиасом и нечётким поиском — 1-3 дня при наличии выбранного провайдера данных. С offline-базой ФИАС и кастомной моделью ранжирования — до 1-2 недель. Стоимость рассчитывается после анализа требований.







