Ваш агент бесконечно вызывает один и тот же инструмент — найдите причины и защиты.
Агент работает с поисковым инструментом и не завершается. Трасса повторяется дословно, пока процесс не убьют.
Ограничения:
- Сам инструмент исправен — на каждый вызов он отвечает HTTP 200.
- Старые ходы обрезаются из контекста, чтобы уместиться в окно.
- Назовите причины, с которыми согласуется эта трасса, затем предложите защиты.
шаг 41 мысль: нужна дата релиза. действие: search{"q": "release date"}
шаг 41 наблюдение: []
шаг 42 мысль: нужна дата релиза. действие: search{"q": "release date"}
шаг 42 наблюдение: []
шаг 43 мысль: нужна дата релиза. действие: search{"q": "release date"}
шаг 43 наблюдение: []
Найдите причины и почините цикл.
Ход повторяется, потому что между шагами ничего не меняется: наблюдение не несёт нового либо модель не видит, что уже пробовала этот вызов. Защита — бюджет шагов, детектор повторов, прошлые действия в контексте и содержательные наблюдения.
- ✗Добавить только бюджет шагов, не спросив, почему наблюдение не меняется
- ✗Считать, что модель помнит свои прошлые вызовы после их обрезки из контекста
- ✗Принимать повторный вызов за нестабильный инструмент и прятать его за повторами клиента
- →Что должен делать runtime при срабатывании детектора повторов — прервать или направить?
- →Почему пустой результат инструмента бывает хуже явного сообщения об ошибке?
Трасса согласуется с двумя причинами сразу. Первая: наблюдение — пустой список, и пустота не сообщает модели ничего нового, поэтому она переформулирует ту же мысль. Вторая: прошлые ходы обрезаны, так что модель не видит, что уже делала этот вызов.
guard 1 step budget → hard stop at N steps, return a partial answer
guard 2 repeat detector → hash (tool, args) over the last k calls; identical → intervene
guard 3 action memory → keep a compact list of past (tool, args, outcome) in context
guard 4 rich observation → "0 results for q=... ; try a different query" instead of []
Порядок важен: бюджет шагов лишь ограничивает ущерб, а причину убирают защиты 3 и 4. При срабатывании детектора лучше не обрывать запуск, а направить модель — вернуть наблюдение о том, что этот вызов уже делался с тем же результатом.