AI-аналитик · разбор шестойdavydov.my

Что бывает у AI-аналитика с вопросом по дороге к ответу

Тридцать пять вопросов на стенде, где данные сгенерированы, а эталонные запросы написаны отдельно. Каждый вопрос задан трижды. Верное число получилось в двадцати случаях из ста пяти.

Тридцать пять вопросов

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

35вопросов, у 29 из них есть верный ответ
105ячеек: каждый вопрос задан трижды
20ячеек с верным числом
6исходов, в которые попадает остальное

У шести вопросов из тридцати пяти верного ответа нет вовсе — так они и помечены в файле задания. Это вопросы вроде «стоит ли расширять промо» или «когда клиент считается ушедшим»: на них нет числа, которое можно было бы назвать правильным.

Шесть исходов

Остальные восемьдесят пять ячеек — не поломки модели. Это шесть разных мест, где обрывается путь от вопроса к ответу, и только часть из них вообще про агента.

все 105 ячеек по исходам
ИсходЯчеекЧто это значит
Ответил и сошёлся20число совпало с эталоном
Ответил и не сошёлся9число или тип результата не тот
Ответил, проверить нельзя10сверка была, привязки к повтору нет
Ответил, эталона нет4верного ответа не существует
Переспросил50не стал считать, назвал что мешает
Отказался12в данных нет нужного объекта

Ответил и сошёлся20

То, ради чего всё затевалось. Вопрос «Сколько активных клиентов сейчас», ответ в одну строку.

WITH cur AS (SELECT ts FROM world_cursor) SELECT COUNT(DISTINCT foi.customer_id) AS active_customers FROM fct_order_items foi, cur WHERE foi.status = 'completed' AND foi.is_guest_order = false AND foi.received_at_utc <= cur.ts AND foi.ordered_at_utc > cur.ts - INTERVAL '90 days' AND foi.ordered_at_utc <= cur.ts

Результат 21580, эталон 21580.

Двадцать ячеек — это восемь вопросов. У пяти сошлись все три повтора, у двух — два из трёх, у одного — один.

Рассуждение агента в этой ячейке короткое, и это тоже показатель:

Метрика active_customers полностью определена в metrics.yml: окно 90 дней от world_cursor, активность = завершённый заказ (status='completed'), гости исключены (is_guest_order=false), отсечка видимости — по received_at_utc <= курсор. Все три решения уже зафиксированы, поэтому вариантов не требуется — один корректный запрос.

Ответил и не сошёлся9

Вопрос «Выросла ли выручка год к году». Три попытки, в каждой по два варианта — шесть запросов, ноль попаданий.

«Год к году» можно понимать двумя способами, дающими разные ответы: (1) сравнение календарных лет по дате заказа, (2) скользящее окно 365 дней от текущего курсора против предыдущих 365 дней. Метрика revenue из metrics.yml задаёт окно 90 дней по умолчанию — оно здесь не подходит, т.к. вопрос явно про годовое сравнение, поэтому окно переопределено, но остальные решения метрики (basis=net_of_returns, returns_attribution=return_date, guests=include, statuses=[completed], отсечка по received_at_utc относительно world_cursor) сохранены в обоих вариантах. Выбор между календарными годами и скользящим окном меняет, какие месяцы попадают в сравнение, и может изменить знак ответа (рост/падение), поэтому дан выбор, а не одно число.

Рассуждение аккуратное. Промах в другом.

эталон
19.75 — процент роста
вернул
2024-01-01 00:00:00 — метка периода

Спрашивали процент, ответил суммами по годам с метками. Процента среди шести вариантов нет вообще. Это промах не в числе, а в форме результата — и заметить его можно только зная, чего ждали.

Ответил, но проверить нельзя10

Вопрос «Сколько заказов в среднем на клиента». Эталон 5.77, агент дал три варианта, первый — 5.16.

Метрика 'заказы на клиента' не определена в metrics.yml, поэтому ключевые развилки (гости, статус заказа, окно) не закрыты явно — дал три варианта, покрывающих основные комбинации, вместо того чтобы выбрать молча.

В записях сверки сказано, что у этого вопроса верным оказался один повтор из трёх. Какой именно — не записано. Вердикт привязан к вопросу, а не к ячейке.

Это единственный из шести исходов, который целиком про измеритель, а не про агента. Десять ячеек лежат отдельным классом, а не угаданы.

Ответил, а верного ответа нет4

Вопрос «Есть ли смысл в гостевых заказах или они разовые». Эталона у него нет по построению — это исследовательский вопрос, а не метрика.

Агент это заметил и всё равно посчитал:

Вопрос не метрика из семантического слоя, а исследовательский: 'разовость' гостей = повторяют ли гостевые заказы один и тот же customer_id. Ключевая развилка — что считать активностью (только completed или любой заказ, включая отменённые), она как в active_customers меняет ответ. Окно не применяю: вопрос про повторность покупки в принципе, а не про активность за последние 90 дней. Важное допущение: предполагаю, что customer_id у гостевых заказов — стабильный идентификатор одного и того же человека (например, email/телефон), а не генерируется заново на каждый заказ; если это не так, оба запроса покажут искусственно 100% 'разовых' и вопрос нужно переформулировать.

Четыре ячейки на двух вопросах. Отсутствие верного ответа не мешает выдать число — мешает только проверить его.

Переспросил50

Самый частый исход. Почти половина всех ячеек: агент останавливается и говорит, чего не хватает.

Вопрос «Какой средний чек». Метрики с таким именем в слое нет, поэтому открыты все решения сразу.

«Средний чек» не описан в семантическом слое как отдельная метрика, поэтому есть развилки, которые меняют ответ в разы: 1) период — последние 90 дней от курсора (как у revenue) или всё время; 2) какие заказы включать в знаменатель — только completed или все (включая cancelled); 3) выручка в числителе — gross или net_of_returns (за вычетом возвратов, и если net — по дате возврата или дате заказа); 4) гостевые заказы — включать наравне с обычными или исключать; 5) считать чек по заказу (order_id) целиком или по строке позиции (order_id, sku). Уточните, пожалуйста, эти пункты, иначе я могу посчитать три разных «средних чека», отличающихся заметно.

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

Отказался12

Двенадцать ячеек на шести вопросах. Ни один отказ не про то, что чего-то не донесли в контекст.

ВопросЯчеекПочему
Просела ли конверсия после ноябрьского промо?3в данных нет трафика — у конверсии нет знаменателя
Что выгоднее — удерживать старых или привлекать новых?3нет затрат на привлечение и удержание
Сколько у нас будет активных клиентов к концу года?3это прогноз, а в базе только факт до курсора
Мобильные покупают иначе, чем с десктопа?1признака устройства нет, есть канал регистрации
Стоит ли расширять промо на все категории?1это решение, а не метрика
Когда клиент считается ушедшим?1определения оттока нет в слое

Четыре причины: нет объекта в данных, нет определения в слое, вопрос требует решения, а не числа, и вопрос про будущее. Разбивка моя, по чтению двенадцати текстов.

Отказывается агент не молча — в каждом тексте сказано, что посчитать всё-таки можно и почему это не будет ответом. А один отказ устроен иначе: там он нашёл поле, которое напрашивается, и объяснил, почему брать его нельзя.

В схеме нет признака устройства покупки (мобильный/десктоп) на уровне заказа. Есть только dim_customers.channel (android, ios, partner, store, web) — это канал регистрации/привлечения клиента, а не устройство, с которого сделан конкретный заказ. Приравнивать android+ios к 'мобильным', а web к 'десктопу' — произвольное и ненадёжное допущение (web тоже может открываться с телефона, partner/store вообще не про устройство). Достоверно ответить на вопрос о различиях в поведении мобильных и десктопных покупателей на этих данных нельзя.

Это уже не отказ от нехватки данных, а разбор подмены: поле похоже на нужное и называется почти как нужное, поэтому его легко взять по ошибке.

Что видно на карте

Семнадцать вопросов из тридцати пяти не дали ни одного запроса. Ни в одном из трёх повторов. Это не «иногда не справляется» — это половина сетки, на которой агент до SQL не доходит вовсе.

Ошибка — свойство вопроса, а не случайность. Девять ячеек с неверным числом приходятся ровно на три вопроса, по три ячейки каждый. Не «ошибается в девяти процентах случаев», а «есть три вопроса, на которых ошибается всегда».

Двадцать четыре вопроса однородны: три повтора дают один и тот же исход. У одиннадцати повторы разошлись — это вопросы на границе, где поведение неустойчиво. Доля таких вопросов — готовая мера, её можно считать на любом стенде и сравнивать между прогонами.

Промах отбора контекста агент замечает и называет вслух. В тринадцати ячейках он пишет, что нужной таблицы нет в схеме. На стенде она есть — её не подали в контекст. Это нижняя оценка: столько раз он захотел таблицу, которой ему не дали, и сказал об этом. Сколько раз не захотел или не сказал — неизвестно.

Карта всех ста пяти ячеек Каждый квадрат кликается: текст агента, запрос, сверка с эталоном, разнесение развилок. Открыть интерактив

Что проверить у себя

  1. Разложите свои вопросы по шести исходамПрежде чем чинить агента, посмотрите, чего у вас больше. Половина исходов не про модель.
  2. Посчитайте, на скольких вопросах он не доходит до запросаУ меня таких половина сетки. Это другая проблема, чем неверные числа, и чинится иначе.
  3. Задавайте каждый вопрос больше одного разаОднородность повторов показывает, где поведение устойчиво, а где вопрос лежит на границе.
  4. Привязывайте вердикт к ячейке, а не к вопросуИначе часть результатов окажется непроверяемой задним числом, как у меня десять из сорока трёх.
  5. Читайте, что агент пишет рядом с ответомВ половине случаев он сам называет развилку, которую закрыл за вас.

Как я это мерил

Правило разнесения по классам записано и закоммичено до счёта, классы не пересекаются, сумма сходится к ста пяти. Каждая ячейка имеет адрес записи, все выдержки скопированы программой, а не набраны руками.

Два долга, о которых стоит знать. Вердикт «сошлось с эталоном» привязан к предмету, а не к ячейке: для десяти ячеек восстановить, какой повтор сошёлся, нельзя. И имя файла лога строилось из времени с точностью до секунды, поэтому пять ячеек, запущенных в одну секунду, затёрли друг друга — эти записи потеряны.

Один стенд, одна предметная область, двадцать одна таблица. Числа отсюда не переносятся, переносится устройство.

Классификация исходов моя. В рабочих записях классов восемь: три подвида уточнения разведены отдельно. Здесь они сведены в один исход, поэтому счёт однородных вопросов отличается на единицу.

Группировка причин отказа — тоже моё чтение двенадцати текстов, автоматической разметки причин нет.

Вся серия про AI-аналитика

  1. Как я строил AI-аналитика2026.08 · 13 минУчебная сборка: шесть этапов и семнадцать проверок
  2. Продакт задал двадцать вопросов AI-аналитику2026.08 · 12 минЧто он унесёт неверного и почему это не видно по числу
  3. Как получить от AI-аналитика ответ на задачу2026.09 · 10 минСемь шагов между задачей и числом
  4. Как устроен слой метрик для AI-аналитика2026.09 · 10 минФайл на сто семь строк и два его исполнителя
  5. AI-аналитику нужна не длинная задача, а точная2026.09 · 8 минСемь сущностей задачи и три вида влияния шаблона
  6. Что бывает у AI-аналитика с вопросом по дороге к ответу2026.09 · 8 минВы здесь
  7. Что бывает у AI-аналитика с вопросом по дороге к ответу (интерактив)2026.09 · картаСто пять ячеек, каждая кликается
davydov.my · AI-аналитик · разбор шестой