AI-Аналіз видатків та категоризація транзакцій мобільного додатку
Ручна категоризація транзакцій—те, що користувачі роблять першого тижня, а потім кидають. Автоматична категоризація на правилах ("якщо назва мерчанта містить 'ЛЕНТУ'—це продукти") працює для великих ритейлерів, але ламається на "ТОВ ПЕРСПЕКТИВА" або "ФОП Іванов А.В.". ML-категоризатор + LLM-аналіз поверх дає інший рівень якості.
Категоризація: модель vs LLM
ML-класифікатор (TF-IDF + LightGBM або distilBERT). Тренується на історичних категоризованих транзакціях. Inference < 10ms, працює offline, вартість—нуль після обучення. Точність на top-100 мерчантів—95%+, на "хвості" (ФОП, малі компанії)—60–70%.
LLM для невпізнаних. Транзакції з низькою впевненістю класифікатора (confidence < 0.7) спрямовуються в LLM. GPT-4o-mini, temperature=0, один промпт з категоріями та прикладами—рішення за 300–500ms, точність на нестандартних назвах 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-запитів—копійки.
Збагачення даних мерчантів
Назва мерчанта в банківській виписці—брудні дані. "МАГНИТ КОСМЕТИК 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) RUB (\($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 "слідкуйте за видатками на їжу".
Обучение на користувацьких поправках
Користувачі виправляють неправильні категорії—золото для переобучення. Кожна поправка—новий 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)
}
Орієнтири за часом
Класифікатор на правилах + MCC—3–5 днів. ML-класифікатор з LLM-fallback—1–2 тижні. Повна система з аналізом паттернів, інсайтами та обученням на поправках—2–4 тижні.







