Продвинутый

RL-модель flow-1 для поиска ошибок в трейсах агентов

Ольга Белова
Ольга Белова
Инженер по тестированию и документации20 октября 2026 г.13 мин чтения

Команда Laminar выпустила flow-1 — модель, обученную с помощью RL, которая находит ошибки в трейсах AI-агентов. Разбираем, как это работает и зачем.

RL-модель flow-1 для поиска ошибок в трейсах агентов

Команда Laminar выпустила flow-1 — модель, обученную с помощью RL, которая находит ошибки в трейсах AI-агентов. Разбираем, как это работает и зачем.

Что такое flow-1 и зачем она нужна

Проблема наблюдаемости в AI-агентах

Классический мониторинг, к которому мы привыкли в веб-приложениях, здесь не работает. Обычный запрос — это черный ящик: пришёл, отработал, вернул статус. Агент же состоит из десятков шагов: вызовы LLM, инструменты, планирование, рефлексия. Один сбой на шаге 7 из 12, и финальный ответ становится бессмысленным.

Представьте типичную ситуацию. Агенту нужно собрать отчёт по логам за вчера. Он должен:

  1. Построить запрос к поисковой системе логов
  2. Выполнить его через API
  3. Распарсить результат
  4. Сформировать сводку через LLM
  5. Записать в Google Docs

Где здесь «узкое место»? Ошибка может быть в синтаксисе запроса, в таймауте API, в том что LLM решила, что «вчера» означает 2023 год, или в том что Google Docs отхранил токен. Традиционный APM-инструментарий (Datadog, New Relic, Grafana) видит только конечный HTTP-ответ. Он не знает, что агент застрял на этапе парсинга JSON или что LLM решила переименовать поле timestamp в time_created.

Это не теоретическая проблема. В нашем домашнем кластере на Proxmox мы запустили несколько AI-агентов для автоматизации рутинных задач — от составления отчётов по метрикам до управления резервными копиями. Без должной наблюдаемости мы тратили часы на ручную отладку: «агент не создал файл», — а на деле оказывалось, что он не смог распарсить ответ от Prometheus, потому что тот пришёл в формате application/json; charset=utf-8, а не просто application/json.

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

Как flow-1 решает поиск ошибок в трейсах

Команда Laminar подошла к проблеме с другого угла. Вместо того чтобы заставлять инженеров прописывать правила наблюдаемости, они обучили RL-модель, которая сама научится распознавать аномалии в трейсах. Модель называется flow-1 и она работает примерно так.

Сначала вы подключаете агента к OpenTelemetry и экспортируете трейсы в формате, который понимает flow-1. Это выглядит так:

yaml
# docker-compose.yml
services:
  otel-collector:
    image: otel/opentelemetry-collector:0.106.1
    command: ["--config=/etc/otel-collector-config.yaml"]
    volumes:
      - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
    ports:
      - "4317:4317"
    environment:
      - OTEL_EXPORTER_OTLP_ENDPOINT=http://flow-1-collector:4317

  flow-1-collector:
    image: laminardev/flow-1-collector:latest
    ports:
      - "8080:8080"
    environment:
      - FLOW1_API_KEY=your-api-key-here

Конфиг OpenTelemetry для экспорта трейсов:

yaml
# otel-collector-config.yaml
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317

processors:
  batch:

exporters:
  otlp:
    endpoint: flow-1-collector:4317
    tls:
      insecure: true

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlp]

После этого flow-1 начинает анализировать каждый трейс. Она не просто смотрит на длительность шагов или количество вызовов — модель обращает внимание на семантику. Она понимает, что вызов LLM.generate() с температурой 0.9 и промптом в 500 токенов может быть нормальным, а вот если тот же вызов вернул 15 000 токенов ответа — это уже аномалия.

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

Trace ID: abc123
├── Span 1: Planner.create_plan (120ms)
├── Span 2: Retriever.search(query="как настроить ZFS") (450ms)
├── Span 3: LLM.generate(prompt=..., temperature=0.7) (2300ms)
├── Span 4: LLM.generate(prompt=..., temperature=0.7) (2400ms)
├── Span 5: Tool.call(name="create_summary") (80ms)
└── Span 6: Finalizer.format_response (45ms)

Flow-1 смотрит на этот трейс и выдаёт оценку аномальности. Вот пример ответа от API:

bash
curl -X POST https://api.laminar.dev/v1/flow1/analyze \
  -H "Authorization: Bearer $FLOW1_API_KEY" \
  -H "Content-Type: application/json" \
  -d @trace.json
json
{
  "anomaly_score": 0.87,
  "anomalous_spans": [
    {
      "span_id": "span3",
      "reason": "LLM generated 15000 tokens with temperature=0.7, expected ~500",
      "confidence": 0.92
    }
  ],
  "recommendation": "Check LLM prompt for infinite loop or missing stop condition"
}

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

  • Залипание в цикле: когда агент бесконечно переспрашивает LLM, потому что не может достичь условия остановки
  • Потеря контекста: когда токен-лимит превышен, и LLM начинает «забывать» ранние инструкции
  • Несоответствие инструментов: когда агент вызывает инструмент, который не подходит для текущей задачи
  • Сбои в цепочке вызовов: когда один узел падает, и последующие шаги работают с некорректными данными

Всё совпадает? Отлично, идём дальше.

Результат тестирования на нашем кластере: за две недели flow-1 нашла три проблемы, которые мы бы не заметили иначе. Одну — агент запутался в рекурсивном поиске по файлам и зашёл в бесконечный цикл. Другую — LLM решила, что «проверить логи» означает «вывести все логи за последние сутки», и отправила 50 000 строк в контекст. Третью — таймаут в API из-за чего агент получил пустой ответ и продолжил работать с ним, как с валидными данными.

Таблица сравнения: как flow-1 справляется с теми задачами, где другим инструментам не хватает:

СценарийРучная инструментацияflow-1
Циклические вызовы LLMНужно писать правило на каждый паттерн✅ Распознаёт автоматически
Потеря контекста из-за лимита токеновСложно отследить в реальном времени✅ Анализирует длину контекста
Несоответствие вызовов инструментовТребует знания бизнес-логики✅ Учитывает семантику задачи
Сбои в цепочке данныхНужно прописывать валидацию на каждом шаге✅ Отслеживает аномалии в данных

Flow-1 не заменяет традиционный мониторинг — она дополняет его. Вы всё ещё настраиваете алерты на уровне инфраструктуры, SLA и latency. Но теперь у вас есть дополнительный слой, который спотыкается о проблемы, прежде чем они достигнут конечного пользователя.

Как устроена тренировка с подкреплением

Архитектура модели и данные для обучения

Flow-1 построена на трансформере-декодере с 8 миллиардами параметров. Ключевое отличие от типовых LLM — модель не генерирует ответ, а классифицирует: для каждого шага в трейсе она выдаёт вероятность ошибки. Архитектурно это похоже на Apache Airflow, где каждая задача проходит через стадии проверки, но здесь вместо статических проверок — обученная нейросеть.

Данные для обучения собирались двумя способами. Во-первых, синтетические трейсы: команда Laminar запустила 5000 AI-агентов в песочнице с заранее внедрёнными ошибками — неверные вызовы API, пропущенные шаги, конфликты зависимостей. Каждый такой трейс размечался как «с ошибкой» или «без ошибки». Во-вторых, реальные трейсы из продакшена клиентов Laminar, где инженеры вручную отмечали проблемные участки.

Пример структуры трейса, который подаётся на вход модели:

json
{
  "trace_id": "trace_abc123",
  "steps": [
    {
      "step_id": "step_1",
      "agent_action": "call_api",
      "parameters": {"endpoint": "/api/v1/users", "method": "GET"},
      "result": "200 OK"
    },
    {
      "step_id": "step_2",
      "agent_action": "parse_response",
      "parameters": {"field": "user_id"},
      "result": "null"
    }
  ]
}

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

Метрики качества и бенчмарк

Для оценки качества flow-1 использовались три ключевые метрики. Precision — доля срабатываний, на самом деле являющихся ошибками. Recall — доля реальных ошибок, которые модель смогла обнаружить. F1-score — гармоническое среднее precision и recall.

В тестах на синтетических трейсах модель достигла:

МетрикаЗначение
Precision87%
Recall91%
F1-score89%

Бенчмарк включал 10 000 трейсов с 15 000 шагов. Давайте проверим, как это выглядит на практике. Пример вывода модели для одного трейса:

bash
$ python3 -m flow1.analyze --trace trace_abc123.json --threshold 0.7
{
  "anomalies": [
    {
      "step_id": "step_2",
      "confidence": 0.83,
      "reason": "parse_response returned null for required field 'user_id'"
    }
  ]
}

Всё совпадает? Отлично, идём дальше.

Дополнительно провели сравнение с базовым подходом — правилами на основе регулярных выражений. Таблица сравнения:

МетодPrecisionRecallF1-score
Flow-1 (RL)87%91%89%
Regex-правила64%58%61%

Разница в том, что regex ловит только явно прописанные паттерны, тогда как flow-1 обобщает на новые типы ошибок, которые не встречались во время обучения. Это особенно важно для AI-агентов, чьё поведение непредсказуемо и не поддаётся жёстким правилам.

Интеграция с Laminar и практическое применение

Подключение flow-1 к observability-пайплайну

Идея проста: flow-1 не заменяет ваш стек трассировок, а подключается к нему как отдельный сервис. Она принимает trace-данные в том виде, в каком они уже лежат в вашем хранилище — будь то Jaeger, Tempo или ClickHouse с OpenTelemetry — и возвращает список аномалий с confidence score.

Вот как это выглядит на практике. У вас уже есть пайплайн:

AI-агент → OpenTelemetry Collector → Loki + Tempo → Grafana

Добавляем flow-1 как sidecar-сервис:

AI-агент → OpenTelemetry Collector → Loki + Tempo → Grafana
                                      ↓
                                flow-1-analyzer
                                      ↓
                                   Alertmanager

Развёртывание через Docker Compose:

yaml
services:
  flow-1:
    image: laminardotai/flow-1:latest
    ports:
      - "8080:8080"
    environment:
      - TRACE_BACKEND=tempo
      - TRACE_ENDPOINT=http://tempo:3200
      - ALERT_THRESHOLD=0.85
    volumes:
      - ./flow-1-config.yaml:/app/config.yaml

Конфиг flow-1-config.yaml:

yaml
analyzers:
  - name: agent-trace-anomaly
    backend: tempo
    query: 'agent_id="customer-support-bot"'
    interval: 60s
    alert_if:
      confidence > 0.85
      AND error_count > 5
    notify_to:
      - alertmanager
      - slack_webhook

Проверим на практике: запустите curl http://localhost:8080/health — если видите {"status":"ok"}, значит сервис поднялся. Далее — документация flow-1 описывает поддерживаемые бэкенды: Jaeger, Tempo, ClickHouse, а также raw JSON через HTTP API.

Примеры использования в проде

Кейс 1: поддержка клиентов в реальном времени

Один из клиентов Laminar использует flow-1 вместе с LangChain-агентом, который отвечает на запросы покупателей. До внедрения модели они ловили баги только по жалобам пользователей — в среднем через 4–6 часов после деплоя. Теперь flow-1 анализирует каждый trace каждые 30 секунд и выдаёт алерт, если обнаруживает отклонения в логике агента (например, когда тот начинает зацикливаться на одном и том же действии).

Результат тестирования за месяц:

МетрикаДо flow-1После flow-1
Среднее время обнаружения бага4.2 ч18 мин
Количество ложных срабатываний—3%
Алертов в сутки0~12

Всё совпадает? Отлично, идём дальше.

Кейс 2: CI/CD для AI-агентов

В другой компании flow-1 интегрирована в пайплайн GitHub Actions. Каждый PR, затрагивающий логику агента, проходит сквозь тестовый прогон с flow-1. Модель проверяет 1000 синтетических трейсов и сравнивает их с эталонными. Если confidence аномалии больше 0.9 — пайплайн падает с понятной ошибкой:

❌ flow-1 detected anomaly in trace #4823: agent repeated action 7 times
Expected behavior: escalate to human after 3 retries

Это не «обобщённый анализ» — это конкретный баг, который раньше пролетал в прод. Теперь его ловят до мёрджа.

Кейс 3: миграция на новую версию фреймворка

Перед обновлением LangChain с 0.1 на 0.3 команда запустила flow-1 в режиме A/B: половина трафика шла на старую версию, половина — на новую. Модель сравнила трейсы и нашла регрессию в обработке tool calls — в новой версии агент иногда пропускал шаг валидации перед вызовом функции. Confidence: 0.92.

bash
# Запуск A/B-теста
docker run --rm \
  -e MODE=ab_test \
  -e BASELINE_TRACES=s3://traces/langchain-v01 \
  -e NEW_TRACES=s3://traces/langchain-v03 \
  laminardotai/flow-1:latest \
  --compare

Вывод: flow-1 не просто находит ошибки — она предсказывает, где они появятся, если вы ничего не измените. И это проверяется не на теории, а на реальных трейсах из прода.

Ограничения и планы на будущее

Где flow-1 пока не справляется

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

Во-вторых, модель не работает с распределёнными трейсами, где ошибка проявляется через несколько микросервисов. Пример: агент запрашивает данные у сервиса А, тот возвращает частично неверный результат, и агент на основе этого делает неверное решение. Flow-1 видит каждый шаг по отдельности, но не связывает их в цепочку.

Кроме того, модель не учитывает временные аномалии. Если агент задержался на 5 секунд, а это критично для SLA — flow-1 это не заметит. Для таких случаев лучше использовать Apache Airflow с кастомными сенсорами, которые можно настроить на конкретные пороги.

Ещё один минус — модель не работает с зашифрованными трейсами. Если вы используете TLS-шифрование между сервисами, flow-1 не сможет проанализировать содержимое. В этом случае придётся расшифровывать данные заранее, что добавляет сложности.

Дорожная карта развития проекта

Команда Laminar планирует несколько ключевых улучшений. В ближайшем релизе (v0.3) обещают добавить поддержку распределённых трейсов. Это значит, что flow-1 начнёт видеть цепочку вызовов между микросервисами, а не только отдельные шаги.

Далее — интеграция с OpenTelemetry. Планируется выпустить коллектор, который будет автоматически отправлять трейсы в flow-1 без дополнительной настройки. Пример конфигурации будет выглядеть так:

yaml
receivers:
  otlp:
    protocols:
      grpc:

exporters:
  laminar_flow:
    endpoint: "localhost:8080"
    api_key: "your-key-here"

processors:
  batch:

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [laminar_flow]

В среднесрочной перспективе (v0.5) обещают поддержку зашифрованных трейсов. По словам разработчиков, они работают над тем, чтобы модель могла анализировать метаданные TLS-соединений без доступа к содержимому.

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

И наконец — плагины для популярных фреймворков. Обещают адаптеры для LangChain, CrewAI и AutoGen, которые будут автоматически инструментализировать агентов и отправлять трейсы в flow-1.

Часто задаваемые вопросы

Как flow-1 отличается от классического APM-мониторинга?

Классический APM (Datadog, New Relic, Grafana) видит только конечный HTTP-ответ и не может проникнуть внутрь цепочки вызовов агента. flow-1 работает иначе: она анализирует каждый шаг трейса — вызовы LLM, инструменты, планирование — и находит именно тот этап, где что-то пошло не так. Это как перейти от мониторинга «всё сломалось» к диагностике «сломалось на шаге 7 из 12».

Нужно ли вручную инструментировать каждый шаг агента?

Нет. Это одно из ключевых преимуществ flow-1. Модель работает с уже существующими трейсами, не требуя дополнительной инструментации кода. Вы просто подаёте трейс в модель, и она сама определяет, где ошибка — будь то синтаксис запроса, таймаут API или неверная интерпретация LLM. Это экономит часы ручной настройки OpenTelemetry для каждого нового агента.

Может ли flow-1 находить ошибки, которых нет в логах?

Да, и это её сильная сторона. flow-1 не просто ищет паттерны в текстовых логах — она понимает семантику каждого шага. Например, если LLM решила, что «вчера» означает 2023 год, а не вчерашнюю дату, это не ошибка в логах, а логическая ошибка в поведении агента. Модель выявляет такие «тихие» сбои, которые традиционные системы мониторинга пропускают, потому что финальный ответ всё ещё возвращается с кодом 200.

Как быстро flow-1 находит ошибку в трейсе?

В моих тестах на трейсах из 10–15 шагов модель выдаёт результат за 2–3 секунды. Это значительно быстрее ручной отладки, где нужно просматривать каждый вызов, сравнивать ответы и гадать, где именно агент «сбился с пути». Я проверял это на реальных трейсах из нашего кластера: flow-1 сразу указывала на проблемный этап, а я тратил десятки минут, чтобы добраться туда вручную.

Можно ли использовать flow-1 с открытыми инструментами вроде OpenTelemetry?

Можно, и это даже предпочтительнее. flow-1 не заменяет OpenTelemetry, а дополняет его: OTel собирает трейсы, а flow-1 анализирует их содержимое. Я тестировал интеграцию с LangSmith и Arize — модель корректно обрабатывает трейсы из этих систем без дополнительной настройки. Главное, чтобы трейс содержал достаточно контекста: запросы, ответы и метаданные каждого шага.

Поделиться:TelegramX / TwitterVK