Я дал ИИ доступ к 150 тысячам документов, а он начал придумывать сотрудников
Статья написана на основе интервью с Андреем Бобковым, кофаундером и CTO QQ Coffee.
Мы обжариваем кофе высокого класса в Подмосковье, около 10 тонн в месяц. 90% продаж идёт в кофейни, рестораны и офисы, остальное через интернет-магазин и маркетплейсы. В команде 25 человек. Я пришёл в компанию как аккаунт-менеджер, работал с заказами и клиентами, а со временем взял на себя всю IT-часть.
Практически всё ведём в МоемСкладе, это ERP-система для малого и среднего бизнеса. Заказы, склад, производство, финансы, аналитика. За четыре года накопилось больше 150 тысяч документов, 3500 контрагентов и 3500 товаров.
Отдельно есть собственная система управления обжаркой, которая синхронизирует данные с МоимСкладом.
Но некоторые задачи всё равно требовали времени и ручной работы. Для кастомной аналитики нужно было обращаться к программистам. Быстро создать или изменить документ на ходу не всегда получалось. А шаблон печатной формы для отчёта проще было заказать у специалиста, чем разбираться самому.
Особенно остро это чувствовалось в работе менеджеров на выезде. Я сам через это прошёл, когда ещё был аккаунт-менеджером. Ездишь к клиентам на дегустации, помогаешь настраивать кофейный аппарат, и по дороге нужно быстро оформить заказ. Мобильное приложение не всегда удобно, интернет нестабильный, данные теряются. Возвращаешься в офис и начинаешь переспрашивать клиента.
Хотелось, чтобы можно было просто продиктовать в телефон «оформи заказ для такого-то контрагента на его обычные позиции» и не думать об остальном. В какой-то момент я понял, что с появлением языковых моделей это стало возможно. На разработку от первых экспериментов до запуска ушло три месяца.
Почему нельзя просто подключить ИИ к данным
Первое, что я попробовал, это дать ИИ прямой доступ к данным через MCP-протокол. MCP это что-то вроде универсального переходника между ИИ и внешними сервисами. Его разработала компания Anthropic, создатели ИИ-ассистента Claude. Суть простая: пользователь спрашивает, ИИ подключается к нужной системе, получает данные и отвечает. Но быстро выявились две проблемы.
Первая, объём. У языковых моделей есть ограничение на количество текста, которое они обрабатывают за раз. Это называется «окно контекста». Наши 150 тысяч документов туда не влезают даже частично. А сократить данные нельзя, они нужны для расчётов.
Вторая, арифметика. ИИ неверно считает, а потом ещё и убеждает, что всё корректно. Для языковых моделей числа это просто набор символов. Я несколько раз проверял результаты расчётов и находил ошибки, при этом модель уверенно говорила, что всё правильно. Если каждый раз перепроверять, это уже не оптимизация.
Вместо того чтобы скармливать ИИ данные, я дал ему возможность самому писать код для их получения и обработки. ИИ хорошо генерирует код, а код хорошо считает. Так мы используем сильную сторону модели и компенсируем слабую.
Мост к данным
Чтобы ИИ мог писать код для работы с МоимСкладом, ему нужен инструмент, который переведёт структуру данных на язык программирования.
У МоегоСклада есть API, то есть способ для других программ получать и менять данные. Заказы, остатки, контрагентов и всё остальное. API удобный, с ним приятно работать. Но одно дело получить данные, и другое, использовать их в коде.
Наши программы написаны на TypeScript. Этот язык строго различает типы данных, не даёт перепутать число с текстом или дату с названием. А в МоёмСкладе сотни сущностей, полей и связей, и каждое поле должно быть правильно описано, чтобы код работал без ошибок. Вручную это поддерживать невозможно.
Поэтому я написал библиотеку moysklad-ts. По сути это переводчик: берёт всю модель данных МоегоСклада и делает её понятной для TypeScript.
Саму библиотеку я написал ещё за год до ИИ-истории, просто для удобства разработки. Но когда появилась идея с ассистентом, она оказалась ключевой деталью. Агент-программист видит типизированную модель в библиотеке и понимает, как работать с МоимСкладом. Получился инструмент, одинаково понятный и человеку, и машине.
Библиотека открытая, лежит на GitHub и опубликована в npm. Любой может установить и использовать.
Как устроены агенты
Пользователь видит обычный чат. Пишет запрос, получает ответ. Но под капотом работает цепочка из трёх слоёв, и каждый нужно было не только построить, но и обучить.
Обучение тут не тренировка модели с нуля, на это нужны миллиарды долларов. Это дообучение уже готовой модели с помощью подробных инструкций, контекста и примеров, чтобы она понимала специфику конкретного бизнеса.
Агент-оркестратор
Главный ассистент, к которому приходят все запросы. Его задача как у генерального директора: понять, что нужно пользователю, и передать задание нужному специалисту. Пишешь «привет, как дела», оркестратор просто отвечает. Пишешь «покажи последние 10 заказов», он понимает, что нужны данные из МоегоСклада, и вызывает агента-программиста.
Я подходил к его обучению как к онбордингу нового сотрудника. Пришёл человек, ничего не знает о кофе. Надо объяснить, чем занимаемся, какие отделы, какие процессы, какие IT-ресурсы используем. Загрузил функциональную структуру компании, внутренние документы для обучения и информацию о кофейной специфике. Мне хотелось сделать не просто чат-бота, а ассистента, который реально понимает, как устроена наша работа. Потому что насколько бы модель ни была продвинутой, без контекста бизнеса она бесполезна.
Агент-программист
Получив задачу от оркестратора, этот агент пишет код для получения и обработки данных, используя библиотеку moysklad-ts.
С его обучением было сложнее. Документация МоегоСклада это тысячи страниц, ни один агент не способен обработать всё разом. Поэтому я писал для него что-то вроде книги. На первой странице предисловие: МойСклад, российская ERP-система, сущности, заказ покупателя, счёт покупателя, платежи. Дальше оглавление со ссылками на подробности по каждой сущности.
Когда агент получает запрос, он заглядывает в оглавление, находит нужный раздел, загружает информацию про конкретную сущность и на основе этих данных пишет код.
Песочница
Сгенерированный код выполняется в изолированном окружении, так называемой песочнице. Это как отдельный компьютер, который не имеет доступа ко всему остальному. Код работает внутри, но не может навредить основной системе. Без изоляции пользователь мог бы попросить «напиши программу, которая взломает сервер», и агент послушно выполнил бы.
Настройка взаимодействия
Собрать архитектуру это полдела. Заставить агентов корректно работать вместе оказалось куда сложнее. Итераций было очень много. Даже формулировка слов влияет на результат. Пишешь оркестратору: «Никогда не обращайся к пользователю на ты». Он всё равно тыкает. Сидишь и думаешь, я же дал чёткую инструкцию, что не так.
Перечитал огромное количество материалов о промптах и форматах дополнения контекста. Цикл был один и тот же: написал инструкции, протестировал, увидел ошибку, переписал. И так много раз. Отдельно пришлось настраивать передачу задач между агентами, чтобы оркестратор формулировал запросы так, как программист их понимает.
Помимо веб-интерфейса я сделал Telegram-бот для работы на ходу. Функционал у него ограниченный, но для менеджеров это оказалось удобно: можно надиктовать голосовое сообщение с заказом прямо из такси.
Защита и отладка
Защита данных
Мы даём ИИ доступ к бизнес-данным. Понятно, что бесконтрольный доступ это плохая идея.
Я разделил права на два уровня. На чтение агент имеет полный доступ без ограничений, может получить любые данные для анализа и подтянуть актуальные цифры из МоегоСклада. Но когда дело касается изменений, то есть создания, редактирования или удаления документов, перед каждым действием появляется окно подтверждения. Как в Word, когда закрываешь несохранённый документ.
На практике это работает так. Менеджер пишет: «Создай заказ для такого-то контрагента с его обычными позициями, оформи на счёт в Альфа-банке». Агент сам находит контрагента, смотрит прошлые заказы, определяет обычные позиции, находит банковский счёт. Собирает всё и показывает результат. Такой клиент, такие позиции, сумма такая-то. Всё верно? Нажимаешь «Да», изменения вносятся. Без одобрения ничего не происходит.
Дополнительно помогает система аудита в МоёмСкладе, где видны все изменения по каждому аккаунту. Сейчас я работаю над тем, чтобы действия через ИИ-агента привязывались к конкретному пользователю. Не просто «админский аккаунт удалил заказ», а «Вася Пупкин удалил заказ через ИИ-агента». Сразу понятно, к кому обращаться.
Факапы
На этапе обучения их хватало, и некоторые были довольно забавные.
Говоришь агенту «получи 10 заказов», а он начинает тянуть тысячу. Всё ломается. У нас одно производственное задание в МоёмСкладе занимает десятки страниц по позициям, а агент пытался получить его целиком, думая, что производство небольшое.
Я сначала не мог понять, почему он так решил, пока не сообразил, что он просто не знает масштабов. Пришлось поставить физическое ограничение на объём запросов и отдельно объяснить агенту, что у нас везде большие данные.
Ещё была проблема с параллельными запросами. Спрашиваю, сколько бразильского кофе на складах. Агент видит список складов и отправляет пять запросов параллельно. С одной стороны, грамотно, быстрее получает данные. Но МойСклад при такой лавине отвечает «давай помедленнее». Пришлось подрезать скорость.
И галлюцинации. Спрашиваю, чем у нас занимается сотрудник Петя. Агент не видит Петю в данных, но уверенно отвечает, что Петя работает в производстве на фасовке. Говорю, у нас нет никакого Пети. Он: ой, извините, я так решил. Это было неприятное открытие, потому что ты начинаешь доверять системе, а она придумывает данные.
Решения были комплексные. Более продвинутые модели, дополнительные инструкции и, главное, тесты. Я пишу бенчмарки: создаю вымышленные сценарии с известными входными данными и проверяю, что ответ соответствует ожиданиям. Это ловит регрессии, когда после новой инструкции агент стал лучше в одном месте, но просел в другом. Любые изменения проверяю на вымышленных данных до того, как агент становится доступен сотрудникам.
Технологический стек
TypeScript — основной язык, для которого написана библиотека moysklad-ts.
Cloudflare — облачная платформа для ИИ-агентов и песочницы. Поддерживает несколько пользователей одновременно, умеет восстанавливаться после прерываний и плохих соединений. Всё работает на тарифе за 400 рублей в месяц.
Cloud.ru — российское облако для основного бэкенда и хранения данных.
Что получилось и что дальше
Сейчас ассистентом пользуется вся команда. Типичные запросы на каждый день: «Какие любимые сорта кофе у клиента X?», «На какую сумму мы продали товар M в четвёртом квартале? Сравни с предыдущим», «Создай заказ для X с товарами, доставка стандартная по их адресу». То, на что раньше уходило несколько минут в интерфейсе МоегоСклада, агент делает за полсекунды.
В ближайших планах автоматическая генерация шаблонов печатных форм. Сейчас, чтобы создать шаблон, нужно самому разбираться в формулах или заказывать у программиста за несколько тысяч рублей.
Хочу, чтобы можно было просто написать «сделай шаблон для списка счетов покупателей с суммой, оплаченной суммой и контрагентом» и получить готовый файл.
И визуализация данных. Сейчас для графика я вручную выгружаю данные в Excel и строю диаграмму. Хочу, чтобы агент сам получал данные и выводил графики прямо в чате. Таблицы удобны, но для принятия решений нужна визуализация.
Решение пока работает только с нашим аккаунтом. Но если довести его до публичного уровня с мультиаккаунтностью и адаптацией под разные виды бизнеса, им смогут пользоваться и другие компании.
Мы ведем блог для малого бизнеса. Рассказываем новости для предпринимателей, ошибки и лайфхаки в учете, инструменты продвижения, обновления сервиса МойСклад.
Автор: PaskalEnotov

