Chain-of-thought: как заставить LLM рассуждать по шагам
Практика3 минРедакция Innovialabs
Коротко
Chain-of-thought — это просьба к модели сначала рассуждать по шагам, а потом давать ответ; это помогает в задачах с расчётами, логикой и несколькими условиями. В продакшене рассуждение отделяют тегами или полями JSON и показывают пользователю только итог.
Что такое chain-of-thought и когда он помогает
Chain-of-thought (CoT) — приём, при котором модель сначала выписывает промежуточные шаги решения, а уже потом даёт ответ. Модель генерирует текст последовательно, поэтому записанные шаги становятся опорой для следующих — и ошибок «в уме» становится меньше.
CoT обычно помогает в задачах, где ответ нельзя выдать сразу:
- расчёты: суммы, скидки, сроки, конвертация единиц;
- логика с несколькими условиями: «подходит ли клиент под тариф, если…»;
- анализ документа: найти противоречия, сверить данные из разных мест;
- классификация со сложными правилами, где важно учесть исключения.
Где CoT почти бесполезен: простое извлечение факта, перевод, короткий ответ по шаблону. Там он только увеличивает длину ответа, задержку и стоимость.
Многие современные модели умеют рассуждать сами (так называемые reasoning-модели или режим «расширенного мышления»). Для них явная просьба «думай по шагам» часто не нужна — достаточно включить соответствующий режим через API.
Как запросить рассуждение
Простой вариант
Добавьте в промпт инструкцию: «Сначала рассуди по шагам, затем дай ответ». Это уже меняет поведение модели.
Структурированный вариант
Лучше задать конкретные шаги и отделить рассуждение от ответа:
Определи, положена ли клиенту бесплатная доставка.
Правила: {правила}
Заказ: {данные заказа}
Сначала в теге <thinking> по шагам:
1. Выпиши сумму заказа и город.
2. Проверь каждое правило.
3. Учти исключения.
Затем в теге <answer> дай только "да" или "нет" и одно предложение причины.
С примерами
Можно совместить с few-shot: в примерах показать короткое рассуждение и ответ. Модель повторит стиль рассуждения.
Как скрыть рассуждение в продакшене
Пользователю чат-бота не нужно видеть черновик модели. Варианты:
| Способ | Как работает | Когда подходит |
|---|---|---|
| Теги | Рассуждение в <thinking>, ответ в <answer>; код показывает только <answer> | Простой текстовый вывод |
| Поля JSON | {"reasoning": "...", "answer": "..."}; в интерфейс уходит только answer | Интеграции, API |
| Два запроса | Первый запрос рассуждает, второй формулирует ответ для пользователя | Когда нужен отполированный текст |
| Встроенный режим рассуждений | Модель думает в отдельном блоке ответа API | Если модель это поддерживает |
Пример разбора ответа:
import re
def extract_answer(text: str) -> str:
match = re.search(r"<answer>(.*?)</answer>", text, re.DOTALL)
return match.group(1).strip() if match else ""
Если тег не найден — не показывайте пользователю весь сырой текст. Повторите запрос или верните нейтральное сообщение об ошибке.
Типичные ошибки
- CoT везде. Пошаговое рассуждение в простых задачах только тратит токены.
- Рассуждение после ответа. Если модель сначала пишет ответ, а потом «обосновывает» его, точность не растёт. Рассуждение должно идти до ответа.
- Рассуждение видно пользователю. Черновик может содержать сомнения, внутренние правила и лишние детали.
- Вера в рассуждение как в доказательство. Шаги выглядят логично, но могут содержать ошибку. Для критичных расчётов проверяйте результат кодом.
- Нет лимита. Без ограничений рассуждение может быть очень длинным. Задайте конкретные шаги или ограничьте объём.
Как понять, что CoT действительно помогает
- Соберите набор тестовых задач с известными ответами.
- Сравните точность с CoT и без него.
- Учтите цену: длину ответа и время отклика.
- Оставьте CoT только там, где выигрыш в качестве стоит этих затрат.