Измерить 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-агента — симулируем:
- Создаём простого агента на основе OpenAI Chat Completion с функцией вызова
calculator(для математических задач). - Подготавливаем 20–30 задач, для каждой известно правильное решение.
- Запускаем агента, логируем: 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 минут)
Действия
-
Формализовать метрику KPD
KPD = (Количество правильно решённых задач) / (Общее количество делегированных задач)
Правильно решённая – задача, где ответ агента совпадает с ground truth или достигает согласованного критерия (например, answer.strip() == ground_truth.strip()). -
Создать 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]" } -
Выбрать инструмент для логирования
Например, CSV-файл с полями из схемы, или MLflowlog_params+log_metric.
Ожидаемый результат этапа
- Чёткое определение KPD.
- Готовый формат лога и выбранный инструмент.
Этап 2: Сбор данных делегирования (1 час)
Действия
-
Подготовить набор задач
-
Настроить AI-агента
- Использовать LangChain Agent с ChatOpenAI (например, gpt-4o-mini).
- Добавить инструменты:
calculator, search (можно заглушку). - Включить логирование: перед вызовом агента и после получения ответа.
-
Запустить батч-прогон
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)
Ожидаемый результат этапа
Этап 3: Расчёт KPD и анализ (30 минут)
Действия
-
Загрузить логи и вычислить базовый KPD
import pandas as pd df = pd.read_csv("logs.csv") kpd = df["correct"].mean() print(f"KPD = {kpd:.3f}") -
Разбить по категориям сложности (если категории есть)
df.groupby("difficulty").agg({"correct": "mean"})- Определить, на каких задачах агент ошибается чаще.
-
Вычислить 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) -
Создать первый дашборд (Streamlit)
- Вывести общий KPD, KPD по категориям, таблицу последних ошибок.
Ожидаемый результат этапа
- Рассчитанный KPD (возможно <0.9) и понимание проблемных категорий.
- Streamlit-дашборд с визуализацией.
Этап 4: Улучшение KPD до >0.9 (1 час)
Действия
-
Анализ ошибок
Выписать 5–10 ошибочных ответов, понять причину:- Неправильное использование инструмента (например, не вызван calculator).
- Неверный парсинг запроса.
- Отсутствие нужной информации в знании агента.
-
Внесение корректировок
- Уточнить промпт системного сообщения (добавить инструкцию "Всегда проверяй вычисления с помощью calculator").
- Добавить fallback-инструмент или правило повторной попытки.
- Улучшить примеры few-shot в промпте.
-
Повторный прогон (только на ошибочных задачах + 10% новых для валидации)
- Заменить логи старых решений новыми (с новым промптом).
- Пересчитать KPD.
- Если KPD < 0.9, повторить анализ.
-
Документирование изменений
- Зафиксировать в Git изменения в коде агента и промптах.
Ожидаемый результат этапа
- KPD > 0.9 на тестовом наборе задач.
- Зафиксированы изменения, повысившие точность.
Этап 5: Автоматизация и отчётность (30 минут)
Действия
-
Настроить периодический запуск оценки (например, каждую неделю)
- Скрипт, который берёт новые задачи (из очереди) и запускает агента, логирует, обновляет дашборд.
-
Создать финальный отчёт
- Описание метрики KPD.
- Текущее значение (0.93 например).
- График KPD по времени.
- Рекомендации по поддержанию уровня >0.9.
-
Добавить алерт (опционально)
Ожидаемый результат этапа
- Скрипт для повторного расчёта.
- Отчёт в 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.9 | 1 ч |
| Этап 5: Автоматизация и отчётность | 30 мин |
| Итого | 3.5 ч |
Примечание Для первого выполнения может потребоваться до 5–6 часов, так как потребуется настройка инструментов и отладка агента.
9. Связанные вопросы из базы знаний
| Вопрос | Тема |
|---|---|
| 101 | Метрики качества LLM (accuracy, precision, recall) |
| 115 | Оценка агента с помощью автономных тестов |
| 127 | Проектирование пайплайна оценки RAG |
| 132 | Сбор и хранение логов промптов |
| 145 | A/B тестирование промптов |
| 202 | Интеграция LLM с внешними инструментами (tool use) |
| 311 | Доверительные интервалы для метрик |
| 408 | Мониторинг ML-систем в production |
| 502 | Автоматизация разметки ground truth |
| 618 | LangChain 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.