惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Register - Security
The Register - Security
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
MyScale Blog
MyScale Blog
V
Visual Studio Blog
云风的 BLOG
云风的 BLOG
aimingoo的专栏
aimingoo的专栏
C
Check Point Blog
J
Java Code Geeks
大猫的无限游戏
大猫的无限游戏
L
LangChain Blog
Vercel News
Vercel News
阮一峰的网络日志
阮一峰的网络日志
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
Security @ Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
人人都是产品经理
人人都是产品经理
H
Hacker News: Front Page
L
Lohrmann on Cybersecurity
T
Troy Hunt's Blog
T
Threat Research - Cisco Blogs
A
About on SuperTechFans
T
Threatpost
AWS News Blog
AWS News Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
T
Tor Project blog
Google Online Security Blog
Google Online Security Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tenable Blog
W
WeLiveSecurity
博客园 - 叶小钗
K
Kaspersky official blog
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
Hugging Face - Blog
Hugging Face - Blog
M
MIT News - Artificial intelligence
Hacker News - Newest:
Hacker News - Newest: "LLM"
Engineering at Meta
Engineering at Meta
有赞技术团队
有赞技术团队
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Secure Thoughts
小众软件
小众软件
D
Docker
爱范儿
爱范儿
C
Cyber Attacks, Cyber Crime and Cyber Security
N
News and Events Feed by Topic
S
Schneier on Security
博客园 - 三生石上(FineUI控件)
D
DataBreaches.Net

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
DataCopilot: строим мультиагентную архитектуру для работы с корпоративным хранилищем данных и документацией
Maxim_Shakur · 2026-04-28 · via Все публикации подряд на Хабре

Уровень сложностиСредний

Время на прочтение9 мин

Охват и читатели439

Кейс

Привет, Хабр! Меня зовут Максим Шакуров, я ML-инженер в VK.

Сегодня индустрия активно внедряет LLM для оптимизации рабочих процессов. Наша команда решила идти не от самой технологии, а от реальных потребностей. Чтобы найти процессы с наибольшим потенциалом для автоматизации, мы начали с аудита текущей рутины: проанализировали, с какими запросами аналитики и менеджеры приходят в чаты поддержки к инженерам Data Office (специалистам, отвечающим за сбор, хранение и миграцию корпоративных данных) и к разработчикам нашей платформы данных (команде, которая поддерживает и дорабатывает DWH). Оказалось, что львиная доля типовых запросов сводится к трём категориям:

Из этих категорий логично выросли три ключевые функции нашего будущего бота:

  • Поиск нужных данных среди тысяч витрин.

  • Генерация валидного SQL и ClickHouse-кода под задачу пользователя.

  • Ответы по внутренней документации.

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

Чтобы обозначить ценность получившегося решения, приведу числа за февраль 2026 года: нашей новой системой воспользовался 731 сотрудник, при этом Retention составил 68% (499 человек вернулись). По нашим оценкам, это ежедневно экономит десятки часов чистого времени специалистов. Статистика показывает, что инструмент помог снизить нагрузку по типовым запросам сотрудников компании.

В этой статье я расскажу, как мы реализовали такого помощника, перейдя от классического RAG к роевой архитектуре ИИ-агентов. Этот материал будет полезен разработчикам и менеджерам, которым нужно запустить масштабируемую ИИ-систему в закрытом контуре компании для работы с проприетарными данными. Я покажу, какой путь мы прошли, с какими архитектурными вызовами столкнулись и как вы можете адаптировать этот опыт для своего проекта.

Архитектура: почему рой, а не обычный RAG?

С проблематикой и верхнеуровневым представлением мы определились, далее перед нами встал вопрос реализации. Первая мысль: сделать очередного RAG-бота и в его базу загрузить всю доступную информацию. В качестве эксперимента мы действительно попробовали реализовать классический подход, но на практике столкнулись с рядом существенных ограничений.

Для начала краткая сводка, как устроен RAG.

Мы взяли:

  • Redis в качестве векторного хранилища;

  • BERT — в качестве эмбеддера (превращение текста в вектора);

  • bge-m3 — в качестве реранкера (сортирует топ N ответов из БД по релевантности);

  • LLM с поддержкой tool calling — в качестве генератора итоговых ответов и вызова внешних инструментов.

Парсим нашу базу знаний и загружаем её в Redis, предварительно превратив каждый чанк в эмбеддинг. Когда пользователь задаёт вопрос, идём в Redis по расстоянию l2 и находим в базе знаний 50 актуальных кусочков. При помощи реранкера сортируем эти 50 кусочков по релевантности (так как расстояние l2 даёт только приблизительное, неточное понимание релевантности данных и запроса). Выбираем 15 актуальных кусочков и собираем промт для модели: ЗНАНИЯ + ЗАПРОС ПОЛЬЗОВАТЕЛЯ.

Сложность масштабируемости. Из единого решения трудно вычленить отдельные логические цепочки, чтобы доработать их изолированно. Внося изменения в один блок, мы не можем гарантировать, что это не вызовет регрессию в остальных частях системы.

Снижение точности маршрутизации и генерации. Если один ИИ-агент получает комплексный запрос (например: «Найди мне таблицу X, напиши скрипт для получения колонок по условию Y и расскажи про синтаксис использованных функций»), то возникает перегрузка контекстом. Пытаясь одновременно искать данные, генерировать код и обращаться к документации, модель начинает смешивать эти предметные области. В результате страдает предсказуемость: повышается вероятность генерации синтаксически неверных функций или выбора нерелевантных таблиц

Избыточность контекста. При генерации скрипта агенту совершенно не обязательно знать логику форматирования итогового ответа. Аналогично, для поиска нужной таблицы в DWH не требуется понимание синтаксиса SQL-запросов. Объединяя все инструкции в единый системный промпт, мы неизбежно перегружаем контекстное окно модели лишним шумом, что напрямую снижает качество конечной генерации.

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

Здесь на помощь приходит LangGraph, который имеет несколько заранее реализованных архитектур для создания мультиагентных систем. Из всего многообразия подходов мы остановились на паттерне Swarm (Рой).

В отличие от жёстких иерархических структур (Supervisor-паттерн), Swarm представляет собой сеть узлов, где каждый агент — это независимый эксперт в своей узкой предметной области. У него есть собственный набор системных промптов агентов и набор инструментов. Агенты общаются между собой внутри системы, передавая контекст задачи и результаты выполнения, декомпозируя сложный запрос на атомарные шаги

Знакомство с командой: четыре агента-эксперта

  • Support (Оркестратор). Его главная цель — определить намерения пользователя, правильно скоординировать и декомпозировать запрос. Оркестратор классифицирует запрос пользователя и определяет сценарий. Содержит в себе большой промпт, описывающий общее поведение системы и пути взаимодействия всех агентов

  • Data Search (Сыщик).  Главная цель агента — найти путь к нужной витрине через RAG по корпоративному каталогу данных, и объяснить пользователю, как правильно с ней работать. Агент раскрывает бизнес-смысл найденных сущностей и подсказывает, как именно эти данные применимы к задаче. При этом важно отметить: он оперирует исключительно метаданными (схемами и описаниями полей), не имея доступа к самому содержимому таблиц.

    • Фича с доступами. Система строго соблюдает внутренние политики безопасности. Если найденная таблица находится в директории, на доступ к которой у сотрудника нет прав, то агент не раскрывает конфиденциальную информацию. Вместо этого он выдаёт точный путь к ресурсу и генерирует готовую ссылку с инструкцией для легитимного запроса доступов через внутреннюю систему управления правами (IDM).

  • Doc Assistant (Библиотекарь). Его главная цель — поиск ответов в массиве технической документации. Агент реализует RAG-подход по базе знаний, которая объединяет инструкции по SQL-диалектам платформы, BI-сервисам, системе оркестрации задач и другим инфраструктурным инструментам. Помогает разобраться в нюансах работы движков, подсказывает корректный синтаксис функций и предоставляет прямые ссылки на соответствующие разделы документации.

  • QL generator (Кодер). Его главная цель — написать корректный SQL-запрос. Агент знает проприетарный синтаксис наших БД, умеет получать схему нужной таблицы, ориентироваться во вложенности данных и определять, как именно надо обращаться к хранилищу (к конкретной таблице или диапазону партиций). Также он умеет программно валидировать свой код и исправлять ошибки по traceback’у.

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

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

Теперь самое интересное: рассмотрим, как агенты связаны и какие инструменты им доступны.


Расскажу про несколько архитектурных решений, которые мы используем для повышения качества генерирования кода:

  1. Анализ метаинформации таблиц. Если ваша платформа позволяет получать метаданные SQL- или NoSQL-таблиц, то стоит реализовать отдельный инструмент для агента. В момент генерирования запроса агент обращается к пути расположения данных, проверяет физическое существование таблиц и считывает их схему. Это даёт модели точный контекст для написания корректного скрипта с правильными именами колонок и типами данных.

  2. Предварительная валидация скриптов. Перед тем как отдать готовый код пользователю, мы программно запускаем его в базе в режиме validate (аналог Dry Run). Если возникает синтаксическая или логическая ошибка, то traceback вместе с исходным кодом автоматически возвращается агенту-генератору для самокоррекции.

  3. Делегирование при неизвестном синтаксисе. Если агент-кодер сталкивается со специфической функцией, которая не поддерживается нашей внутренней платформой, то он передаёт управление агенту документации. Вызов сопровождается чётким системным указанием: найти справку по конкретной функции и вернуть контекст обратно агенту написания скриптов для завершения задачи.

Внедрение этих подходов позволило повысить долю успешно сгенерированных запросов к БД более чем в два раза. Если вы используете стандартный и широко известный SQL-диалект без специфических внутренних модификаций, то часть этих проверок может оказаться избыточной.

Observability: как не сойти с ума при дебаге (Langfuse)

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

Существует много готовых решений для трассировки LLM-приложений (LangSmith, Langfuse и др.). Мы остановились на Langfuse. Его главное преимущество для нас — возможность развернуть self-hosted версию на серверах компании. Мы не делимся конфиденциальными трейсами со сторонними облаками и при этом из коробки получаем понятный интерфейс для аналитики.

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

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

Трейсы

Трейсы

Как выглядит трейс внутри

Как выглядит трейс внутри

Такая прозрачность позволяет нам быстро находить системные ошибки. Приведу пару примеров из практики.

Адаптация логики работы с партиционированными данными. В процессе эксплуатации системы мы выявили специфические сценарии, требующие более тонкой настройки агента SQL-генератора. В нашем хранилище логи записываются по путям с датами (например, ../1d/07-01-2026, ../1d/08-01-2026 и т. д.). Чтобы модель лучше ориентировалась во временных интервалах, мы доработали инструмент сканирования путей. Теперь если переданный путь похож на партицию, то агент автоматически анализирует соседние таблицы. Это даёт ему полный контекст для того, чтобы считывать нужный срез через конструкцию RANGE(). Такое расширение алгоритма кардинально улучшило качество генерирования скриптов для работы с историческими данными.

Нарушение маршрутизации (перехват управления). Пользователи жаловались, что иногда вместо готового скрипта система выдавала просто выдержку из документации с абстрактными примерами функций. Анализ трейсов показал причину: когда агент-кодер запрашивал у агента документации справку по неизвестной функции, то последний перехватывал контекст и сам формировал финальный ответ пользователю. Мы скорректировали системные промпты, добавив строгое правило: агент документации должен возвращать найденную информацию и обязательно передавать управление обратно агенту-кодеру. Эта небольшая правка свела к нулю случаи некорректной маршрутизации.

Боевой пример (сквозной сценарий)

Чтобы закрепить понимание архитектуры, давайте на примере тестовой среды посмотрим, как наша система шаг за шагом обрабатывает комплексный запрос пользователя.

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

  1. Оркестрация (Support Agent). Анализирует интент и понимает, что пользователю нужны как метаданные, так и готовый код. Передаёт базовый контекст агенту DataSearch.

  2. Поиск таблиц (Data Search Agent). Вызывает инструмент find_tables. Получает путь к директории в песочнице (например, //sandbox/test_env/logs/1d) и актуальную схему колонок. Формирует подробное ТЗ и передаёт управление агенту-кодеру (SQL generator Agent).

  3. Разведка (SQL generator Agent. Получает задачу и вызывает инструмент explore_path_structure, чтобы изучить физическое расположение тестовых данных перед написанием запроса. Инструмент возвращает контекст: {"type": "directory", "found_partitions": ["2026-01-01", ... "2026-01-31"], "suggestion": "USE_PARTITION_READ_FUNCTION"}.

  4. Генерация и ошибка валидации. Агент пишет первую версию SQL-кода и прогоняет его через инструмент validate_query. Движок базы данных возвращает синтаксическую ошибку: "validation_error": "Unknown builtin: RANGE. Consider using FROM RANGE(_) function(s) instead."

  5. Самокоррекция. Агент-кодер анализирует полученный traceback, исправляет синтаксис вызова функции для чтения партиций и повторно вызывает validate_query. На этот раз ответ базы успешен: {"status": "success", "message": "Query validation passed", "job_url": "https://dwh.internal/test_queries/d561..."}

  6. Финальный ответ. SWARM возвращает пользователю готовый, проверенный скрипт и ссылку на успешную валидацию на выделенном тестовом кластере.

Вот так этот конвейер можно представить в виде диаграммы:

Итоги и планы на будущее

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

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

Я не призываю вас слепо копировать текущую реализацию, но надеюсь, что наш опыт с LangGraph и подход к валидации кода будет полезен при проектировании ваших умных систем. Призываю в комментариях делиться вашим опытом и вопросами — возможно, именно ваши идеи помогут нам внедрить новые крутые подходы!