Contrastive Chain-of-Thought (Contrastive CoT) — расширение классического Chain of Thought, где помимо правильных примеров модели показывают и ошибочные reasoning traces с пометкой, где именно произошёл сбой. В 2026 это полезно понимать как error-aware few-shot pattern: техника хороша не везде, а именно там, где модель систематически попадает в повторяющиеся логические ловушки.
Представьте урок математики. Учитель не только показывает правильное решение, но и разбирает типичную ошибку: «Вот так решили — и это неправильно, потому что забыли учесть скобки». Вы запоминаете, на что обратить внимание. Contrastive CoT работает так же — показывает модели и правильный, и ошибочный путь, чтобы она не повторяла чужих промахов.
Contrastive CoT — простая модификация Few-shot CoT. К каждому примеру с правильным рассуждением добавляется пример с ошибочным рассуждением на ту же задачу. Модель учится не только «как правильно», но и «как неправильно» — и в результате реже допускает типичные ошибки.
Формат: для каждого демонстрационного вопроса вы показываете два варианта решения — правильный и неправильный. В неправильном явно указана ошибка.
ПромптChatGPT
Вопрос: В магазине яблоки стоят 80 руб/кг. Маша купила 2.5 кг и дала 500 руб. Сколько сдачи?
[Правильное рассуждение]
1. Стоимость покупки: 2.5 × 80 = 200 руб.
2. Сдача: 500 − 200 = 300 руб.
Ответ: 300 руб. ✓
[Неправильное рассуждение]
1. Стоимость покупки: 2 × 80 = 160 руб. ← Ошибка: проигнорировали 0.5 кг
2. Сдача: 500 − 160 = 340 руб.
Ответ: 340 руб. ✗
Теперь реши:
Вопрос: Бензин стоит 55 руб/литр. Водитель залил 32.5 литра и заплатил 2000 руб. Сколько сдачи?
Ответ модели
Рассуждение:
Стоимость бензина: 32.5 × 55 = 1787.50 руб.
Сдача: 2000 − 1787.50 = 212.50 руб.
Ответ: 212 руб. 50 коп.
Подходит для: математических задач, логического анализа, задач с «ловушками», где модели часто допускают типичные ошибки.
Классический Few-shot CoT показывает модели только правильные цепочки рассуждений. Это работает хорошо, но у подхода есть слабое место: модель не знает, какие ошибки типичны и как их избежать. Она учится «как правильно», но не учится «как неправильно».
Исследователи из DAMO-NLP-SG (Chia et al., 2023) предложили Contrastive CoT — технику, где каждый пример содержит пару рассуждений:
Положительный пример — правильное пошаговое решение
Отрицательный пример — ошибочное решение с указанием, где именно допущена ошибка
Идея вдохновлена контрастивным обучением (contrastive learning) в машинном обучении: модель учится различать правильное и неправильное, а не просто имитировать правильное.
Вопрос: Товар стоил 2000 руб. Цену подняли на 25%, а потом снизили на 25%. Какова итоговая цена?
[Правильное рассуждение]
1. Повышение на 25%: 2000 × 1.25 = 2500 руб.
2. Снижение на 25% от новой цены: 2500 × 0.75 = 1875 руб.
Ответ: 1875 руб. ✓
[Неправильное рассуждение]
1. Подняли на 25%, потом снизили на 25% — значит вернулись к начальной цене.
Ответ: 2000 руб. ✗
← Ошибка: 25% снижения считается от новой цены (2500), а не от исходной (2000). Процент от разных баз даёт разные суммы.
Теперь реши:
Вопрос: Зарплату сотрудника увеличили на 20%, а через полгода снизили на 20%. Исходная зарплата — 80 000 руб. Какова итоговая?
Ответ модели
Рассуждение:
Повышение на 20%: 80 000 × 1.20 = 96 000 руб.
Снижение на 20% от новой зарплаты: 96 000 × 0.80 = 76 800 руб.
Важно: нельзя считать, что +20% и −20% «отменяют» друг друга. 20% от 96 000 (19 200) больше, чем 20% от 80 000 (16 000).
Вопрос: Все розы — цветы. Некоторые цветы быстро вянут. Можно ли утверждать, что некоторые розы быстро вянут?
[Правильное рассуждение]
1. Все розы — подмножество цветов.
2. Некоторые цветы быстро вянут — но мы не знаем, входят ли розы в эту группу.
3. «Некоторые цветы» могут быть тюльпанами, ромашками и т.д. — не обязательно розами.
4. Вывод: нельзя утверждать наверняка.
Ответ: Нет, нельзя утверждать. ✓
[Неправильное рассуждение]
1. Все розы — цветы.
2. Некоторые цветы быстро вянут.
3. Значит, некоторые розы тоже быстро вянут.
Ответ: Да, можно утверждать. ✗
← Ошибка: из того, что розы — подмножество цветов, не следует, что свойство «некоторых цветов» обязательно распространяется на розы. Это классическая ошибка недопустимого среднего термина.
Теперь реши:
Вопрос: Все студенты сдали экзамен. Некоторые сдавшие получили отлично. Можно ли утверждать, что некоторые студенты получили отлично?
Ответ модели
Рассуждение:
Все студенты входят в множество «сдавших экзамен».
Некоторые из сдавших получили отлично.
Студенты — подмножество сдавших. Но «некоторые сдавшие» с отличным результатом могут быть и не студентами (например, вольные слушатели).
Без дополнительной информации мы не знаем, пересекаются ли множества «студенты» и «получившие отлично».
Ответ: нельзя утверждать наверняка — информации недостаточно для однозначного вывода.
Вопрос: 5 из 6 успешных стартапов использовали методологию X. Стоит ли внедрять методологию X?
[Правильное рассуждение]
1. 5 из 6 успешных стартапов использовали X — но это только успешные.
2. Сколько неуспешных стартапов тоже использовали X? Если 500 из 600 провалившихся тоже использовали X, то корреляция с успехом ничтожна.
3. Без данных о неуспешных стартапах нельзя делать вывод о причинно-следственной связи.
4. Это классическая ошибка выжившего (survivorship bias).
Ответ: Недостаточно данных для вывода. ✓
[Неправильное рассуждение]
1. 5 из 6 успешных стартапов использовали X.
2. Значит, методология X ведёт к успеху.
3. Нужно срочно внедрять X.
Ответ: Да, стоит внедрять. ✗
← Ошибка: рассмотрены только успешные случаи. Игнорирование неуспешных стартапов с тем же X — ошибка выжившего.
Теперь реши:
Вопрос: 90% лучших программистов компании пьют более 3 чашек кофе в день. Стоит ли рекомендовать сотрудникам пить больше кофе для повышения продуктивности?
Ответ модели
Рассуждение:
90% лучших программистов пьют 3+ чашек кофе — но это данные только по лучшим сотрудникам.
Нужно проверить: сколько слабых программистов тоже пьют 3+ чашек? Если большинство — корреляция ложная.
Возможно, лучшие программисты просто работают дольше (и поэтому пьют больше кофе). Кофе — следствие, а не причина.
Это и ошибка выжившего (смотрим только на лучших), и путаница корреляции с причинностью.
Ответ: нет, данных недостаточно. Нужно сравнение с остальными сотрудниками и контролируемый эксперимент.
Показываем только правильные рассуждения. Модель учится имитировать верный паттерн, но не знает, какие ошибки типичны. На задачах-ловушках может попасться.
Contrastive CoT
Показываем пары: правильное + ошибочное рассуждение. Модель видит типичные ловушки и активно их обходит. Особенно эффективно на задачах с контринтуитивными ответами.
Сегодня Contrastive CoT — это скорее targeted prompt layer, чем универсальный default:
хороший fit для exams, finance, legal reasoning, analytics;
средний fit для обычного business Q&A;
слабый fit для creative writing и open generation.
То есть технику стоит включать по маршруту "мы уже знаем, какие именно ошибки модель любит делать", а не просто потому, что contrastive learning звучит солидно.
Точность на арифметических бенчмарках (Chia et al., 2023)
Стандартный промпт18%
Zero-shot CoT57%
Few-shot CoT73%
Contrastive CoT80%
По данным Chia et al. (2023), Contrastive CoT стабильно превосходит стандартный Few-shot CoT на бенчмарках арифметики и логического рассуждения, показывая наибольший прирост на задачах, где модели систематически ошибаются.
def generate_negative_example(
question: str,
correct_reasoning: str,
) -> dict:
"""
Генерирует правдоподобный, но ошибочный
вариант рассуждения через LLM.
"""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "system",
"content": (
"Ты генерируешь правдоподобные, но ошибочные "
"рассуждения для обучения. Ошибка должна быть "
"типичной и неочевидной, но явно помеченной."
),
},
{
"role": "user",
"content": (
f"Вопрос: {question}\n\n"
f"Правильное рассуждение:\n{correct_reasoning}\n\n"
f"Сгенерируй одну правдоподобную, но ошибочную "
f"цепочку рассуждений для этой же задачи. "
f"Формат ответа (строго):\n"
f"РАССУЖДЕНИЕ: <ошибочная цепочка>\n"
f"ОШИБКА: <объяснение, в чём ошибка>"
),
},
],
temperature=0.7,
)
text = response.choices[0].message.content
# Парсим ответ
parts = text.split("ОШИБКА:")
reasoning = parts[0].replace("РАССУЖДЕНИЕ:", "").strip()
explanation = parts[1].strip() if len(parts) > 1 else ""
return {
"question": question,
"correct": correct_reasoning,
"incorrect": reasoning,
"error_explanation": explanation,
}
demo = generate_negative_example(
question=(
"За 3 дня магазин продал 150 товаров. "
"Сколько продаст за 2 недели при том же темпе?"
),
correct_reasoning=(
"1. Темп продаж: 150 ÷ 3 = 50 товаров/день.\n"
"2. 2 недели = 14 дней.\n"
"3. За 14 дней: 50 × 14 = 700 товаров.\n"
"Ответ: 700 товаров."
),
)
print(f"Ошибочное: {demo['incorrect']}")
print(f"Почему ошибка: {demo['error_explanation']}")
Отрицательные примеры должны быть правдоподобными — такими, которые модель реально могла бы сгенерировать. Абсурдные ошибки (2 + 2 = 5) бесполезны. Самые ценные — ошибки, связанные с неверной интерпретацией условия, пропуском шага или путаницей причины и следствия.
Contrastive CoT даёт стабильный прирост в 5-10% над обычным Few-shot CoT. В сочетании с Self-Consistency (несколько прогонов + голосование) результат ещё выше.