Чуваки из Микрософта берут LLM и при помощи промпт-инжиниринга заставляют его решать классификационные задачи. И оно, понятное дело, как-то работает. А фишка в данной работе в методе улучшения формулировки промпта. Здесь у нас есть labeled data (то есть список примеров и ответов к ним). Соответственно, мы можем оценить качество промпта на этих данных (насколько хорошо с таким промптом удаётся предсказать правильный лейбл). Естественно, на большом датасете проверять дорого, прежде всего в смысле времени. Поэтому проверяем на семпле из датасета (но этот ответ, понятно, только некая аппроксимация настоящего ответа).
Пытаются улучшать промпты предлагая LLM покритиковать формулировки промптов, которые не дали правильных ответов. Далее, отдельным промптом просят LLM улучшить промпт, указав его проблему, идентифицированную на предыдущем шаге. В довесок просят придумать несколько семантически эквивалентных формулировок к каждому улучшенному промпту.
Всё это происходит в несколько итераций.
Процесс выбора кандидатов для дальнейших попыток улучшения осуществляется с помощью beam search (не путать с тем beam search, который используется внутри LLM, чтобы сгенерировать многословные ответы на основе вероятностей, посчитанных для каждого слова).
То есть на каждом этапе делается набор промптов дополняется, как описано выше, потом делается эксперимент с рандомным семплом данных и оценивается результат промпта. При этом обновляется некий показатель его качества (по алгоритму UCB Bandits). Качество оценивается как сумма эмпирической оценки успешности работы данного промпта (сумма - потому что хороший промпт потенциально оценивается много раз) и некого дополнительного члена, убывающего с ростом количества проб - чтобы стимулировать exploration. Далее оставляют некое заданное количество промптов для следующего шага. И так несколько раз.
Чуваки метафорически назвали попытку улучшения промпта "градиентным спуском" и на мой взгляд, не вполне удачно. Кажется, оно больше похоже на simulated annealing.
https://arxiv.org/abs/2305.03495