Коротко
Почему регулярный отчёт съедает день в неделю?
Знакомая картина: каждую неделю нужно собрать отчёт. Цифры посещаемости - из счётчика на сайте. Заявки - из базы. Данные партнёра - файлом на почте. Дальше всё это сводится в одну таблицу руками, и на это уходит рабочий день.
Больно тут не от объёма. Больно от того, что работа одинаковая, а автоматизировать её страшно: слишком много мелких договорённостей, которые живут в голове того, кто собирал отчёт прошлый раз.
Я собирал такой контур для регулярной отчётности маркетингового агентства: три источника, недельная сетка, готовая книга-шаблон, куда пишутся значения. Расскажу, что там оказалось настоящей сложностью, потому что она не там, где её ждут.
Выгрузить данные - самая простая часть. Настоящая работа начинается, когда выясняется, что источники между собой не согласованы. И вот тут самое интересное: несогласованность видна не сразу, а на второй-третий период, когда отчёт уже сдали.
С чего начинать: эталон вместо технического задания
Это правило я выучил на живом проекте, и оно экономит недели.
Прежде чем поручать сборку агенту, возьми один период, который уже закрыт и сдан. Тот, где числа проверял человек и заказчик их принял. Это твой эталон.
Задача первой версии - не «собрать отчёт», а воспроизвести эталон. Полностью, до последней цифры. Совпало - логика верна, дальше можно считать новые периоды. Не совпало - у тебя на руках конкретное расхождение, и оно всегда указывает на реальную разницу в понимании данных.
На эталоне у меня всплыли обе ключевые ловушки проекта: несовпадение формулировок и путаница с метками источников. Без него они уехали бы в сданный отчёт и вернулись бы вопросом от заказчика.
Собери его руками. Один период, честно посчитанный человеком, - это день работы, который окупается на первой же автоматической сборке. Автоматизация без точки отсчёта проверяется только доверием, а доверие тут плохой инструмент.
Что спросить у каждого источника?
Списком, который стоит пройти до того, как писать первую строчку кода:
| Что уточнить | Почему это важно |
|---|---|
| Способ доступа: выгрузка, база, ключ доступа | от этого зависит, можно ли вообще автоматизировать |
| Часовой пояс и фильтры | счётчик может считать без роботов или со всеми, и цифры разойдутся |
| За период или нарастающим итогом | вторая неделя в нарастающем файле - это не вторая неделя |
| Кто и в каком виде присылает файл | человек в отпуске - и данные приходят в другом формате |
| Пускает ли источник с адреса, где идёт расчёт | база вполне может резать сторонние подключения |
Последний пункт выглядит технической мелочью и стоит дороже всех. Доступ, который работает у тебя на компьютере, может не работать оттуда, где расчёт крутится по расписанию.
Проверять это надо запросом, а не устным подтверждением. Фраза «да, доступ есть» и живой ответ сервера - разные вещи, и расходятся они регулярно.
Если у нужной системы вообще нет программного доступа, это не тупик: подробно разбирал варианты в материале про то, как забрать данные, когда у площадки нет API.
Словарь соответствий: главная работа проекта
Вот место, где ломается большинство попыток.
В базе причины отказа записаны так, как их формулировал оператор. В отчёте у заказчика они названы своими словами. На моём проекте они не совпали ни одним словом. Ни одним - при том, что смысл был тот же самый.
Это значит, что между источником и отчётом должен жить словарь: явная таблица, где каждому значению из системы сопоставлена строка отчёта. Без неё агент будет угадывать по смыслу, и в половине случаев угадает правильно. Половина - плохая точность для отчётности.
Что должно быть в этом словаре:
Полный список значений из источника
Не по памяти, а выгрузкой всех уникальных значений за большой период. То, что встречается раз в квартал, всплывёт именно тогда, когда тебя не будет рядом.
Соответствие каждой строке отчёта
Одно значение - одна строка. Не подходит ни к одной - заводи явную категорию «прочее», а не оставляй пустоту.
Правило приоритета
Если строка подходит под две категории сразу, укажи, какая выигрывает. Иначе результат будет зависеть от порядка обработки, а он однажды поменяется.
Что делать с незнакомым значением
Правило простое: не угадывать, а останавливаться и спрашивать. Незнакомое значение в отчётности хуже, чем задержка на день.
Этот словарь - и есть та часть знания, которая раньше жила в голове человека, собиравшего отчёт. Автоматизация начинается с того, что ты её достаёшь и записываешь.
Где число живёт в двух местах
Отдельная ловушка готовых форм. Заказчик присылает книгу-шаблон, куда надо вписывать значения. Ты вписываешь число в нужную ячейку и радуешься. А это же число, оказывается, дублируется во втором листе, и туда оно не записалось.
Дальше происходит худшее из возможного: отчёт уходит, и расхождение внутри одного документа находит заказчик.
Что с этим делать:
- Найди все места, где живёт одно значение. До первой автоматической сборки, а не после.
- Заведи проверку на совпадение. После записи расчёт сам сверяет пары чисел и ругается, если они разошлись.
- Не трогай формулы. В чужой книге часть ячеек - расчётные. Записал в них значение - сломал документ, и заметно это станет через период.
- Помечай, какие листы неприкосновенны. Иногда правило звучит буквально так: пишем ровно одну ячейку, остальное не трогаем даже по форматированию.
Проверка «сходятся ли числа между собой» - это тот же принцип приёмки, о котором писал в материале про проверку работы ИИ-агента без технического бэкграунда. Машина проверяет то, что человек проверял бы глазами и однажды пропустил.
Периоды: список дат вместо правила
Случай из практики. Отчётность идёт по неделям. Первая неделя сдана, всё сходится. После этого заказчик переопределяет границы следующих периодов: у него поменялись условия акции.
Если границы зашиты правилом «прибавляй семь дней», расчёт продолжит считать по-старому и выдаст красивые числа за неправильный отрезок. Ошибка, которую по документу не видно: цифры выглядят нормально, подпись выглядит нормально, а внутри они за разные периоды.
Правило, которое я держу с тех пор: даты живут в одном месте, отдельным списком, и подписи в отчёте сверяются с ним на каждом прогоне. Заодно - явный ответ на вопрос, включается ли последний день в период. Это тот случай, где неопределённость стоит одного дня продаж в цифрах.
Ещё пара мелочей того же семейства: одна неделя в году бывает длиннее семи дней, а «месяц» у финансистов и маркетологов иногда начинается в разные дни.
Как поставить эту задачу агенту?
Порядок, который работает:
- Опиши источники словами. Что откуда берётся, в каких единицах, за какой период. Это и есть половина задачи.
- Дай эталон. Файл с числами, которые должны получиться. Прямо скажи: результат должен совпасть с ним полностью.
- Двигайся по одному источнику. Первый подключён и сверен - берём второй. Так место поломки всегда очевидно.
- Отдельным шагом - запись в форму. Расчёт и запись в чужую книгу - разные задачи, и вторая ломает документы чаще.
- Попроси отчёт о расхождениях. Не «всё сошлось», а таблица: где сошлось, где нет и на сколько.
Агент хорошо справляется с этой работой при одном условии: у него есть, с чем сверяться. Без эталона он тоже выдаст результат - уверенный и правдоподобный, и проверить его будет нечем.
Про то, как связать собранные данные с презентацией, чтобы отчёт не пересобирали руками каждый раз, писал отдельно в материале про живые графики вместо картинок.
Частые вопросы
Частые вопросы
Главный вывод
Главное, что стоит запомнить: технически данные собираются легко. Разваливается всё на том, что источники говорят на разных языках, и переводчика между ними никто не записал.
Практический минимум: возьми один сданный период как эталон, выпиши словарь соответствий, зафиксируй границы периодов списком дат и проверяй, что число не разошлось само с собой внутри отчёта.
Посмотри на свой регулярный отчёт. Если завтра его будет собирать другой человек, какие договорённости он не сможет угадать?
Источники
- Extract, transform, load - как устроен перенос данных между системами, Википедия
- Single source of truth - принцип единственного места для значения, Википедия
- Data cleansing - обзор подходов к очистке и согласованию данных, Википедия
- Comma-separated values - формат выгрузок и его подводные камни, Википедия
