Chain-of-thought (буквально «цепочка размышлений», часто пишут CoT) — это приём, при котором вы просите модель не сразу выдать ответ, а сначала расписать свои рассуждения. Идея простая: когда Claude вслух разбирает задачу шаг за шагом, у него заметно меньше шансов перескочить через логическую дыру и выдать правдоподобную, но неверную картину.
Эта статья — про ручной CoT. Он же manual CoT — то есть вы сами в промпте просите модель порассуждать. Это не то же самое, что встроенный режим extended thinking у новых моделей (там модель «думает» автоматически, а вам отдаёт уже готовый ответ). Про extended thinking — отдельная статья. Здесь — приём, который работает в любом интерфейсе, включая Claude Code.
Вы пишете веб-систему для производства лестниц на Kotlin + Ktor + JDBI + PostgreSQL и React, кодите в основном через Claude Code. CoT здесь пригождается в трёх ситуациях:
JwtFilterTest
падает на CI и зелёный локально — попросите Claude сначала расписать
возможные причины, и только потом править код. Часто на этапе
рассуждения уже видно, что дело в часовом поясе или порядке загрузки
пропертей, и до правок не доходит.
OrderCalculationService или формулу
markupMaterialsPct — попросите расписать, какие случаи
она должна покрывать и какие сейчас не покрывает. Это ловит граничные
условия (нулевая наценка, отрицательный остаток материала) ещё до
того, как код написан.
OrderService, OrderRepository и
MaterialService одновременно — пусть модель сначала
расскажет план изменений и порядок, а потом приступает.
В разделе «Thinking and reasoning» документации Claude есть пункт специально про ручной CoT:
Manual CoT as a fallback. When thinking is off, you can still encourage step-by-step reasoning by asking Claude to think through the problem. Use structured tags like
<thinking>and<answer>to cleanly separate reasoning from the final output.
По-русски: даже когда автоматический thinking-режим выключен, вы можете
попросить Claude рассуждать шаг за шагом. Удобный приём — обернуть
рассуждение в тег <thinking>, а финальный ответ — в
<answer>. Тогда вы (или ваш код, если бы он у вас
был) легко отделите внутреннюю кухню от итога.
Тут же Anthropic советует ещё один полезный приём — самопроверку:
Ask Claude to self-check. Append something like "Before you finish, verify your answer against [test criteria]." This catches errors reliably, especially for coding and math.
То есть в конце промпта добавьте что-то вроде «Прежде чем закончить, сверь ответ с [критерии]». Anthropic пишет, что это «надёжно ловит ошибки, особенно в задачах по программированию и математике» — то есть ровно ваш случай.
Допустим, вы хотите изменить
OrderCalculationService: там поменялась формула наценки
на материалы. Не лучший подход — сразу написать «поправь
markupMaterialsPct чтобы…». Лучше сначала попросить план.
Промпт в Claude Code:
Я хочу поменять расчёт markupMaterialsPct в OrderCalculationService.
Новая логика: наценка зависит от суммы заказа — до 100 000 ₽ это 30%,
выше — 20%.
Прежде чем менять код, расскажи в <thinking>:
1. какие методы OrderCalculationService используют markupMaterialsPct
2. какие тесты в IntegrationTestBase покроют это
3. какие граничные случаи могут сломаться (ровно 100 000, ноль, отрицательное)
Потом в <answer> — план правок с порядком файлов.
Перед тем как закончить, сверь план с тем, что markupMaterialsPct
используется в OrderRepository (если используется).
Что вы получаете: Claude сначала разбирает задачу — и часто на этом
этапе всплывает, что markupMaterialsPct читается ещё в
двух местах, или что текущий тест проверяет старую формулу буквально.
Дальше план становится точнее, и вероятность правки в один проход —
выше.
<thinking> и
<answer> — рассуждение и итог разделены.