Evals as Code: внедрение оценки AI-агентов в CI/CD | Практический кейс monday.com | AiManual
AiManual Logo Ai / Manual.
22 Фев 2026 Гайд

Evals as Code: как monday.com внедрила оценку AI-агентов в CI/CD с первого дня и ускорила фидбэк в 8.7 раз

Как monday.com ускорила фидбэк по AI-агентам в 8.7 раза через evals-driven development на LangSmith. Полное руководство по интеграции в CI/CD.

Когда AI-агенты начали галлюцинировать в продакшене

Это было обычное утро в monday.com. Команда запустила новый AI-агент для автоматизации workflow — он должен был анализировать тикеты и предлагать решения. Первые 20 минут всё работало идеально. Потом агент начал рекомендовать "перезагрузить сервер" для проблем с UI. Потом — "проверить кабели" для cloud-сервиса. К часу дня он уже предлагал "помолиться" для решения бага с API.

Проблема: 40% галлюцинаций в продакшен-агентах. Регрессии появлялись после каждого деплоя. Фидбэк-цикл занимал 3-5 дней. Инженеры тратили недели на ручное тестирование.

Решение: Evals as Code

Вместо того чтобы строить очередную "систему мониторинга", monday.com пошла другим путём. Они внедрили оценку AI-агентов как часть CI/CD пайплайна с первого дня. Не как опциональную фичу, а как обязательный gate перед каждым деплоем.

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

💡
Ключевое отличие: традиционный мониторинг реагирует на проблемы. Evals as Code предотвращает их. Вы ловите регрессии до того, как они попадут в прод.

1 Инфраструктура: LangSmith + GitOps

monday.com использовала LangSmith не просто как инструмент для отладки, а как центральный хаб для evals. Вот как выглядит их стек:

  • LangSmith (актуально на 22.02.2026): последняя версия с поддержкой Multi-Turn Evaluators и production-трассировки
  • GitHub Actions: автоматический запуск evals при каждом PR
  • Артефакты: датасеты evals хранятся как код в Git
  • Метрики: автоматические отчёты в Slack/Teams
# .github/workflows/ai-evals.yml
name: AI Agent Evals

on:
  pull_request:
    paths:
      - 'agents/**'
      - 'prompts/**'
      - 'evals/**'

jobs:
  evaluate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'
          
      - name: Install dependencies
        run: pip install langsmith langchain anthropic openai evals-core
        
      - name: Run evals
        env:
          LANGSMITH_API_KEY: ${{ secrets.LANGSMITH_API_KEY }}
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: python -m evals.run_all --dataset production-2026-q1

2 Multi-Turn Evaluators: оценка диалогов, а не отдельных ответов

Самая большая ошибка при оценке AI-агентов — тестировать их в вакууме. Реальные пользователи ведут диалоги. Они задают уточняющие вопросы. Они меняют контекст.

monday.com разработала систему Multi-Turn Evaluators, которая симулирует реальные диалоги:

# evals/multi_turn_evaluator.py
from langsmith.schemas import Run, Example
from typing import List, Dict
import asyncio

class MultiTurnEvaluator:
    def __init__(self, max_turns: int = 5):
        self.max_turns = max_turns
        
    async def evaluate_conversation(self, 
                                   agent: callable,
                                   initial_prompt: str,
                                   user_profile: Dict) -> Dict:
        """Оценивает агента в многоходовом диалоге"""
        
        conversation = []
        current_input = initial_prompt
        
        for turn in range(self.max_turns):
            # Получаем ответ агента
            response = await agent(current_input)
            conversation.append({"agent": response})
            
            # Генерируем следующий пользовательский ввод
            # на основе ответа агента и профиля пользователя
            next_input = self._simulate_user_response(
                response, user_profile, turn
            )
            
            if next_input is None:  # Диалог завершён
                break
                
            conversation.append({"user": next_input})
            current_input = next_input
            
        return {
            "conversation": conversation,
            "coherence_score": self._calculate_coherence(conversation),
            "hallucination_score": self._detect_hallucinations(conversation),
            "helpfulness_score": self._rate_helpfulness(conversation)
        }
Метрика До внедрения После внедрения Улучшение
Время фидбэка 3-5 дней 8 часов 8.7x
Галлюцинации в проде 40% 3.2% 12.5x
Регрессии после деплоя 67% релизов 4% релизов 16.7x

Как они это сделали: пошаговый разбор

Шаг 1: Создание эталонных датасетов

Вместо того чтобы писать evals с нуля, команда начала с анализа реальных пользовательских диалогов. Они взяли 1000+ реальных тикетов поддержки, анонимизировали их и превратили в тестовые кейсы.

Ключевой инсайт: не все диалоги одинаково важны. Они выделили три категории:

  1. Критические сценарии (20%): то, что ломает пользовательский опыт
  2. Частые запросы (50%): ежедневные операции пользователей
  3. Edge-кейсы (30%): странные, но важные сценарии

Шаг 2: Интеграция в CI/CD

Evals стали обязательным чеком в PR. Если агент не проходит 95% тестов — мерж-реквест блокируется. Звучит жёстко? Зато работает.

# evals/ci-config.yaml
thresholds:
  critical_scenarios: 98%  # Должны проходить почти всегда
  frequent_requests: 95%   # Стандартный порог
  edge_cases: 85%         # Могут иногда фейлиться
  
alerts:
  - type: slack
    channel: '#ai-agents-alerts'
    conditions:
      - score_drop > 5%
      - new_hallucination_detected: true
      
auto_remediation:
  - action: rollback_to_previous_version
    condition: critical_score < 90%
  - action: notify_engineers
    condition: any_test_failed

Шаг 3: Production-трассировка

Evals — это не только про pre-production. monday.com настроила LangSmith на мониторинг продакшен-трасс в реальном времени. Каждый пользовательский запрос оценивается по тем же метрикам.

Если в продакшене обнаруживается новый тип галлюцинации — он автоматически добавляется в evals датасет. Круг замыкается.

Типичные ошибки (и как их избежать)

Ошибка #1: Тестировать только happy path. Реальные пользователи делают опечатки, меняют тему диалога, задают странные вопросы.

Ошибка #2: Использовать LLM для оценки без human-in-the-loop. Да, GPT-4 может оценивать ответы, но он тоже галлюцинирует. Нужна калибровка.

Ошибка #3: Фокусироваться только на точности. Пользователям важны ещё и тон, полезность, скорость ответа.

Инструменты, которые работают в 2026

После года экспериментов, команда monday.com остановилась на этом стеке:

  • LangSmith 2026.1+ — для трассировки и evals
  • Claude 3.5 Sonnet — как основной LLM для сложных evals
  • GPT-4o Mini — для быстрых/дешёвых проверок
  • RAGAS — для оценки retrieval-систем
  • Custom evaluators — доменно-специфичные метрики

Если вы только начинаете, посмотрите на Maos AgentGate — это гайд по настройке CI/CD для AI-агентов, который поможет избежать самых болезненных ошибок.

Что делать, если evals стали bottleneck?

Случилось предсказуемое: по мере роста числа агентов, evals начали занимать часы. Вот как monday.com оптимизировала процесс:

  1. Приоритизация тестов — сначала критичные, потом остальные
  2. Параллельный запуск — разделили evals на независимые группы
  3. Кэширование — если промпт не менялся, используем прошлые результаты
  4. Сэмплинг — не нужно запускать все тесты каждый раз
# evals/optimized_runner.py
from concurrent.futures import ThreadPoolExecutor
import hashlib
from functools import lru_cache

class OptimizedEvalRunner:
    def __init__(self, max_workers: int = 10):
        self.executor = ThreadPoolExecutor(max_workers=max_workers)
        self.cache = {}
        
    def _get_cache_key(self, agent_config: dict, test_case: dict) -> str:
        """Генерируем ключ для кэша"""
        config_hash = hashlib.md5(
            str(sorted(agent_config.items())).encode()
        ).hexdigest()
        test_hash = hashlib.md5(
            str(sorted(test_case.items())).encode()
        ).hexdigest()
        return f"{config_hash}:{test_hash}"
        
    @lru_cache(maxsize=1000)
    def run_eval_cached(self, agent, test_case):
        """Запускаем eval с кэшированием"""
        cache_key = self._get_cache_key(
            agent.get_config(), 
            test_case
        )
        
        if cache_key in self.cache:
            return self.cache[cache_key]
            
        result = agent.evaluate(test_case)
        self.cache[cache_key] = result
        return result

Совет, который сэкономит вам месяц работы

Не начинайте со сложных Multi-Turn Evaluators. Начните с трёх простых метрик:

  1. Точность — агент даёт правильный ответ?
  2. Безопасность — агент не рекомендует опасные действия?
  3. Скорость — ответ приходит за разумное время?

Добавляйте сложность постепенно. Каждую новую метрику калибруйте на реальных данных. И обязательно читайте форенсик-аудит локального AI-ассистента — там подробно разобраны методы обнаружения галлюцинаций.

Что дальше? Evals 2.0

Команда monday.com уже экспериментирует с next-gen подходами:

  • Автоматическая генерация тестов — LLM создаёт edge-кейсы на основе продакшен-трасс
  • Adversarial evals — специальные промпты, которые пытаются "сломать" агента
  • Transfer learning между агентами — если один агент научился чему-то, другие могут перенять опыт
  • Непрерывная калибровка — evals постоянно обновляются на основе пользовательского фидбэка

Самое интересное — они начали использовать evals не только для контроля качества, но и для обучения агентов. Проваленный тест становится тренировочным примером.

Финал: Evels as Code — это не про тестирование. Это про создание feedback loop, который становится короче с каждой итерацией. С 5 дней до 8 часов. С 40% галлюцинаций до 3.2%. Это тот самый leverage, который превращает AI-агентов из игрушки в production-инструмент.

Если вы хотите глубже погрузиться в тему, посмотрите Agent Engineering: новая дисциплина для перехода от прототипа к продакшену. Там разобраны все этапы — от MVP до масштабирования.

А самый главный урок от monday.com? Не ждите, пока ваши агенты начнут галлюцинировать в проде. Встройте evals в CI/CD с первого дня. Первый баг, который они поймают, окупит все потраченные усилия.