Международная логистика на стеке Python: Почему мы выкинули векторный поиск и создали архитектуру, которая не галлюцинирует
О проекте
Telegram-бот для компании международной логистики (доставка грузов из Китая в Россию). Автоматизирует расчет таможенных платежей.
Задача: Пользователь вводит название товара («кроссовки») или код ТН ВЭД + вес + стоимость. Бот за 2 минуты рассчитывает:
- Доставку (авиа/море/ЖД/авто)
- Таможенные пошлины + НДС
- Сборы за оформление
- Маркировку КИЗ, сертификацию (если нужно)
Было: Клиент → менеджер → поиск кода в таблицах → ручной расчет → ответ в течение суток.
Стало: Автоматический расчет за 2 минуты, 24/7.
1. Стек: никакого хайпа, только прагматизм
В проекте сознательно исключены популярные фреймворки вроде LangChain. Когда нужен мгновенный расчет в Telegram, лишние слои абстракции создают только задержки.
- Python 3.11 + aiogram 3.13 — асинхронность для работы с внешними API
- PostgreSQL 15 — единый источник истины для всех расчетов
- Redis 7 — хранение состояний диалога (FSM)
Важно: В продакшене не используются онлайн-запросы к LLM. Скорость ответа < 50 мс, точность абсолютная. Нейросети применяются только офлайн для генерации синонимов и обогащения базы кодов ТН ВЭД.
2. Поиск по 13,279 кодам ТН ВЭД: три уровня без векторов
Классификация товара — фундамент международной логистики. Использован гибридный поиск в три уровня:
- Точное совпадение — PostgreSQL ILIKE по описанию
- Семантический слой — поиск по массивам ключевых слов и синонимов
- Fuzzy-поиск — алгоритм Левенштейна (thefuzz) + морфология (pymorphy2)
Почему не векторный поиск? По запросу "птица массой не более 185 г" система на векторах выдавала «ноутбуки» — фраза «массой не более» есть в обоих описаниях.
Решение: Категорийные бонусы. Если в запросе «птица» — группа «Живые животные» получает +20 баллов. Результат: алгоритм не путает курицу с MacBook, скорость < 50 мс.
3. Расчет: 22 поля стоимости за 2 минуты
Алгоритм из 13 шагов автоматизирует то, на что у менеджера уходит полдня:
- Комбинированные пошлины — автоматический выбор MAX между процентом и специфической ставкой (€/кг)
- Объемный вес — расчет и выбор оптимального транспорта
- Финансовые комиссии — платежный агент, валютный контроль, страховка
Результат — детальная смета с разбивкой каждой копейки: от доставки внутри Китая до итоговой суммы с НДС и без.
Пример расчета
📊 ИТОГОВЫЙ РАСЧЕТ ДОСТАВКИ
🚚 Маршрут: Китай → Москва
📦 Транспорт: Море через Владивосток
📋 Товар: наборы конструкторские и игрушки для конструирования прочие: → пластмассовые
🔢 ТН ВЭД: 9503003500
⚖️ Параметры: 150.0 кг | 5.00 м³
💡 Объемный вес: 5,000.0 кг (тарифицируется по объему)
💵 Инвойс: 8,000.00 EUR = 732,513 ₽
━━━━━━━━━━━━━━━━━━━━━━
💰 ПОЛНАЯ СТОИМОСТЬ:
1. Товар: 732,513 ₽
2. Логистика (EXW):
├─ Прекерридж (доставка в Китае): 123,329 ₽
├─ Фрахт: 66,447 ₽
├─ Терминал РФ: 45,000 ₽
└─ Итого: 234,776 ₽
3. Финансовые комиссии:
├─ Платежный агент (1.8%): 13,185 ₽
├─ Валютный контроль (0.07%): 513 ₽
└─ Страховка (0.07%): 513 ₽
└─ Итого: 14,211 ₽
4. Таможенные платежи:
├─ Таможенная стоимость (EXW): 912,835 ₽
├─ Пошлина (10.0%): 91,283 ₽
├─ НДС: 220,906 ₽
├─ Сбор за подачу ДТ: 4,924 ₽
└─ Оформление: 3,000 ₽
└─ Итого: 320,113 ₽
5. Брокер:
├─ Базовый сбор: 14,000 ₽
├─ НДС (22%): 3,080 ₽
└─ Итого: 17,080 ₽
6. Агентское вознаграждение:
├─ Комиссия (4%): 56,348 ₽
├─ НДС (22%): 12,396 ₽
└─ Итого: 68,744 ₽
━━━━━━━━━━━━━━━━━━━━━━
💰 ИТОГОВАЯ СТОИМОСТЬ:
ИТОГО С НДС: 1,477,437 ₽
НДС к возмещению: 236,382 ₽
ИТОГО БЕЗ НДС: 1,241,055 ₽
4. Масштабирование: от Telegram до PDF за секунды
Архитектура позволяет не только выдавать расчет в мессенджере, но и мгновенно формировать документы:
- PDF — коммерческое предложение с фирменным стилем для отправки клиенту
- Excel — детальная таблица для бухгалтерии с разбивкой каждого параметра
5. Три ключевые технические проблемы
Разработка для ВЭД — это работа с огромными массивами данных и сложной математикой. Три критичные проблемы и их решения:
№1: Двухфакторная система идентификации ТН ВЭД
В базе данных 13,279 кодов. Для работы с ними внедрено два сценария:
Итоговая выдача формируется на основе системы весов:
- Семантика и морфология — поиск по наименованию товара, задекларированным описаниям, ключевым словам и синонимам
- Индекс популярности — ранжирование по количеству оформленных деклараций, наиболее востребованные коды вверху
Чтобы пользователь не запутался в тысячах схожих позиций, реализована последовательная детализация через 5-ступенчатую воронку:
Результат: Пользователь движется от общего к частному, не перегружаясь информацией на каждом этапе.
№2: Производительность — проблема N+1 запросов
Проблема: При сотнях расчетов админка «засыпала». Каждая связанная строка — отдельный запрос к БД.
Решение: Eager loading через joinedload в SQLAlchemy — все связанные данные одним запросом.
Результат: Загрузка страницы: 5 секунд → 200 мс (ускорение в 25 раз).
№3: Математический лабиринт пошлин
Проблема: Пошлины — не только проценты. Есть адвалорные, специфические и комбинированные ставки с разной логикой расчета.
Решение: Система автоматически определяет тип ставки. При адвалорной — процент от стоимости. При специфической — фиксированная сумма (€/кг). При комбинированной — выбирает MAX между обоими вариантами.
Результат: Исключение человеческого фактора. Учет всех параметров: комбинированные пошлины, сборы за подачу ДТ, стоимость оформления.
6. Зачем это нужно в 2026 году
Международная логистика усложняется: меняются курсы, вводятся новые пошлины и обязательная маркировка.
Три преимущества автоматизации:
- Скорость — 2 минуты vs сутки ожидания
- Точность — алгоритм не забывает сертификацию и сборы за ДТ
- Масштаб — 1000+ расчетов/день одним ботом
Вывод: Будущее логистики — не в «умных разговорах» с ботом, а в математически выверенной работе систем, которые знают базу ТН ВЭД лучше человека.
Подробные технические кейсы доступны на сайте bezk.pro. Также на сайте вы можете заказать разработку ИИ-агента под задачи вашего бизнеса.