Реалізація AI-аналізу витрат і категоризації транзакцій у мобільному застосунку
Ручна категоризація транзакцій — те, що користувачі роблять перший тиждень, а потім кидають. Автоматична категоризація на правилах («якщо мнемоніка містить "ЛЕНТА" — це "Продукти"») працює для великих рітейлерів, але ламається на «ТОВ ПЕРСПЕКТИВА» або «ФОП Іванов А.В.». ML-категоризатор + LLM поверх нього дає інший рівень якості. Ми реалізуємо такі рішення під ключ — від збору даних до деплою в App Store і Google Play. Наш досвід у мобільній розробці (понад 5 років, 40+ проєктів) дозволяє вбудовувати AI-модулі без втрати продуктивності на пристроях.
Як працює гібридний підхід?
Класифікатор на ML (TF-IDF + LightGBM або distilBERT). Навчається на історичних транзакціях з мітками. Inference < 10 мс, працює офлайн, вартість — нульова після навчання. Точність на топ-100 мерчантів — 95%+, на «хвості» (ФОП, дрібні компанії) — 60–70%.
LLM для нерозпізнаних. Транзакції з низькою впевненістю класифікатора (confidence < 0.7) направляються в LLM. GPT-4o-mini, temperature=0, один промпт з категоріями та прикладами — рішення за 300–500 мс, точність на нестандартних найменуваннях 80–90%.
# Серверний пайплайн категоризації
async def categorize_transaction(transaction: Transaction) -> CategoryResult:
# 1. Швидкий класифікатор
ml_result = classifier.predict(transaction.description)
if ml_result.confidence >= 0.75:
return CategoryResult(
category=ml_result.category,
confidence=ml_result.confidence,
method="ml_classifier"
)
# 2. LLM для невпевнених передбачень
llm_category = await llm_categorize(
description=transaction.description,
amount=transaction.amount,
merchant=transaction.merchant_name
)
return CategoryResult(
category=llm_category,
confidence=0.85, # LLM більш впевнений у складних випадках
method="llm_fallback"
)
Гібридний підхід: 85–90% транзакцій обробляє швидкий класифікатор (безкоштовно), 10–15% — LLM. При 1 000 транзакцій на день на користувача вартість LLM-запитів — копійки.
Порівняння підходів до категоризації
| Підхід | Точність на відомих мерчантах | Точність на рідкісних мерчантах | Вартість за 1000 запитів | Час відповіді |
|---|---|---|---|---|
| Правила (regex) | 70-80% | 30-50% | Безкоштовно | <1 мс |
| ML-класифікатор (LightGBM) | 95%+ | 60-70% | Безкоштовно (офлайн) | <10 мс |
| LLM (GPT-4o-mini) | 85-90% | 80-90% | Безкоштовно + мізер | 300-500 мс |
| Гібридний (ML+LLM) | 95%+ | 85-90% | Безкоштовно (90%) | <50 мс |
Гібридний підхід виграє за сукупністю: висока точність на всьому спектрі при мінімальній вартості.
Збагачення даних мерчантів
Найменування в банківській виписці — брудні дані. «MAGNIT COSMETIC 0001» і «МАГНІТ КОСМЕТИК» — один мерчант. Нормалізація через бази мерчантів (Clearbit, Plaid Enrich, або власний мапінг) значно підвищує точність класифікатора.
Додатковий сигнал — MCC-код (Merchant Category Code), який банк передає разом із транзакцією. MCC 5411 — продуктові магазини, MCC 5812 — ресторани. Використання MCC як ознаки в класифікаторі дає +5–10% точності.
AI-аналіз патернів витрат
Категоризація — перший крок. AI-аналіз поверх категоризованих даних — те, що перетворює застосунок з трекера на радника.
// iOS — Swift: запит до LLM для аналізу витрат за місяць
func generateExpenseInsights(transactions: [CategorizedTransaction]) async -> [Insight] {
let summary = transactions.groupBy(\.category)
.mapValues { txs in (count: txs.count, total: txs.map(\.amount).reduce(0, +)) }
.map { "\($0.key): \($0.value.total) руб. (\($0.value.count) транзакцій)" }
.joined(separator: "\n")
let prompt = """
Проаналізуй витрати користувача за місяць і дай 2-3 конкретних спостереження.
Не загальні поради — конкретні патерни з даних.
Витрати за категоріями:\n\(summary)
"""
let response = await llmClient.complete(prompt, maxTokens: 300, temperature: 0.4)
return parseInsights(response)
}
LLM бачить: «Витрати на доставку їжі зросли з 3 200 до 8 700 рублів порівняно з минулим місяцем» і генерує конкретне спостереження, а не generic «слідкуйте за витратами на їжу».
Чому варто обрати AI-категоризацію?
Правила застарівають, користувачі не хочуть витрачати час на ручне введення. AI-категоризація з персоналізацією підвищує retention застосунку на 20–30%. Ми гарантуємо точність класифікації не нижче 90% на повних даних після двох тижнів навчання. Зверніться за консультацією — оцінимо ваш проєкт і запропонуємо оптимальну архітектуру.
Навчання моделі на виправленнях користувачів
Користувачі виправляють невірні категорії — це золото для перенавчання. Кожне виправлення — новий labeled приклад. Накопичивши достатньо виправлень (50–100 на користувача), можна донавчати персоналізовану модель або додати правила, специфічні для користувача:
// Android — збереження виправлення користувача
fun saveUserCorrection(transactionId: String, correctedCategory: Category) {
val correction = UserCorrection(
transactionDescription = getTransaction(transactionId).description,
merchantId = getTransaction(transactionId).merchantId,
correctedCategory = correctedCategory,
timestamp = System.currentTimeMillis()
)
localDatabase.saveCorrection(correction)
// Синхронізуємо на сервер для перенавчання
syncService.scheduleCorrectionUpload(correction)
}
Що входить в роботу
- Архітектура AI-модуля та інтеграція з існуючим застосунком
- Розробка ML-класифікатора (LightGBM або BERT) з пайплайном навчання
- LLM-обгортка для обробки складних транзакцій
- Механізм збору виправлень користувачів і донавчання
- Інтеграція з App Store та Google Play (через Firebase App Distribution)
- Документація коду, інструкції з підтримки та донавчання
- Технічна підтримка протягом місяця після релізу
Орієнтири за термінами
Класифікатор на правилах + MCC — 3–5 днів. ML-класифікатор з LLM-fallback — 1–2 тижні. Повна система з аналізом патернів, інсайтами та навчанням на виправленнях — 2–4 тижні.
Замовте розробку AI-категоризації для вашого мобільного застосунку. Зв'яжіться з нами — ми підготуємо комерційну пропозицію з урахуванням ваших даних і вимог.







