ReAct-промпт стал монолитом
Это был узел в агенте, который искал круизы и вел пользователя по процессу бронирования. Тот самый, который упоминался в посте выше.
В этом агентском цикле модель должна была делать tool calls по инструкциям, а затем отвечать пользователю.
Пока бронирований не было, всё работало нормально: агент искал круизы, уточнял параметры и показывал варианты. Алгоритм был достаточно простым.
Потом добавилась booking-логика. Причем уже заметно сложнее: с явными состояниями, переходами и запретами.
И в одном промпте оказалось сразу три ответственности:
— определить бизнес-сценарий
— выбрать и вызвать нужные инструменты
— отформатировать ответ пользователю
Сценариев становилось больше. Появлялись исключения, запреты, новые шаги логики. При этом дообучать модель мы не могли.
Пошли ошибки:
— неправильно определялись сценарии
— пропускались шаги
— игнорировались важные запреты
— да, те самые, которые написаны капсом и с восклицательными знаками
Проблема была в том, что один промпт пытался быть сразу planner’ом, tool executor’ом и formatter’ом.
Для LLM это превращается в complex instruction following: много ограничений разного типа внутри одного вызова.
Формально — один промпт.
По факту — несколько задач в одном forward pass.
Решение было не в том, чтобы еще раз “лучше написать промпт”.
Мы разделили узел на два этапа:
— planning: определить сценарий и план действий
— tool execution: выполнить нужные вызовы
После этого стало проще понимать, где ломается логика: на выборе сценария или на исполнении.
Следующий шаг — отдельно вынести presentation logic.
Главный вывод:
когда промпт начинает содержать бизнес-логику, он становится кодом.
А код нужно декомпозировать.
Благо, на моем любимчике LangGraph это легко провернуть
Post #541
579
- 🔥 8
- ❤ 6
- 🐳 4