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

推荐订阅源

V
Vulnerabilities – Threatpost
Blog — PlanetScale
Blog — PlanetScale
博客园_首页
Y
Y Combinator Blog
The Cloudflare Blog
V
V2EX
Microsoft Security Blog
Microsoft Security Blog
V
Visual Studio Blog
MyScale Blog
MyScale Blog
Martin Fowler
Martin Fowler
T
Tailwind CSS Blog
P
Privacy International News Feed
S
Securelist
T
The Blog of Author Tim Ferriss
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Tor Project blog
P
Proofpoint News Feed
Project Zero
Project Zero
D
Darknet – Hacking Tools, Hacker News & Cyber Security
MongoDB | Blog
MongoDB | Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
H
Help Net Security
美团技术团队
The GitHub Blog
The GitHub Blog
SecWiki News
SecWiki News
酷 壳 – CoolShell
酷 壳 – CoolShell
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Security Latest
Security Latest
NISL@THU
NISL@THU
www.infosecurity-magazine.com
www.infosecurity-magazine.com
S
Secure Thoughts
Cyberwarzone
Cyberwarzone
Scott Helme
Scott Helme
IT之家
IT之家
Last Week in AI
Last Week in AI
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
C
CERT Recently Published Vulnerability Notes
Google DeepMind News
Google DeepMind News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
P
Privacy & Cybersecurity Law Blog
A
About on SuperTechFans
Microsoft Azure Blog
Microsoft Azure Blog
M
MIT News - Artificial intelligence
Spread Privacy
Spread Privacy
S
Schneier on Security
L
Lohrmann on Cybersecurity
S
Security Affairs
Apple Machine Learning Research
Apple Machine Learning Research
爱范儿
爱范儿
云风的 BLOG
云风的 BLOG

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

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет 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 миллионов точек без потерь
Строим первую линию техподдержки на n8n за 250$ в месяц. Часть 1
javdet12 · 2026-05-14 · via Все публикации подряд на Хабре

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

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

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

Кейс

Привет! Если ты, как и я, держишь инфраструктуру небольшой команды, наверняка знаком с ситуацией: разработчиков становится больше, а DevOps-отдел при этом не растёт. С приходом vibe-coding'а эта диспропорция стала особенно заметной — у нас в студии команда разработки выросла раза в полтора буквально за пару месяцев, потому что каждый продакт-менеджер захотел свой мини-аппликейшен. Параллельно подкинули головной боли участившиеся проблемы с доступностью приложения из ряда регионов.

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

Так появилась идея переложить первую линию на AI-агента. К тому моменту мы уже автоматизировали анализ инцидентов по сработавшему алерту (об этом я писал в предыдущей статье), и опыт показал, что подход рабочий. Логичным продолжением стало расширение схемы на ручные обращения в чате.

В этой статье — первой из двух — расскажу, как мы:

  • классифицировали поток обращений за последний год и выделили категории, которые имеет смысл автоматизировать;

  • реализовали классификатор на n8n с интеграцией Mattermost через MCP;

  • построили ассистента по CI/CD-инцидентам как первую боевую ветку обработки;

  • научились разбирать вложения (скриншоты ошибок, файлы с логами);

  • настроили нормальную отчётность об ошибках в самих workflow.

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

Все workflow и системные промпты выложены отдельно — ссылка в конце статьи.

Подготовка: классификация обращений

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

  1. Модификация инфраструктуры — изменения в текущей инфраструктуре, добавление типовых ресурсов.

  2. Новая инсталляция — развёртывание новых систем и интеграций, которых раньше не было.

  3. Инцидент — что-то перестало работать в текущей инфраструктуре.

  4. CI/CD — падающие сборки, неудачные тесты и деплои.

  5. Вопрос — общие вопросы по нашей инфраструктуре.

  6. Анонс — сообщения информационного характера: например, о плановых техработах.

  7. Другое — всё, что не попало ни в одну из категорий выше.

Основная масса запросов оказалась в категориях 3–5 — именно их мы и взяли в работу в первую очередь. Категории 1–2 требуют согласований и почти всегда участия инженера, так что автоматизировать их смысла нет. Анонсы агенту обрабатывать не нужно — достаточно корректно их распознавать и не дёргать дежурного.

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

Классификатор

На первый взгляд всё выглядело просто: создаём бота в Mattermost, настраиваем webhook в n8n на сообщения с упоминанием этого бота, прогоняем через LLM, получаем категорию.

Пример

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

Вместо того чтобы дёргать Mattermost API напрямую из n8n, я переложил эту задачу на агента — благо у нас уже есть mattermost-mcp, который умеет читать сообщения в каналах и тредах. Агент сам решает, нужно ли подтянуть историю треда, и подтягивает её, если контекст того требует. В системном промпте необходимо описать как это сделать, а также еще несколько моментов

  • Описания категорий и примеры.

  • Ожидаемый формат выходных данных

{
  "category": "<category_key>",
  "confidence": <0.0-1.0>,
  "summary": "<one sentence summary in the same language as the user message>",
  "acknowledge": "<a short response that you accepted the request and started working on it>",
  "is_thread": <true|false>,
  "parent_post": "<post_id to use as root_id when replying — ALWAYS set>"
}

В user промпте я дополнительно передаю channel_id, channel_name, post_id, user_name это поможет классификатору лучше ориентироваться в сообщениях

В качестве модели использую Sonnet или GPT-5 Codex — на классификации обе показывают сопоставимое качество.

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

После того как ответ агента получен и провалидирован на корректность полей, нужно определить дежурного инженера — он может понадобиться, если автоматизированная обработка не справится. Дежурства у нас ведутся в Google Calendar, поэтому пришлось настроить OAuth2-доступ к нему по документации n8n.

Пример

После определения категории и дежурного запускается соответствующий sub-workflow. Параллельно с этим в Mattermost уходит сообщение-acknowledge, чтобы автор обращения видел: запрос принят и обрабатывается. Это важная деталь — без неё человек продолжает писать в тред «эй, кто нибудь смотрит?», что портит всю задумку.

Помощник по CI/CD

CI/CD — одна из самых частых категорий обращений, поэтому с неё и начал. Внушительная доля таких проблем решается без участия инженера: упавшие из-за временной недоступности репозитория сборки, флаки-тесты, неправильно сконфигурированные пайплайны, истёкшие токены.

На входе sub-workflow ожидает структуру с данными об обращении:

{
  "message": "Запрос в чате",
  "post_id": "id поста в Mattermost",
  "channel_id": "id канала в Mattermost",
  "channel_name": "Название канала в Mattermost",
  "user_name": "Имя отправителя",
  "user_id": "id отправителя",
  "file_ids": ["Список id вложений"],
  "category": "Одна из категорий",
  "confidence": "Уровень уверенности в выборе",
  "summary": "Краткое описание обращения",
  "is_thread": "Сообщение пришло из треда или нет",
  "thread_root_id": "Начальное сообщение в треде, если оно есть",
  "on_call_user": "Имя дежурного"
}

Разбор вложений

Чаще всего обращение по CI приходит в формате «упала сборка» + скриншот ошибки. Такого описания явно недостаточно, чтобы найти конкретную сборку, поэтому перед вызовом основного агента стартует вспомогательный sub-workflow — attachmentsAnalyzer.

Он разбирает прикреплённые файлы:

  • Изображения (скриншоты ошибок) — отправляются в gpt-4o-mini для извлечения текста и описания контекста.

  • Текстовые файлы (логи) — если размер не превышает заданный в Config-ноде лимит, содержимое прокидывается дальше как дополнительный контекст.

На выходе формируется компактный текстовый блок:

{
  "attachments_context": "...human-readable block...",
  "attachments_count": 1
}

Я вынес этот функционал в отдельный workflow намеренно — он переиспользуется и в других ветках обработки. Если attachmentsAnalyzer падает с ошибкой, основной workflow продолжает работу без доп. контекста, а не валится целиком.

Сбор контекста и вызов агента

Перед формированием запроса к LLM в ноде SetVars собираю всё необходимое:

  • исходные данные обращения;

  • результат работы attachmentsAnalyzer;

  • вспомогательный контекст для системного промпта: имена организаций в GitHub, контексты и namespace'ы в Kubernetes, названия источников данных в Grafana.

Сам агент работает с набором MCP-инструментов:

  • GitHub MCP — доступ к логам сборок в Actions, PR, исходному коду.

  • Mattermost MCP — чтение сообщений в треде (если контекста изначального запроса недостаточно).

  • Grafana / Kubernetes MCP — поиск логов и событий кластера при проблемах с деплоем.

Что следует осветить в системном промпте:

  • Какие есть команды и какие группы репозиториев им принадлежат - это поможет быстрее определить репозиторий с ошибкой

  • Как искать дополнительный контекст в треде Mattermost

  • Описание зоны ответственности DevOps отдела - если ошибка попадает в эту зону ассистент будет дополнительно тэгать дежурного инженера в конце расследования

  • Общее описание доступных инструментов и когда их использовать.

  • Несколько примеров

  • Формат выходных данных

В качестве пользовательского промпта используется конструкция

Расследуй проблему от {{ $json.user_name }} в канале {{ $json.channel_name }}{{ $json.is_thread ? ' (сообщение в треде, thread_root_id=' + $json.thread_root_id + ' — сначала прочитай историю через Mattermost get_thread)' : '' }}
{{ $json.message }}{{ $json.attachments_context && $json.attachments_context.trim().length > 0 ? '\n\nДополнительная информация из вложений:\n' + $json.attachments_context : '' }}

Здесь помимо самого сообщения передается от кого и в каком канале пришло сообщение, пришло ли сообщение из треда, а также вложения, если они есть.

Костыль с HTTP-проверками

Одна из частых причин падения сборок — недоступность внешнего ресурса: репозитория с зависимостями, прокси, registry. Логично было бы дать агенту встроенный HTTP Request-tool и попросить проверить доступность. На практике это не сработало: встроенная нода n8n не умеет нормально обрабатывать таймауты и сетевые ошибки — в случае проблем она роняет всю цепочку с агентом.

Пришлось обернуть проверку в отдельный sub-workflow httpProbeTool, который всегда возвращает структурированный результат: успешно, неуспешно с описанием причины, или таймаут. Агент использует его как обычный инструмент.

После получения ответа от агента идёт короткая валидация формата, и сообщение уходит в тред Mattermost.

Обработка ошибок самого workflow

Когда строишь систему, через которую идут реальные обращения, надёжность критична. Если workflow упадёт по любой причине — закончилась квота у LLM, отвалился MCP-сервер, прилетел невалидный JSON — никто в чате об этом не узнает, и обращение зависнет в подвешенном состоянии.

Особенно это актуально в первые недели после запуска, когда постоянно что-то правишь и докручиваешь. Решение простое: отдельный workflow, который указан в настройках основных workflow как Error Workflow.

Что он делает:

  1. Получает информацию о сломавшемся execution от n8n API (для этого надо сгенерировать API-ключ).

  2. Через ноду Extract Thread Context определяет channel_id и root_id исходного сообщения.

  3. Отправляет краткое сообщение об ошибке прямо в тред обращения, чтобы автор не висел в неведении.

Пример

Дополнительно в более развёрнутом виде ошибка летит в служебный канал DevOps-команды — это позволяет быстро реагировать на регрессии.

Что получилось

После пары месяцев тестирования в боевом режиме картина такая:

  • Среднее время ответа — до 3 минут с момента появления сообщения в канале.

  • ~25% обращений закрываются полностью без участия инженера.

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

  • Стоимость при нашем потоке (несколько десятков обращений в неделю) — до 250$ в месяц на оплату LLM.

Расследование упавшего билда
Расследование инцидента по скриншоту
Ответ на вопрос об инфраструктуры
Создание задачи по запросу

На фоне часовой ставки инженера это выглядит как очень выгодное пополнение в команде — особенно с учётом того, что агент работает круглосуточно и не отвлекает дежурного от основной работы.

Чего пока не удалось

  • Агент иногда «теряется» в длинных тредах с десятками сообщений — приходится в системном промпте отдельно ограничивать глубину контекста.

  • Категория Инцидент пока даёт самый низкий процент автономного разрешения — там слишком много нестандартных ситуаций. Работаем над расширением набора MCP-инструментов.

  • Сложно объективно оценить качество ответов на «вопросы по инфраструктуре» — нужен механизм фидбэка от инженеров (планирую реакции в Mattermost как простейший сигнал).

Во второй части разберём оставшиеся ветки обработки обращений: ассистента по инфраструктурным инцидентам, ассистента по типовым вопросам с RAG-поиском по нашей документации, и обработку задач на модификацию инфраструктуры с автоматическим заведением тикетов.


Репозиторий с workflow: https://github.com/javdet/automagicops-workflows

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