Выборка с самосогласованностью
Голосование между несколькими путями рассуждения
«Выборка с самосогласованностью» — бесплатный урок AI Prompt Engineering на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Prompt Engineering, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Prompt Engineering содержит 4 уроков всего.
Одна цепочка ненадёжна
Одна цепочка рассуждений может рано свернуть не туда и так и не восстановиться. Самосогласованность (Wang и др., 2022) решает эту проблему, создавая выборку из множества независимых путей рассуждения и объединяя их итоговые ответы, обычно с помощью голосования большинством.
Идея такова: правильное рассуждение сходится к одному ответу по разным маршрутам, а ошибки разбросаны. Объединение усиливает согласованный сигнал.
def self_consistency(prompt, n=20, temperature=0.7):
answers = []
for _ in range(n):
chain = llm(prompt, temperature=temperature)
answers.append(extract_answer(chain))
return majority_vote(answers)Почему маргинализация по путям работает
Самосогласованность приближённо выполняет маргинализацию по путям рассуждения: вместо доверия к одному скрытому выводу оценивается наиболее вероятный итоговый answer с учётом множества выводов.
Это оценка распределения ответов методом Монте-Карло. Мода этого распределения обычно надёжнее любого отдельно взятого пути, особенно когда пространство ответов невелико и дискретно.
from collections import Counter
def majority_vote(answers):
norm = [normalize_answer(a) for a in answers]
counts = Counter(norm)
answer, votes = counts.most_common(1)[0]
confidence = votes / len(norm)
return answer, confidenceРазнообразие за счёт температуры
Самосогласованности нужны разнообразные пути. Жадная выборка или температура, близкая к нулю, создаёт почти одинаковые цепочки, сводя метод на нет. Используйте умеренную температуру (часто 0,5–0,8) и, возможно, выборку из верхней части распределения, чтобы сделать пути разнообразнее.
Слишком высокая температура ухудшает каждую отдельную цепочку; настраивайте температуру для максимальной точности ансамбля, а не качества одной цепочки.
def tune_temperature(prompt, val_set, temps=(0.4, 0.6, 0.8, 1.0)):
best = max(
temps,
key=lambda t: ensemble_accuracy(prompt, val_set, temp=t, n=20)
)
return bestНормализация ответов крайне важна
Голоса учитываются только тогда, когда эквивалентные ответы распознаются как одинаковые. Перед подсчётом нормализуйте их: удаляйте единицы измерения, приводите числа к каноническому виду, переводите текст в нижний регистр, разбирайте дроби и проценты и применяйте эквивалентность, зависящую от задачи.
Плохая нормализация разделяет настоящее большинство между разными формами записи и позволяет ответу меньшинства победить в голосовании.
def normalize_answer(a):
a = a.strip().lower().rstrip('.')
a = a.replace(',', '').replace('$', '').replace('%', '')
try:
return str(round(float(a), 6)) # numeric canonical form
except ValueError:
return aСколько образцов?
Точность растёт с числом образцов n, но с убывающей отдачей, часто выходя на плато примерно при 10–40 образцах в зависимости от сложности задачи. Каждый образец линейно увеличивает затраты и задержку.
Переберите значения n на проверочном наборе и выберите точку перегиба кривой, где дополнительные образцы уже не оправдывают своих затрат.
def sweep_n(prompt, val, ns=(1,3,5,10,20,40)):
return {n: ensemble_accuracy(prompt, val, n=n) for n in ns}
# Choose n at the accuracy/cost knee, not the maximumАдаптивная ранняя остановка
Экономьте вычислительные ресурсы с помощью адаптивной выборки: прекращайте создавать пути, как только результат голосования становится однозначным. Если после 5 образцов один answer уверенно лидирует, дополнительные образцы вряд ли изменят победителя.
Так вычислительные ресурсы сосредотачиваются на действительно сложных и спорных элементах, а простые ответы получают дёшево.
def adaptive_sc(prompt, max_n=40, margin=0.6, min_n=5):
answers = []
for i in range(max_n):
answers.append(extract_answer(llm(prompt, temperature=0.7)))
if i + 1 >= min_n:
ans, conf = majority_vote(answers)
if conf >= margin:
return ans, conf, i + 1
return majority_vote(answers)Взвешенное голосование с помощью проверяющего средства
Обычное голосование большинством считает все пути равными. Вы можете взвешивать голоса по вероятности пути, назначенной моделью, по оценке обученного проверяющего средства или по самооценке допустимости каждой цепочки.
Самосогласованность с весами от проверяющего средства часто превосходит невзвешенное голосование, поскольку понижает рейтинг уверенно ошибочных, но частых вариантов сбоя.
def weighted_vote(chains):
scores = {}
for c in chains:
a = normalize_answer(extract_answer(c))
scores[a] = scores.get(a, 0.0) + verifier_score(c)
return max(scores, key=scores.get)Уверенность по согласованности
Разрыв при голосовании — полезный сигнал уверенности. Единогласный answer гораздо надёжнее, чем результат 6 против 5. Предоставляйте этот показатель нижележащей логике: используйте route, чтобы передавать элементы с низкой согласованностью на повышение уровня обработки, проверку человеком или более сильной модели.
Так самосогласованность становится одновременно способом повысить точность и механизмом калибровки.
def route(prompt):
ans, conf = adaptive_sc(prompt)[:2]
if conf < 0.5:
return escalate_to_stronger_model(prompt)
return ansОграничения: непрерывные и открытые задачи
Голосование большинством предполагает дискретное и сопоставимое пространство answer. Оно неприменимо напрямую к свободной генерации, длинному тексту или непрерывным результатам, где никакие два образца не совпадают.
Для таких задач используйте другой способ объединения: группируйте семантически похожие результаты, голосуйте по извлечённым структурированным полям или используйте модель-судью, чтобы выбрать лучший образец, вместо подсчёта точных совпадений.
def semantic_consistency(samples):
clusters = cluster_by_embedding(samples)
biggest = max(clusters, key=len) # largest agreement cluster
return representative(biggest) # medoid of the clusterРазвёртывание с учётом затрат
Самосогласованность — один из самых затратных методов составления запросов: затраты растут вместе с n. Оставляйте её для важных или сложных элементов, сочетайте с адаптивной остановкой и рассмотрите многоуровневую политику, при которой одна цепочка обрабатывает простые запросы.
Всегда сравнивайте её точность на единицу затрат с одним вызовом более сильной модели, который может оказаться дешевле при том же приросте качества.
def tiered(prompt, q):
if easy(q):
return extract_answer(llm(prompt, temperature=0))
return adaptive_sc(prompt, max_n=20)[0] # SC only when neededСамосогласованность от начала до конца
Полный конвейер: настройте температуру и n, создавайте разнообразные цепочки, тщательно нормализуйте ответы, проводите голосование (при желании с весами от проверяющего средства), используйте разрыв голосов как показатель уверенности, останавливайтесь досрочно при явном результате и передавайте элементы с низкой согласованностью на следующий уровень.
В результате получается более точная и самокалибрующаяся система рассуждений, чем любая отдельная цепочка.
def solve(prompt):
chains = sample_until_decisive(prompt, max_n=20, temp=0.7)
ans, conf = weighted_majority(chains)
if conf < THRESH:
return escalate(prompt)
return {'answer': ans, 'confidence': conf, 'paths': len(chains)}Быстрая проверка
Проанализируйте настройки самосогласованности, которые дают результаты хуже ожидаемых.
Итоги
Главные выводы:
- Самосогласованность создаёт выборку из множества разнообразных цепочек и проводит голосование, приближённо выполняя маргинализацию по путям рассуждения.
- Разнообразие (умеренная температура) и тщательная нормализация ответов необходимы для работы метода.
- Точность растёт с
n, но выходит на плато; используйте адаптивную раннюю остановку для контроля затрат. - Взвешивайте голоса с помощью проверяющего средства и используйте разрыв голосов как откалиброванный сигнал уверенности.
- Методу требуется дискретное пространство ответов; для открытых задач группируйте результаты по смыслу или используйте судью.
Часто задаваемые вопросы
Урок «Выборка с самосогласованностью» бесплатный?
Да — полный текст урока «Выборка с самосогласованностью» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Prompt Engineering, подпишись на CoddyKit PRO. Курс AI Prompt Engineering содержит 4 уроков всего.
Чему я научусь в уроке «Выборка с самосогласованностью»?
Голосование между несколькими путями рассуждения Ты практикуешь AI Prompt Engineering с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать AI Prompt Engineering?
Предыдущий опыт не требуется. AI Prompt Engineering на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Выборка с самосогласованностью»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке AI Prompt Engineering?
Да. Каждый урок AI Prompt Engineering включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Подсказки с рассуждением по шагам
- Выборка с самосогласованностью
- Исследование дерева мыслей
- Когда подсказки с рассуждением помогают