Когда нужно получить от разрабатываемого агента структурированный вывод, я почти никогда не использую structured output схему, если только весь агент не выстроен на SGR. Вместо этого используется следующий хорошо-известный
1️⃣ создается инструмент с именем, типа
finalize, аргументы которого описывают требуемую структуру ответа;2️⃣ модель строго-настрого инструктируется в системном промпте сообщить финальный ответ через вызов этого инструмента;
3️⃣ stop reason'ы вида
stop / end_turn отвергаются, и модели вежливо напоминается, что от неё ждут вызов finalize, а не вот это всё.И это в целом работает, если бы не два «но»:
• иногда модель вертеть хотела, чего там от неё ожидают, и упорно продолжает сообщать ответ в
stop / end_turn, и на низких температурах это приводит к зацикливанию на одних и тех же итерациях;• в некоторых агентах приходится достаточно жестко ограничивать количество шагов, которые они могут сделать для достижения цели, и на все вот эти приседания их тратить как-то не айс.
Но есть выход 🦄 С каждым вежливым напоминанием, ещё и повышать температуру модели, пока она не сделает то, что от неё требуют. Мне нравится формула:
temperature = math.Min(temperature * (1 + float64(attempt)*0.5), maxFinalRetryTemperature)
В качестве
maxFinalRetryTemperature стоит использовать значение, при котором результаты работы всё ещё остаются адекватными. Я обычно ставлю 0.8.Работает — как часы 🙂
#агенты