AI в логистике: маршруты, склады и прогнозирование спроса

Оптимизация маршрутов, управление складом, Computer Vision — AI в логистике и доставке

Логистика — одна из самых данных-насыщенных отраслей: миллионы маршрутов, миллиарды посылок, тысячи складов. Именно здесь AI перешёл из экспериментов в операционную реальность быстрее, чем в большинстве других индустрий. По данным McKinsey, компании, внедрившие AI в цепочки поставок, фиксируют снижение логистических затрат на 5–20%, сокращение запасов на 20–30% и рост точности прогнозирования спроса на 10–15%. В 2026 году рынок AI в логистике достиг $26 млрд, а темпы роста составляют около 47% в год. Предиктивная маршрутизация, роботизированные склады, Computer Vision (компьютерное зрение) для сортировки и автономная доставка — это уже не конкурентное преимущество, а базовое ожидание рынка.

Представьте, что вы заказали товар в интернет-магазине. AI решает, с какого склада его быстрее отправить, строит оптимальный маршрут для курьера с учётом пробок и погоды, управляет роботами на складе, которые находят и упаковывают вашу посылку, а камеры с компьютерным зрением проверяют, что в коробку положили правильный товар. Всё это происходит без участия человека — и именно поэтому доставка за 1–2 дня стала нормой, а не исключением.

Суть за 2 минуты

AI в логистике решает задачи, где человеческий мозг не справляется с масштабом: оптимизация тысяч маршрутов одновременно, прогнозирование спроса на миллионы товаров, управление складом, где работают сотни роботов.

Ключевые применения:

ОбластьЧто делает AIРезультат
МаршрутизацияСтроит оптимальные маршруты с учётом пробок, погоды, приоритетов−15% стоимость доставки, −19% расход топлива
Прогнозирование спросаПредсказывает, сколько товара понадобится на каждом складе−20–30% избыточных запасов
Управление складомКоординирует роботов, людей и конвейеры+25% скорость обработки заказов
Computer VisionРаспознаёт, сортирует, проверяет качество упаковки95% точность в смешанных средах
Автономная доставкаДроны и роботы для last-mile доставкиДоставка за 30 минут без курьера
Предиктивное обслуживаниеПредсказывает поломки техники до их наступления−30% простоев оборудования

Ключевые цифры:

  • $26 млрд — объём рынка AI в логистике в 2026 году
  • 5–20% — снижение логистических затрат при внедрении AI (McKinsey)
  • 3.5x — медианный возврат инвестиций в AI за три года (McKinsey)
  • 1 000 000 роботов работает на складах Amazon в 2025 году
ПромптЛогист → Claude: быстрый анализ маршрутной сети
Я руководитель логистики интернет-магазина. У нас 3 склада (Москва, Казань, Новосибирск), 200 заказов в день, доставка по всей России. Какие AI-решения помогут оптимизировать маршруты доставки? Для каждого решения укажи: задачу, инструмент/подход, ожидаемый эффект и сложность внедрения.
Ответ модели
  1. Динамическая маршрутизация last-mile Задача: оптимизация маршрутов курьеров внутри города Инструмент: Яндекс Маршрутизация / Google OR-Tools Эффект: −15–20% пробег, −10–15% стоимость доставки Сложность: низкая (SaaS, интеграция через API за 1–2 недели)

  2. Предиктивное распределение запасов Задача: размещение товаров на ближайшем к клиенту складе ДО заказа Инструмент: ML-модель на исторических данных (Prophet / LightGBM) Эффект: −1 день среднее время доставки, −20% межскладских перемещений Сложность: средняя (нужны данные за 12+ месяцев, ML-инженер)

  3. Выбор оптимального склада отгрузки Задача: для каждого заказа — выбор склада с учётом наличия, расстояния, загрузки Инструмент: решатель (solver) на основе линейного программирования Эффект: −10% стоимость логистики, +5% скорость доставки Сложность: средняя (интеграция с WMS и OMS)

Оптимизация маршрутов: от статики к непрерывному планированию

Маршрутизация — самое зрелое применение AI в логистике. Задача выглядит просто: доставить N посылок по N адресам за минимальное время и стоимость. Но в реальности это NP-трудная задача (задача коммивояжёра, TSP), которую невозможно решить перебором при сотнях точек.

Как это работает

Классические системы маршрутизации строили маршруты один раз в начале дня. AI-системы работают иначе — непрерывное планирование (continuous planning):

Кейс: UPS ORION

Система ORION (On-Road Integrated Optimization and Navigation) от UPS — один из самых масштабных примеров AI-маршрутизации в мире. Она обрабатывает 30 000 оптимизаций маршрутов в минуту, экономит 38 миллионов литров топлива ежегодно и предотвращает выброс около 100 000 тонн CO₂ в год. Каждая сэкономленная миля на маршруте одного водителя масштабируется на 125 000+ водителей UPS по всему миру.

Яндекс Маршрутизация

В России лидер AI-маршрутизации — Яндекс Маршрутизация. Платформа использует алгоритмы Яндекса и прогноз пробок для автоматического построения маршрутов. Система учитывает временные окна доставки, типы транспорта, загрузку и приоритеты. Компании, использующие платформу, отмечают снижение пробега на 15–20% и стоимости доставки на 10–15%.

Прогнозирование спроса: знать заранее

Прогнозирование спроса (demand forecasting) — это не просто «сколько товара продадим в следующем месяце». В логистике это определяет, на каком складе разместить товар, сколько транспорта зарезервировать, какие запасы пополнить до пика сезона.

Что учитывает AI-модель

Современные модели прогнозирования спроса анализируют десятки сигналов:

  • Исторические продажи — паттерны, сезонность, тренды
  • Внешние факторы — погода, праздники, экономические индикаторы, курс валют
  • Маркетинговые акции — планируемые промо, скидки, рекламные кампании
  • Социальные сигналы — упоминания бренда, вирусные тренды, новости
  • Данные конкурентов — цены, ассортимент, акции

По данным McKinsey, AI-прогнозирование повышает точность на 10–15% по сравнению с традиционными методами. Это приводит к сокращению избыточных запасов на 20–30% и снижению упущенных продаж (out-of-stock) на 65%.

DHL: Generative AI для прогнозирования

DHL использует генеративный AI для создания сценарных прогнозов спроса. Модели принимают исторические данные и генерируют диапазоны сценариев будущего спроса — от оптимистичного до пессимистичного. Это позволяет заранее планировать запасы, персонал и транспортные мощности. По данным DHL Logistics Trend Radar 2025, пять ключевых AI-трендов в логистике: Computer Vision, Audio AI, Generative AI, AI Ethics и Advanced Analytics.

Точность прогноза (традиционные методы)60%
Точность прогноза (ML-модели)75%
Точность прогноза (AI + внешние данные)85%
Снижение out-of-stock65%
Снижение избыточных запасов30%

Управление складом: роботы и оркестрация

Склад — это место, где AI приносит наибольшую измеримую отдачу. Здесь каждая секунда на обработку заказа, каждый метр пробега робота и каждая ошибка в комплектации напрямую влияют на стоимость и скорость доставки.

Роботизация складов

Amazon — лидер складской роботизации. В 2025 году на складах Amazon работает более 1 000 000 роботов: от простых направляемых тележек (AGV) до автономных мобильных роботов Proteus, способных работать среди людей, и робо-руки Sparrow, которая захватывает отдельные товары. Amazon тестирует гуманоидных роботов для доставки посылок совместно с электрическими фургонами Rivian — робот выходит из фургона, забирает посылку и несёт к двери клиента, обходя препятствия с помощью компьютерного зрения.

Оркестрация: единый мозг склада

Ключевое развитие 2025–2026 — платформы оркестрации, которые объединяют AMR (автономные мобильные роботы), AGV (автоматические направляемые транспортные средства), конвейеры, шаттлы и людей в единый исполнительный слой. Вместо того чтобы каждая система работала изолированно, оркестратор распределяет задачи между всеми ресурсами склада в реальном времени.

Склад без AI
• Маршруты комплектовщиков — фиксированные зоны • Роботы и люди работают в разных зонах • Инвентаризация — раз в месяц, вручную • Ошибки комплектации: 1–3% • Пиковая нагрузка = овертайм персонала
AI-оркестрированный склад
• AI строит оптимальный путь комплектовщика по складу • Роботы и люди работают вместе, задачи распределяет оркестратор • Непрерывная инвентаризация через RFID + Computer Vision • Ошибки комплектации: 0.1–0.3% (CV-проверка) • Пиковая нагрузка = автоматическое масштабирование роботов

Computer Vision для сортировки и контроля качества

Computer Vision (компьютерное зрение) в логистике решает задачи, которые раньше требовали глаз человека: идентификация товаров, считывание штрих-кодов и маркировки, проверка комплектации, контроль повреждений упаковки.

Как CV работает на сортировочной линии

Камеры установлены над конвейерной лентой. Модели глубокого обучения (deep learning) в реальном времени:

  1. Идентифицируют товар — по форме, цвету, маркировке, без необходимости сканировать штрих-код
  2. Определяют размер и вес — для автоматического выбора упаковки и тарифа
  3. Выявляют повреждения — вмятины, разрывы, мокрые пятна на упаковке
  4. Направляют на нужную линию — автоматическая сортировка по направлению доставки

Системы на основе deep learning достигают 95% точности в смешанных средах (mixed-SKU), что на 20% превосходит традиционные системы машинного зрения. Модульные сортировщики нового поколения используют reinforcement learning (обучение с подкреплением) для обработки предметов нестандартной формы и размера.

Контроль качества и безопасности

CV также применяется для контроля безопасности на складе: обнаружение опасных ситуаций (человек в зоне работы робота), проверка соблюдения правил (защитная одежда, каски), мониторинг загруженности зон.

Автономный транспорт и дроны

Автономная доставка — самая футуристичная, но быстро зреющая область AI в логистике.

Дроны для last-mile

Дроны для доставки — это не фантазия: рынок доставочных дронов оценивается в $1.08 млрд в 2025 году и вырастет до $4.4 млрд к 2030 году (CAGR 32%). Zipline — лидер отрасли — преодолела отметку в 100 миллионов автономных миль с более чем 1.4 миллионами доставок. Flytrex расширяет доставку дронами через партнёрства с Uber Eats и DoorDash.

Дроны особенно эффективны для:

  • Субурбанных и сельских районов — где наземная доставка дорогая
  • Срочных доставок — медикаменты, запчасти, документы (до 30 минут)
  • Труднодоступных территорий — горные районы, острова

Автономные фургоны

Amazon планирует довести флот электрических фургонов Rivian до 100 000 к концу десятилетия. Уже сейчас более 20 000 электрофургонов доставляют посылки, а компания тестирует гуманоидных роботов, которые будут работать в связке с фургонами — робот самостоятельно выносит посылку к двери клиента.

Кейсы из России

Яндекс развивает автономную доставку через роботов-курьеров «Яндекс.Ровер», которые уже работают в нескольких городах России. Параллельно Яндекс анонсировал Yandex Commerce Protocol (YCP) — протокол интеграции магазинов с AI-ассистентом «Алисой» для автоматизации всей цепочки: от заказа до доставки.

Сбер интегрирует GigaChat в логистические процессы через API: обработка заказов, планирование маршрутов, управление запасами и отслеживание грузов. Это позволяет малому и среднему бизнесу получить доступ к AI-оптимизации без собственной ML-команды.

ПромптМенеджер склада → Claude: аудит AI-готовности
У нас распределительный центр: 15 000 м², 50 000 SKU, 30 сотрудников, WMS на базе 1C, ручная комплектация. Средняя ошибка комплектации — 2.1%. Проведи аудит AI-готовности: какие AI-технологии мы можем внедрить, в каком порядке, с каким ROI и какие данные нужно начать собирать уже сейчас?
Ответ модели

Аудит AI-готовности распределительного центра

Фаза 1 (0–3 месяца, низкие инвестиции): → Computer Vision для проверки комплектации Камеры на упаковочных станциях + модель детекции товаров Ожидаемый эффект: ошибки с 2.1% → 0.3–0.5% ROI: окупаемость за 4–6 месяцев (снижение возвратов) Данные: начать фотографировать эталонные комплектации

Фаза 2 (3–6 месяцев, средние инвестиции): → AI-оптимизация размещения товаров (slotting) Анализ частоты обращений к SKU → перемещение популярных товаров ближе к зоне отгрузки Ожидаемый эффект: −20% время комплектации Данные: экспорт истории заказов из 1C за 12+ месяцев

Фаза 3 (6–12 месяцев, значительные инвестиции): → AMR (мобильные роботы) для транспортировки Роботы доставляют полки к комплектовщику (goods-to-person) Ожидаемый эффект: +40% производительность, −30% пробег сотрудников Данные: карта склада, потоки перемещений

Начните собирать уже сейчас:

  1. Логи всех операций WMS с таймстемпами
  2. Фото товаров для обучения CV-модели
  3. Heatmap перемещений сотрудников (GPS-бейджи)

Оптимизация маршрутов: код и алгоритмы

Для решения задачи маршрутизации транспорта (Vehicle Routing Problem, VRP) используются две основные категории инструментов: точные солверы (Google OR-Tools, CPLEX) для задач малого и среднего масштаба и метаэвристики/RL для крупных задач.

Vehicle Routing Problem с Google OR-Tools

from ortools.constraint_solver import routing_enums_pb2, pywrapcp


def solve_vrp(
    distance_matrix: list[list[int]],
    num_vehicles: int,
    depot: int = 0,
    demands: list[int] | None = None,
    vehicle_capacity: int | None = None,
    time_windows: list[tuple[int, int]] | None = None,
) -> dict:
    """
    Решение задачи маршрутизации транспорта (VRP).

    Args:
        distance_matrix: матрица расстояний между точками (метры)
        num_vehicles: количество транспортных средств
        depot: индекс депо (начальная точка)
        demands: спрос каждой точки (вес/объём)
        vehicle_capacity: грузоподъёмность транспорта
        time_windows: временные окна доставки (мин_от_старта, макс_от_старта)
    """
    manager = pywrapcp.RoutingIndexManager(
        len(distance_matrix), num_vehicles, depot,
    )
    routing = pywrapcp.RoutingModel(manager)

    # Callback расстояний
    def distance_callback(from_index, to_index):
        from_node = manager.IndexToNode(from_index)
        to_node = manager.IndexToNode(to_index)
        return distance_matrix[from_node][to_node]

    transit_callback_index = routing.RegisterTransitCallback(distance_callback)
    routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index)

    # Ограничение грузоподъёмности
    if demands and vehicle_capacity:
        def demand_callback(from_index):
            from_node = manager.IndexToNode(from_index)
            return demands[from_node]

        demand_callback_index = routing.RegisterUnaryTransitCallback(demand_callback)
        routing.AddDimensionWithVehicleCapacity(
            demand_callback_index,
            0,  # slack
            [vehicle_capacity] * num_vehicles,
            True,  # start_cumul_to_zero
            "Capacity",
        )

    # Временные окна
    if time_windows:
        routing.AddDimension(
            transit_callback_index,
            30,  # допустимое ожидание (мин)
            1440,  # максимум в пути (мин)
            False,
            "Time",
        )
        time_dimension = routing.GetDimensionOrDie("Time")
        for location_idx, (start, end) in enumerate(time_windows):
            if location_idx == depot:
                continue
            index = manager.NodeToIndex(location_idx)
            time_dimension.CumulVar(index).SetRange(start, end)

    # Параметры поиска
    search_parameters = pywrapcp.DefaultRoutingSearchParameters()
    search_parameters.first_solution_strategy = (
        routing_enums_pb2.FirstSolutionStrategy.PATH_CHEAPEST_ARC
    )
    search_parameters.local_search_metaheuristic = (
        routing_enums_pb2.LocalSearchMetaheuristic.GUIDED_LOCAL_SEARCH
    )
    search_parameters.time_limit.FromSeconds(30)

    solution = routing.SolveWithParameters(search_parameters)

    if not solution:
        return {"status": "no_solution", "routes": []}

    # Извлечение маршрутов
    routes = []
    total_distance = 0
    for vehicle_id in range(num_vehicles):
        route = []
        index = routing.Start(vehicle_id)
        route_distance = 0
        while not routing.IsEnd(index):
            node = manager.IndexToNode(index)
            route.append(node)
            previous_index = index
            index = solution.Value(routing.NextVar(index))
            route_distance += routing.GetArcCostForVehicle(
                previous_index, index, vehicle_id,
            )
        route.append(manager.IndexToNode(index))
        routes.append({
            "vehicle": vehicle_id,
            "route": route,
            "distance": route_distance,
        })
        total_distance += route_distance

    return {
        "status": "solved",
        "routes": routes,
        "total_distance": total_distance,
    }


# Пример использования
if __name__ == "__main__":
    # 6 точек доставки + депо (индекс 0)
    matrix = [
        [0, 548, 776, 696, 582, 274, 502],
        [548, 0, 684, 308, 194, 502, 730],
        [776, 684, 0, 992, 878, 502, 274],
        [696, 308, 992, 0, 114, 650, 878],
        [582, 194, 878, 114, 0, 536, 764],
        [274, 502, 502, 650, 536, 0, 228],
        [502, 730, 274, 878, 764, 228, 0],
    ]

    result = solve_vrp(
        distance_matrix=matrix,
        num_vehicles=2,
        depot=0,
        demands=[0, 1, 1, 2, 4, 2, 4],
        vehicle_capacity=8,
    )

    for r in result["routes"]:
        print(f"Машина {r['vehicle']}: {''.join(map(str, r['route']))}")
    print(f"Общее расстояние: {result['total_distance']}")

Динамическая маршрутизация с реальными данными

import httpx
from datetime import datetime


async def get_route_with_traffic(
    origin: tuple[float, float],
    destination: tuple[float, float],
    waypoints: list[tuple[float, float]],
    departure_time: datetime | None = None,
    api_key: str = "",
) -> dict:
    """
    Построение маршрута с учётом реального трафика через API.

    Args:
        origin: координаты старта (lat, lon)
        destination: координаты финиша (lat, lon)
        waypoints: промежуточные точки
        departure_time: время выезда (для прогноза пробок)
        api_key: ключ API картографического сервиса
    """
    # Формирование запроса к Яндекс.Маршрутизации или Google Directions
    waypoints_str = "|".join(f"{lat},{lon}" for lat, lon in waypoints)

    async with httpx.AsyncClient() as client:
        response = await client.get(
            "https://routes.googleapis.com/directions/v2:computeRoutes",
            headers={
                "X-Goog-Api-Key": api_key,
                "X-Goog-FieldMask": "routes.duration,routes.distanceMeters,routes.legs",
            },
            params={
                "origin": f"{origin[0]},{origin[1]}",
                "destination": f"{destination[0]},{destination[1]}",
                "intermediates": waypoints_str,
                "departureTime": (departure_time or datetime.now()).isoformat(),
                "routingPreference": "TRAFFIC_AWARE_OPTIMAL",
            },
        )
        data = response.json()

    route = data.get("routes", [{}])[0]
    return {
        "distance_m": route.get("distanceMeters", 0),
        "duration_s": int(route.get("duration", "0s").rstrip("s")),
        "legs": [
            {
                "distance_m": leg.get("distanceMeters", 0),
                "duration_s": int(leg.get("duration", "0s").rstrip("s")),
            }
            for leg in route.get("legs", [])
        ],
    }

Пайплайн прогнозирования спроса

Типичный пайплайн demand forecasting для логистики включает: сбор данных, feature engineering, обучение модели, генерацию прогноза и интеграцию с WMS/OMS.

import pandas as pd
import numpy as np
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.metrics import mean_absolute_error, mean_absolute_percentage_error


def build_demand_features(
    sales_df: pd.DataFrame,
    weather_df: pd.DataFrame | None = None,
    promo_df: pd.DataFrame | None = None,
) -> pd.DataFrame:
    """
    Feature engineering для модели прогнозирования спроса.

    Args:
        sales_df: история продаж (date, sku, warehouse, quantity)
        weather_df: прогноз погоды (date, warehouse, temp, precipitation)
        promo_df: планируемые акции (date, sku, discount_pct)
    """
    df = sales_df.copy()
    df["date"] = pd.to_datetime(df["date"])

    # Временные фичи
    df["day_of_week"] = df["date"].dt.dayofweek
    df["month"] = df["date"].dt.month
    df["is_weekend"] = df["day_of_week"].isin([5, 6]).astype(int)
    df["day_of_year"] = df["date"].dt.dayofyear

    # Лаговые фичи (спрос за предыдущие периоды)
    for lag in [1, 7, 14, 28]:
        df[f"demand_lag_{lag}"] = (
            df.groupby(["sku", "warehouse"])["quantity"]
            .shift(lag)
        )

    # Скользящие средние
    for window in [7, 14, 28]:
        df[f"demand_rolling_{window}"] = (
            df.groupby(["sku", "warehouse"])["quantity"]
            .transform(lambda x: x.rolling(window, min_periods=1).mean())
        )

    # Тренд
    df["demand_trend"] = (
        df[f"demand_lag_1"] - df[f"demand_lag_7"]
    ) / (df[f"demand_lag_7"] + 1e-9)

    # Погодные данные
    if weather_df is not None:
        weather_df["date"] = pd.to_datetime(weather_df["date"])
        df = df.merge(weather_df, on=["date", "warehouse"], how="left")

    # Промо-данные
    if promo_df is not None:
        promo_df["date"] = pd.to_datetime(promo_df["date"])
        df = df.merge(promo_df, on=["date", "sku"], how="left")
        df["discount_pct"] = df["discount_pct"].fillna(0)
        df["has_promo"] = (df["discount_pct"] > 0).astype(int)

    return df.dropna()


def train_demand_model(features_df: pd.DataFrame) -> dict:
    """Обучение модели прогнозирования спроса."""
    feature_cols = [
        col for col in features_df.columns
        if col not in ["date", "sku", "warehouse", "quantity"]
    ]

    # Хронологический split (не random!)
    split_date = features_df["date"].quantile(0.8)
    train = features_df[features_df["date"] <= split_date]
    test = features_df[features_df["date"] > split_date]

    X_train, y_train = train[feature_cols], train["quantity"]
    X_test, y_test = test[feature_cols], test["quantity"]

    model = GradientBoostingRegressor(
        n_estimators=300,
        max_depth=6,
        learning_rate=0.05,
        min_samples_leaf=10,
        subsample=0.8,
        random_state=42,
    )
    model.fit(X_train, y_train)

    y_pred = model.predict(X_test)

    metrics = {
        "mae": mean_absolute_error(y_test, y_pred),
        "mape": mean_absolute_percentage_error(y_test, y_pred),
    }

    # Важность фичей
    feature_importance = sorted(
        zip(feature_cols, model.feature_importances_),
        key=lambda x: x[1],
        reverse=True,
    )[:10]

    return {
        "model": model,
        "metrics": metrics,
        "top_features": feature_importance,
        "feature_cols": feature_cols,
    }


def generate_replenishment_plan(
    model,
    forecast_df: pd.DataFrame,
    feature_cols: list[str],
    safety_stock_days: int = 3,
) -> pd.DataFrame:
    """
    Генерация плана пополнения запасов на основе прогноза.

    Args:
        model: обученная модель
        forecast_df: данные для прогноза (будущие даты с фичами)
        feature_cols: колонки фичей
        safety_stock_days: запас безопасности (дни)
    """
    forecast_df = forecast_df.copy()
    forecast_df["predicted_demand"] = model.predict(forecast_df[feature_cols])

    # Агрегация по SKU и складу
    plan = (
        forecast_df
        .groupby(["sku", "warehouse"])
        .agg(
            total_predicted=("predicted_demand", "sum"),
            peak_daily=("predicted_demand", "max"),
        )
        .reset_index()
    )

    # Страховой запас
    plan["safety_stock"] = plan["peak_daily"] * safety_stock_days
    plan["order_quantity"] = np.ceil(
        plan["total_predicted"] + plan["safety_stock"]
    ).astype(int)

    return plan[["sku", "warehouse", "total_predicted", "safety_stock", "order_quantity"]]

Интеграция Computer Vision для сортировки

import anthropic
import base64
import httpx
from pathlib import Path


async def classify_package(
    image_path: str | Path,
    categories: list[str],
) -> dict:
    """
    Классификация посылки по изображению через Vision API.

    Args:
        image_path: путь к фото посылки с камеры сортировочной линии
        categories: список категорий/направлений сортировки
    """
    image_data = Path(image_path).read_bytes()
    base64_image = base64.standard_b64encode(image_data).decode("utf-8")

    # Определяем media type
    suffix = Path(image_path).suffix.lower()
    media_types = {".jpg": "image/jpeg", ".jpeg": "image/jpeg", ".png": "image/png"}
    media_type = media_types.get(suffix, "image/jpeg")

    client = anthropic.Anthropic()

    response = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=300,
        messages=[{
            "role": "user",
            "content": [
                {
                    "type": "image",
                    "source": {
                        "type": "base64",
                        "media_type": media_type,
                        "data": base64_image,
                    },
                },
                {
                    "type": "text",
                    "text": f"""Проанализируй изображение посылки на сортировочной линии.

Определи:
1. Тип упаковки (коробка/пакет/конверт/нестандарт)
2. Приблизительные размеры (S/M/L/XL)
3. Видимые повреждения (да/нет, описание)
4. Читаемая маркировка (штрих-код, адрес, номер заказа)
5. Категория сортировки из списка: {', '.join(categories)}

Ответь в формате JSON.""",
                },
            ],
        }],
    )

    return {
        "image": str(image_path),
        "classification": response.content[0].text,
        "tokens_used": response.usage.input_tokens + response.usage.output_tokens,
    }


async def detect_damage_batch(
    image_urls: list[str],
    damage_threshold: float = 0.7,
) -> list[dict]:
    """
    Пакетная проверка повреждений упаковки.

    Args:
        image_urls: URL изображений с камер
        damage_threshold: порог уверенности для флага повреждения
    """
    client = anthropic.Anthropic()
    results = []

    for url in image_urls:
        response = client.messages.create(
            model="claude-sonnet-4-20250514",
            max_tokens=200,
            messages=[{
                "role": "user",
                "content": [
                    {
                        "type": "image",
                        "source": {"type": "url", "url": url},
                    },
                    {
                        "type": "text",
                        "text": "Оцени состояние упаковки на фото. Ответь JSON: {\"damaged\": true/false, \"confidence\": 0.0-1.0, \"damage_type\": \"описание или null\"}",
                    },
                ],
            }],
        )

        results.append({
            "url": url,
            "analysis": response.content[0].text,
        })

    return results
  1. VRP — это не одноразовая задача. В продакшене маршруты пересчитываются каждые 5–15 минут с учётом новых заказов, пробок и отмен. Используйте инкрементальную оптимизацию, а не полный пересчёт. 2. Demand forecasting требует хронологического split. Никогда не используйте random split для временных рядов — это приводит к data leakage и ложно завышенным метрикам. 3. CV на сортировочной линии работает в реальном времени. Задержка > 200 мс на классификацию = бутылочное горлышко конвейера. Используйте edge-inference (NVIDIA Jetson, Intel OpenVINO) вместо облачных API для критичных задач.

Проверьте себя

Проверьте себя

1. Почему AI-маршрутизация в 2026 году перешла от построения маршрутов один раз в начале дня к непрерывному планированию?

2. Что такое оркестрация на складе и почему она стала ключевым трендом 2025–2026?

3. Почему для demand forecasting нельзя использовать случайное (random) разделение данных на train/test?

Связанные темы

Источники