Почему регулярки сдают позиции
Знакомая история: прилетает файл, первая строка — название прайса, вторая пустая, заголовки где-то на седьмой. Колонки называются то «Кол-во», то «qty», то вообще «шт». Плюс рукописные пометки в ячейках. Я начинал с маппинга и пары десятков правил. Пару недель работало, потом приходил файл с объединёнными ячейками или артикулом, склеенным через дефис, и всё разваливалось. Правила росли до сотни и начинали конфликтовать.
В какой-то момент стало ясно: задача требует понимания структуры, а не просто сопоставления строк. Вот тут и нужны модели.
Что я называю ИИ-агентом
Не просто один вызов модели. Это цепочка: восприятие файла, план, инструменты и проверка результата. Модель — только часть, причём не самая важная. Главное — обвязка, которая ловит её за руку и не даёт галлюцинировать.
В моём случае агент сам ищет строку заголовков, маппит колонки к внутренней онтологии, проверяет артикулы по базе и, если что-то непонятно, отправляет строку человеку.
Начинал не с промпта, а с онтологии
Сначала я вместе с клиентом выписал все нужные поля: артикул, код, наименование, количество, единица, цены, скидка, срок. Получилось около пятнадцати сущностей и куча вариантов названий.
Агент не угадывает, а сопоставляет с этим списком. Если колонка не подходит ни под одну сущность — она «неизвестна» и дальше не идёт.
Пайплайн вышел простой:
- Разбиваем файл на листы, модель ищет прямоугольник данных.
- Берём заголовки и маппим к онтологии.
- Валидируем строки обычным кодом: артикул в справочнике, количество — число и т.д.
- Всё подозрительное — в отдельный лист для человека.
Модель трогает только два шага. Остальное — обычный Python. Чем меньше решений на модели, тем меньше ошибок.
Где споткнулся и что поправил
- Объединённые ячейки. Пришлось разъединять и копировать значения вниз.
- Единицы измерения. Добавил few-shot примеры в промпт, модель стала нормально нормализовать «шт», «pcs», «упак.».
- Комментарии в числовых колонках. Если в ячейке количества есть текст — вся строка уходит человеку. Ошибка здесь стоит дорого.
- Выбор модели. Для маппинга хватило компактной, для поиска шапки взял посильнее. Разные модели на разных шагах — нормально.
Что изменилось
Раньше младший менеджер тратил целый день на пачку новых прайсов. Сейчас файл падает в папку, через пару минут строки загружены, а спорные — в отдельном листе. Менеджер только добивает остальное. Голова освободилась: он не сверяет глазами, а принимает решения.
Бонусом онтология сама по себе оказалась полезной — клиент впервые чётко описал, какие данные вообще нужны в закупках.
Главный вывод
Агент работает, когда ты сначала чётко описываешь задачу без всяких моделей: что на выходе, какие данные валидны, что делать с непонятным. Тогда обвязка из кода и проверок делает остальное, а модели остаётся только понимать и сопоставлять. Без такой основы любой агент превращается в лотерею.
