Self-consistency промптинг: это когда модели несколько раз задают один и тот же вопрос на рассуждение и оставляют ответ, который встречается чаще всего. Каждый запуск выписывает своё рассуждение, как в chain of thought промптинге, и поскольку модель выбирает слова с долей случайности, запуски идут разными путями. Правильные пути обычно приходят к одному ответу. Ошибки обычно разбегаются по разным неверным. Голосование большинством использует эту разницу.
Техника пришла из работы Wang et al. 2022, «Self-Consistency Improves Chain of Thought Reasoning in Language Models». В статье сравнили сэмплирование многих путей рассуждения с голосованием и один «жадный» ответ и обнаружили, что голосование повышает точность на бенчмарках по арифметике и рассуждениям на здравый смысл.
Блок ниже показывает три запуска одного и того же промпта. Каждая вкладка: один запуск со своим ответом. Два запуска считают правильно; один допускает ошибку, которую легко допустить.
Посчитаем семёрки по разрядам.
- Разряд единиц: 7, 17, 27, 37, 47, 57, 67, 77, 87, 97. Это 10 семёрок.
- Разряд десятков: от 70 до 79. Это ещё 10 семёрок.
- Разряд сотен: трёхзначное только 100, и семёрки в нём нет.
77 есть в обоих списках, и это правильно, потому что в нём две семёрки.
Ответ: 20
Запуск 2 ответил на немного другой вопрос: сколько чисел содержат семёрку, а не сколько раз встречается цифра. Его рассуждение звучит так же уверенно, как два других, и само по себе не дало бы повода сомневаться. По трём запускам голоса распределились так: 20, 19, 20, и ответ большинства правильный.
Как работает self-consistency
- Напишите промпт с цепочкой рассуждений и фиксированной строкой ответа. Попросите сначала рассуждение, а итоговый ответ в конце, в форме, которую легко найти, например «Ответ: N». Без фиксированной строки придётся читать каждый запуск целиком, чтобы найти ответ.
- Сэмплируйте несколько запусков со случайностью. Каждому запуску нужна свобода пойти другим путём. В API это даёт температура выше 0. При температуре 0 большинство запусков повторило бы одно и то же рассуждение, а ошибка, повторённая пять раз, не доказательство.
- Извлеките итоговый ответ из каждого запуска. На этом этапе игнорируйте рассуждения. Два запуска, пришедшие к 20 разными путями, считаются двумя голосами за 20.
- Возьмите самый частый ответ. Нормализуйте ответы перед подсчётом, чтобы «20», «20.» и «двадцать» считались одним ответом.
Само согласие тоже полезная информация. Когда все пять запусков совпадают, случайная ошибка маловероятна. Когда голоса делятся на три стороны, вопрос для модели трудный, и это сигнал проверить ответ самому или переписать промпт. В статье также сообщалось, что на вопросы, где согласие между запусками было сильнее, модель чаще отвечала правильно.
Self-consistency вручную
Технику можно применять в любом чат-приложении. Отправьте промпт, запишите последнюю строку, затем получите ещё один независимый запуск: нажмите перегенерацию или вставьте тот же промпт в новый чат. Повторяйте, пока не наберётся три или пять ответов.
Не переспрашивайте в том же диалоге «Ты уверен?» или «Попробуй ещё раз». Модель видит свой предыдущий ответ, поэтому новый ответ не независим: она склонна либо повторить первый ответ, либо поменять его просто потому, что вы, кажется, сомневаетесь. Ни то ни другое не голос.
Этот промпт подготовлен для голосования. Впишите свой вопрос и формат ответа и запустите его несколько раз.
12 ручек: это 12 ÷ 3 = 4 упаковки.
4 упаковки стоят 4 × 8.
Сдача с 10 минус 2.
Ответ: $2
Голосование возможным делает именно часть с форматом. Отключите её, и запуски начнут формулировать ответы по-разному, часто где-то в середине текста, и простой подсчёт превратится во внимательное чтение.
Self-consistency в коде
В коде цикл короткий: запустите один и тот же промпт N раз, вытащите строки с ответом и посчитайте их. Эта версия использует Python SDK от OpenAI; любой API, в котором можно задать температуру, работает так же.
import re
from collections import Counter
from openai import OpenAI
client = OpenAI()
MODEL = "your-model-id" # e.g. from your provider's model list
PROMPT = (
"How many times does the digit 7 appear when you write out all the whole "
"numbers from 1 to 100? Think it through step by step, then give the final "
'answer on the last line in the form "Answer: N".'
)
def final_answer(text):
# Also matches "**Answer: 20**", since chat models often bold the last line.
lines = re.findall(r"^\**Answer:\**\s*(.+)$", text, re.MULTILINE)
return lines[-1].strip(" *.") if lines else None
answers = []
for _ in range(5):
response = client.chat.completions.create(
model=MODEL,
temperature=0.8,
messages=[{"role": "user", "content": PROMPT}],
)
answers.append(final_answer(response.choices[0].message.content))
votes = Counter(a for a in answers if a is not None)
if votes:
best, count = votes.most_common(1)[0]
print(f"{best} ({count} of {len(answers)} runs agree)")
else:
print("No run gave an answer line.")
Запуски независимы, поэтому в продакшене их отправляют параллельно, а не один за другим. Некоторые рассуждающие модели принимают только температуру по умолчанию и возвращают ошибку, если её задать; для них уберите temperature. Их запуски всё равно различаются, потому что значение по умолчанию уже включает сэмплирование.
Когда её применять и сколько это стоит
Self-consistency окупается, когда верны три вещи: ответ короткий и сравнимый (число, метка, выбор), неверный ответ стоит дороже нескольких лишних вызовов, и модель ещё не надёжна в этой задаче. Хорошо подходят текстовые задачи по математике, классификация с хитрыми пограничными случаями и вопросы с вариантами ответа.
Она стоит примерно в N раз больше токенов, чем один ответ, и не помогает, когда у модели одно и то же заблуждение в каждом запуске. Если все пять запусков делают одну и ту же ошибку, голосование единогласно и неверно. Голосование уменьшает случайные промахи, а не систематические ошибки, поэтому оно не заменяет периодической сверки ответов с известным результатом.
Модели, которые рассуждают внутри перед ответом, и так подробно прорабатывают задачу в каждом запуске, и выигрыш от голосования у них обычно меньше. На трудных вопросах, где их запуски расходятся, оно всё равно может окупиться.
Self-consistency голосует только по готовым ответам. Tree of thought промптинг идёт на шаг дальше и сравнивает частичные рассуждения, пока задача ещё решается, оставляя перспективные ветви и отбрасывая слабые до того, как они дойдут до ответа.
Часто задаваемые вопросы
Что такое self-consistency промптинг?
Self-consistency (самосогласованность): это техника из работы Wang et al. (2022). Вы отправляете один и тот же промпт с цепочкой рассуждений несколько раз с включённым сэмплированием, так что каждый запуск рассуждает своим путём, а затем берёте итоговый ответ, который встречается чаще всего. Вместо доверия одной цепочке рассуждений получается голосование по нескольким.
Сколько запусков нужно для self-consistency?
Для повседневного использования трёх-пяти запусков хватает, чтобы перевесить случайную ошибку, а нечётное число исключает ничью между двумя ответами. В исходной статье на каждый вопрос сэмплировали гораздо больше путей и обнаружили, что точность продолжает расти с числом запусков, но с каждым разом всё медленнее. Делайте больше запусков, когда неверный ответ обходится дорого, и меньше, когда важны стоимость или скорость.
Чем self-consistency отличается от chain of thought?
Chain of thought: это один запуск, в котором модель выписывает рассуждение перед ответом. Self-consistency строится поверх него: запускает chain of thought несколько раз и голосует по итоговым ответам. Chain of thought меняет промпт; self-consistency меняет то, сколько ответов вы собираете и как выбираете один.
Работает ли self-consistency для эссе или развёрнутых ответов?
Напрямую нет, потому что для голосования нужны ответы, которые можно сравнить на равенство: число, метка, буква варианта ответа или короткий факт. Для свободного текста обычный обходной путь: сгенерировать несколько версий и спросить модель, какая лучше всего согласуется с остальными, но это суждение, а не подсчёт.
Можно ли использовать self-consistency в ChatGPT или Claude?
Да, вручную. Отправьте промпт в нескольких новых чатах или перегенерируйте ответ несколько раз и выпишите итоговый ответ каждого запуска. Используйте новый чат или кнопку перегенерации, а не спрашивайте заново в той же переписке, потому что модель, которая видит свой прошлый ответ, склонна его повторять.