Детекторы, которым я не доверял, молчали. Правило, которое срабатывает, легко проверить на работоспособность. Правило, которое ничего не делает, может означать «проверено, ничего не найдено» или «вышло из строя до проверки», и снаружи они выглядят одинаково...
Детекторы, которым я не доверял, молчали. Правило, которое срабатывает, легко проверить на работоспособность. Правило, которое ничего не делает, может означать «проверено, ничего не найдено» или «вышло из строя до проверки», и со стороны это выглядит одинаково.
В итоге в агентском дозоре у меня оказалось 43 детектора, входящих в комплект агентского пакета, и это система, которую я построил, чтобы не путать их. Он запускает 226 сценариев примерно за двенадцать секунд.
Форма сценария
Каждый случай — это небольшой класс данных, который знает, как построить трассировку и что с ней должно происходить:
@dataclass
Класс Сценарий:
идентификатор: ул
детектор: тип
ожидаемый_огонь: логическое значение
build: Callable # -> (RunSummary, list[SpanNode])
серьезность: ул | Нет = Нет
пул: dict[str, Any] | Нет = Нет # значений БД в сценарии
фаза: str = "матрица" # матрица | точность | ллм | чистый
Трассировки строятся вручную, а не выбираются из корпуса, поэтому одновременно тестируется только одна вещь:
add("L1", LoopDetector, True,
лямбда: (summ(total_tool_calls=6), [tool("search_kb") для _ в диапазоне(6)]),
серьезность = "предупреждение")
Шесть одинаковых вызовов (порог пять) должны выдать предупреждение. Никакой двусмысленности, о которой можно было бы спорить позже.
Следы созданы вручную не просто так. Корпус