Реалізація контекстного вікна та управління історією діалогу AI у мобільному додатку

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1735 послуг
Реалізація контекстного вікна та управління історією діалогу AI у мобільному додатку
Середній
~2-3 дні
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    495

Реалізація контекстного вікна та управління історією діалогу у мобільному додатку

Контекст—це те, що превращає набір розрізнених запитань у зв'язний діалог. Відправити всю історію переписки в кожному запиті—найпростіше рішення. Працює до першого переповнення вікна або скарги на рахунок за API. Управління історією—окремо інженерна задача, яку потрібно проектувати заранее.

Як растёт контекст і чому це проблема

Кожний обмін додає токени: запит користувача + ответ моделі. При середньому повідомленні 50–100 токенів та 20 парах—вже 2000–4000 токенів тільки на історію, плюс системний промпт. При gpt-4o з ціною $5 за 1M input токенів—дрібниця. При 1000 активних користувачів з 50 повідомленнями на день—$250/день тільки на історію, яка могла бути компактніше.

Друга проблема: у різних моделей різні ліміти. GPT-4o—128K, Claude—200K, YandexGPT—8K. Додаток, який нормально працював з GPT-4o, ломиться при перемиканні на іншу модель.

Три стратегії управління історією

1. Скользящее вікно (Sliding Window)

Найпростіший підхід: держимо останні N повідомлень, відбрасуємо раніші. Швидко, передбачувано. Мінус: модель «забуває» початок розговору—ім'я користувача, домовленості з перших повідомлень.

func buildMessages(history: [Message], systemPrompt: String, maxTokens: Int = 3000) -> [Message] {
    var result: [Message] = []
    var tokenCount = countTokens(systemPrompt)

    // Йдемо з кінця історії
    for message in history.reversed() {
        let msgTokens = countTokens(message.content)
        if tokenCount + msgTokens > maxTokens { break }
        result.insert(message, at: 0)
        tokenCount += msgTokens
    }
    return result
}

2. Суммаризація (Summarization)

Коли історія перевищує поріг—відправляємо накопичені повідомлення на суммаризацію через дешевшу модель (gpt-4o-mini, claude-haiku, mistral-small). Отримуємо summary, зберігаємо як system-повідомлення або спеціальний assistant-блок, видаляємо суммаризовані повідомлення з активної історії.

Проблема суммаризації: теряються конкретні факти («користувач сказав, що алергічний на пеніцилін»). Для медичних, юридичних та фінансових асистентів суммаризація без явного збереження ключових фактів—ризик.

3. Гібридний підхід з пам'яттю

Найнадійніший варіант для довгострокових асистентів:

  • Кратковременна пам'ять — останні 10–15 повідомлень, завжди в контексті
  • Довгострокова пам'ять — структуровані факти про користувача та розмову, зберігаються окремо
  • Семантичний пошук — при кожному запиті витягуємо з довгострокової пам'яті релевантні факти через еквалайзири

Довгострокова пам'ять оновлюється через додатковий виклик: після кожного ответу моделі просимо модель витягнути факти для запам'ятовування ("Які нові факти про користувача можна витягнути з цього діалогу?").

Зберігання історії на мобілі

SQLite—стандарт. Структура:

CREATE TABLE conversations (
    id TEXT PRIMARY KEY,
    created_at INTEGER,
    title TEXT,
    model TEXT,
    summary TEXT  -- суммаризація старих повідомлень
);

CREATE TABLE messages (
    id TEXT PRIMARY KEY,
    conversation_id TEXT REFERENCES conversations(id),
    role TEXT CHECK(role IN ('user', 'assistant', 'system')),
    content TEXT,
    token_count INTEGER,
    created_at INTEGER
);

CREATE INDEX idx_messages_conversation ON messages(conversation_id, created_at);

token_count рахується при збереженні—не при кожному завантаженні. Це важливо для продуктивності при довгих історіях.

Підрахунок токенів на мобілі

Точний підрахунок вимагає tokenizer'а для конкретної моделі. На сервері—tiktoken для OpenAI, tokenizers від HuggingFace для решти. На мобілі часто використовуємо евристику:

  • Англійський текст: ~4 символи ≈ 1 токен
  • Російський текст: ~2–2.5 символи ≈ 1 токен (кирилиця кодується більшим числом токенів)
  • Код: ~3 символи ≈ 1 токен

Для відповідального підрахунку (тарифікація, ліміти)—серверна валідація.

UI: відображення історії

Список повідомлень—UITableView з зворотним порядком (нові внизу) або LazyColumn у Compose з reverseLayout = true. При потіці останнє повідомлення оновлюється на місці без переходу скролу.

Індикація контекстного вікна: показувати користувачу, скільки «пам'яті» займано—візуальна смужка або лічильник токенів. Не обов'язкова фіча, але додатки, які її додають, отримують менше скарг на «забув чивість» асистента.

Кошторис строків

Скользящее вікно з SQLite зберіганням—3–4 дні. Гібридна система з суммаризацією та довгостроковою пам'яттю—1,5–2,5 тижні.