Technology
Как мы строим Norman: AI-агенты, которые делают настоящую бухгалтерскую и налоговую работу, и системы, которые держат их в норме. Заметки прямо от команды.
У половины наших фоновых задач был дедлайн, который никто не выбирал
Дефолт из командной строки в нашем образе контейнера молча ограничивал каждую фоновую задачу 120 секундами, включая батчи с десятками вызовов модели. Поправить число было простой половиной работы. Сложной было научить задачи умирать.
Мы не пишем тест-кейсы для нашего ИИ. Их пишет продакшен.
Golden dataset, написанный руками, портится на той же неделе, когда вы его составили. Наш регрессионный набор для ИИ-категоризации генерируется из реальных правок пользователей, а промах должен повториться три раза, прежде чем заслужит тест. Ниже сам пайплайн, цифры за ним и шарнир, который всё это время был тихо сломан.
У нашего агента 102 инструмента. Вся инженерия в том, чего он не видит
Все рефлексы в дизайне агентов сейчас работают на сложение: больше инструментов, больше инструкций, больше памяти. Norman отдаёт 102 инструмента и 19 плейбуков, и почти каждое архитектурное решение было вычитанием. Вот что мы отнимаем у модели и почему агент делает свою работу лучше именно потому, что никогда не знает, на каком он шаге.
Наш пакетный планировщик на самом деле load balancer
Каждую ночь Norman балансирует на одних и тех же воркерах двух очень разных «жильцов»: терпеливые, сетевые банковские синхронизации и голодные, вычислительно тяжёлые AI-джобы, которые читают чеки и категоризируют постоянный поток транзакций. Вот как мы относимся к планировщику как к load balancer, измеряем давление очередей по каждой нагрузке и куда ведём это дальше: раскладываем тяжёлую AI-работу по живой нагрузке, а не по вручную выбранной минуте крона.
Как мы отслеживаем каждый прогон ИИ-агента, не сохраняя твои данные
Каждый вызов модели в Norman оставляет аудиторский след: какой воркфлоу, какая модель, во сколько обошёлся, сколько занял. Чего он не оставляет, это твои чеки и банковские данные. Мы храним хеши, а не payload. Вот слой наблюдаемости за нашими агентами.
Как наш категоризатор учится на одном-единственном исправлении
Каждая транзакция в Norman получает категорию, и большинство из них ни разу не касаются модели. Интересная инженерия тут не в LLM: она в том, чтобы превратить одно ручное исправление в память конкретной компании, которая никогда не протекает наружу, обязана заслужить доверие и о которой можно доказать, что она держится. Вот как это устроено.
Как мы собрали агента, который сам подаёт твою декларацию по НДС
Autofiling полностью готовит и подаёт твою немецкую UStVA, от начала до конца. Сложным было никогда не само модель, а то, как сделать стохастического агента достаточно безопасным, чтобы он совершал юридически значимую подачу. Вот как устроен дизайн.