Buffer of Thoughts (BoT)

[object Object]

Buffer of Thoughts (буфер мыслей) — pattern, в котором система хранит и переиспользует thought-templates: обобщённые стратегии решения похожих задач. В 2026 его лучше понимать как template-buffer runtime, а не как ещё один prompt trick. Смысл техники не в том, чтобы каждый раз искать решение заново, а в том, чтобы постепенно собирать библиотеку устойчивых reasoning templates и доставать их при похожих запросах.

Представьте шеф-повара с папкой рецептов. Когда поступает заказ «рыба с овощами», он не изобретает блюдо с нуля. Он достаёт из папки подходящий шаблон (рецепт «белая рыба + гарнир»), адаптирует под доступные ингредиенты (заменяет треску на судака, брокколи на цукини) и готовит. Buffer of Thoughts работает так же: вместо рассуждения с нуля модель берёт готовый «рецепт мышления» из библиотеки и адаптирует его.

Суть в двух словах

Buffer of Thoughts работает в три шага: retrieve → instantiate → reason. В мета-буфере хранятся обобщённые шаблоны мышления (thought-templates) — не конкретные ответы, а стратегии решения. Для новой задачи модель находит наиболее подходящий шаблон, адаптирует его под конкретные условия и решает задачу по этому плану.

Ключевое отличие от Tree of Thoughts: ToT исследует множество путей для каждой задачи (дорого), а BoT переиспользует проверенные стратегии (дёшево). При этом Llama-8B с BoT побеждает Llama-70B без BoT на ряде задач.

ПромптClaude
У меня есть числа 2, 5, 7, 11. Используя каждое число ровно один раз и операции +, -, ×, ÷, получи 24.

Применяй метод Buffer of Thoughts: сначала определи тип задачи и стратегию решения, затем адаптируй стратегию и реши.
Ответ модели

Шаблон из буфера: задачи «получи число» → стратегия «перебор пар с группировкой».

Адаптация: 4 числа → разбить на 2 пары, найти комбинацию пар, дающую 24.

Решение:

  • Пара 1: 5 - 2 = 3
  • Пара 2: 11 - 7 = 4
  • Нет, 3 × 4 = 12, не 24
  • Перегруппировка: (7 - 5) = 2, 2 × (11 + 2) = 26, нет
  • Другой шаблон: найти множитель 24. 24 = 8 × 3.
  • 11 - 5 = 6, нет... 2 + 5 = 7, 7 не делитель 24
  • 24 = 2 × 12. 12 = 5 + 7. Итого: 2 × (5 + 7) = 24. ✓

Ответ: 2 × (5 + 7) = 24 (число 11 не требуется... пересмотр)

  • (11 - 5) × (7 - 2) = 6 × 5 = 30, нет
  • (7 × 2) + (11 - 5) = 14 + 6 = 20, нет
  • 5 × (7 - (11 - 2)) = нет
  • (2 + 11) × 5 - 7 = 65 - 7 = 58, нет
  • 2 × 7 + 11 - 5 = 14 + 6 = 20, нет
  • (5 - 2) × (11 - 7) = 3 × 4 = нет, 12
  • 2 × (5 + 7) + 11 - 11? Нельзя — каждое число один раз.
  • (11 - 7 + 2) × 5 = 6 × 5 = 30, нет
  • (11 + 7 - 2) × 5 = 80, нет
  • 11 × 2 + 7 - 5 = 22 + 2 = 24 ✓

Ответ: 11 × 2 + 7 - 5 = 24

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

Как работает Buffer of Thoughts

Архитектура

Buffer of Thoughts состоит из трёх компонентов:

Типы thought-templates

Тип шаблонаСтратегияПример задач
Разбиение на парыПеребрать пары элементов, проверить комбинацииGame of 24, головоломки
Обратный ходНачать с цели, восстановить шаги назадШахматные задачи, планирование
Классификация признаковВыделить признаки, сопоставить с категориямиGeometric Shapes, диагностика
Пошаговая верификацияКаждый шаг проверить перед продолжениемМатематические доказательства
ДекомпозицияРазбить сложную задачу на независимые подзадачиМногошаговые вычисления

Почему BoT эффективнее ToT

Tree of Thoughts (ToT)
Каждая задача → исследуем 5-10 путей рассуждения Каждый путь → оценка (ещё один LLM-вызов) Отсекаем плохие пути → продолжаем лучшие Всего: 20-50 LLM-вызовов на задачу Дорого, но тщательно
Buffer of Thoughts (BoT)
Новая задача → classify (1 вызов) Retrieve шаблон → instantiate (1 вызов) Reason по шаблону (1-2 вызова) Всего: 3-4 LLM-вызова на задачу В 12 раз дешевле, сравнимая точность

Бенчмарки

Прирост BoT относительно лучшего baseline (% абсолютный)
Checkmate-in-One51%
Geometric Shapes20%
Game of 2411%
MATH (уровень 5)6%

Примечательно, что Llama-3-8B с BoT обгоняет Llama-3-70B без BoT на задачах Game of 24 и Checkmate-in-One. Это означает, что правильная стратегия рассуждения важнее размера модели.

Плюсы

  • В 12 раз дешевле ToT при сравнимой точности
  • Маленькие модели с BoT побеждают большие без BoT
  • Буфер растёт: каждая задача потенциально улучшает библиотеку шаблонов
  • +51% на шахматных задачах (Checkmate-in-One)
  • Переиспользуемость: однажды найденная стратегия применяется многократно

Минусы

  • Требует начальной библиотеки шаблонов (cold start)
  • Плохо работает на принципиально новых типах задач без аналогов в буфере
  • Классификация задачи может ошибиться → выбирается неподходящий шаблон
  • Сложность реализации мета-буфера в продакшене

Где BoT выглядит реалистично в production

Буфер шаблонов особенно уместен там, где:

  • задачи приходят сериями;
  • task families повторяются;
  • можно накопить шаблоны без постоянной ручной перепрошивки;
  • reasoning pattern важнее, чем wording конкретного prompt.

Это хороший fit для:

  • internal expert copilots;
  • recurring analytic tasks;
  • puzzle-like evaluators;
  • domain pipelines с ограниченным набором problem archetypes.

Он слабее там, где каждый запрос уникален или домен меняется быстрее, чем вы успеваете обновлять template library.

Пустой буфер = нет шаблонов = нет выигрыша. На старте BoT работает как обычный prompting. Шаблоны нужно либо заполнить вручную (seed templates), либо накопить через первые N задач. Для продакшена рекомендуется pre-seed буфера 10-20 шаблонами по основным типам задач.

Как внедрять BoT без лишней магии

На практике хороший rollout выглядит так:

  1. выделить 5-10 повторяемых task archetypes;
  2. собрать по 1-2 начальных templates на каждый;
  3. мерить retrieval hit rate и template success rate;
  4. только потом автоматизировать обновление буфера.

Если начать сразу с fully automatic template growth, система быстро зарастает шумными, плохо обобщёнными шаблонами.

ПромптChatGPT
Задача: определить, является ли фигура с вершинами A(0,0), B(4,0), C(4,3), D(0,3) прямоугольником.

Используй Buffer of Thoughts:
1. Определи тип задачи и извлеки подходящий шаблон
2. Адаптируй шаблон к данной задаче
3. Реши по шаблону
Ответ модели

Retrieve: тип задачи — «классификация геометрической фигуры». Шаблон: проверить (1) все стороны, (2) все углы, (3) диагонали.

Instantiate: 4 вершины → 4 стороны, 4 угла, 2 диагонали. Критерий прямоугольника: противоположные стороны равны + все углы 90°.

Reason: Стороны:

  • AB = √((4-0)² + (0-0)²) = 4
  • BC = √((4-4)² + (3-0)²) = 3
  • CD = √((0-4)² + (3-3)²) = 4
  • DA = √((0-0)² + (0-3)²) = 3

Противоположные стороны: AB = CD = 4 ✓, BC = DA = 3 ✓

Диагонали:

  • AC = √(16 + 9) = 5
  • BD = √(16 + 9) = 5

Диагонали равны ✓ → это прямоугольник.

Обновление буфера: шаблон подтверждён, добавить подшаблон «быстрая проверка через диагонали».

Техническая реализация

Структуры данных

from dataclasses import dataclass, field

@dataclass
class ThoughtTemplate:
    """Шаблон мышления для мета-буфера."""
    id: str
    task_type: str                   # тип задачи: "arithmetic_puzzle", "geometry", ...
    strategy: str                    # стратегия: "pair_decomposition", "backward_reasoning"
    steps: list[str]                 # последовательность шагов
    examples: list[str] = field(default_factory=list)  # примеры применения
    success_count: int = 0           # сколько раз успешно применён
    fail_count: int = 0              # сколько раз не сработал

    @property
    def success_rate(self) -> float:
        total = self.success_count + self.fail_count
        return self.success_count / total if total > 0 else 0.0


class MetaBuffer:
    """Мета-буфер: хранение и поиск thought-templates."""

    def __init__(self):
        self.templates: dict[str, ThoughtTemplate] = {}

    def add(self, template: ThoughtTemplate) -> None:
        self.templates[template.id] = template

    def retrieve(self, task_type: str) -> ThoughtTemplate | None:
        """Найти лучший шаблон для данного типа задачи."""
        candidates = [
            t for t in self.templates.values()
            if t.task_type == task_type
        ]
        if not candidates:
            return None
        # Выбираем шаблон с лучшим success_rate
        return max(candidates, key=lambda t: (t.success_rate, t.success_count))

    def update_stats(self, template_id: str, success: bool) -> None:
        """Обновить статистику после использования."""
        if template_id in self.templates:
            t = self.templates[template_id]
            if success:
                t.success_count += 1
            else:
                t.fail_count += 1

Основной цикл BoT

from openai import OpenAI

client = OpenAI()

CLASSIFY_PROMPT = """Определи тип задачи. Варианты:
- arithmetic_puzzle (числовые головоломки, Game of 24)
- geometry (геометрические фигуры, координаты)
- chess (шахматные задачи, мат в N ходов)
- logic (логические задачи, выводы)
- math_proof (математические доказательства)
- text_analysis (анализ текста, классификация)

Задача: {task}

Ответь ОДНИМ словом — типом задачи."""

INSTANTIATE_PROMPT = """У тебя есть шаблон мышления:
Тип: {task_type}
Стратегия: {strategy}
Шаги:
{steps}

Адаптируй шаблон к конкретной задаче:
{task}

Запиши адаптированный план решения."""

REASON_PROMPT = """Реши задачу строго по плану.

Задача: {task}

План решения:
{plan}

Выполни каждый шаг и дай финальный ответ."""


def buffer_of_thoughts(
    task: str,
    buffer: MetaBuffer,
    model: str = "gpt-4o"
) -> dict:
    """Полный цикл Buffer of Thoughts."""

    # Шаг 1: Classify — определяем тип задачи
    classify_resp = client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": CLASSIFY_PROMPT.format(task=task)}],
        temperature=0
    )
    task_type = classify_resp.choices[0].message.content.strip().lower()

    # Шаг 2: Retrieve — ищем шаблон
    template = buffer.retrieve(task_type)

    if template is None:
        # Нет шаблона — fallback на прямое решение
        resp = client.chat.completions.create(
            model=model,
            messages=[{"role": "user", "content": f"Реши задачу пошагово:\n{task}"}],
            temperature=0
        )
        return {"answer": resp.choices[0].message.content, "template_used": None}

    # Шаг 3: Instantiate — адаптируем шаблон
    steps_text = "\n".join(f"{i+1}. {s}" for i, s in enumerate(template.steps))
    inst_resp = client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": INSTANTIATE_PROMPT.format(
            task_type=template.task_type,
            strategy=template.strategy,
            steps=steps_text,
            task=task
        )}],
        temperature=0
    )
    plan = inst_resp.choices[0].message.content

    # Шаг 4: Reason — решаем по плану
    reason_resp = client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": REASON_PROMPT.format(task=task, plan=plan)}],
        temperature=0
    )
    answer = reason_resp.choices[0].message.content

    return {
        "answer": answer,
        "template_used": template.id,
        "plan": plan,
        "task_type": task_type
    }


# Пример: заполняем буфер и решаем задачу
buffer = MetaBuffer()
buffer.add(ThoughtTemplate(
    id="game24_pairs",
    task_type="arithmetic_puzzle",
    strategy="pair_decomposition",
    steps=[
        "Перечислить все пары чисел и результаты операций (+, -, ×, ÷)",
        "Для каждого промежуточного результата повторить с оставшимися числами",
        "Проверить, даёт ли цепочка целевое число",
        "Вернуть первую найденную цепочку"
    ],
    success_count=15,
    fail_count=2
))

result = buffer_of_thoughts("Числа: 3, 4, 6, 8. Получи 24.", buffer)
print(result["answer"])
  1. Слишком узкие шаблоны — шаблон «Game of 24 с числами до 10» не сработает для чисел 11-99. Обобщайте: «арифметическая головоломка с N числами и целевым результатом».
  2. Игнорирование fail_count — если шаблон часто не срабатывает, его нужно обновить или заменить. Порог: success_rate < 0.5 → пометить для ревизии.
  3. Один шаблон на тип — для каждого типа задач полезно иметь 2-3 альтернативных шаблона с разными стратегиями. Если первый не сработал, попробовать второй.

Проверьте себя

Проверьте себя

1. Из чего состоит цикл Buffer of Thoughts?

2. Почему BoT в 12 раз дешевле ToT?

3. Что такое cold start проблема в BoT?