Измерить KPD (коэффициент полезного делегирования)

ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Измерить KPD (коэффициент полезного делегирования)

1. Цель задачи

Разработать и внедрить метрику KPD (коэффициент полезного делегирования) для автономного AI-агента, выполняющего делегированные задачи без участия человека. Научиться собирать логи делегирования, вычислять долю правильно решённых задач и анализировать узкие места для повышения автономности.

Ключевой результат Достигнуть KPD > 0.9 (более 90% делегированных задач решены корректно) и настроить дашборд для непрерывного мониторинга этой метрики.


2. Исходные данные

Что нужноОткуда взять
Набор делегированных задач (не менее 100)Сформировать вручную или взять из существующего датасета (например, GSM8K для математики, MMLU для QA)
AI-агент с API (LLM с инструментами)OpenAI Assistants API, LangChain Agent, или самописный на базе LLM
Ожидаемые правильные ответы (ground truth) для каждой задачиСоздать параллельно с задачами (вручную или автоматически из датасета)
Система логирования (результаты делегирования)MLflow, Weights & Biases или самописный SQLite / CSV
Веб-дашборд (опционально)Grafana, Streamlit или просто Google Sheets

Если нет реального AI-агента — симулируем:

  1. Создаём простого агента на основе OpenAI Chat Completion с функцией вызова calculator (для математических задач).
  2. Подготавливаем 20–30 задач, для каждой известно правильное решение.
  3. Запускаем агента, логируем: task_id, промпт, ответ агента, правильный ответ, флаг успеха (0/1).

3. Технологический стек

КомпонентИнструментыНазначение
AI-агентLangChain / OpenAI Assistants APIВыполнение делегированных задач
ЛогированиеMLflow + SQLite (или просто CSV)Хранение результатов каждого делегирования
Расчёт метрикPython (pandas, numpy)Вычисление KPD, точности по категориям
ВизуализацияStreamlit / GrafanaДашборд метрик KPD
Оценка correct/incorrectСопоставление с ground truth (автоматическое)Определение успеха задачи
ВерсионированиеGitУправление версиями агента и наборов задач

4. Этапы выполнения

Этап 1: Определение KPD и pipeline оценки (30 минут)

Действия

  1. Формализовать метрику KPD
    KPD = (Количество правильно решённых задач) / (Общее количество делегированных задач)
    Правильно решённая – задача, где ответ агента совпадает с ground truth или достигает согласованного критерия (например, answer.strip() == ground_truth.strip()).

  2. Создать JSON-схему лога делегирования

    {
      "task_id": "int",
      "timestamp": "datetime",
      "prompt": "str",
      "agent_response": "str",
      "ground_truth": "str",
      "correct": "bool (0/1)",
      "response_time_ms": "int",
      "model_used": "str",
      "tools_called": "list[str]"
    }
    
  3. Выбрать инструмент для логирования
    Например, CSV-файл с полями из схемы, или MLflow log_params + log_metric.

Ожидаемый результат этапа

  • Чёткое определение KPD.
  • Готовый формат лога и выбранный инструмент.

Этап 2: Сбор данных делегирования (1 час)

Действия

  1. Подготовить набор задач

    • 100+ задач различной сложности (например, 50 простых, 30 средних, 20 сложных).
    • Для каждой задачи записать ground truth.
    • Пример (математика): {"task": "Сколько будет 2+2*3?", "answer": "8"}.
  2. Настроить AI-агента

    • Использовать LangChain Agent с ChatOpenAI (например, gpt-4o-mini).
    • Добавить инструменты: calculator, search (можно заглушку).
    • Включить логирование: перед вызовом агента и после получения ответа.
  3. Запустить батч-прогон

    import csv, json
    from langchain.agents import AgentExecutor, create_openai_tools_agent
    from langchain_openai import ChatOpenAI
    from langchain.tools import tool
    from datetime import datetime
    
    @tool
    def calculator(expression: str) -> str:
        """Evaluates a mathematical expression."""
        return str(eval(expression))
    
    tasks = load_tasks("tasks.json")  # список словарей с полями task, answer
    logs = []
    for task in tasks:
        start = datetime.now()
        result = agent_executor.invoke({"input": task["task"]})
        elapsed = (datetime.now() - start).total_seconds() * 1000
        correct = (result["output"].strip() == task["answer"].strip())
        logs.append({
            "task_id": task["id"],
            "prompt": task["task"],
            "agent_response": result["output"],
            "ground_truth": task["answer"],
            "correct": 1 if correct else 0,
            "response_time_ms": elapsed,
            "model_used": "gpt-4o-mini",
            "tools_called": [c["tool"] for c in result.get("intermediate_steps", [])]
        })
    save_logs("logs.csv", logs)
    

Ожидаемый результат этапа

  • Файл logs.csv (или записи в MLflow) с не менее 100 строками делегированных задач.

Этап 3: Расчёт KPD и анализ (30 минут)

Действия

  1. Загрузить логи и вычислить базовый KPD

    import pandas as pd
    df = pd.read_csv("logs.csv")
    kpd = df["correct"].mean()
    print(f"KPD = {kpd:.3f}")
    
  2. Разбить по категориям сложности (если категории есть)

    • df.groupby("difficulty").agg({"correct": "mean"})
    • Определить, на каких задачах агент ошибается чаще.
  3. Вычислить 95% доверительный интервал для KPD
    Использовать bootstrap или формулу для пропорций:

    import numpy as np
    n = len(df)
    se = np.sqrt(kpd * (1 - kpd) / n)
    ci = (kpd - 1.96*se, kpd + 1.96*se)
    
  4. Создать первый дашборд (Streamlit)

    • Вывести общий KPD, KPD по категориям, таблицу последних ошибок.

Ожидаемый результат этапа

  • Рассчитанный KPD (возможно <0.9) и понимание проблемных категорий.
  • Streamlit-дашборд с визуализацией.

Этап 4: Улучшение KPD до >0.9 (1 час)

Действия

  1. Анализ ошибок
    Выписать 5–10 ошибочных ответов, понять причину:

    • Неправильное использование инструмента (например, не вызван calculator).
    • Неверный парсинг запроса.
    • Отсутствие нужной информации в знании агента.
  2. Внесение корректировок

    • Уточнить промпт системного сообщения (добавить инструкцию "Всегда проверяй вычисления с помощью calculator").
    • Добавить fallback-инструмент или правило повторной попытки.
    • Улучшить примеры few-shot в промпте.
  3. Повторный прогон (только на ошибочных задачах + 10% новых для валидации)

    • Заменить логи старых решений новыми (с новым промптом).
    • Пересчитать KPD.
    • Если KPD < 0.9, повторить анализ.
  4. Документирование изменений

    • Зафиксировать в Git изменения в коде агента и промптах.

Ожидаемый результат этапа

  • KPD > 0.9 на тестовом наборе задач.
  • Зафиксированы изменения, повысившие точность.

Этап 5: Автоматизация и отчётность (30 минут)

Действия

  1. Настроить периодический запуск оценки (например, каждую неделю)

    • Скрипт, который берёт новые задачи (из очереди) и запускает агента, логирует, обновляет дашборд.
  2. Создать финальный отчёт

    • Описание метрики KPD.
    • Текущее значение (0.93 например).
    • График KPD по времени.
    • Рекомендации по поддержанию уровня >0.9.
  3. Добавить алерт (опционально)

    • Если KPD падает ниже 0.85, отправлять уведомление в Telegram/Slack.

Ожидаемый результат этапа

  • Скрипт для повторного расчёта.
  • Отчёт в Markdown/PDF.
  • Система мониторинга (дашборд + алерт).

5. Критерии приемки (Definition of Done)

  • KPD на тестовом наборе из 100+ задач превышает 0.9.
  • Логи каждой делегированной задачи содержат все поля из схемы.
  • Есть воспроизводимый скрипт батч-прогона и расчёта KPD.
  • Дашборд (Streamlit/Grafana) показывает текущий KPD, тренд и разбивку по категориям.
  • Для снижения KPD ниже 0.85 настроен алерт.
  • В репозитории есть README с описанием метрики и инструкцией по запуску.
  • Проведён анализ минимум 3-х ошибочных ответов и внесены улучшения в промпт/агент.
  • 95% доверительный интервал для KPD не пересекает 0.9 (т.е. нижняя граница ≥ 0.85).

6. Ожидаемый результат

Основной артефакт

  • Репозиторий с кодом AI-агента, скриптами прогона, расчёта метрик и дашбордом.
  • Файл logs.csv (или MLflow эксперимент) с записями не менее 100 задач.
  • Дашборд (например, streamlit run dashboard.py) с KPD, трендом, таблицей ошибок.

Опциональные дополнительные результаты

  • Docker Compose для развёртывания агента + логирование + дашборд.
  • Документ postmortem для случаев, когда KPD падал ниже 0.9.
  • Slack/Telegram бот для уведомлений о падении KPD.

7. Возможные сложности и их решение

СложностьРешение
Нет ground truth для задачИспользовать задачи из открытых бенчмарков (GSM8K, MMLU, HumanEval) с готовыми ответами
Ответ агента не соответствует форматуВвести функцию сравнения с использованием LLM-as-judge (например, GPT-4 проверяет эквивалентность)
Разброс KPD из-за случайности LLMПрогонять каждую задачу 3 раза и брать мажоритарный ответ; фиксировать seed
Отсутствие API для агентаИспользовать локальную open-source модель (Llama 3.1 8B) через Ollama
Ручная разметка отнимает времяАвтоматизировать: взять датасет, где ground truth уже есть, и просто сформировать промпты
Задачи слишком простые → KPD=1 и нет обученияВключить задачи с подвохом (например, требующие chain-of-thought) и задачи с неоднозначным ответом

8. Бюджет времени (оценка)

ЭтапВремя
Этап 1: Определение KPD и pipeline оценки30 мин
Этап 2: Сбор данных делегирования1 ч
Этап 3: Расчёт KPD и анализ30 мин
Этап 4: Улучшение KPD до >0.91 ч
Этап 5: Автоматизация и отчётность30 мин
Итого3.5 ч

Примечание Для первого выполнения может потребоваться до 5–6 часов, так как потребуется настройка инструментов и отладка агента.


9. Связанные вопросы из базы знаний

ВопросТема
101Метрики качества LLM (accuracy, precision, recall)
115Оценка агента с помощью автономных тестов
127Проектирование пайплайна оценки RAG
132Сбор и хранение логов промптов
145A/B тестирование промптов
202Интеграция LLM с внешними инструментами (tool use)
311Доверительные интервалы для метрик
408Мониторинг ML-систем в production
502Автоматизация разметки ground truth
618LangChain Agent и Executor

10. Чек-лист самопроверки

Перед сдачей работы проверь:

  • Я определил KPD как correct / total и понимаю, как учитывать частично правильные ответы.
  • Я настроил логирование с полями task_id, prompt, agent_response, ground_truth, correct.
  • Я запустил батч на 100+ задач и получил воспроизводимый CSV.
  • Я построил дашборд (Streamlit/Grafana) и вижу KPD в реальном времени.
  • Я улучшил агента (промпт/инструменты) и подтвердил KPD > 0.9 на том же наборе.
  • В репозитории есть README с инструкцией по запуску и описание метрики.
  • Я настроил хотя бы простой алерт при падении KPD ниже 0.85.