AI-Помічник для навігації мобільного додатку
Складні мобільні додатки—банківські платформи, ERP-системи, рішення для охорони здоров'я—втрачають користувачів не через брак функцій, а тому що знайти потрібну функцію занадто складно. Традиційні рішення як-от тури онбордингу та розділи довідки працюють погано: користувачі проходять тур при першому запуску й забувають про нього протягом днів. AI-помічник для навігації вирішує це, розуміючи запити природною мовою та спрямовуючи користувачів у потрібне місце.
Можливості AI-помічника для навігації
Не чат, не FAQ-бот. Три конкретні сценарії:
Deep link навігація. Користувач пишає "хочу перевести гроші на карту"—помічник відкриває потрібний екран. Технічно: модель NLU класифікує намір, відображає його на deep link, і додаток виконує програмну навігацію.
Контекстні підказки. Користувач застряг на екрані на три хвилини без дій—Помічник пропонує допомогу. Не generica "потрібна допомога?", а контекстно: "Ви на екрані платежу. Хочете, щоб я пояснив різницю між переводом за номером телефону та реквізитами?"
Керована виконання завдань. Багатокрокові завдання, як "подати заявку на іпотеку"—12 кроків, розкидані в три розділи. Помічник веде крок за кроком, відстежує прогрес і пояснює кожний екран.
Архітектура: NLU → Intent → Action
Найнетривіальніша частина—це відображення запиту користувача на конкретну дію в додатку. Два підходи:
На основі класифікатора. Попередньо визначена множина намірів (50–200 для типового додатка), тренований класифікатор. Швидко, передбачувано, дешево під час виконання. Має проблеми з нестандартними формулюваннями.
LLM + function calling. Описуйте всі екрани та дії як набір функцій. LLM вибирає потрібну на основі запиту користувача:
// iOS — опис навігаційних функцій для LLM
let navigationTools: [ChatCompletionTool] = [
ChatCompletionTool(
type: .function,
function: ChatCompletionToolFunction(
name: "navigate_to_screen",
description: "Відкриває екран додатку за ідентифікатором",
parameters: NavigationParameters.schema // {screen_id: string, params: object}
)
),
ChatCompletionTool(
type: .function,
function: ChatCompletionToolFunction(
name: "highlight_element",
description: "Виділяє елемент UI на поточному екрані з поясненням",
parameters: HighlightParameters.schema
)
),
ChatCompletionTool(
type: .function,
function: ChatCompletionToolFunction(
name: "start_guided_flow",
description: "Розпочинає покроковий гайд для багатокрокового завдання",
parameters: FlowParameters.schema
)
)
]
// Запит з function calling
let request = ChatCompletionRequest(
model: "gpt-4o-mini",
messages: [systemMessage, userMessage],
tools: navigationTools,
toolChoice: .auto
)
LLM повертає tool_calls з назвою функції та параметрами, додаток виконує навігацію.
Програмна навігація в iOS та Android
На iOS (SwiftUI)—через NavigationPath або спеціальний Router:
class AppRouter: ObservableObject {
@Published var path = NavigationPath()
func navigate(to screen: AppScreen, params: [String: Any] = [:]) {
switch screen {
case .transfer:
path.append(TransferRoute(params: params))
case .loanApplication:
path.append(LoanApplicationRoute(params: params))
// ...
}
}
// Викликається з AI Помічника
func executeNavigationAction(_ action: NavigationAction) {
DispatchQueue.main.async {
self.navigate(to: action.screen, params: action.params)
}
}
}
На Android (Compose)—через NavController:
fun handleCopilotAction(action: NavigationAction, navController: NavController) {
when (action.screenId) {
"transfer" -> navController.navigate(
"transfer?amount=${action.params["amount"] ?: ""}"
)
"loan_application" -> navController.navigate("loan/application")
// ...
}
}
Виділення елементів UI
Керований режим із виділенням елементів технічно складніший за навігацію. Потребує системи ідентифікації елементів, незалежної від позиції на екрані.
На iOS: система тегів через accessibilityIdentifier. Помічник знає імена елементів; за потреби шар overlay малює виділення з анімацією над цільовим елементом.
На Android: подібний підхід через contentDescription або спеціальні теги + ViewTreeObserver для отримання координат елемента під час виконання.
Контекстна обізнаність
Помічник повинен знати, де користувач знаходиться зараз. Поточний екран, виконані кроки, незаповнені поля—цей контекст інжектується в системний промпт:
func buildCopilotContext(currentScreen: AppScreen, formState: FormState?) -> String {
var context = "Поточний екран: \(currentScreen.name).\n"
if let form = formState {
context += "Заповнені поля: \(form.completedFields.joined(separator: ", ")).\n"
context += "Пропущені обов'язкові поля: \(form.missingRequired.joined(separator: ", ")).\n"
}
return context
}
Типові помилки реалізації
Головна помилка: Помічник виконує деструктивні дії без підтвердження. Правило—навігація виконується негайно, будь-які зміни даних (відправка форми, створення платежу) потребують явного підтвердження користувача, незалежно від того, що сказав Помічник.
Друга помилка: повний опис всіх 80 екранів у системному промпті. Це роздмухує промпт до тисяч токенів. Рішення—векторний пошук по каталогу екранів перед запитом до LLM: з 80 екранів у промпт потрапляють лише 5–10 найбільш релевантних.
Процес розробки
Інвентаризація всіх екранів та дій → проектування схеми намірів → реалізація NLU (класифікатор або LLM function calling) → система програмної навігації → UI overlay для виділення елементів → керована машина потоків → A/B тестування метрик завершення завдання.
Орієнтири за часом
MVP з LLM function calling та базовою навігацією—2–3 тижні. Повна система із керованими потоками, виділенням елементів і контекстними підказками—3–5 тижнів. Ітеративні поліпшення на основі аналітики—постійно.







