Everything of Thoughts (XoT)

[object Object]

Everything of Thoughts (XoT) — это search runtime, в котором LLM соединяется с Monte Carlo Tree Search (MCTS). В 2026 его полезно подавать не как "универсально лучшую технику рассуждения", а как research-heavy orchestration pattern: внешний search algorithm управляет exploration/exploitation, а модель генерирует шаги и оценивает состояния.

Представьте, что вы играете в шахматы с тренером. Тренер (MCTS) предлагает ходы, оценивает позиции, просчитывает последствия на несколько шагов вперёд и может отменить неудачный ход. А вы (LLM) — исполнитель, который делает конкретные ходы и оценивает позицию на доске. Вместе вы играете намного сильнее, чем каждый по отдельности. XoT работает именно так: MCTS стратегически направляет поиск, а LLM генерирует и оценивает идеи.

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

XoT — это когда за рассуждение модели отвечает не сама модель, а внешний алгоритм MCTS (Monte Carlo Tree Search). MCTS строит дерево решений, оценивает каждый путь, симулирует его до конца и обновляет оценки. LLM при этом выполняет две роли: генерирует варианты следующего шага и оценивает перспективность текущего состояния.

Главное отличие от ToT: в Tree of Thoughts модель сама решает, какие пути исследовать. В XoT этим управляет MCTS — проверенный алгоритм, который выиграл Go у чемпиона мира.

ПромптClaude
Задача: из чисел 3, 5, 7, 11 получить ровно 24, используя +, -, *, / (каждое число один раз).

Применяй подход XoT — стратегический поиск решения:
1. Определи возможные первые шаги (какие пары чисел объединить)
2. Оцени перспективность каждого шага (0-10)
3. Углубись по самому перспективному пути
4. Если тупик — вернись и попробуй другой
5. Обнови оценки путей на основе полученного опыта
Ответ модели

Фаза 1: Selection — выбор перспективного направления

Возможные первые шаги:

  • A: 11 - 3 = 8 → остались 5, 7, 8 → оценка: 7/10 (8 — хороший множитель)
  • B: 7 - 5 = 2 → остались 2, 3, 11 → оценка: 5/10
  • C: 11 - 5 = 6 → остались 3, 6, 7 → оценка: 6/10 (6*4=24, но нет 4)
  • D: 5 * 3 = 15 → остались 7, 11, 15 → оценка: 4/10

Выбираю A (наивысшая оценка).

Фаза 2: Expansion — углубление пути A

  • A1: 8 * (7 - 5) = 8 * 2 = 16 ≠ 24
  • A2: (8 - 5) * 7 = 3 * 7 = 21 ≠ 24
  • A3: 5 * 8 - 7 = 40 - 7 = 33 ≠ 24
  • A4: 8 / (7 - 5) = 4, нет третьей операции, тупик

→ Обновляю оценку A: 7 → 3/10 (тупик)

Фаза 3: Backtrack — возврат к C

  • C: 11 - 5 = 6 → остались 3, 6, 7
  • C1: 6 * 7 - 3 = 42 - 3 = 39 ≠ 24
  • C2: (7 - 3) * 6 = 4 * 6 = 24 ✓

Ответ: (7 - 3) * (11 - 5) = 4 * 6 = 24

Оценки обновлены: путь C → 10/10.

XoT решает «треугольник Пенроуза» промптинга: предыдущие техники могли обеспечить только 2 из 3 свойств — качество, эффективность и гибкость. CoT быстр, но негибок. ToT гибок, но дорог. XoT благодаря MCTS достигает всех трёх одновременно.

Как работает XoT

Архитектура

XoT состоит из двух главных компонентов: внешний MCTS-движок (стратег) и LLM (исполнитель). MCTS управляет поиском через четыре фазы, повторяющиеся циклически:

Как понимать XoT в 2026

XoT интересен прежде всего как демонстрация того, что LLM reasoning можно вынести под контроль внешнего search algorithm. Это важно концептуально:

  • модель перестаёт быть единственным "дирижёром" рассуждения;
  • runtime получает свои собственные exploration rules;
  • quality начинает зависеть не только от prompt, но и от search policy.

Именно поэтому XoT ближе к agent/runtime design, чем к обычному prompt engineering.

Чем XoT отличается от CoT, ToT и GoT

Авторы оригинальной статьи используют метафору «треугольник Пенроуза» — невозможная фигура, где три свойства не могут быть достигнуты одновременно:

СвойствоCoTToTGoTXoT
Качество решенияСреднееВысокоеВысокоеВысокое
Эффективность (токены)ВысокаяНизкаяНизкаяВысокая
Гибкость (типы задач)НизкаяСредняяВысокаяВысокая
BacktrackingНетДаДаДа
Стратегический поискНетЧастичноЧастичноДа (UCB1)
Объединение мыслейНетНетДаДа
LLM-вызовов на задачу120-5030-603-10
Tree of Thoughts (ToT)
LLM сама решает, какие пути исследовать и как оценивать. Каждое ветвление — отдельный LLM-вызов. Оценка субъективна: модель может переоценить плохой путь. 20-50 LLM-вызовов на задачу. Нет стратегии exploration vs exploitation.
Everything of Thoughts (XoT)
MCTS управляет поиском по формуле UCB1 — математически обоснованный баланс. LLM только генерирует варианты и оценивает состояния. 3-10 LLM-вызовов на задачу. Стратегический поиск: исследование новых путей ровно настолько, насколько нужно.

Когда использовать XoT

Плюсы

  • Стратегический поиск через MCTS — математически обоснованный, а не эвристический
  • В 3-5 раз меньше LLM-вызовов, чем ToT, при сравнимом качестве
  • Backtracking: автоматический возврат из тупиков с обновлением оценок
  • Универсальность: один фреймворк покрывает задачи CoT, ToT и GoT
  • Масштабируемость: больше итераций MCTS = лучше результат (управляемый бюджет)

Минусы

  • Требует внешнего MCTS-движка — нельзя реализовать одним промптом
  • Сложнее в реализации, чем ToT или CoT
  • Overhead на MCTS-логику: для простых задач избыточен
  • Качество зависит от функции оценки (value function) — если LLM плохо оценивает состояния, MCTS теряет эффективность

Сравнение эффективности

LLM-вызовов на задачу (меньше — лучше)
CoT1%
XoT5%
Self-Consistency (k=10)10%
ToT30%
GoT45%

XoT занимает «золотую середину»: значительно меньше вызовов, чем ToT и GoT, но при этом сохраняет преимущества стратегического поиска и backtracking, которых нет у CoT.

XoT требует внешней программной обвязки — это не техника «одного промпта». Для production-использования нужно реализовать MCTS-движок, интегрировать его с API модели и настроить гиперпараметры (exploration constant, глубина, количество итераций). Для разовых задач проще использовать ToT через промпт.
ПромптChatGPT
Ты — эксперт по стратегическому планированию. Используй подход XoT (MCTS-поиск) для решения задачи.

Задача: стартап с 5 разработчиками должен за 3 месяца выпустить MVP продукта. Есть 4 направления: мобильное приложение, веб-платформа, API-сервис, Telegram-бот. Бюджет позволяет сделать только 2.

Для каждого варианта пары:
1. Selection: оцени перспективность (UCB-подход: баланс потенциала и неопределённости)
2. Simulation: смоделируй результат через 3 месяца
3. Backpropagation: обнови оценки на основе симуляции
4. Выбери лучшую пару
Ответ модели

Итерация 1: Selection Все пары не исследованы → UCB максимален для всех. Начинаю с пары (API + Telegram-бот) — минимальный scope.

Simulation (API + Telegram-бот):

  • Месяц 1: API-ядро (3 разработчика), бот-прототип (2)
  • Месяц 2: интеграция, тестирование
  • Месяц 3: запуск, первые пользователи через Telegram
  • Результат: MVP готов, 500 пользователей, быстрая итерация
  • Reward: 8/10

Backpropagation: API+бот → 8/10, visits=1

Итерация 2: Selection UCB выбирает неисследованную пару → (Веб + API)

Simulation (Веб + API):

  • Месяц 1-2: API + фронтенд (все 5 человек)
  • Месяц 3: тестирование, но фронтенд не готов
  • Результат: 70% готовности, задержка на 1-2 месяца
  • Reward: 4/10

Backpropagation: Веб+API → 4/10, visits=1

Итерация 3: Selection UCB выбирает → (API + мобильное)

Simulation (API + мобильное):

  • Месяц 1: API-ядро
  • Месяц 2-3: React Native приложение
  • Результат: MVP готов, но App Store ревью добавляет 2 недели, 200 пользователей
  • Reward: 6/10

Backpropagation: API+моб → 6/10, visits=1

Итерация 4: Selection UCB выбирает лучший → (API + Telegram-бот) для углублённого анализа

Углублённая Simulation: Риски: зависимость от Telegram API, ограниченный UI. Митигация: API-first → легко добавить веб/моб позже.

  • Reward: 8.5/10

Рекомендация: API + Telegram-бот. Основание: быстрый выход на рынок (3 месяца), минимальный scope, API-ядро позволяет добавить веб и мобильное приложение после валидации.

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

UCB1: формула выбора

Upper Confidence Bound (UCB1) — ключевая формула MCTS, которая балансирует эксплуатацию и исследование:

UCB1(node) = Q(node) / N(node) + C * sqrt(ln(N(parent)) / N(node))

Где:

  • Q(node) — суммарная оценка (reward) узла
  • N(node) — количество посещений узла
  • N(parent) — количество посещений родительского узла
  • C — константа исследования (exploration constant, обычно sqrt(2))

Первая часть формулы (Q/N) — средняя оценка (эксплуатация). Вторая (C * sqrt(...)) — бонус за малое количество посещений (исследование).

Реализация на Python

import math
import random
from dataclasses import dataclass, field
from openai import OpenAI

client = OpenAI()


@dataclass
class MCTSNode:
    """Узел дерева MCTS."""
    state: str                           # текущее состояние рассуждения
    parent: "MCTSNode | None" = None
    children: list["MCTSNode"] = field(default_factory=list)
    visits: int = 0
    total_reward: float = 0.0
    is_terminal: bool = False

    @property
    def avg_reward(self) -> float:
        return self.total_reward / self.visits if self.visits > 0 else 0.0

    def ucb1(self, exploration_constant: float = 1.41) -> float:
        """Вычислить UCB1 для этого узла."""
        if self.visits == 0:
            return float("inf")  # неисследованные узлы — приоритет
        parent_visits = self.parent.visits if self.parent else 1
        exploitation = self.avg_reward
        exploration = exploration_constant * math.sqrt(
            math.log(parent_visits) / self.visits
        )
        return exploitation + exploration


def llm_expand(node: MCTSNode, task: str, n: int = 3) -> list[MCTSNode]:
    """Expansion: LLM генерирует n вариантов следующего шага."""
    resp = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {
                "role": "system",
                "content": (
                    "Ты генерируешь варианты следующего шага "
                    "рассуждения. Каждый вариант на отдельной строке, "
                    "начиная с номера (1., 2., 3.). Только варианты, "
                    "без пояснений."
                ),
            },
            {
                "role": "user",
                "content": (
                    f"Задача: {task}\n\n"
                    f"Текущее состояние рассуждения:\n{node.state}\n\n"
                    f"Предложи {n} различных варианта "
                    "следующего шага."
                ),
            },
        ],
        temperature=0.8,
    )
    text = resp.choices[0].message.content
    children = []
    for line in text.strip().split("\n"):
        line = line.strip()
        if line and line[0].isdigit():
            thought = line.lstrip("0123456789.)- ").strip()
            if thought:
                child = MCTSNode(
                    state=f"{node.state}\n{thought}",
                    parent=node,
                )
                children.append(child)
    node.children = children[:n]
    return node.children


def llm_evaluate(state: str, task: str) -> float:
    """Simulation: LLM оценивает текущее состояние (0.0 — 1.0)."""
    resp = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {
                "role": "user",
                "content": (
                    f"Задача: {task}\n\n"
                    f"Текущее рассуждение:\n{state}\n\n"
                    "Оцени, насколько это рассуждение близко к "
                    "правильному решению. Ответь ОДНИМ числом "
                    "от 0.0 до 1.0, где 1.0 — задача решена верно, "
                    "0.0 — полный тупик."
                ),
            }
        ],
        temperature=0,
    )
    text = resp.choices[0].message.content.strip()
    try:
        score = float(text.split()[0])
        return max(0.0, min(1.0, score))
    except (ValueError, IndexError):
        return 0.5


def select(node: MCTSNode) -> MCTSNode:
    """Selection: спуск по дереву через UCB1."""
    current = node
    while current.children:
        current = max(current.children, key=lambda c: c.ucb1())
    return current


def backpropagate(node: MCTSNode, reward: float) -> None:
    """Backpropagation: обновление статистик вверх по дереву."""
    current = node
    while current is not None:
        current.visits += 1
        current.total_reward += reward
        current = current.parent


def xot_solve(
    task: str,
    max_iterations: int = 20,
    expand_count: int = 3,
    reward_threshold: float = 0.9,
) -> str:
    """
    Основной цикл XoT: MCTS + LLM.

    Args:
        task: описание задачи
        max_iterations: макс. итераций MCTS
        expand_count: вариантов на каждом expansion
        reward_threshold: порог для досрочной остановки
    """
    root = MCTSNode(state="Начало рассуждения.")

    best_node = root
    best_reward = 0.0

    for i in range(max_iterations):
        # 1. Selection — выбираем лист через UCB1
        leaf = select(root)

        # 2. Expansion — LLM генерирует варианты
        if not leaf.is_terminal:
            children = llm_expand(leaf, task, n=expand_count)
            if children:
                leaf = random.choice(children)

        # 3. Simulation — LLM оценивает состояние
        reward = llm_evaluate(leaf.state, task)

        # 4. Backpropagation — обновляем статистики
        backpropagate(leaf, reward)

        # Отслеживаем лучший результат
        if reward > best_reward:
            best_reward = reward
            best_node = leaf

        # Досрочная остановка, если нашли хорошее решение
        if reward >= reward_threshold:
            break

    return best_node.state


# Пример использования
result = xot_solve(
    task="Из чисел 2, 5, 7, 11 получи ровно 24 (+, -, *, /). "
         "Каждое число — один раз.",
    max_iterations=15,
    expand_count=3,
)
print(result)

Гиперпараметры MCTS

ПараметрЗначениеВлияние
exploration_constant (C)1.41 (sqrt(2))Больше → больше исследования, меньше → больше эксплуатации
max_iterations10-30Больше → лучше результат, но дороже
expand_count2-4Больше → шире дерево, но дороже каждая итерация
reward_threshold0.85-0.95Порог досрочной остановки при хорошем решении

Где XoT реально уместен

Техника оправдана в довольно узком классе задач:

  • search-heavy puzzles;
  • planning with expensive alternatives;
  • environments, где есть meaningful state and reward signal;
  • research setups, где можно позволить себе orchestration overhead.

Она обычно не нужна для:

  • writing;
  • support;
  • extraction;
  • большинства обычных business prompts.

То есть XoT полезен как сильный research archetype и как источник идей для runtime design, но редко как первый practical choice.

  1. Exploration constant слишком высокий — MCTS будет бесконечно исследовать новые пути вместо углубления перспективных. Начинайте с C = 1.41 (sqrt(2)), уменьшайте до 0.5-1.0 для задач с узким пространством решений.
  2. LLM-оценка нестабильна — одно и то же состояние получает разные оценки при повторных вызовах. Используйте temperature=0 для evaluation и усредняйте по 2-3 вызовам для критичных узлов.
  3. Слишком глубокое дерево без ширины — если expand_count=1, MCTS вырождается в цепочку (CoT). Минимум 2-3 варианта на expansion, иначе теряется смысл поиска.
  4. Забыть про досрочную остановку — без reward_threshold MCTS потратит все итерации, даже если решение найдено на второй. Всегда проверяйте reward и останавливайтесь, когда он достаточно высок.

Что измерять кроме "нашёл решение или нет"

Для XoT полезно отдельно смотреть:

  • iterations to best node;
  • reward stability;
  • regret against simpler baselines;
  • cost per solved instance;
  • share of cases, где MCTS реально дал выигрыш над ToT-like search.

Без этих метрик XoT легко выглядит впечатляюще концептуально, но не показывает, окупается ли он practically.

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

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

1. Какой алгоритм лежит в основе XoT?

2. Что делает формула UCB1 в MCTS?

3. Почему XoT эффективнее ToT по количеству LLM-вызовов?