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

<Callout type="tip" title="Представьте конвейер">
Подобно тому, как заводской конвейер разбивает производство на специализированные станции, цепочка промптов разбивает задачи ИИ на специализированные этапы. Каждый этап хорошо выполняет одну задачу, а совокупный результат намного лучше, чем если бы всё делалось одновременно.
</Callout>

## Зачем объединять промпты в цепочки?

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

<div className="my-6 grid md:grid-cols-2 gap-4">
  <div className="border rounded-lg bg-red-50/50 dark:bg-red-950/20 border-red-200 dark:border-red-900">
    <p className="text-sm font-semibold text-red-700 dark:text-red-400 px-4 pt-3 flex items-center gap-2 m-0!"><IconX className="h-4 w-4" /> Проблемы одиночного промпта</p>
    <div className="text-sm p-4 pt-2 space-y-1">
      <p className="m-0!">Многоэтапные рассуждения путаются</p>
      <p className="m-0!">Разные «режимы» мышления конфликтуют</p>
      <p className="m-0!">Сложные выходные данные непоследовательны</p>
      <p className="m-0!">Нет возможности контроля качества</p>
    </div>
  </div>
  <div className="border rounded-lg bg-green-50/50 dark:bg-green-950/20 border-green-200 dark:border-green-900">
    <p className="text-sm font-semibold text-green-700 dark:text-green-400 px-4 pt-3 flex items-center gap-2 m-0!"><IconCheck className="h-4 w-4" /> Цепочки решают это</p>
    <div className="text-sm p-4 pt-2 space-y-1">
      <p className="m-0!">Каждый этап фокусируется на одной задаче</p>
      <p className="m-0!">Специализированные промпты для каждого режима</p>
      <p className="m-0!">Валидация между этапами</p>
      <p className="m-0!">Отладка и улучшение отдельных этапов</p>
    </div>
  </div>
</div>

## Базовый паттерн цепочки

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

<div className="my-6 flex items-center justify-center gap-3 p-6 bg-muted/30 rounded-lg overflow-x-auto">
  <div className="flex flex-col items-center">
    <div className="px-4 py-3 bg-blue-100 dark:bg-blue-900/50 border border-blue-200 dark:border-blue-800 rounded-lg text-center">
      <p className="text-sm font-medium text-blue-700 dark:text-blue-300 m-0!">Промпт 1</p>
      <p className="text-xs text-blue-600 dark:text-blue-400 m-0!">(Извлечь)</p>
    </div>
    <p className="text-xs text-muted-foreground mt-1 m-0!">Вход</p>
  </div>
  <div className="text-blue-400 dark:text-blue-500">→</div>
  <div className="flex flex-col items-center">
    <div className="px-4 py-3 bg-purple-100 dark:bg-purple-900/50 border border-purple-200 dark:border-purple-800 rounded-lg text-center">
      <p className="text-sm font-medium text-purple-700 dark:text-purple-300 m-0!">Промпт 2</p>
      <p className="text-xs text-purple-600 dark:text-purple-400 m-0!">(Анализировать)</p>
    </div>
    <p className="text-xs text-muted-foreground mt-1 m-0!">Промежуточный</p>
  </div>
  <div className="text-purple-400 dark:text-purple-500">→</div>
  <div className="flex flex-col items-center">
    <div className="px-4 py-3 bg-green-100 dark:bg-green-900/50 border border-green-200 dark:border-green-800 rounded-lg text-center">
      <p className="text-sm font-medium text-green-700 dark:text-green-300 m-0!">Промпт 3</p>
      <p className="text-xs text-green-600 dark:text-green-400 m-0!">(Сгенерировать)</p>
    </div>
    <p className="text-xs text-muted-foreground mt-1 m-0!">Выход</p>
  </div>
</div>

<Callout type="info" title="Паттерн ETG">
Наиболее распространённый паттерн цепочки — **Извлечь → Преобразовать → Сгенерировать** (Extract → Transform → Generate). Сначала извлеките необработанные данные, затем преобразуйте их для своих целей, а потом сгенерируйте конечный результат. Этот паттерн подходит почти для любой задачи с контентом.
</Callout>

## Типы цепочек

Разные задачи требуют разных архитектур цепочек. Выберите паттерн, соответствующий вашему рабочему процессу.

<ChainFlowDemo />

### Последовательная цепочка

Наиболее простой паттерн: каждый этап зависит от предыдущего. Представьте это как эстафету, где каждый бегун передаёт эстафетную палочку следующему.

<ChainExample 
  type="sequential"
  steps={[
    { step: "Этап 1: Извлечение", prompt: "Извлеките все даты, имена и числа из: [текст]", output: '{ dates: ["2024-01-15", "2024-02-20"], names: ["Иван Петров", "ООО Ромашка"], numbers: [15000, 42] }' },
    { step: "Этап 2: Анализ", prompt: "Учитывая эти извлечённые данные: [вывод_этапа1], определите связи и закономерности.", output: '{ patterns: ["Запланированы ежемесячные встречи"], relationships: ["Иван Петров работает в ООО Ромашка"] }' },
    { step: "Этап 3: Генерация", prompt: "Используя эти закономерности: [вывод_этапа2], напишите краткий отчёт с выделением наиболее значимых результатов.", output: "Краткий отчёт: Анализ документа выявил деловые отношения между Иваном Петровым и ООО Ромашка, с запланированными ежемесячными встречами..." }
  ]}
/>

### Параллельная цепочка

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

<ChainExample 
  type="parallel"
  steps={[
    { step: "Вход", prompt: "Текст отзыва о продукте", output: '"Я в восторге от этих наушников! Батарея держится вечно, а дисплей на чехле такой удобный. Идеально для ежедневных поездок на работу."' },
    { step: "Ветка A: Тональность", prompt: "Проанализируйте тональность: [текст]", output: '{ sentiment: "positive", score: 0.85 }' },
    { step: "Ветка B: Характеристики", prompt: "Извлеките упомянутые характеристики: [текст]", output: '{ features: ["батарея", "дисплей"] }' },
    { step: "Ветка C: Персона", prompt: "Определите персону пользователя: [текст]", output: '{ persona: "человек, ездящий на работу" }' },
    { step: "Объединение", prompt: "Объедините анализы в единый отчёт", output: "Единый отчёт: Положительный отзыв от человека, ездящего на работу, с акцентом на батарею и дисплей." }
  ]}
/>

### Условная цепочка

Направляйте входные данные по разным путям на основе классификации. Это похоже на дерево решений, где ИИ сначала категоризирует вход, а затем обрабатывает каждую категорию по-разному.

<ChainExample 
  type="conditional"
  steps={[
    { step: "Классификация входа", prompt: "Классифицируйте это сообщение клиента как: жалоба, вопрос, отзыв или другое.\n\nСообщение: [текст]", output: '{ classification: "complaint", confidence: 0.92 }' },
    { step: "Маршрут: Вопрос (пропущен)", prompt: "Определите, какая информация требуется", output: "Пропущено — вход классифицирован как жалоба" },
    { step: "Маршрут: Жалоба", prompt: "Определите проблему и её серьёзность: [текст]", output: '{ issue: "задержка доставки", severity: "средняя" }' },
    { step: "Генерация ответа", prompt: "Сгенерируйте сочувственный ответ с решением: [анализ]", output: "Уважаемый клиент, приносим искренние извинения за задержку. Ваш заказ отправлен в ускоренном режиме..." }
  ]}
/>

### Итеративная цепочка

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

<Callout type="warning" title="Установите лимит итераций">
Всегда устанавливайте максимальное количество итераций (обычно 3-5), чтобы избежать бесконечных циклов и контролировать затраты. Действует закон убывающей отдачи: большая часть улучшений происходит в первых 2-3 итерациях.
</Callout>

<ChainExample 
  type="iterative"
  steps={[
    { step: "Создание черновика", prompt: "Напишите описание продукта для: [беспроводные наушники]", output: "Эти беспроводные наушники обеспечивают хорошее качество звука и удобную посадку для повседневного использования." },
    { step: "Оценка (Балл: 5)", prompt: "Оцените это описание от 1 до 10 по: ясности, убедительности, точности.\n\nОписание: [текущий_черновик]", output: '{ score: 5, improvements: ["Добавить конкретные характеристики", "Включить эмоциональные преимущества", "Упомянуть время работы батареи", "Добавить призыв к действию"] }' },
    { step: "Улучшение черновика", prompt: "Улучшите это описание на основе обратной связи:\n\nТекущее: [текущий_черновик]\nОбратная связь: [улучшения]", output: "Ощутите кристально чистый звук с нашими премиальными беспроводными наушниками. 30 часов работы от батареи, активное шумоподавление и эргономичный дизайн, обеспечивающий комфорт на весь день. Идеально для любителей музыки и профессионалов. Закажите сейчас и преобразите свой опыт прослушивания." },
    { step: "Оценка (Балл: 8)", prompt: "Оцените это описание от 1 до 10 по: ясности, убедительности, точности.\n\nОписание: [улучшенный_черновик]", output: '{ score: 8, improvements: ["Незначительно: можно добавить информацию о гарантии"] }\n\n✓ Балл >= 8: ВЫХОД ИЗ ЦИКЛА' }
  ]}
/>

## Распространённые паттерны цепочек

Эти проверенные паттерны решают типичные задачи. Используйте их как отправные точки и адаптируйте под свои нужды.

### Извлечь → Преобразовать → Сгенерировать

Рабочая лошадка обработки контента. Извлеките данные, преобразуйте их, затем создайте что-то новое.

<div className="mb-4 p-3 rounded-lg bg-blue-50/50 dark:bg-blue-950/20 border border-blue-200 dark:border-blue-800">
  <p className="text-xs font-semibold text-blue-700 dark:text-blue-300 mb-1 m-0!">Лучше всего подходит для</p>
  <p className="text-sm text-blue-600 dark:text-blue-400 m-0!">Суммаризации документов, генерации отчётов, переработки контента, преобразования данных в повествование</p>
</div>

<ChainExample 
  type="sequential"
  steps={[
    { step: "Извлечение", prompt: "Из этого документа извлеките:\n- Основную тему\n- Ключевые аргументы (список)\n- Подтверждающие доказательства (список)\n- Выводы\nВерните в формате JSON.", output: '{ "topic": "Последствия изменения климата", "arguments": ["Повышение температуры", "Подъём уровня моря"], "evidence": ["Данные NASA", "Отчёты МГЭИК"], "conclusions": ["Необходимы срочные действия"] }' },
    { step: "Преобразование", prompt: "Реорганизуйте эту информацию для [бизнес-руководителей]:\n[извлечённые_данные]\nФокус на: экономические последствия\nУдалить: технический жаргон", output: '{ "summary": "Климатические риски для бизнеса", "key_points": ["Нарушение цепочек поставок", "Рост страховых расходов"], "action_items": ["Оценить уязвимости", "Спланировать адаптацию"] }' },
    { step: "Генерация", prompt: "Используя эту реструктурированную информацию, напишите [краткое резюме для руководства]:\n[преобразованные_данные]\nТон: профессиональный\nДлина: 200 слов", output: "Краткое резюме для руководства: Изменение климата представляет значительные операционные риски для нашего бизнеса. Ключевые проблемы включают нарушение цепочек поставок из-за экстремальных погодных явлений и рост страховых премий. Мы рекомендуем немедленно оценить уязвимости объектов и разработать стратегии адаптации..." }
  ]}
/>

### Анализировать → Планировать → Выполнять

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

<div className="mb-4 p-3 rounded-lg bg-purple-50/50 dark:bg-purple-950/20 border border-purple-200 dark:border-purple-800">
  <p className="text-xs font-semibold text-purple-700 dark:text-purple-300 mb-1 m-0!">Лучше всего подходит для</p>
  <p className="text-sm text-purple-600 dark:text-purple-400 m-0!">Рефакторинга кода, планирования проектов, устранения неполадок, стратегического принятия решений, решения сложных задач</p>
</div>

<ChainExample 
  type="sequential"
  steps={[
    { step: "Анализ", prompt: "Проанализируйте структуру этой кодовой базы и определите:\n- Архитектурный паттерн\n- Основные компоненты\n- Зависимости\n- Потенциальные проблемы\n[код]", output: '{ "pattern": "MVC", "components": ["UserController", "AuthService", "Database"], "dependencies": ["express", "mongoose"], "issues": ["Нет валидации входных данных", "Захардкоженные секреты"] }' },
    { step: "Планирование", prompt: "На основе этого анализа создайте план рефакторинга:\n[вывод_анализа]\nЦель: улучшить безопасность\nОграничения: без критических изменений", output: '{ "steps": ["1. Добавить middleware для валидации входных данных", "2. Перенести секреты в переменные окружения", "3. Добавить ограничение скорости запросов"], "priority": "высокий", "estimated_time": "4 часа" }' },
    { step: "Выполнение", prompt: "Реализуйте шаг 1 этого плана:\n[вывод_плана]\nПокажите рефакторинг кода с пояснениями.", output: "// Добавлен middleware для валидации\nconst validateInput = (req, res, next) => {\n  const { email, password } = req.body;\n  if (!email || !isValidEmail(email)) {\n    return res.status(400).json({ error: 'Некорректный email' });\n  }\n  next();\n};" }
  ]}
/>

### Сгенерировать → Критиковать → Улучшить

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

<div className="mb-4 p-3 rounded-lg bg-green-50/50 dark:bg-green-950/20 border border-green-200 dark:border-green-800">
  <p className="text-xs font-semibold text-green-700 dark:text-green-300 mb-1 m-0!">Лучше всего подходит для</p>
  <p className="text-sm text-green-600 dark:text-green-400 m-0!">Маркетинговых текстов, творческого письма, черновиков электронных писем, презентаций, любого контента, который выигрывает от редактирования</p>
</div>

<ChainExample 
  type="iterative"
  steps={[
    { step: "Генерация", prompt: "Напишите маркетинговое письмо для [фитнес-приложения], ориентированное на [занятых профессионалов].", output: "Тема: Быстро придите в форму!\n\nПривет! Наше приложение помогает заниматься спортом. Скачайте его сегодня и начните свой путь к фитнесу. Спасибо!" },
    { step: "Критика", prompt: "Как эксперт по маркетингу, оцените это письмо:\n[сгенерированное_письмо]\nОцените: тему письма, зацепку, ценностное предложение, призыв к действию, тон\nОцените каждый пункт от 1 до 10.", output: '{ "subject_line": 4, "hook": 3, "value_proposition": 2, "cta": 5, "tone": 4, "feedback": "Слишком общее, нет конкретных преимуществ, слабая срочность" }' },
    { step: "Улучшение", prompt: "Перепишите письмо с учётом этой обратной связи:\nОригинал: [сгенерированное_письмо]\nКритика: [вывод_критики]\nСосредоточьтесь на элементах с наименьшими оценками.", output: "Тема: 15-минутные тренировки для обеденного перерыва\n\nПлотный график? Мы понимаем. Наше приложение предлагает научно обоснованные тренировки, разработанные для профессионалов, у которых совершенно нет времени. Присоединяйтесь к 50 000+ руководителей, которые преобразили своё здоровье всего за 15 минут в день. Начните бесплатный пробный период прямо сейчас — ваше будущее «я» скажет вам спасибо." },
    { step: "Финальная оценка", prompt: "Переоцените улучшенное письмо.", output: '{ "subject_line": 8, "hook": 8, "value_proposition": 9, "cta": 8, "tone": 9, "improvement": "+23 балла в сумме" }' }
  ]}
/>

## Реализация цепочек

Вы можете реализовать цепочки вручную для экспериментов или программно для продакшн-систем. Начните с простого и добавляйте сложность по мере необходимости.

### Ручное связывание

Подход «скопировать и вставить» идеально подходит для прототипирования и экспериментов. Запустите каждый промпт вручную, изучите результат и вставьте его в следующий промпт.

<CodeEditor 
  language="python"
  filename="manual_chain.py"
  code={`# Pseudocode for manual chaining
step1_output = call_ai("Extract entities from: " + input_text)
step2_output = call_ai("Analyze relationships: " + step1_output)
final_output = call_ai("Generate report: " + step2_output)`}
/>

### Программное связывание

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

<CodeEditor 
  language="python"
  filename="chain.py"
  code={`def analysis_chain(document):
    # Step 1: Summarize
    summary = call_ai(f"""
        Summarize the key points of this document in 5 bullets:
        {document}
    """)
    
    # Step 2: Extract entities
    entities = call_ai(f"""
        Extract named entities (people, organizations, locations) 
        from this summary. Return as JSON.
        {summary}
    """)
    
    # Step 3: Generate insights
    insights = call_ai(f"""
        Based on this summary and entities, generate 3 actionable 
        insights for a business analyst.
        Summary: {summary}
        Entities: {entities}
    """)
    
    return {
        "summary": summary,
        "entities": json.loads(entities),
        "insights": insights
    }`}
/>

### Использование шаблонов цепочек

Определяйте цепочки как конфигурационные файлы для повторного использования и лёгкой модификации. Это отделяет логику промптов от кода приложения.

<CodeEditor 
  language="yaml"
  filename="chain_template.yaml"
  code={`name: "Document Analysis Chain"
steps:
  - name: "extract"
    prompt: |
      Extract key information from this document:
      {input}
      Return JSON with: topics, entities, dates, numbers
    
  - name: "analyze"
    prompt: |
      Analyze this extracted data for patterns:
      {extract.output}
      Identify: trends, anomalies, relationships
    
  - name: "report"
    prompt: |
      Generate an executive summary based on:
      Data: {extract.output}
      Analysis: {analyze.output}
      Format: 3 paragraphs, business tone`}
/>

## Обработка ошибок в цепочках

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

<ChainErrorDemo />

<Callout type="warning" title="Мусор на входе — мусор на выходе">
Если один этап производит плохой результат, это повлияет на все последующие этапы. Всегда проверяйте критические промежуточные результаты перед их передачей дальше.
</Callout>

### Валидация между этапами

Добавьте этап валидации после любого этапа, который производит структурированные данные. Это позволяет выявлять ошибки на ранней стадии, пока они не распространились каскадом.

<ValidationDemo />

### Запасные цепочки

Когда ваш основной подход даёт сбой, имейте готовый более простой запасной вариант. Пожертвуйте возможностями ради надёжности.

<FallbackDemo />

## Оптимизация цепочек

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

<div className="my-6 grid md:grid-cols-3 gap-4">
  <div className="border rounded-lg bg-blue-50/50 dark:bg-blue-950/20 border-blue-200 dark:border-blue-900 p-4">
    <p className="text-sm font-semibold text-blue-700 dark:text-blue-400 mb-2 m-0!">Снижение задержки</p>
    <div className="text-sm space-y-1">
      <p className="m-0!">Параллелизуйте независимые этапы</p>
      <p className="m-0!">Кэшируйте промежуточные результаты</p>
      <p className="m-0!">Используйте меньшие модели для простых этапов</p>
      <p className="m-0!">Группируйте однотипные операции</p>
    </div>
  </div>
  <div className="border rounded-lg bg-green-50/50 dark:bg-green-950/20 border-green-200 dark:border-green-900 p-4">
    <p className="text-sm font-semibold text-green-700 dark:text-green-400 mb-2 m-0!">Снижение затрат</p>
    <div className="text-sm space-y-1">
      <p className="m-0!">Используйте более дешёвые модели для классификации</p>
      <p className="m-0!">Ограничьте итерации в циклах</p>
      <p className="m-0!">Прерывайте выполнение досрочно, когда возможно</p>
      <p className="m-0!">Кэшируйте повторяющиеся запросы</p>
    </div>
  </div>
  <div className="border rounded-lg bg-purple-50/50 dark:bg-purple-950/20 border-purple-200 dark:border-purple-900 p-4">
    <p className="text-sm font-semibold text-purple-700 dark:text-purple-400 mb-2 m-0!">Повышение надёжности</p>
    <div className="text-sm space-y-1">
      <p className="m-0!">Добавьте валидацию между этапами</p>
      <p className="m-0!">Включите логику повторных попыток</p>
      <p className="m-0!">Логируйте промежуточные результаты</p>
      <p className="m-0!">Реализуйте запасные пути</p>
    </div>
  </div>
</div>

## Пример цепочки из реального мира

Давайте разберём полноценную продакшн-цепочку. Этот конвейер контента превращает сырую идею в отшлифованный пакет статьи.

### Конвейер контента

<ContentPipelineDemo />

## Резюме

Цепочка промптов трансформирует возможности ИИ, разбивая невыполнимые задачи на достижимые этапы.

<div className="my-6 grid md:grid-cols-2 gap-4">
  <div className="border rounded-lg bg-amber-50/50 dark:bg-amber-950/20 border-amber-200 dark:border-amber-900 p-4">
    <p className="text-sm font-semibold text-amber-700 dark:text-amber-400 mb-2 m-0!">Цепочки позволяют</p>
    <div className="text-sm space-y-1">
      <p className="m-0!">Сложные многоэтапные рабочие процессы</p>
      <p className="m-0!">Более высокое качество благодаря специализации</p>
      <p className="m-0!">Лучшую обработку ошибок и валидацию</p>
      <p className="m-0!">Модульные, многоразовые компоненты промптов</p>
    </div>
  </div>
  <div className="border rounded-lg bg-cyan-50/50 dark:bg-cyan-950/20 border-cyan-200 dark:border-cyan-900 p-4">
    <p className="text-sm font-semibold text-cyan-700 dark:text-cyan-400 mb-2 m-0!">Ключевые принципы</p>
    <div className="text-sm space-y-1">
      <p className="m-0!">Разбивайте сложные задачи на простые этапы</p>
      <p className="m-0!">Проектируйте чёткие интерфейсы между этапами</p>
      <p className="m-0!">Валидируйте промежуточные результаты</p>
      <p className="m-0!">Встраивайте обработку ошибок и запасные варианты</p>
      <p className="m-0!">Оптимизируйте под ваши ограничения</p>
    </div>
  </div>
</div>

<Callout type="tip" title="Начинайте просто">
Начните с последовательной цепочки из 2-3 этапов. Добейтесь её надёжной работы, прежде чем усложнять. Большинству задач не нужны сложные архитектуры цепочек.
</Callout>

<Quiz 
  question="В чём главное преимущество цепочки промптов по сравнению с одним сложным промптом?"
  options={[
    "Используется меньше токенов в целом",
    "Выполнение происходит быстрее",
    "Каждый этап может специализироваться, улучшая качество и позволяя обрабатывать ошибки",
    "Требуется меньше планирования"
  ]}
  correctIndex={2}
  explanation="Цепочка промптов разбивает сложные задачи на специализированные этапы. Каждый этап может хорошо выполнять одну задачу, промежуточные результаты можно валидировать, ошибки можно отлавливать и повторять попытки, а общее качество повышается благодаря специализации."
/>

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