Поиск

Личная бухгалтерия на LLM: парсинг сообщений из Telegram в Notion через n8n

Личная бухгалтерия на LLM: парсинг сообщений из Telegram в Notion через n8n

Классический учет личных расходов регулярно разбивается о бытовую инерцию. Банковские приложения охватывают только безналичные операции по картам, теряя платежи по СБП и чеки самозанятых в категории «Прочие переводы». Специализированные финансовые менеджеры заставляют открывать отдельный интерфейс, выбирать счета, пролистывать вложенные списки категорий и вбивать суммы вручную. В момент оплаты на кассе, в метро или в кафе этот сценарий теряется — чек откладывается на «потом», а к вечеру детали стираются из памяти. Notion выглядит идеальной базой для кастомной отчетности благодаря гибким свойствам, фильтрам, связям с проектами и дашбордам, однако мобильный клиент долго грузится на слабом соединении, а добавление записи превращается в микрохирургию по экрану смартфона. Задача состояла в удалении любого трения: свести учет к отправке одного короткого сообщения на естественном языке в Telegram, а классификацию, валидацию и запись переложить на автоматизированный пайплайн.

Архитектура решения на n8n, DeepSeek и Notion API

Вся логика построена на базе самоподнятого n8n без привлечения сторонних платных middleware-сервисов. Оркестратор принимает вебхуки, выполняет фильтрацию, маршрутизирует данные в языковую модель и пишет результат в целевую базу. Стек компонентов выглядит следующим образом:

Центральный узел связывает чат, мозг и документы светящимися путями

  • Telegram Bot API (Telegram Trigger) — мгновенная точка входа. Клиент закреплен в быстром доступе и стабильно доставляет сообщения даже при слабом EDGE-соединении.
  • n8n (Self-hosted) — оркестратор бизнес-логики. Обрабатывает входящие вебхуки, управляет ветвлением сценария, вызывает языковую модель и взаимодействует с Notion API.
  • LangChain-стек внутри n8n (AI Agent + DeepSeek Chat Model + Structured Output Parser) — вместо ненадежных сырых HTTP-запросов используется агентная сборка нод n8n. Модель DeepSeek Chat Model отвечает за извлечение сущностей, а Structured Output Parser гарантирует строгую типизацию ответа.
  • Notion API (Create a database page) — целевое хранилище. База «Мои расходы» содержит колонки: «Что купили» (Title), «Категория» (Select), «Сумма (RUB)» (Number) и «Дата» (Date).

Пошаговый разбор пайплайна: от Telegram Trigger до записи в Notion

Шаг 1. Маршрутизация и первичный фильтр мусора через узел If

В реальном сценарии данные никогда не приходят в идеальном виде. Пользователь может отправить приветствие, скинуть стикер, забыть указать сумму или ввести текст с кавычками и опечатками. Чтобы исключить холостые вызовы языковой модели и не спамить в Notion пустыми страницами, первым звеном после Telegram Trigger стоит узел If. Он проверяет два условия: наличие текстового поля в сообщении и базовую сигнатуру расхода — присутствие числовых символов.

Сообщение проходит фильтр, робот обрабатывает, запись появляется в журнале

Если проверка не пройдена (ветка False), сценарий уходит в узел Send a Text Message, который возвращает пользователю подсказку с форматом ввода: «Не удалось распознать расход. Пожалуйста, напишите название расхода, а в конце через пробел сумму цифрами без дополнительных знаков и точек. Примеры: «Такси 500», «Обед в столовой 570», «Бензин АИ 95 1500»». Это отсекает шум на входе и экономит токены модели. При прохождении проверки (ветка True) полезная нагрузка передается в агентный блок.

Шаг 2. Извлечение сущностей через AI Agent и Structured Output Parser

Ключевая проблема при работе с моделями вроде DeepSeek — галлюцинации и лишний текст в ответе. При просьбе отдать JSON обычным промптом модель периодически заворачивает его в markdown-блоки, вставляет вводные фразы или искажает названия ключей. Для решения этой задачи в n8n задействован узел Structured Output Parser, подключенный к AI Agent. Парсер генерирует жесткую JSON-схему, обязывая DeepSeek Chat Model возвращать строго типизированный объект со следующей структурой:

  1. {
  2. "item": "string",
  3. "category": "string",
  4. "amount": "number"
  5. }

Модель берет на себя интеллектуальное сопоставление категорий за счет In-Context Learning: в промпте заложены примеры соответствия merchant-имен и наименований товаров заранее заданным селектам базы Notion. Рассмотрим работу парсера на конкретных входах:

  • Ввод: Кроссовки «Спортмастер» 2399 → Поле Что купили: Кроссовки → Категория: Одежда и покупки → Сумма: 2399
  • Ввод: Столовая 2010 → Поле Что купили: Столовая → Категория: Кафе и перекусы → Сумма: 2010
  • Ввод: молоко «Пятерочка» 100 → Поле Что купили: молоко → Категория: Еда и продукты → Сумма: 100
  • Ввод: Аптека «Миницен» 2349 → Поле Что купили: Аптека «Миницен» → Категория: Спорт и здоровье → Сумма: 2349

Structured Output Parser исключает появление в ответе лишних полей, markdown-оберток или текстовых комментариев. Выход ноды — чистый JSON-объект, готовый к прямому маппингу в поля Notion без промежуточных трансформаций в коде (Function Item / Set).

Шаг 3. Маппинг данных и создание страницы в Notion без промежуточных костылей

Спарсенные значения напрямую маппятся в ноду Notion (Create a Database Page) через выражения n8n:

  • Title (Что купили) ➔
    1. {{ $json.output.item }}
  • Select (Категория) ➔
    1. {{ $json.output.category }}
  • Number (Сумма RUB) ➔
    1. {{ $json.output.amount }}
  • Date (Дата) ➔ системное время триггера
    1. {{ $now }}
    (с фиксацией даты и времени внесения транзакции).

Благодаря типизации на уровне Structured Output Parser база защищена от появления пустых строк, невалидных форматов чисел (например, строк вместо number) или битых тегов категорий, которых нет в селекте Notion. Если модель вернет категорию, отсутствующую в списке Select, Notion API вернет ошибку 400, что служит дополнительным контролем качества на границе систем.

Ограничения и нюансы реализации на n8n и DeepSeek

Решение требует самоподнятого инстанса n8n (Docker, VPS или локальная машина с туннелем), так как вебхук Telegram должен быть доступен по публичному HTTPS. DeepSeek Chat Model используется через API-совместимый эндпоинт; качество категоризации напрямую зависит от полноты примеров в системном промпте агента. При добавлении новых категорий в Notion необходимо обновить промпт и, при необходимости, схему Structured Output Parser. Необходимо учитывать лимиты токенов модели и стоимость вызовов API при высоком объеме сообщений. Время отклика пайплайна определяется суммарной латентностью: доставка вебхука Telegram → обработка n8n → генерация LLM → запись в Notion. На типичной инфраструктуре это укладывается в 2–4 секунды, что приемлемо для фонового процесса.

Готовый JSON-шаблон сценария для импорта в n8n и структура базы Notion доступны для адаптации под собственные категории и правила именования. Подход демонстрирует, как комбинация детерминистической фильтрации (узел If) и вероятностного извлечения сущностей (AI Agent + Structured Output Parser) позволяет построить надежный ETL-пайплайн для неструктурированного пользовательского ввода без написания кастомного парсера на коде.

Читайте также на сайте

—
02:42
18
Нет комментариев. Ваш будет первым!