Menu

Chain of thought промптинг: думаем шаг за шагом

Chain of thought (цепочка рассуждений) просит модель выписать рассуждение, прежде чем дать ответ. Больше всего это помогает в многошаговых задачах по математике и логике и меньше значит для рассуждающих моделей, которые и так думают перед ответом.

Каждый промпт на этой странице можно изменить и открыть в ChatGPT, Claude или другом ИИ-приложении.

Chain of thought промптинг просит языковую модель выписать промежуточные шаги задачи, прежде чем дать итоговый ответ. На задачах из нескольких шагов, таких как текстовые задачи, логические головоломки и расписания, работа на виду обычно даёт больше правильных ответов, чем ответ сразу, и оставляет вам шаги, которые можно проверить. Самая короткая версия: одно предложение, добавленное в промпт: «Давай подумаем шаг за шагом».

Почему выписывание шагов помогает

Модель создаёт ответ по одному токену за раз, и всё, что она уже написала, становится входом для следующего токена. Если промпт требует ответ немедленно, модели приходится выдать его раньше, чем на странице появится хоть один промежуточный результат. Если же она сначала пишет «продажи кофе в понедельник составили $168», это число уже в контексте, и следующий шаг может опираться на него, а не держать его в уме.

Это интуиция. Доказательства дали две работы 2022 года. Wei et al., «Chain-of-Thought Prompting Elicits Reasoning in Large Language Models», показали, что готовые примеры с выписанным рассуждением улучшают результаты больших моделей на задачах по арифметике, здравому смыслу и символьным рассуждениям. Они также обнаружили, что выигрыш зависит от размера: маленькие модели ничего не выигрывали и часто писали гладкие рассуждения, которые вели к неверным ответам. Затем Kojima et al., «Large Language Models are Zero-Shot Reasoners», показали, что одно предложение без примеров, «Let's think step by step», тоже заметно улучшает результаты, хотя обычно меньше, чем готовые примеры.

Прямой ответ против цепочки рассуждений

Обе вкладки задают один и тот же вопрос. Первая требует только сумму; вторая просит расчёт и ставит ответ в фиксированную последнюю строку.

Кафе продаёт кофе по $3.50 и маффины по $2.25. В понедельник оно продало 48 чашек кофе и сколько-то маффинов и выручило всего $213. Во вторник оно продало на 10 чашек кофе меньше, чем в понедельник, и вдвое больше маффинов. Какова выручка во вторник? Ответь только суммой.
Try it
Example replyReplies vary between models and runs.

$258

Прямой ответ показывает типичную ошибку: 258это258 это 168 за кофе в понедельник плюс $90 за маффины во вторник, то есть модель забыла, что во вторник продали на 10 чашек меньше. Пошаговый ответ выделяет число чашек во вторник в отдельную строку, так что этот шаг нельзя тихо пропустить. Современная модель может решить правильно и прямую версию; разрыв растёт по мере того, как задачи становятся длиннее, а шаги сильнее зависят друг от друга.

У выписанных шагов есть и второе преимущество: когда ответ неверен, видно, какой шаг сломался, и можно исправить промпт или входные данные именно в этом месте.

Few-shot chain of thought

Исходная техника Wei et al. кладёт в промпт готовые примеры, в ответах которых показано рассуждение, и модель отвечает на новый вопрос так же. Пример ниже адаптирован из первого рисунка их статьи; вопрос после него новый. Замените вопрос, чтобы попробовать свой.

Few-shot chain of thought
Fill in
Parts
Вопрос: У Роджера 5 теннисных мячей. Он покупает ещё 2 банки теннисных мячей. В каждой банке 3 мяча. Сколько теннисных мячей у него теперь? Ответ: Сначала у Роджера было 5 мячей. 2 банки по 3 мяча: это 6 мячей. 5 + 6 = 11. Ответ: 11.
Вопрос: На полках библиотеки было 120 книг. Она выдала 45, получила назад 18 и приняла в дар 30. Сколько книг теперь на полках? Ответ:
Try it
Example replyReplies vary between models and runs.

Сначала в библиотеке было 120 книг. После выдачи 45 на полках осталось 75. Когда вернули 18, стало 93. Подаренные 30 книг довели число до 123. Ответ: 123.

Few-shot CoT даёт контроль над формой рассуждения: какой оно длины, что в нём проговаривается и как сформулирован ответ. «Ответ: 11» в примере: фиксированная концовка, и ответ модели её скопировал. Zero-shot CoT быстрее написать, но эти решения он оставляет модели. Подробнее о подборе примеров на странице few-shot промптинг; версия только с инструкцией описана на странице zero-shot промптинг.

Ставьте ответ в отдельную строку

Когда в ответе есть рассуждение, итог оказывается где-то внутри абзаца, а это проблема, если его должна прочитать программа. Попросите ответ в фиксированной форме в последней строке, как делает промпт про кафе с "Answer: $X" (маркер оставлен на английском, потому что его ищет код ниже), и читайте эту строку в коде:

import re

matches = re.findall(r"^Answer:\s*(.+)$", reply, re.MULTILINE)
answer = matches[-1] if matches else None

Брать именно последнее совпадение важно, потому что в самом рассуждении может встретиться строка, начинающаяся с "Answer:", до того как модель себя поправит. Если пользователи должны видеть только ответ, попросите рассуждение внутри одной пары тегов, а ответ внутри другой, и показывайте только вторую. Как просить JSON, когда нужно больше одного поля, рассказано на странице структурированный вывод.

Рассуждающие модели

Некоторые современные модели устроены так, чтобы думать перед ответом: они генерируют рассуждение внутри, часто скрытое или сжатое, до видимого ответа. Для них «давай подумаем шаг за шагом» значит гораздо меньше, потому что шаги происходят, просите вы о них или нет. Добавление этой фразы обычно просто удлиняет видимый ответ.

С рассуждающей моделью по-прежнему помогает всё, что окружает рассуждение: полная постановка задачи, ограничения, которым должен удовлетворять правильный ответ, и формат итогового ответа. Описывайте, как выглядит хороший ответ, а не расписывайте каждый шаг; жёсткий рецепт шагов может увести модель с лучшего пути, который она нашла бы сама.

Когда не использовать chain of thought

Цепочка рассуждений стоит токенов и времени и окупается только тогда, когда в задаче есть шаги, зависящие друг от друга. Для поиска факта, перевода, переписывания или простой классификации она лишь делает ответ длиннее. Модель также может написать рассуждение, которое выглядит здраво, и всё равно прийти к неверному ответу, поэтому проверяйте итоговый результат отдельно, а не только шаги, которые к нему привели.

Для трудных задач, где одна цепочка может ошибиться, есть два развития этой идеи. Self-consistency промптинг сэмплирует несколько цепочек и берёт ответ, к которому приходит большинство, а tree of thought промптинг исследует и сравнивает несколько частичных линий рассуждения, прежде чем выбрать одну.

Часто задаваемые вопросы

Что такое chain of thought промптинг?

Chain of thought (CoT, цепочка рассуждений) просит языковую модель выписать промежуточные шаги задачи перед итоговым ответом: либо через готовые примеры, в которых есть рассуждение, либо через инструкцию вроде «Давай подумаем шаг за шагом». На многошаговых задачах это обычно даёт больше правильных ответов и позволяет проверить каждый шаг.

«Давай подумаем шаг за шагом» всё ещё работает?

Со стандартными чат-моделями это всё ещё помогает на задачах из нескольких шагов, особенно когда промпт иначе подталкивал бы к мгновенному ответу. Рассуждающие модели, которые думают перед ответом, и так делают это внутри, поэтому фраза мало что им добавляет, кроме более длинного ответа. Для таких моделей лучше ясно сформулировать задачу и формат ответа.

Когда chain of thought помогает, а когда нет?

Помогает в задачах, где нужно несколько зависящих друг от друга шагов: текстовые задачи, арифметика, логические головоломки, расписания с ограничениями и трассировка того, что делает код. Мало что добавляет к поиску фактов, переводу, переписыванию или простой классификации, где он только делает ответ длиннее и медленнее.

Чем zero-shot chain of thought отличается от few-shot?

Few-shot CoT, предложенный Wei et al. в 2022 году, кладёт в промпт готовые примеры с рассуждениями, и модель подражает этому стилю рассуждений. Zero-shot CoT из работы Kojima et al. 2022 года обходится без примеров и просто добавляет инструкцию вроде «Давай подумаем шаг за шагом». Zero-shot быстрее написать; few-shot даёт больше контроля над тем, как выглядят шаги.

Написанное рассуждение: это то, как модель на самом деле получила ответ?

Не обязательно. Шаги: это текст, который генерирует модель, и они могут выглядеть убедительно, а итоговый ответ оказаться неверным, или содержать ошибку при случайно верном ответе. Относитесь к рассуждению как к тому, что нужно проверить, а не как к доказательству, и проверяйте итоговый ответ отдельно.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ