Реализация AI-автодополнения текста при наборе в мобильном приложении

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.
Разработка и поддержка любых видов мобильных приложений:
Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Реализация AI-автодополнения текста при наборе в мобильном приложении
Средняя
~3-5 рабочих дней
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1054
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    874
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    445

Реализация AI-автодополнения текста при наборе в мобильном приложении

Встроенное автодополнение клавиатуры iOS и Android предсказывает следующее слово по частотным n-граммам. AI-автодополнение понимает контекст: знает, что пользователь пишет деловое письмо, видит первые два абзаца, предлагает целые фразы, а не одно слово.

Разрыв между концептом и рабочей реализацией — в деталях UX и производительности.

Когда предлагать подсказку

Самая недооценённая часть — триггер. Подсказка не должна появляться при каждом символе.

Рабочая эвристика: предлагаем автодополнение, если пользователь набрал от 3 слов в текущей строке и сделал паузу > 600 мс, или нажал пробел в конце предложения-незавершёнки.

// iOS - триггер автодополнения
private var autocompleteTask: Task<Void, Never>?

func textDidChange(_ textView: UITextView) {
    autocompleteTask?.cancel()

    let text = textView.text ?? ""
    let cursorPosition = textView.selectedRange.location
    let textBeforeCursor = String(text.prefix(cursorPosition))

    // Не предлагаем в середине слова
    guard textBeforeCursor.last == " " || textBeforeCursor.last == "\n" else {
        hideAutocomplete()
        return
    }

    // Минимум 15 символов контекста
    guard textBeforeCursor.trimmingCharacters(in: .whitespaces).count > 15 else { return }

    autocompleteTask = Task {
        try? await Task.sleep(nanoseconds: 600_000_000) // 600ms debounce
        guard !Task.isCancelled else { return }
        await fetchAutocomplete(context: textBeforeCursor)
    }
}

Запрос к модели и парсинг ответа

Для автодополнения используем режим completion, не chat. gpt-4o-mini с max_tokens: 30 и temperature: 0.3 — быстро и предсказуемо.

struct AutocompleteRequest: Encodable {
    let model = "gpt-4o-mini"
    let messages: [ChatMessage]
    let maxTokens = 30
    let temperature = 0.3
    let stop = ["\n", "."]  // останавливаемся на конце предложения
}

func buildPrompt(context: String) -> [ChatMessage] {
    [
        ChatMessage(role: "system", content: "Complete the text naturally. Continue from where it ends. Output only the continuation, no commentary."),
        ChatMessage(role: "user", content: context)
    ]
}

Стоп-токены \n и . — важны. Без них модель сгенерирует несколько предложений, а нам нужно одно продолжение.

Альтернатива для on-device — CreateML Text Classifier не подходит, нужен generative model. На iOS 18+ есть Foundation Models framework с on-device LLM (Apple Intelligence). На Android — Gemini Nano через Google AI Edge SDK:

// Android - Gemini Nano on-device (требует поддержки устройства)
val generativeModel = GenerativeModel(
    modelName = "gemini-nano",
    generationConfig = generationConfig {
        maxOutputTokens = 30
        temperature = 0.3f
        stopSequences = listOf(".", "\n")
    }
)

val response = generativeModel.generateContent(
    content { text("Complete naturally: $contextText") }
)
val completion = response.text?.trim() ?: ""

Gemini Nano доступен на Pixel 8+ и некоторых Samsung — не универсальное решение. Для широкой аудитории нужен серверный fallback.

Отображение подсказки

Стандартный паттерн: серый inline-текст после курсора. Пользователь нажимает Tab или свайп вправо — подсказка принимается. Любой другой ввод — скрывается.

// Android Compose - inline suggestion
@Composable
fun TextFieldWithSuggestion(
    value: String,
    suggestion: String,
    onValueChange: (String) -> Unit,
    onAcceptSuggestion: () -> Unit
) {
    val annotatedText = buildAnnotatedString {
        append(value)
        withStyle(SpanStyle(color = Color.Gray.copy(alpha = 0.6f))) {
            append(suggestion)
        }
    }

    BasicTextField(
        value = TextFieldValue(
            annotatedString = annotatedText,
            selection = TextRange(value.length)  // курсор — после реального текста
        ),
        onValueChange = { tfv ->
            val newText = tfv.text.take(value.length + suggestion.length)
            if (newText.startsWith(value + suggestion)) {
                onAcceptSuggestion()
            } else {
                onValueChange(tfv.text.take(value.length))
            }
        },
        keyboardActions = KeyboardActions(
            onDone = { onAcceptSuggestion() }
        )
    )
}

На iOS inline suggestion через UITextInput + drawText(in:) или проще через overlay label, позиционированный через caretRect(for:).

Частые проблемы

Suggestion мигает. Происходит если новый запрос возвращается быстрее 200 мс и сразу сменяет предыдущий. Решение — показывать только если новый suggestion отличается от предыдущего более чем на 3 символа.

Модель продолжает удалённый текст. Если пользователь удалил часть текста — в контексте для промпта должна быть актуальная версия, не предыдущая. Следите за синхронизацией textBeforeCursor с реальным состоянием TextStorage.

Tab перехватывается системой. На Android Tab на мягкой клавиатуре недоступен. Используем кастомную inline-клавишу или жест свайп-вправо через GestureDetector.

Ориентиры по срокам

Базовое автодополнение с серверным API + inline UI — 5–8 дней. On-device через Apple Intelligence / Gemini Nano с серверным fallback — 2–3 недели.