Заметки · 25 сентября 2026
Одна разумная строка кода и восемь неверных цифр.
Владелец магазина выгружает из Shopify заказы за квартал и отдаёт файл ИИ-ассистенту, который умеет запускать Python. Просит то, что попросил бы любой владелец: ключевые цифры квартала, «точные, для презентации инвестору». Ассистент возвращает аккуратный отчёт со 113 цифрами.
Выгрузка в этом тесте синтетическая, но в настоящем формате Shopify: 21 687 строк и 9 659 заказов, со всем беспорядком реальной выгрузки — пересекающимися загрузками, отменёнными, тестовыми и служебными заказами, ценами с НДС. Раз данные сгенерированы, правильные ответы известны заранее.
Что нашёл пересчёт
Из 113 цифр для 35 у отдельного проверочного кода есть определение. 27 из них сошлись до цента, 8 — нет. Остальные 78 перечислены с объяснением, почему их нельзя пересчитать: другое определение, разбивка, которую проверочный код не считает, или описание того, как чистили данные.
Все восемь расхождений идут от одной строки в коде ассистента:
q['refund_prod'] = q['Refunded Amount'] * q['Subtotal'] / q['Total']
Она вычитает из каждого возврата пропорциональную долю доставки. Для 364 полных возвратов это верно: доставку в них тоже вернули. Но 439 частичных возвратов в этой выгрузке касаются только товаров, и из них строка вычла доставку, которую никто не возвращал. В итоге возвраты за квартал занижены на 505,35 €, а чистые продажи завышены: по месяцам на 207,78, 149,19 и 148,38 €, за квартал на 505,35 € и на столько же в канале интернет-магазина.
Почему повторное чтение этого не поймает
- Строка выглядит как разумное допущение. Из выгрузки не понять, входила ли доставка в частичный возврат, так что решать приходилось в любом случае. Здесь это решили молча, в комментарии к коду, о котором в отчёте нет ни слова.
- Если перечитывать тот же код, разделяешь то же допущение. Отдельный код, который не видел отчёта, его не разделяет.
- 505 € — немного на фоне 1,47 млн €. Но цифра, которую увидит инвестор, либо совпадает с данными, либо нет.
Какой вывод я делаю
До подсчёта нужно записать определения и попросить владельца ответить на вопросы, на которые данные не отвечают: входит ли доставка в частичный возврат, входит ли НДС в чистые продажи, какую дату считать. Потом пересчитать всё, что можно пересчитать, и прямо назвать то, что пересчитать нельзя, с причиной.