Skip to content
Эта страница создана и переведена с помощью ИИ. Если вы заметили неточности, помогите нам улучшить её. Редактировать на GitHub

Журнал решений

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

Обзор

Журнал решений фиксирует полный жизненный цикл решений эволюции:

  • Генерация предложения -- какое улучшение было предложено и почему
  • Оценка -- как предложение было оценено по критериям безопасности и пригодности
  • Вердикт -- было ли предложение одобрено, отклонено или отложено
  • Выполнение -- какие изменения были применены и их непосредственные эффекты
  • Результат -- измеренные результаты после изменения, включая любые регрессии

В отличие от журнала аудита безопасности (который фиксирует все события безопасности), журнал решений сфокусирован именно на процессе рассуждений системы самоэволюции.

Структура записи решения

Каждое решение хранится как структурированная запись:

ПолеТипОписание
decision_idStringУникальный идентификатор (UUIDv7, упорядоченный по времени)
cycle_idStringЦикл эволюции, породивший это решение
layerLayerУровень эволюции: L1 (память), L2 (промпт) или L3 (стратегия)
timestampDateTime<Utc>Время записи решения
proposalProposalПредложенное изменение (тип, описание, параметры)
rationaleStringОбоснование предложения данного изменения
data_pointsusizeКоличество выборок данных, информировавших решение
fitness_beforef64Балл пригодности до изменения
fitness_afterOption<f64>Балл пригодности после изменения (заполняется после выполнения)
verdictVerdictapproved, rejected, deferred или auto_approved
verdict_reasonStringПричина вердикта (напр., результат проверки безопасности)
executedboolБыло ли изменение фактически применено
rollback_idOption<String>Ссылка на снимок отката, если он был создан
outcomeOption<Outcome>Результат после выполнения: improved, neutral, regressed или rolled_back

Типы вердиктов

ВердиктОписаниеТриггер
auto_approvedОдобрено автоматически конвейеромИзменения L1 с баллом риска ниже порога
approvedОдобрено после оценкиИзменения L2/L3, прошедшие проверки безопасности
rejectedОтклонено конвейером безопасностиНеудача проверок корректности, слишком высокий риск или обнаружены конфликты
deferredОтложено для последующей оценкиНедостаточно данных или проблемы со здоровьем системы

Конфигурация

toml
[self_evolution.decision_log]
enabled = true
storage = "file"                # "file" или "database"
path = "~/.local/share/openprx/decisions/"
format = "jsonl"                # "jsonl" или "json" (с форматированием)
retention_days = 180            # автоудаление записей старше 180 дней
max_entries = 10000             # максимум записей до ротации

[self_evolution.decision_log.database]
backend = "sqlite"
path = "~/.local/share/openprx/decisions.db"

Справочник конфигурации

ПолеТипПо умолчаниюОписание
enabledbooltrueВключить или отключить журналирование решений
storageString"file"Бэкенд хранения: "file" или "database"
pathString"~/.local/share/openprx/decisions/"Каталог для файлов журнала (файловый режим)
formatString"jsonl"Формат файла: "jsonl" (компактный) или "json" (читаемый)
retention_daysu64180Автоудаление записей старше N дней. 0 = хранить вечно
max_entriesusize10000Максимум записей на файл до ротации
database.backendString"sqlite"Бэкенд базы данных: "sqlite" или "postgres"
database.pathString""Путь к базе данных (SQLite) или URL подключения (PostgreSQL)

Пример записи решения

json
{
  "decision_id": "019520b0-5678-7000-8000-000000000042",
  "cycle_id": "cycle_2026-03-21T03:00:00Z",
  "layer": "L2",
  "timestamp": "2026-03-21T03:05:12.345Z",
  "proposal": {
    "type": "prompt_refinement",
    "description": "Shorten system prompt preamble by 15% to reduce token usage",
    "parameters": {
      "target": "system_prompt.preamble",
      "old_token_count": 320,
      "new_token_count": 272
    }
  },
  "rationale": "Analysis of 500 sessions shows the preamble consumes 8% of context window with low recall contribution. A/B test variant with shortened preamble showed 3% improvement in response relevance.",
  "data_points": 500,
  "fitness_before": 0.72,
  "fitness_after": 0.75,
  "verdict": "approved",
  "verdict_reason": "Passed all safety checks. Risk score 0.12 (threshold: 0.5). No conflicts with existing policies.",
  "executed": true,
  "rollback_id": "snap_019520b0-5678-7000-8000-000000000043",
  "outcome": "improved"
}

Запросы к журналу решений

Команды CLI

bash
# Просмотр последних решений
prx evolution decisions --tail 20

# Фильтрация по уровню
prx evolution decisions --layer L2 --last 30d

# Фильтрация по вердикту
prx evolution decisions --verdict rejected --last 7d

# Фильтрация по результату
prx evolution decisions --outcome regressed

# Показать конкретное решение с полными деталями
prx evolution decisions --id 019520b0-5678-7000-8000-000000000042

# Экспорт решений для анализа
prx evolution decisions --last 90d --format json > decisions_q1.json

Программный доступ

Журнал решений доступен через API шлюза:

bash
# Список последних решений
curl -H "Authorization: Bearer <token>" \
  http://localhost:3120/api/v1/evolution/decisions?limit=20

# Получить конкретное решение
curl -H "Authorization: Bearer <token>" \
  http://localhost:3120/api/v1/evolution/decisions/019520b0-5678-7000-8000-000000000042

Анализ паттернов решений

Доля одобрений по уровням

Отслеживайте процент одобренных предложений на каждом уровне для оценки эффективности системы эволюции:

bash
prx evolution stats --last 90d

Пример вывода:

Layer   Proposed  Approved  Rejected  Deferred  Approval Rate
L1      142       138       2         2         97.2%
L2      28        19        6         3         67.9%
L3      5         2         3         0         40.0%

Обнаружение регрессий

Выявление решений, приведших к регрессиям:

bash
prx evolution decisions --outcome regressed --last 90d

Каждое решение с регрессией включает значения fitness_before и fitness_after, что позволяет легко измерить воздействие и соотнести с изменением.

Трассировка откатов

При откате решения журнал фиксирует:

  1. Исходное решение с outcome = "rolled_back"
  2. Новую запись решения для самого действия отката
  3. rollback_id ссылается на восстановленный снимок

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

Откат из журнала решений

Для ручного отката конкретного решения:

bash
# Просмотр решения и его снимка отката
prx evolution decisions --id <decision_id>

# Восстановление снимка
prx evolution rollback --snapshot <rollback_id>

Операция отката создаёт новую запись решения, документирующую ручное вмешательство.

Интеграция с системой безопасности

Журнал решений интегрируется с конвейером безопасности:

  • Перед выполнением -- конвейер безопасности читает прошлые решения для обнаружения паттернов (напр., повторные неудачи в одной области)
  • После выполнения -- сигналы регрессии запускают автоматический откат, который фиксируется в журнале
  • Ограничение частоты -- конвейер проверяет журнал для соблюдения максимума изменений за временное окно

Ограничения

  • Журналы решений локальны для экземпляра PRX; многоузловые развёртывания требуют внешней агрегации журналов
  • Файловый бэкенд не поддерживает индексированные запросы; для масштабного анализа используйте бэкенд базы данных
  • Баллы пригодности заполняются только после завершения окна наблюдения (настраивается для каждого уровня)
  • Отложенные решения могут так и не разрешиться, если условие отложения не переоценивается

Связанные страницы

Released under the Apache-2.0 License.