ОК или НеОК: как мы строили LLM-судью и дважды переписывали формулу
Классика: десять метрик, а ответа на простой вопрос «сколько обращений бот реально закрывает?» — ноль. Судья по тексту диалога радостно ставил 18/20, а проверка по настоящим вызовам инструментов приземляла до 8/20. Ну то есть красивый ответ ≠ правильный ответ, кто бы мог подумать.
Первый инсайт — выкинуть дробь «решено из заявленного». Знаменатель гулял: один и тот же диалог модель то делила на две «проблемы», то на три, и процент прыгал сам по себе. Решение — одна категория на диалог: resolved, unresolved, escalated, needs_info, unknown, excluded. Спросил номер заказа, а юзер пропал — это не провал. Грамотно передал оператору — тоже не всегда провал.
Потом коллега разметила 50 диалогов вслепую: согласие с судьёй 70%, каппа 0,584. Не идеал, но честно. И главный урок — версию промпта фиксируй и гоняй трижды, иначе цифры врут.
Вся сага — на Хабре.
🔥 — пойду мерить своего бота
🤡 — а у меня и судьи нет
@ai_for_dev
Классика: десять метрик, а ответа на простой вопрос «сколько обращений бот реально закрывает?» — ноль. Судья по тексту диалога радостно ставил 18/20, а проверка по настоящим вызовам инструментов приземляла до 8/20. Ну то есть красивый ответ ≠ правильный ответ, кто бы мог подумать.
Первый инсайт — выкинуть дробь «решено из заявленного». Знаменатель гулял: один и тот же диалог модель то делила на две «проблемы», то на три, и процент прыгал сам по себе. Решение — одна категория на диалог: resolved, unresolved, escalated, needs_info, unknown, excluded. Спросил номер заказа, а юзер пропал — это не провал. Грамотно передал оператору — тоже не всегда провал.
Потом коллега разметила 50 диалогов вслепую: согласие с судьёй 70%, каппа 0,584. Не идеал, но честно. И главный урок — версию промпта фиксируй и гоняй трижды, иначе цифры врут.
Вся сага — на Хабре.
🔥 — пойду мерить своего бота
🤡 — а у меня и судьи нет
@ai_for_dev