Menu

Self-consistency: ответ большинством голосов

Self-consistency промптинг задаёт один и тот же вопрос на рассуждение несколько раз, позволяет каждому запуску рассуждать по-своему и оставляет ответ, который встречается чаще всего. Как это работает, как делать это вручную и как в коде.

Каждый промпт на этой странице можно изменить и открыть в ChatGPT, Claude или другом ИИ-приложении.

Self-consistency промптинг: это когда модели несколько раз задают один и тот же вопрос на рассуждение и оставляют ответ, который встречается чаще всего. Каждый запуск выписывает своё рассуждение, как в chain of thought промптинге, и поскольку модель выбирает слова с долей случайности, запуски идут разными путями. Правильные пути обычно приходят к одному ответу. Ошибки обычно разбегаются по разным неверным. Голосование большинством использует эту разницу.

Техника пришла из работы Wang et al. 2022, «Self-Consistency Improves Chain of Thought Reasoning in Language Models». В статье сравнили сэмплирование многих путей рассуждения с голосованием и один «жадный» ответ и обнаружили, что голосование повышает точность на бенчмарках по арифметике и рассуждениям на здравый смысл.

Блок ниже показывает три запуска одного и того же промпта. Каждая вкладка: один запуск со своим ответом. Два запуска считают правильно; один допускает ошибку, которую легко допустить.

Сколько раз встречается цифра 7, если выписать все целые числа от 1 до 100? Рассуждай шаг за шагом, затем дай итоговый ответ в последней строке в виде «Ответ: N».
Try it
Example replyReplies vary between models and runs.

Посчитаем семёрки по разрядам.

  • Разряд единиц: 7, 17, 27, 37, 47, 57, 67, 77, 87, 97. Это 10 семёрок.
  • Разряд десятков: от 70 до 79. Это ещё 10 семёрок.
  • Разряд сотен: трёхзначное только 100, и семёрки в нём нет.

77 есть в обоих списках, и это правильно, потому что в нём две семёрки.

Ответ: 20

Запуск 2 ответил на немного другой вопрос: сколько чисел содержат семёрку, а не сколько раз встречается цифра. Его рассуждение звучит так же уверенно, как два других, и само по себе не дало бы повода сомневаться. По трём запускам голоса распределились так: 20, 19, 20, и ответ большинства правильный.

Как работает self-consistency

  1. Напишите промпт с цепочкой рассуждений и фиксированной строкой ответа. Попросите сначала рассуждение, а итоговый ответ в конце, в форме, которую легко найти, например «Ответ: N». Без фиксированной строки придётся читать каждый запуск целиком, чтобы найти ответ.
  2. Сэмплируйте несколько запусков со случайностью. Каждому запуску нужна свобода пойти другим путём. В API это даёт температура выше 0. При температуре 0 большинство запусков повторило бы одно и то же рассуждение, а ошибка, повторённая пять раз, не доказательство.
  3. Извлеките итоговый ответ из каждого запуска. На этом этапе игнорируйте рассуждения. Два запуска, пришедшие к 20 разными путями, считаются двумя голосами за 20.
  4. Возьмите самый частый ответ. Нормализуйте ответы перед подсчётом, чтобы «20», «20.» и «двадцать» считались одним ответом.

Само согласие тоже полезная информация. Когда все пять запусков совпадают, случайная ошибка маловероятна. Когда голоса делятся на три стороны, вопрос для модели трудный, и это сигнал проверить ответ самому или переписать промпт. В статье также сообщалось, что на вопросы, где согласие между запусками было сильнее, модель чаще отвечала правильно.

Self-consistency вручную

Технику можно применять в любом чат-приложении. Отправьте промпт, запишите последнюю строку, затем получите ещё один независимый запуск: нажмите перегенерацию или вставьте тот же промпт в новый чат. Повторяйте, пока не наберётся три или пять ответов.

Не переспрашивайте в том же диалоге «Ты уверен?» или «Попробуй ещё раз». Модель видит свой предыдущий ответ, поэтому новый ответ не независим: она склонна либо повторить первый ответ, либо поменять его просто потому, что вы, кажется, сомневаетесь. Ни то ни другое не голос.

Этот промпт подготовлен для голосования. Впишите свой вопрос и формат ответа и запустите его несколько раз.

Промпт, готовый к голосованию
Fill in
Parts
Магазин продаёт ручки упаковками по 3 штуки за $2. Майя покупает 12 ручек и платит купюрой $10. Сколько сдачи она получит?
Рассуждай шаг за шагом. Затем дай итоговый ответ отдельно в последней строке в виде «Ответ: сумма в долларах».
Try it
Example replyReplies vary between models and runs.

12 ручек: это 12 ÷ 3 = 4 упаковки.

4 упаковки стоят 4 × 2=2 = 8.

Сдача с 10:10: 10 минус 8=8 = 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?

Да, вручную. Отправьте промпт в нескольких новых чатах или перегенерируйте ответ несколько раз и выпишите итоговый ответ каждого запуска. Используйте новый чат или кнопку перегенерации, а не спрашивайте заново в той же переписке, потому что модель, которая видит свой прошлый ответ, склонна его повторять.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ