Хаки промпт-инжиниринга от Google
Недавно вышел 68-страничный мануал от Google про как делать промпт-инжиниринг. В англоязычном интернете мануал наделал Хайфа. По этому я все прочитал и выписал основные идеи с примерами.
Ничего супер революционного не было, но пару интересных хаков себе отметил.
Step-back prompting
Это когда перед промтом, вы генерируете некий дополнительный контекст, и добавляете его в промпт.
Допустим, вам надо сгенерировать портреты четырех покупательских сегментов, основываясь на данных опроса, для презентации коллегам. И вы хотите, чтобы все картинки были в одном стиле.
Вместо того, чтобы просить по-одной:
Вы сначала попросите:
Полученное описание граф. стиля добавьте в промпт для генерации картинки, и получите однообразные авиаторы.
Температура, Top-p, Top-k настройки
При создании запросов к языковым моделям, можно использовать параметр температура.Когда модель генерирует текст, она оценивает вероятности всех возможных следующих слов.
Температура определяет, насколько предсказуемым или творческим будет ответ. (задает уровень случайности в выборе следующего токена ответа). Вот что это означает на практике:
Промпт
Ответы:
Температура - 0.1
'Температура - 0.7
'Температура - 1.5
Указать температуру можно при обращении к API. В случае с OpenAI, например, вот так:
Параметры top-k и top-p задают число наиболее вероятных следующих токенов, и число токенов с суммарой вероятностью, из которых будет выбран следующий токен. Никакой практической пользы от их использования я не заметил.
Tree-of-Thought
Подход довольно большой, и сам по себе тянет на мануал, по этому в статье в сабже его только упоминают.
Идея простая, давайте напишем программу, мышление которой будет ветвиться, чтобы изучить сразу несколько возможных подходов к поиску решения задачи.
Например, задача: у нас есть данные опроса покупателей, и мы хотим улучшить рекомендательную систему, обучив модель рекомендовать квесты.
Есть несколько возможных подходов:
А. Кластеризация и поиск закономерностей в неструктурированных даных, а затем фильтровать квесты, которые подходят каждому кластеру.
Б. Разметить анкеты квестами, которые забронировал клиент, и обучить классификатор
В. Изучить данные, поискать закономерности и профили клиентов, а затем опросить каждый профиль еще раз, специализированным опросом, и строить рекомендательную систему для каждого.
Система с tree-of-thought (как и человек исследователь), берет каждый из вариантов, и углубляется в него, пока не дойдет до какого-то логического итога. Причем каждый вариант тоже ветвится на варианты. Например вариант Б, про классификатор можно разделить на классификацию методом:
- Логическая регрессия
- Решающий лес
- Нейросеть
- и т.д.
Пройдя по всем ветвям всех веток модель приходит к наиболее всесторонне обдуманному ответу. При этом на каждом шаге геренирует следующие ветки мышления, валидирует полученные ранее результаты и сохранят текущий вид дерева и прогресс.
Чтобы такая модель работала, надо написать сразу несколько приложений, и отладить их работу вместе:
- LLM-интерфейс — OpenAI, Mistral, Claude, HuggingFace и т.д.
- Prompter Agent — шаблон, превращающий текущую ситуацию в запрос.
- Checker Module — логика валидации шагов (можно начать с rule-based).
- Memory Module — хранение истории шагов и partial solutions.
- ToT Controller — логика: продолжить/откатиться/сменить путь.
- (опц.) GUI или CLI — визуализация дерева решений, ходов и reasoning.
Самый интересный из них — ToT solver. Работает, примерно, так:
- начать с пустого решения;
- запросить у LLM шаг;
- проверить его (валидно ли?);
- если да — запомнить, продолжить;
- если нет — вернуться и попробовать другой шаг;
- остановиться, когда найдено полное решение или исчерпаны пути.
Не смотря на кажущуюся универсальность, каждый модуль строго заточен под задачу, которую решает система. Например, если бы я захотел написать модель, которая действительно делает то, что я описал выше, написание и отладка всех модулей заняла бы у меня в два раза больше времени, чем просто решить задачу самому, с помощью chatGPT и Google docs.То есть подход плохо генерализируется.
Метод хорош для специализированных задач, экономический эффект которых окупит штат сайнтистов для разработки и поддержки моделей. Например что-то в банках, военке или гос. органах.
Структурированные форматы на входе и входе
Вы возможно знаете, что JSON отличный способ получить от нейросети ответ в структурированной форме. Это важно, когда результаты промпта потом обрабатываются автоматически. Я применял это, например, для получения трех коротких описаний для каждого товара, добавив в конце промпта:
Это позволило в 99% случаев получить ответ, который потом легко парсился в табличку. Но можно пойти дальше
А что, если JSON схему можно использовать не только для ВЫВОДА нейросети, но и для ВХОДА? Оказывается так и есть, и это помогает нейросети лучше понять контекст и избежать мисинтерпритаций. Например, для генерации коротких описаний можно подавать больше контекста в структурированном виде, сфокусировать нейросеть на важном, и получить более информативные описания, например вот так:
Такой же подход можно использовать при обработке обращений в чат-бор покупателей. Первое обращение к нейросети определяет тип запроса, выбирает нужную схему и заполняет JSON, на втором запросе, уже за решением, JSON предоставляется для контекста
CoT и ReAct
Chain of thought и ReAct — просто интересные внутренние особенности, которые ни как особо на вас не повлияют, если вы пользуетесь chatGPT. Он и так сам применит их когда нужно.
Chain of thought заставляет модель рассуждать последовательно, повышая точность в логических задачах. Reason & Act помогает модели поискать в интернете, если это необходимо для ответа.
Все.