Self-Consistency — это техника, при которой модель решает одну и ту же задачу несколько раз разными reasoning-путями, а финальный ответ выбирается голосованием. Идея проста: если независимые попытки сходятся к одному и тому же выводу, доверие к ответу растёт. В 2026 это удобно воспринимать как sampling-based verification layer, а не как универсальный режим для всех запросов подряд.
Один ответ модели может быть случайной удачей или случайной ошибкой. Self-Consistency проверяет, повторяется ли хороший результат снова и снова.
Реши задачу 5 раз разными путями. Верни только итоговый ответ каждого прогона и потом majority answer.
Если цена выросла со 100 до 120, а затем упала на 20%, сколько стало?
Ответ модели
Run 1: 96
Run 2: 96
Run 3: 96
Run 4: 96
Run 5: 96
Majority answer: 96
Self-Consistency не делает модель умнее сама по себе. Она снижает зависимость от одного неудачного sampled path и превращает устойчивость результата в отдельный сигнал качества.
Обычный single-pass reasoning опирается на один sampled path. Если модель на раннем шаге выбрала неудачный ход, ошибка тянется до конца. Self-Consistency пытается компенсировать это за счёт diversity:
Модель генерирует несколько reasoning trajectories.
Каждая траектория приходит к финальному выводу.
Выигрывает ответ, который устойчиво повторяется.
На практике это означает: мы меньше верим одному "красивому" рассуждению и больше смотрим на устойчивость финального результата.
Техника особенно сильна тогда, когда существует один канонический или хотя бы хорошо нормализуемый финальный answer. Если такой answer есть, расхождение между траекториями становится полезным operational signal, а не просто "ещё одной вариацией текста".
Majority vote помогает против случайной path variance, но не решает проблему correlated errors. Если все траектории идут по одному и тому же ошибочному шаблону, Self-Consistency даст уверенное, но системно неверное большинство.
Практический пример:
задача формально арифметическая, но prompt задаёт двусмысленную нормализацию;
модель стабильно неверно интерпретирует условие;
все пять прогонов сходятся к одному wrong answer;
disagreement низкий, но confidence ложный.
Поэтому low disagreement нужно трактовать как сигнал устойчивости, а не как доказательство истинности.
def self_consistency(sample_fn, task, n=5):
answers = [sample_fn(task) for _ in range(n)]
normalized = [normalize(a) for a in answers]
return majority_vote(normalized), answers
В реальных системах нормализация почти всегда domain-specific. Для triage label, multiple-choice, price extraction и boolean verdict это будут разные функции.
Если все прогоны используют почти одинаковый decoding режим и одинаково biased prompt, можно получить пять одинаково плохих ответов. Self-Consistency борется со случайной нестабильностью, но не с системной ошибкой модели.
Если sampling почти не даёт разнообразия, self-consistency теряет смысл. Важно подобрать decoding так, чтобы траектории реально могли расходиться, но не превращались в хаотический шум. Иначе вы платите за пять почти одинаковых прогонов без нового сигнала.