Реалізація 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-400мс: таймер скидається при кожному символі, запит йде тільки після паузи.
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 тижнів. Вартість розраховується після аналізу вимог.







