TL;DR
RF-SeqBoN (Reward-Filtered Sequential Best-of-N) — техника, которая добавляет в контекст только высококачественные генерации вместо того, чтобы сэмплировать все ответы из одного промпта. На каждом шаге модель генерирует ответ, оценивает его качество (reward), и если оценка выше порога — дописывает этот ответ в контекст для следующей итерации. Так модель постепенно смещается к распределению лучшей «reference policy» из pretraining данных.
Классический Best-of-N (BoN) работает так: сгенерируй N ответов из одного промпта → выбери лучший. Исследование доказывает теоретически, что BoN субоптимален — есть принципиальный потолок эффективности. Проблема в том, что все N генераций происходят из одного распределения π_LLM(·|x). Если модель не очень хороша на задаче изначально, даже 100 попыток не сильно помогут — мы сэмплируем из слабого распределения. Авторы показывают нижнюю границу: чтобы достичь оптимума, нужно найти распределение лучшей reference policy τ* из pretraining смеси, а не просто перебирать варианты из общей смеси.
RF-SeqBoN решает это через последовательное обогащение контекста: генерируй → если хорошо (reward ≥ γ) → добавь в историю → генерируй снова из обновлённого контекста. Так мы концентрируем вычисления на superior policy — контекст наполняется примерами из τ, и модель начинает генерировать преимущественно из этого распределения. Формально: если добавлять только a(x) в контекст, π_LLM(·|h) → π_ref_τ*(·|x) при длине истории h → ∞. Метод делает 3 шага в цикле N раз: (1) генерируй из текущего контекста, (2) оцени reward, (3) если выше порога — добавь в контекст. В конце выбери лучший из всех N вариантов.
Схема метода
RF-SeqBoN — цикл из 3 шагов (в одном чате или через API):
Инициализация: h̄ = ⟨x⟩ (контекст = промпт)
ЦИКЛ N раз:
ШАГ 1: Сгенерируй ответ → aᵢ ~ π_LLM(·|h̄)
ШАГ 2: Оцени качество → r(aᵢ, x)
ШАГ 3: Если r(aᵢ, x) ≥ γ → добавь aᵢ в контекст h̄
Выход: Выбери лучший ответ из всех N по reward
Ключевое отличие от BoN: - BoN: все N запросов с контекстом x - RF-SeqBoN: каждый запрос с контекстом h̄ = x + предыдущие хорошие ответы
Пример применения
Задача: Ты запускаешь продукт на ProductHunt через неделю. Нужна стратегия запуска — не абстрактная, а с конкретными действиями, метриками и timing'ом. Идей в интернете полно, но 80% — это вода («сделайте крутой продукт», «попросите друзей поддержать»). Нужен работающий экшн-план с учётом специфики твоего продукта.
Промпт:
Продукт: SaaS для автоматизации отчётности для маркетплейсов (Wildberries, Ozon).
Аудитория: селлеры с оборотом 1-10 млн ₽/мес.
Задача: стратегия запуска на ProductHunt.
Цикл (повторить 5 раз):
1. Сгенерируй стратегию запуска (3-5 конкретных действий с timing и метриками).
2. Оцени свою стратегию от 0 до 100 по критериям:
- Конкретность (есть числа, сроки, инструменты)
- Реализуемость (можно сделать за неделю)
- Специфичность (учитывает российский рынок и нишу SaaS для селлеров)
3. Если оценка ≥ 75:
- Добавь эту стратегию в контекст как "удачный пример"
- В следующей итерации используй её как reference
4. Если оценка < 75:
- НЕ добавляй в контекст
- В следующей итерации генерируй с нуля
В конце: выбери лучшую стратегию из всех 5 по итоговой оценке.
Результат:
Модель покажет 5 итераций генерации стратегий. В первых 1-2 итерациях могут быть общие советы («подготовьте визуалы», «напишите пост в соцсетях») — они получат низкий reward (<75) и не попадут в контекст. Начиная с 3-й итерации, когда в контексте появятся примеры конкретных стратегий (например, «за 5 дней до запуска: создать welcome-цепочку из 3 писем для early access, метрика: 40% open rate»), модель начнёт генерировать в том же стиле — с числами, deadlines, метриками. Финальный output — стратегия с максимальным reward, обычно из последних итераций, где контекст уже обогащён quality examples.
Ты увидишь эволюцию качества: от «сделайте email-рассылку» (итерация 1, reward 60) до «за 3 дня: отправить 50 персональных сообщений селлерам из Wildberries Sellers Chat, conversion benchmark 15%, подготовить FAQ по 5 частым возражениям» (итерация 4, reward 85).
Почему это работает
Слабость LLM: Модель обучена на смеси данных разного качества. Когда ты пишешь промпт, π_LLM(·|x) — это усреднённое распределение по всем стилям ответов из pretraining корпуса: кто-то писал конкретно, кто-то размыто, кто-то вообще генерировал bullshit. Best-of-N сэмплирует из этой смеси N раз — но распределение не меняется. Если доля качественных ответов в смеси 10%, даже при N=100 ты получишь ~10 хороших вариантов из 100 посредственных. Ты не можешь сдвинуть распределение к качественной моде, только перебираешь варианты из того, что есть.
Сильная сторона LLM: Модель адаптируется к контексту через in-context learning. Если показать модели несколько примеров качественных ответов (in-context), она начнёт генерировать из распределения этих примеров. Формально: π_LLM(·|h) где h = (x, a₁, a₂, ...) смещается к той reference policy из pretraining, которая генерировала похожие ответы. Если a₁, a₂ — это качественные ответы (близкие к a(x)), то π_LLM(·|h) → π_ref_τ(·|x), где τ* — лучшая reference policy из pretraining смеси.
Как метод использует это: RF-SeqBoN пропускает через фильтр каждую генерацию: если reward ≥ γ, ответ добавляется в контекст. Так контекст h̄ постепенно наполняется only high-quality examples. С каждой итерацией π_LLM(·|h̄) всё сильнее концентрируется на π_ref_τ*(·|x) — модель учится на своих же удачных генерациях. Плохие ответы (reward < γ) игнорируются — не тратим вычисления на усиление слабых распределений. Результат: за N итераций мы сдвигаем генерацию от усреднённой смеси к оптимальному распределению, вместо того чтобы просто N раз сэмплировать из слабой смеси.
Теоретическая граница: Авторы доказывают, что для достижения ε-оптимальности параллельным методам нужно M_LLM сэмплов (coverage между π* и π_LLM из промпта x), а sequential методам достаточно M_τ сэмплов (coverage между π и лучшей reference π_ref_τ). Поскольку π_LLM — это смесь всех π_ref_τ, выполняется M_τ < M_LLM (строгое неравенство, если reference policies неодинаковы). RF-SeqBoN достигает границы M_τ* через концентрацию контекста на high-reward траекториях.
Рычаги управления:
Порог γ (0 to 1): выше γ → строже фильтр → медленнее наполнение контекста, но чище примеры. Ниже γ → быстрее накапливаются примеры, но risk добавить посредственные ответы. Для сложных задач ставь γ ≥ 0.8, для простых можно 0.6-0.7.
Число итераций N: больше N → больше попыток найти quality примеры → выше шанс наполнить контекст. Но после насыщения контекста (5-7 хороших примеров) рост N даёт diminishing returns.
Условие добавления в контекст: можно заменить "≥ γ" на "топ-50% по reward" или "улучшение относительно предыдущего лучшего". Адаптивный порог работает лучше на задачах с неизвестным распределением качества.
Формат контекста: вместо просто дописывания ответа можно добавлять "Хороший пример: [ответ]" или структурировать как XML
— модель острее воспримет сигнал....
Шаблон промпта
Задача: {описание задачи}
Цикл (повторить {N} раз):
1. Сгенерируй {тип ответа} для задачи выше.
2. Оцени свой ответ от 0 до 100 по критериям:
{критерий_1}
{критерий_2}
{критерий_3}
3. Если оценка ≥ {порог_γ}:
- Пометь этот ответ как "качественный пример"
- В следующей итерации используй его как reference для генерации
4. Если оценка < {порог_γ}:
- Не используй этот ответ как reference
- В следующей итерации генерируй независимо
После всех итераций: выбери лучший ответ по итоговой оценке.
Что подставлять:
- {описание задачи} — конкретная задача (бизнес-план, код, анализ, текст)
- {N} — число итераций (начни с 5-7)
- {тип ответа} — что генерировать (стратегия, решение, код, структура)
- {критерий_1,2,3} — измеримые критерии качества (конкретность, полнота, корректность)
- {порог_γ} — минимальная оценка для добавления в контекст (75-85 для большинства задач)
🚀 Быстрый старт — вставь в чат:
Вот шаблон RF-SeqBoN для итеративной генерации с фильтрацией по качеству.
Адаптируй под мою задачу: [твоя задача].
Задавай вопросы, чтобы заполнить поля.
[вставить шаблон выше]
LLM спросит про критерии оценки (чтобы reward model работала правильно), про порог γ (баланс между строгостью и скоростью накопления примеров), и про число итераций N. Она возьмёт паттерн sequential filtering из шаблона и адаптирует под конкретную задачу — например, для генерации кода добавит критерии «работоспособность» и «читаемость», для бизнес-задач — «конкретность» и «реализуемость».
Ограничения
⚠️ Нужна reward модель: Метод требует оценки качества каждой генерации. Если используешь одну LLM для генерации и оценки (self-evaluation), модель может быть overconfident или давать inconsistent scores. Лучше использовать внешнюю reward модель (другая LLM, rule-based scorer, или человек в цикле).
⚠️ Рост длины контекста: С каждой удачной генерацией контекст растёт → больше токенов → дороже и медленнее. При N=10 и средней длине ответа 500 токенов, к концу контекст может разбухнуть до 5000+ токенов. В статье предлагают burn-in параметр m (ограничение длины истории), но это trade-off между memory и эффективностью.
⚠️ Reward hacking: Если reward модель плохо откалибрована, метод может усиливать артефакты вместо качества. Например, если reward model даёт высокие оценки за многословность, RF-SeqBoN наполнит контекст verbose примерами → модель начнёт генерировать ещё более многословные ответы. Feedback loop усиливает bias reward модели. Решение: тестируй reward model отдельно, используй multiple judges, или добавь человека в цикл проверки first few examples.
⚠️ Не для простых задач: На задачах где π_LLM(·|x) уже близко к оптимуму (например, «столица Франции»), RF-SeqBoN даёт те же результаты что и BoN, но с overhead на контекст. Метод окупается когда задача сложная и разброс качества генераций высокий (creative writing, planning, domain-specific reasoning).
Как исследовали
Исследователи взяли теоретический подход с mixture-of-reference-policies моделью: предположили, что LLM обучена на данных из смеси reference policies {π_ref_τ}, где каждая policy соответствует определённому стилю генерации (кто-то пишет кратко, кто-то детально, кто-то with code examples). Формально: π_LLM(·|h) = Σ_τ π_ref_τ(·|x) · P_D(τ|h), где P_D(τ|h) — байесовская апостериорная вероятность reference policy τ given history h.
Сначала установили нижнюю границу для parallel TTC: доказали, что любому параллельному алгоритму (включая BoN) нужно M_LLM^(x,ε) сэмплов для достижения ε-оптимальности, где M_LLM — это EM-divergence между π* и π_LLM(·|x). EM-divergence — это rejection threshold: сколько сэмплов нужно отбросить при rejection sampling, чтобы получить один сэмпл из целевого распределения. Ключевой результат: показали что M_LLM ≥ M_τ (coverage до лучшей reference policy τ всегда меньше или равно coverage до смеси), причём строгое неравенство когда reference policies различаются. Это значит параллельные методы принципиально хуже sequential методов, которые могут концентрироваться на τ*.
Дальше разработали RF-SeqBoN и доказали, что он достигает границы M_τ при условиях на reward model (Assumption 5.4: actions с r(a,x) ≥ γ должны быть reliably attributable к τ* с margin Δ(x)). Доказательство использует в-context learning свойство: когда в контекст добавляются только high-reward действия (близкие к a(x)), апостериор P_D(τ|h) → 1, и следовательно π_LLM(·|h) → π_ref_τ*(·|x). Так метод концентрирует сэмплирование на оптимальной reference policy.
Удивительный результат: простая идея «добавляй только хорошие примеры в контекст» даёт теоретическое разделение parallel vs sequential TTC. До этой работы считалось что BoN near-optimal (Huang et al. 2025a показали это для parallel setting), но авторы вскрыли gap: под mixture-of-reference assumption есть принципиальный предел для параллельных методов, который sequential методы могут обойти. Практический инсайт: когда задача сложная (большой M_LLM / M_τ* ratio), выигрыш от sequential inference драматичен — может быть разница в 2-5x по числу сэмплов для той же точности.
Эмпирическая часть: тестировали на diverse benchmarks (math reasoning, code generation, instruction following) с backbone моделями разных размеров. Контролировали identical verifiers и token budgets — все методы использовали одну reward model и одинаковое число total tokens, так что улучшения нельзя списать на более сильный re-ranker или больше compute. Измеряли test-time budget efficiency: при фиксированном числе queries/tokens, насколько близко к оптимуму. RF-SeqBoN consistently outperformed BoN и другие baselines (self-consistency, vanilla sequential revision) на 5-15% по win-rate.
Адаптации и экстраполяции
🔧 Техника: гибридный порог (adaptive γ) → баланс между exploration и exploitation
Вместо фиксированного γ, начни с низкого порога (0.6) в первых итерациях (exploration: быстро накопи разнообразные примеры), затем повышай порог (0.8+) в поздних итерациях (exploitation: концентрируйся на top-quality траекториях). Добавь в промпт:
Порог для добавления в контекст: - Итерации 1-3: оценка ≥ 60 (фаза exploration) - Итерации 4-7: оценка ≥ 80 (фаза exploitation)Это помогает на задачах где непонятна априорная сложность — модель сначала прощупывает пространство решений, потом фокусируется на лучших направлениях.
🔧 Техника: явная структура контекста → усиление сигнала
Вместо просто дописывания ответов, оборачивай их в semantic контейнеры:
=== КАЧЕСТВЕННЫЕ ПРИМЕРЫ (reward ≥ 80) === Пример 1 (reward: 85): [ответ] Пример 2 (reward: 92): [ответ] === ТВОЯ СЛЕДУЮЩАЯ ГЕНЕРАЦИЯ === Используй паттерны из примеров выше.Модель острее воспринимает structured context. XML-теги или markdown разметка создают explicit boundaries между reference examples и новой генерацией.
🔧 Техника: multi-aspect filtering → контроль разных измерений качества
Вместо одного reward score, оценивай по нескольким критериям и добавляй в контекст only if все выше порога:
Оцени ответ: - Конкретность: [0-100] - Корректность: [0-100] - Полнота: [0-100] Добавить в контекст если ВСЕ ≥ 75Это предотвращает reward hacking на одном измерении (например, модель генерит verbose ответы с высокой «полнотой», но низкой «конкретностью»).
Экстраполяция: RF-SeqBoN + Chain-of-Thought для complex reasoning
Комбинируй RF-SeqBoN с CoT: на каждой итерации генерируй reasoning path + answer, оценивай по reward, добавляй в контекст только reasoning paths с высоким итоговым reward. Так модель учится не только что генерировать, но и как рассуждать.
Задача: {сложная математическая/логическая задача}
Цикл (повторить 5 раз):
1. Рассуждай пошагово (Chain-of-Thought):
Шаг 1: [рассуждение]
Шаг 2: [рассуждение]
...
Итоговый ответ: [ответ]
2. Проверь корректность ответа.
3. Если ответ правильный:
- Добавь РАССУЖДЕНИЕ (не только ответ) в контекст как "успешный reasoning path"
- В следующей итерации используй структуру этого рассуждения
4. Если ответ неправильный:
- Не добавляй в контекст
- Попробуй другой подход
Финал: используй reasoning path с максимальной уверенностью.
Это создаёт library of successful reasoning patterns в контексте. Модель видит не просто правильные ответы, но и successful strategies их получения. На complex math/code задачах это даёт compound gains: RF-SeqBoN улучшает exploration, CoT улучшает reasoning, комбинация усиливает оба эффекта.
Ресурсы
On the Limits of Test-Time Compute: Sequential Reward Filtering for Better Inference
Авторы: Yue Yu (Indiana University), Qiwei Di (UCLA), Quanquan Gu (UCLA), Dongruo Zhou (Indiana University)
Статья ссылается на: - Huang et al. (2025a) — теория BoN и χ²-regularized sampling - Snell et al. (2024) — empirical evidence для sequential TTC - Xie et al. (2021), Zhang et al. (2023) — in-context learning theory с mixture-of-policies - Foster et al. (2025) — coverage-based analysis of TTC - Beirami et al. (2024) — KL identity для BoN и reward hacking bounds
