Эксперименты и оценка пригодности
Система самоэволюции в PRX использует контролируемые эксперименты и оценку пригодности для измерения того, действительно ли предложенные изменения улучшают производительность агента. Каждое предложение эволюции выше L1 тестируется через A/B-эксперимент перед постоянным принятием.
Обзор
Система экспериментов обеспечивает:
- A/B-тестирование -- параллельный запуск контрольного и экспериментального вариантов
- Скоринг пригодности -- количественная оценка производительности агента составным баллом
- Статистическая валидация -- подтверждение значимости улучшений, а не случайного шума
- Автоматическая конвергенция -- продвижение победителя и отклонение проигравшего при убедительных результатах
Жизненный цикл эксперимента
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌───────────┐
│ Создание │───►│ Запуск │───►│ Оценка │───►│Конвергенц.│
│ │ │ │ │ │ │ │
│ Определ. │ │ Разделен.│ │ Сравнен. │ │ Продвиж. │
│ вариантов│ │ трафика │ │пригодн. │ │или отклон.│
└──────────┘ └──────────┘ └──────────┘ └───────────┘1. Создание
Эксперимент создаётся, когда конвейер эволюции генерирует предложение:
- Контрольный вариант, представляющий текущую конфигурацию
- Экспериментальный вариант, представляющий предложенное изменение
- Параметры эксперимента: длительность, размер выборки, разделение трафика
2. Запуск
Во время эксперимента сессии назначаются вариантам:
- Сессии назначаются случайно на основе соотношения разделения трафика
- Каждая сессия полностью проходит под одним вариантом (без переключения в середине сессии)
- Оба варианта мониторятся по одному набору метрик пригодности
3. Оценка
После достижения минимальной длительности или размера выборки:
- Вычисляются баллы пригодности для обоих вариантов
- Проверяется статистическая значимость (по умолчанию: 95% доверительная вероятность)
- Вычисляется размер эффекта для измерения практической значимости
4. Конвергенция
На основе результатов оценки:
- Экспериментальный побеждает -- предложенное изменение продвигается в конфигурацию по умолчанию
- Контрольный побеждает -- предложенное изменение отклоняется; контрольный остаётся
- Неопределённо -- эксперимент продлевается или изменение откладывается
Конфигурация
[self_evolution.experiments]
enabled = true
default_duration_hours = 168 # 1 неделя по умолчанию
min_sample_size = 100 # минимум сессий на вариант
traffic_split = 0.5 # разделение 50/50 между контролем и экспериментом
confidence_level = 0.95 # требуемая 95% статистическая доверительная вероятность
min_effect_size = 0.02 # минимальное 2% улучшение для принятия
[self_evolution.experiments.auto_converge]
enabled = true
check_interval_hours = 24 # оценка результатов каждые 24 часа
max_duration_hours = 720 # принудительная конвергенция через 30 днейСправочник конфигурации
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
enabled | bool | true | Включить или отключить систему экспериментов |
default_duration_hours | u64 | 168 | Длительность эксперимента по умолчанию в часах (1 неделя) |
min_sample_size | usize | 100 | Минимум сессий на вариант перед оценкой |
traffic_split | f64 | 0.5 | Доля сессий, назначаемых экспериментальному варианту (0.0--1.0) |
confidence_level | f64 | 0.95 | Требуемый уровень статистической доверительной вероятности |
min_effect_size | f64 | 0.02 | Минимальное улучшение пригодности (доля) для принятия эксперимента |
auto_converge.enabled | bool | true | Автоматически продвигать/отклонять при убедительных результатах |
auto_converge.check_interval_hours | u64 | 24 | Как часто проверять результаты эксперимента |
auto_converge.max_duration_hours | u64 | 720 | Принудительная конвергенция после данной длительности (по умолчанию 30 дней) |
Структура записи эксперимента
Каждый эксперимент отслеживается как структурированная запись:
| Поле | Тип | Описание |
|---|---|---|
experiment_id | String | Уникальный идентификатор (UUIDv7) |
decision_id | String | Ссылка на породившее решение |
layer | Layer | Уровень эволюции: L1, L2 или L3 |
status | Status | running, evaluating, converged, cancelled |
created_at | DateTime<Utc> | Время создания эксперимента |
converged_at | Option<DateTime<Utc>> | Время завершения эксперимента |
control | Variant | Описание контрольного варианта |
treatment | Variant | Описание экспериментального варианта |
control_sessions | usize | Количество сессий, назначенных контрольному |
treatment_sessions | usize | Количество сессий, назначенных экспериментальному |
control_fitness | FitnessScore | Агрегированная пригодность контрольного варианта |
treatment_fitness | FitnessScore | Агрегированная пригодность экспериментального варианта |
p_value | Option<f64> | Статистическая значимость (ниже = значимее) |
winner | Option<String> | "control", "treatment" или null если неопределённо |
Оценка пригодности
Скоринг пригодности количественно оценивает производительность агента по нескольким измерениям. Составной балл пригодности используется для сравнения вариантов эксперимента и отслеживания прогресса эволюции с течением времени.
Измерения пригодности
| Измерение | Вес | Описание | Как измеряется |
|---|---|---|---|
response_relevance | 0.30 | Насколько релевантны ответы агента запросам пользователя | Скоринг LLM-как-судья |
task_completion | 0.25 | Доля успешно завершённых задач | Доля успешных вызовов инструментов |
response_latency | 0.15 | Время от сообщения пользователя до первого токена ответа | На основе перцентилей (p50, p95) |
token_efficiency | 0.10 | Токенов на успешную задачу | Чем ниже, тем лучше |
memory_precision | 0.10 | Релевантность вспомненных воспоминаний | Скоринг релевантности вспоминания |
user_satisfaction | 0.10 | Явные сигналы обратной связи пользователя | Лайки/дизлайки, исправления |
Составной балл
Составной балл пригодности -- это взвешенная сумма:
fitness = sum(dimension_score * dimension_weight)Каждое измерение нормализуется в диапазон 0.0--1.0 перед взвешиванием. Составной балл также находится в диапазоне 0.0--1.0, где выше -- лучше.
Конфигурация пригодности
[self_evolution.fitness]
evaluation_window_hours = 24 # агрегирование метрик за это окно
min_sessions_for_score = 10 # минимум 10 сессий для валидного балла
[self_evolution.fitness.weights]
response_relevance = 0.30
task_completion = 0.25
response_latency = 0.15
token_efficiency = 0.10
memory_precision = 0.10
user_satisfaction = 0.10
[self_evolution.fitness.thresholds]
minimum_acceptable = 0.50 # пригодность ниже запускает оповещение
regression_delta = 0.05 # падение пригодности > 5% запускает откатСправочник конфигурации пригодности
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
evaluation_window_hours | u64 | 24 | Временное окно для агрегирования метрик пригодности |
min_sessions_for_score | usize | 10 | Минимум сессий для вычисления валидного балла |
weights.* | f64 | (см. таблицу выше) | Вес для каждого измерения пригодности (сумма должна быть 1.0) |
thresholds.minimum_acceptable | f64 | 0.50 | Порог оповещения при низкой пригодности |
thresholds.regression_delta | f64 | 0.05 | Максимальное падение пригодности до автоматического отката |
Команды CLI
# Список активных экспериментов
prx evolution experiments --status running
# Просмотр конкретного эксперимента
prx evolution experiments --id <experiment_id>
# Просмотр результатов эксперимента с разбивкой пригодности
prx evolution experiments --id <experiment_id> --details
# Отмена запущенного эксперимента (возврат к контрольному)
prx evolution experiments cancel <experiment_id>
# Просмотр текущего балла пригодности
prx evolution fitness
# Просмотр истории пригодности
prx evolution fitness --history --last 30d
# Просмотр разбивки пригодности по измерениям
prx evolution fitness --breakdownПример вывода пригодности
Current Fitness Score: 0.74
Dimension Score Weight Contribution
response_relevance 0.82 0.30 0.246
task_completion 0.78 0.25 0.195
response_latency 0.69 0.15 0.104
token_efficiency 0.65 0.10 0.065
memory_precision 0.71 0.10 0.071
user_satisfaction 0.60 0.10 0.060
Trend (last 7 days): +0.03 (improving)Примеры экспериментов
Оптимизация промпта L2
Типичный эксперимент L2 тестирует изменение системного промпта:
- Контроль: текущий системный промпт (320 токенов)
- Эксперимент: уточнённый системный промпт (272 токена, на 15% короче)
- Гипотеза: более короткий промпт освобождает контекстное окно, улучшая релевантность ответов
- Длительность: 7 дней, 100 сессий на вариант
- Результат: пригодность эксперимента 0.75 vs контроля 0.72 (p = 0.03), эксперимент продвинут
Стратегическое изменение L3
Эксперимент L3 тестирует изменение политики маршрутизации:
- Контроль: направлять все задачи кодирования на Claude Opus
- Эксперимент: направлять простые задачи кодирования на Claude Sonnet, сложные на Opus
- Гипотеза: экономичная маршрутизация без потери качества
- Длительность: 14 дней, 200 сессий на вариант
- Результат: пригодность эксперимента 0.73 vs контроля 0.74 (p = 0.42), неопределённо -- эксперимент продлён
Статистические методы
Система экспериментов использует следующие статистические методы:
- Двухвыборочный t-тест для сравнения средних баллов пригодности между вариантами
- U-тест Манна--Уитни как непараметрическая альтернатива при скошенных распределениях пригодности
- Поправка Бонферрони при одновременном сравнении нескольких измерений пригодности
- Секвенциальный анализ с расходованием альфа для возможности ранней остановки при явно значимых результатах
Ограничения
- Эксперименты требуют достаточного объёма сессий; развёртывания с малым трафиком могут потребовать недель для достижения значимости
- Сигналы удовлетворённости пользователей зависят от явной обратной связи, которая может быть разреженной
- Скоринг LLM-как-судья для релевантности ответов добавляет задержку и стоимость к конвейеру оценки
- Только один эксперимент может проводиться на уровень эволюции одновременно для избежания смешения
- Баллы пригодности относительны к конкретному развёртыванию; они не сравнимы между разными экземплярами PRX
Связанные страницы
- Обзор самоэволюции
- Журнал решений -- решения, запускающие эксперименты
- Конвейер эволюции -- конвейер, генерирующий предложения
- Безопасность и откат -- автоматический откат при регрессии