Menu

Цепочки промптов: как разбить задачу на шаги

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

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

Цепочка промптов: это когда работу делят на последовательность промптов, и результат одного промпта становится частью входа следующего. Вместо того чтобы просить модель за один раз прочитать пятьдесят отзывов, найти проблемы, расставить их по важности и написать отчёт, вы просите обо всём этом по очереди. У каждого промпта одна задача, а между шагами вы (или ваш код) можете посмотреть на результат, исправить его или остановиться.

Блок ниже: цепочка из трёх шагов, которая превращает отзывы покупателей в записку для продуктовой команды. Каждая вкладка: один шаг. Вход шага 2: вставленный ответ на шаг 1, а вход шага 3: ответ на шаг 2.

Fill in
Перечисли все жалобы в отзывах внутри тегов <reviews>. Похвалу игнорируй. Верни JSON-массив объектов с ключами "review" (номер отзыва) и "complaint" (не больше восьми слов). Верни только JSON. <reviews> 1. Батарея села через 4 часа, и кабель для зарядки слишком короткий. 2. Отличный звук. Но приложение постоянно выкидывает из аккаунта. 3. Обожаю их, но батареи едва хватает на дорогу домой. 4. Приложение дважды вылетало при сопряжении, и батарея быстро садится. 5. Кабель настолько короткий, что не могу пользоваться ими, пока они заряжаются у меня на столе. </reviews>
Try it
Example replyReplies vary between models and runs.
[
  {"review": 1, "complaint": "Батарея села через 4 часа"},
  {"review": 1, "complaint": "Слишком короткий кабель для зарядки"},
  {"review": 2, "complaint": "Приложение постоянно выкидывает из аккаунта"},
  {"review": 3, "complaint": "Батареи не хватает на дорогу"},
  {"review": 4, "complaint": "Приложение вылетало при сопряжении"},
  {"review": 4, "complaint": "Батарея быстро садится"},
  {"review": 5, "complaint": "Кабель слишком короткий для использования при зарядке"}
]

Шаг 1 только читает и извлекает. Шаг 2 вообще не видит отзывов, только список, поэтому не может снова скатиться в их пересказ. Шаг 3 только пишет. Если шаг 3 вернулся не в том тоне, вы перезапускаете только шаг 3; извлечение и группировка остаются как были.

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

Почему цепочка лучше одного большого промпта

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

Можно проверить середину. В одном промпте пропущенная жалоба исчезает внутри красиво написанного абзаца, и вы её не увидите. В цепочке список из шага 1 прямо перед вами. Проверка занимает секунды, а исправить его до шага 2 дешевле, чем искать ошибку в итоговом отчёте.

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

Сбои локальны. Когда цепочка ломается, вы знаете, какой шаг сломался, и перезапускаете только его.

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

Как спроектировать цепочку

  1. Запишите шаги, которые вы сделали бы вручную. Если сначала вы составили бы список, потом отсортировали его, потом написали бы текст, это три промпта. Шаги, требующие разного типа мышления, естественные места для разделения.
  2. Определите формат вывода каждого шага до того, как писать его промпт. То, что потребляет следующий шаг, должно легко читаться и легко проверяться: JSON-массив, нумерованный список, таблица. Свободный текст годится только для последнего шага.
  3. Передавайте только то, что нужно следующему шагу. Шаг 2 выше получает список жалоб, а не отзывы. Меньше входных данных: меньше того, что может отвлечь, и каждый шаг можно проверить отдельно.
  4. Добавьте проверку между шагами. В коде разберите JSON и убедитесь, что поля на месте. Для вопросов, требующих суждения, проверка сама может быть промптом: «Содержит ли этот список все жалобы из этих отзывов? Ответь да или нет, затем перечисли пропущенные».
  5. Чётко отмечайте вставленный материал. Вход каждого шага: текст, созданный на предыдущем шаге, и разделители не дают модели прочитать его как новые инструкции.

Вот шаг проверки для цепочки выше, запущенный на версии вывода шага 1, в которой пропущена жалоба. Такая проверка: отдельный промпт с одним узким вопросом, поэтому получить его правильно проще, чем само извлечение.

Проверить шаг перед передачей дальше
Сравни отзывы в тегах <reviews> со списком жалоб в тегах <complaints>. Содержит ли список все жалобы из отзывов? В первой строке ответь «Полный» или «Неполный». Если неполный, перечисли каждую пропущенную жалобу с номером отзыва. <reviews> 1. Батарея села через 4 часа, и кабель для зарядки слишком короткий. 2. Отличный звук. Но приложение постоянно выкидывает из аккаунта. 3. Обожаю их, но батареи едва хватает на дорогу домой. 4. Приложение дважды вылетало при сопряжении, и батарея быстро садится. 5. Кабель настолько короткий, что не могу пользоваться ими, пока они заряжаются у меня на столе. </reviews> <complaints> Отзыв 1: Батарея села через 4 часа Отзыв 1: Слишком короткий кабель для зарядки Отзыв 2: Приложение постоянно выкидывает из аккаунта Отзыв 3: Батареи не хватает на дорогу Отзыв 4: Приложение вылетало при сопряжении Отзыв 5: Кабель слишком короткий для использования при зарядке </complaints>
Try it
Example replyReplies vary between models and runs.

Неполный

  • Отзыв 4: батарея быстро садится

Если проверка говорит «Неполный», перезапустите шаг 1 или добавьте пропущенный пункт вручную, прежде чем запускать шаг 2.

Цепочка в коде

В коде цепочка: это последовательность вызовов, в которой каждый промпт строится из предыдущего ответа. Эта версия использует Python SDK от Anthropic; та же схема работает с любым провайдером.

import json
import anthropic

client = anthropic.Anthropic()
MODEL = "your-model-id"  # e.g. from your provider's model list

def ask(prompt):
    response = client.messages.create(
        model=MODEL,
        max_tokens=1024,
        messages=[{"role": "user", "content": prompt}],
    )
    return response.content[0].text

reviews = open("reviews.txt", encoding="utf-8").read()

complaints = ask(
    "List every complaint in the reviews inside the <reviews> tags. Ignore praise. "
    'Return a JSON array of objects with the keys "review" and "complaint". '
    "Return only the JSON, with no code fence.\n\n"
    f"<reviews>\n{reviews}\n</reviews>"
)
json.loads(complaints)  # raises an error here if step 1 did not return valid JSON

themes = ask(
    "Group these complaints into themes. Return only a JSON array with the keys "
    '"theme", "count" and "reviews", sorted by count, highest first.\n\n'
    f"<complaints>\n{complaints}\n</complaints>"
)

note = ask(
    "Write a note of at most four sentences to the product team based on these "
    f"themes. Lead with the most common one.\n\n<themes>\n{themes}\n</themes>"
)
print(note)

Строка с json.loads: простейшая возможная проверка. Если шаг 1 ответил прозой, цепочка остановится здесь, а не передаст дальше плохой вход. Цепочка для продакшена также проверяла бы поля, один раз повторяла бы упавший шаг и логировала бы каждый промежуточный результат, чтобы плохой итоговый ответ можно было отследить до шага, который его вызвал.

Цепочки в чат-приложении

Чтобы строить цепочки промптов, код не нужен. Запустите шаг 1, прочитайте ответ, исправьте всё неверное и вставьте его в промпт шага 2. Если каждый шаг делать в новом чате, предыдущий разговор не попадает в контекст, и инструкция, написанная для одного шага, не влияет на следующий. Оставаться в одном чате быстрее, и это работает, когда шаги тесно связаны, но тогда вся история едет вместе с каждым новым сообщением.

Цепочки и похожие техники

Chain of thought: это рассуждение, выписанное внутри одного ответа; цепочка промптов: это несколько ответов, и вы контролируете, что передаётся между ними. Эти техники хорошо сочетаются: любой шаг цепочки может просить пошаговое рассуждение.

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

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

Что такое цепочка промптов?

Цепочка промптов (prompt chaining): это техника, при которой задачу разбивают на несколько промптов, которые выполняются один за другим, и результат каждого вставляется в следующий. Например, один промпт извлекает жалобы из отзывов, второй группирует их по темам, а третий пишет отчёт по этим темам.

Чем цепочка промптов отличается от chain of thought?

Chain of thought происходит внутри одного ответа: модель выписывает рассуждение перед ответом. Цепочка промптов использует несколько отдельных вызовов, и вы или ваш код передаёте результат одного в следующий. Любой отдельный шаг цепочки можно посмотреть, исправить или перезапустить, а с рассуждением внутри одного ответа так не получится.

Можно ли делать цепочки промптов в ChatGPT или Claude без кода?

Да. Запустите первый промпт, проверьте ответ, затем вставьте его в следующий промпт, в том же чате или в новом. Если начинать новый чат для каждого шага, ранние черновики и инструкции не влияют на следующие шаги.

Когда использовать цепочку вместо одного промпта?

Используйте цепочку, когда один промпт просит несколько разных видов работы, например извлечь, проанализировать и написать, или когда промежуточный результат нужно проверить или переиспользовать. Если один промпт уже даёт надёжный ответ, цепочка добавит только вызовы, стоимость и время ожидания.

Coddy programming languages illustration

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

НАЧАТЬ