Реализовать user trust метрику
ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Реализовать user trust метрику
1. Цель задачи
Научиться проектировать и вычислять метрику пользовательского доверия (trust score) на основе поведенческих сигналов в AI-ассистенте или RAG-системе. Trust score позволяет оценить, насколько пользователь склонен доверять ответам системы, исходя из таких действий, как копирование, клики на источники, время чтения, лайки/дизлайки. Результатом будет рабочий пайплайн сбора событий, расчёта trust score и визуализации его динамики.
Ключевой результат Реализованный сервис (или ноутбук), который агрегирует поведенческие события пользователя и вычисляет числовой trust score (0–1) с интерпретацией, а также дашборд для мониторинга.
2. Исходные данные
| Что нужно | Откуда взять |
|---|---|
| Поведенческие события пользователей (копирование, клики, время, реакции) | Симуляция генератором (см. ниже) ИЛИ реальный трекинг (если есть работающий AI-ассистент) |
| Список событий и их семантика | Определяем на этапе проектирования |
| Демо-датасет с метками доверия (опционально) | Синтетический: промоделировать пользователей с разным уровнем доверия |
| Среда для разработки | Локальная машина или Colab / Jupyter |
Если нет реального инструмента — симулируем:
- Написать Python-скрипт
generate_events.py, который создаёт таблицу событий (CSV/JSON) со следующими колонками:- user_id (str)
- timestamp (datetime)
event_type(copy / click_source / like / dislike / dwell_time_sec / request_rephrase / open_detail)- session_id (str)
- value (число или None — для dwell_time в секундах)
- Сгенерировать не менее 100 записей для 10 разных пользователей.
- Добавить «шум» и пропуски, чтобы данные были реалистичными (например, 5% пользователей не совершают никаких действий).
3. Технологический стек
| Компонент | Инструменты | Назначение |
|---|---|---|
| Язык / среда | Python 3.10+ | Основной язык разработки |
| Обработка данных | Pandas, NumPy | Загрузка, очистка, агрегация событий |
| Хранилище | SQLite / DuckDB (in‑memory) | Хранение событий (если не CSV) |
| Веб-сервер (опционально) | FastAPI / Flask (+ uvicorn) | REST‑эндпоинт для записи событий |
| Визуализация | Plotly (или Streamlit / Grafana) | Дашборд trust score |
| Версионирование | Git + GitHub/GitLab | Код и документация |
| Тестирование | pytest | Unit-тесты для расчёта trust score |
4. Этапы выполнения
Этап 1: Проектирование метрики и весов (30 минут)
Действия
-
Определить, какие события будут влиять на trust score. Рекомендуемый минимальный набор:
- copy — пользователь копирует ответ (положительный сигнал)
- click_source — клик по ссылке на источник (положительный, сильнее copy)
- dwell_time_sec — время, проведённое на странице с ответом (>15 сек — положительно, <3 сек — отрицательно)
- dislike — дизлайк (сильный отрицательный сигнал)
- rephrase_request — пользователь просит переформулировать (лёгкий отрицательный)
-
Установить веса для каждого типа события (нормировать так, чтобы итоговый score был от 0 до 1). Пример:
| Событие | Вес (w) | Примечание |
|---|---|---|
| copy | +0.15 | |
| click_source | +0.25 | |
| dwell_time_sec > 15 | +0.10 | |
| dwell_time_sec < 3 | -0.20 | |
| dislike | -0.40 | |
| rephrase_request | -0.10 | |
| like (опционально) | +0.20 | — |
-
Написать формулу:
$$trust_score = \max(0,\ \min(1,\ 0.5 + \sum (w_i \cdot count_norm_i)))$$
где $count_norm_i$ — количество событий данного типа за период, нормированное на количество диалогов пользователя.
Можно использовать экспоненциальное сглаживание для учёта давности событий. -
Документировать метрику в
TRUST_METRIC_DESIGN.md.
Ожидаемый результат этапа Документ дизайна метрики с формулой, весами и обоснованием.
Этап 2: Генерация / сбор событий (1 час)
Действия
-
Разработать класс EventCollector (или скрипт), который:
-
Написать генератор синтетических событий (если нет реальных данных):
- Создать 10 пользователей с разными профилями: «доверчивый» (много copy/click), «скептик» (много dislike/rephrase), «нейтральный».
- Распределить события по времени (например, за последние 7 дней).
- Сохранить в
data/events.db.
-
Протестировать сбор: отправить несколько тестовых событий через curl или requests, проверить запись.
Ожидаемый результат этапа Работающий сборщик событий + база данных с ~100+ записей.
Этап 3: Расчёт trust score (1 час)
Действия
-
Реализовать функцию compute_trust_score(user_id, as_of_date, lookback_days=7):
- Загружает события из БД за указанный период.
- Группирует по типу, считает count, нормирует на количество диалогов (или sessions) за тот же период.
- Применяет веса и формулу из этапа 1.
-
Добавить поддержку экспоненциального сглаживания (опционально):
$$score = [alpha](/wiki/alpha) \cdot score_{today} + (1-[alpha](/wiki/alpha)) \cdot score_{yesterday}$$
с $[alpha](/wiki/alpha) = 0.3$. -
Написать unit-тесты с использованием pytest:
- Проверить, что пользователь с только положительными событиями получает score > 0.7.
- Проверить, что пользователь с только дизлайками получает score < 0.3.
- Проверить граничные случаи (нет событий → score = 0.5).
-
Создать скрипт
calculate_all_scores.py, который вычисляет score для всех пользователей и выводит таблицу.
Ожидаемый результат этапа Модуль trust_score.py с функцией расчёта и покрытием тестами.
Этап 4: Визуализация и интерпретация (1 час)
Действия
-
Построить дашборд с помощью Plotly (или Streamlit) в dashboard.py:
- График «Trust score по дням» для выбранного пользователя.
- Гистограмма распределения trust score среди всех пользователей.
- Топ-5 событий, повлиявших на score.
- Таблица пользователей с текущим score и цветовой индикацией (зелёный >0.7, жёлтый 0.4–0.7, красный <0.4).
-
Добавить интерпретатор: функция interpret_score(score) возвращает текстовый комментарий (например, «Пользователь доверяет системе», «Требуется внимание», «Низкое доверие»).
-
Опционально: экспортировать графики в PNG/PDF для отчёта.
Ожидаемый результат этапа Интерактивный дашборд + текстовые отчёты.
Этап 5: Валидация и A/B-тест (имитация) (30 минут)
Действия
-
Создать симуляцию A/B-теста:
- Группа A — старая версия ассистента (без изменений).
- Группа B — улучшенная версия (более точные ответы, больше источников).
- Сгенерировать события для обеих групп (группа B должна показать более высокий trust score).
-
Сравнить средний trust score между группами с помощью t-теста.
-
Задокументировать результат: подтвердить, что метрика чувствительна к качеству системы.
Ожидаемый результат этапа Отчёт о валидации метрики (раздел в README).
5. Критерии приемки (Definition of Done)
- Разработан и задокументирован дизайн trust score (формула, веса, нормализация).
- Реализован сбор событий (REST endpoint или импорт из CSV).
- Написана функция расчёта trust score, покрытая unit-тестами (минимум 4 теста).
- Сгенерированы синтетические данные для 10+ пользователей.
- Создан дашборд (статический или интерактивный) с динамикой score.
- Проведена имитация A/B-теста, метрика показала значимое различие.
- Код залит в Git-репозиторий с README, инструкцией по запуску.
- В README описаны ограничения метрики и возможные улучшения.
6. Ожидаемый результат
Основной артефакт Git-репозиторий со следующей структурой:
├── README.md # описание, запуск
├── TRUST_METRIC_DESIGN.md # дизайн метрики
├── src/
│ ├── event_collector.py # сбор событий (API или парсер)
│ ├── trust_score.py # расчёт scores
│ ├── dashboard.py # визуализация
│ └── generate_events.py # синтетический генератор
├── data/
│ └── events.db # база событий (или CSV)
├── tests/
│ └── test_trust_score.py # unit-тесты
├── reports/
│ └── validation_report.md # результаты A/B-теста
└── requirements.txt
Содержание Рабочая система, которая может принять список поведенческих событий и вернуть trust score для каждого пользователя, а также визуализировать его динамику.
Дополнительно
- Документация по API сбора событий.
- Скрипт для пересчёта score за произвольный период.
7. Возможные сложности и их решение
| Сложность | Решение |
|---|---|
| События разрежены или отсутствуют у части пользователей | Использовать дефолтный score = 0.5 и маркировать как «недостаточно данных». Нормировать на количество диалогов, а не абсолютное число событий. |
| Выбор весов субъективен | Провести калибровку: опросить экспертов или использовать small-scale анкетирование. Задокументировать, что веса — гипотеза. |
| Приватность пользователей | Работать с анонимизированными ID (uuid). Не хранить личные данные. |
| Долгое время расчёта при большом количестве событий | Оптимизировать запросы к БД (индексы по user_id, timestamp). Использовать агрегацию за период (материализованные view). |
| Интерпретация score неочевидна для команды | Добавить в дашборд пояснения (какие события повлияли). Создать легенду цветов. |
8. Бюджет времени (оценка)
| Этап | Время |
|---|---|
| Этап 1: Проектирование метрики | 30 мин |
| Этап 2: Сбор / генерация событий | 1 ч |
| Этап 3: Расчёт trust score + тесты | 1 ч |
| Этап 4: Визуализация | 1 ч |
| Этап 5: Валидация (A/B имитация) | 30 мин |
| Итого | 4 ч |
При первом выполнении рекомендуется заложить +1 час на изучение инструментов и отладку.
9. Связанные вопросы из базы знаний
| Вопрос | Тема |
|---|---|
| #5 | Как определить метрики качества RAG-системы? |
| #12 | User engagement metrics: DAU, WAU, retention |
| #45 | A/B тестирование AI-продуктов |
| #78 | Сбор пользовательских событий (event tracking) |
| #101 | Экспоненциальное сглаживание временных рядов |
| #203 | Оценка достоверности LLM ответов (confidence calibration) |
| #305 | UX-метрики для диалоговых систем |
| #450 | Privacy by design в AI-продуктах |
| #600 | Визуализация данных с Plotly / Dash |
| #720 | Unit-тестирование функций анализа данных |
10. Чек-лист самопроверки
- Я проверил, что trust score корректно реагирует на положительные и отрицательные события (тесты проходят).
- В дашборде отображается динамика для каждого пользователя.
- События собираются через REST API (если выбран такой путь) и сохраняются в БД.
- В README написана команда для запуска и пример curl-запроса.
- Я провёл имитацию A/B-теста и убедился, что метрика чувствительна к изменениям.