DataCopilot: как мы построили мультиагентную систему для работы с корпоративными данными

DataCopilot: как мы построили мультиагентную систему для работы с корпоративными данными

Меня зовут Максим Шакуров, я ML-инженер в VK. В этой статье — рассказ о создании DataCopilot, ИИ-системы, которая помогает сотрудникам находить данные, генерировать SQL и работать с внутренней документацией.

Мы начали с анализа реальных запросов, поступающих в поддержку Data Office и команду платформы данных. Большинство из них сводились к трём типам:

  • Поиск нужных данных среди тысяч витрин.
  • Генерация валидного SQL и ClickHouse-кода.
  • Ответы на вопросы по внутренней документации.

Из этих задач родились три ключевые функции будущего бота. DataCopilot помогает ориентироваться в каталоге витрин, объясняет, что и где хранится, подсказывает, как заполнить заявку на доступ, отвечает на вопросы по документации и генерирует готовые SQL-скрипты для ETL-процессов.

За февраль 2026 года системой воспользовались 731 сотрудник, а retention составил 68% — 499 человек вернулись. По нашим оценкам, это экономит десятки часов рабочего времени ежедневно и снижает нагрузку на поддержку.

Почему мы выбрали мультиагентную архитектуру

Изначально мы рассмотрели классический RAG-подход: Redis как векторное хранилище, BERT для эмбеддингов, bge-m3 как реранкер и LLM с поддержкой tool calling. Но столкнулись с ограничениями:

  • Сложность масштабирования: изменения в одном блоке могут вызвать регрессию в других.
  • Перегрузка контекста: при сложных запросах модель смешивает предметные области — например, одновременно ищет таблицы, пишет код и цитирует документацию.
  • Избыточность: агенту, генерирующему SQL, не нужно знать, как форматировать ответ пользователю.

Решение — разнести функции по независимым агентам. Мы выбрали архитектуру Swarm (Рой) с помощью LangGraph. Каждый агент — эксперт в своей узкой области, с собственными промптами и инструментами. Они общаются между собой, передавая контекст и результаты, и декомпозируют сложные задачи на атомарные шаги.

Четыре агента-эксперта

  • Support (Оркестратор): определяет интент пользователя, классифицирует запрос и координирует работу других агентов. Содержит общий промпт системы и управляет маршрутизацией.
  • Data Search (Сыщик): ищет нужные витрины через RAG по каталогу данных. Объясняет, как работать с таблицей, но не имеет доступа к содержимому — только к метаданным. Если у пользователя нет прав, агент генерирует ссылку для запроса доступа через IDM.
  • Doc Assistant (Библиотекарь): ищет ответы в технической документации — по SQL-диалектам, BI-сервисам, оркестраторам задач. Подсказывает синтаксис и даёт ссылки на источники.
  • SQL Generator (Кодер): пишет корректный SQL. Знает проприетарный синтаксис, получает схемы таблиц, работает с партициями и умеет валидировать код по traceback’у.

Важно: подключение к хранилищу осуществляется через ограниченную сервисную роль. Агенты работают только с метаданными, а все действия логируются для аудита.

Агенты физически разделены — каждый в своём сервисе, доступ к ним через HTTP. Это даёт устойчивость, удобное развёртывание и возможность обновлять компоненты независимо. Хотя в компактных системах все агенты могут жить в одном сервисе.

Ключевые архитектурные решения

  1. Анализ метаинформации: агент-кодер запрашивает схему таблицы перед генерацией SQL. Это обеспечивает точность — правильные имена колонок и типы данных.
  2. Предварительная валидация: перед отправкой пользователю скрипт запускается в режиме validate. При ошибке traceback возвращается агенту для самокоррекции.
  3. Делегирование при неизвестном синтаксисе: если функция неизвестна, агент-кодер передаёт запрос агенту документации. Тот находит справку и возвращает контекст, не прерывая цепочку выполнения.

Эти подходы увеличили долю успешных запросов более чем в два раза. Для стандартных SQL-диалектов часть проверок может быть избыточной, но в проприетарных средах они критичны.

Наблюдаемость: как отлаживать мультиагентную систему (Langfuse)

Анализировать логи в мультиагентной системе сложно — сообщения смешиваются, теряется контекст. Мы выбрали Langfuse с self-hosted развёртыванием: не делимся данными с внешними облаками и получаем удобный интерфейс для аналитики.

Каждый запрос пользователя — отдельный трейс. В нём видно:

  • историю сообщений,
  • вызовы инструментов,
  • тайминги,
  • логику передачи управления между агентами.

Это помогло решить реальные проблемы:

  • Работа с партициями: мы улучшили инструмент разведки — теперь агент анализирует соседние партиции и использует конструкцию RANGE() для временных срезов. Это резко повысило качество скриптов по историческим данным.
  • Нарушение маршрутизации: агент документации иногда перехватывал управление и сам отвечал пользователю. Мы добавили строгое правило — возвращать информацию и передавать управление обратно. Ошибки маршрутизации исчезли.

Пример работы: сквозной сценарий

Запрос: «Где лежат логи нашего тестового стенда (sandbox) и напиши скрипт для подсчёта количества ошибок 404 за январь»

  1. Оркестратор (Support): определяет, что нужны и данные, и код. Передаёт контекст агенту Data Search.
  2. Data Search: находит путь //sandbox/test_env/logs/1d и схему таблицы. Передаёт задачу SQL Generator.
  3. SQL Generator — разведка: вызывает explore_path_structure, получает список партиций за январь 2026 и рекомендацию использовать функцию чтения партиций.
  4. Генерация и ошибка: агент пишет запрос с функцией RANGE, но валидация возвращает ошибку: «Unknown builtin: RANGE. Use FROM RANGE(_) instead».
  5. Самокоррекция: агент исправляет синтаксис, повторно валидирует — на этот раз успешно.
  6. Финальный ответ: пользователь получает готовый скрипт и ссылку на успешную проверку в тестовом кластере.

Итоги и планы

Мы создали масштабируемую систему, где каждый агент — независимый модуль. Можно обновлять промпты, добавлять инструменты и дебажить отдельные части, не нарушая общую логику.

Сейчас мы работаем над следующим шагом: научить агентов запускать тяжёлые скрипты в фоне и возвращать не код, а готовые дашборды и графики с результатами.

Наша реализация — не шаблон для копирования, но опыт с LangGraph, валидацией и наблюдаемостью может быть полезен при создании ИИ-систем в закрытых корпоративных средах.

Читать оригинал