Algorithm of Thoughts (AoT)

[object Object]

Algorithm of Thoughts (алгоритм мыслей) — техника, при которой модель имитирует алгоритмический обход пространства решений внутри одного ответа. В 2026 её полезнее понимать не как "замену Tree of Thoughts", а как prompt-level approximation to search: вы просите модель вести себя так, будто она делает DFS-подобный проход с возвратами, но без внешнего рантайма, который реально хранит дерево и управляет ветками.

Представьте, что вы решаете лабиринт. Tree of Thoughts — это когда вы нанимаете команду людей, и каждый идёт по своему пути. Algorithm of Thoughts — это когда один человек проходит лабиринт систематически: идёт по одному пути до тупика, возвращается и пробует другой. Один человек, но с чётким алгоритмом — и результат не хуже.

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

Algorithm of Thoughts — это когда вы просите модель исследовать варианты решения по алгоритму: идти вглубь одного пути, оценивать его, при необходимости возвращаться и пробовать другой — всё в одном промпте. Это как DFS (depth-first search, поиск в глубину), но выполняемый самой моделью.

Главное преимущество: качество как у Tree of Thoughts, но за один API-вызов вместо десятков.

ПромптChatGPT
Задача: из чисел 2, 8, 6, 3 получи ровно 24, используя +, −, ×, ÷.

Реши методом алгоритмического поиска:
- Попробуй первый путь вглубь
- Если тупик — вернись и попробуй другой
- Продолжай, пока не найдёшь решение
Ответ модели

Путь 1: Начинаю с 8 × 3 = 24. Проверяю — остались 2 и 6. → 24 + 2 − 6 = 20 ≠ 24. Нужно, чтобы 2 и 6 дали 0. → 2 − 6 = −4. 24 + (−4) = 20. Тупик.

Возврат. Путь 2: Начинаю с 8 × 2 = 16. → Остались 6 и 3. 6 + 3 = 9. 16 + 9 = 25. Близко, но нет. → 6 × 3 = 18. 16 + 18 = 34. Нет. Тупик.

Возврат. Путь 3: Начинаю с 6 × (8 − 2). → 8 − 2 = 6. 6 × 6 = 36. Остался 3. 36 − 3 = 33. Нет. Тупик.

Возврат. Путь 4: Попробую 2 × (8 + 6 − 3). → 8 + 6 = 14. 14 − 3 = 11. 2 × 11 = 22. Нет.

Возврат. Путь 5: Попробую (6 − 2) × (8 − 3) + 4... нет, 4 нет. → Попробую 8 ÷ (3 − 8÷... ладно, попробую иначе.

Путь 6: (8 − 6 + 2) × 3 × ... → 8 − 6 = 2. 2 + 2 = 4. 4 × 3 = 12. Нет.

Путь 7: (8 − 2) × (6 − 3) → 6 × 3 = 18. Нет.

Путь 8: 2 × 6 + 8 + 3 = 23. Близко!

Путь 9: 2 × (6 + 3) + 8 − 2... нет, 2 уже использовано.

Путь 10: 8 × (6 ÷ 2 − 3) + 24? → 6 ÷ 2 = 3. 3 − 3 = 0. 8 × 0 = 0. Нет.

Путь 11: (8 − 6 ÷ 3) × 2? Нет, пересчитаю: 6 ÷ 3 = 2. 8 − 2 = 6. 6 × 2 = 12. Нет.

Путь 12: 8 × 2 + 6 + 3 = 25. Нет. Путь 13: 8 × 2 × (6 − 3) = 48. Нет. Путь 14: (2 + 6) × 3 = 24. Остался 8. → (2 + 6) × 3 × (8/8)? Нет, только одна 8. → Но (2 + 6) × 3 = 24 уже! Нужно использовать все 4 числа. → (2 + 6) × 3 + 8 − 8? Нет, одна 8. → Нужно включить 8: ((2 + 6) ÷ 8 + ... нет.

Путь 15: 8 ÷ (6 ÷ (2 + 3))? Проверяю: → 2 + 3 = 5. Но у нас нет 5... нет 3+2. Подождите: 2 × 3 × (8 − 6) = 2 × 3 × 2 = 12. Нет.

8 × 6 ÷ (3 − 2)? = 48 ÷ 1 = 48. Нет. 8 × 6 ÷ 2 × ... нет, = 24... а 3? Нужно использовать 3. 8 × 6 ÷ 2 = 24. Но 3 не использовано!

Нужно: (8 × 6 ÷ 2) × (3 ÷ 3)? Нет, только одна 3. Или: 8 × 6 ÷ 2 + 3 − 3? Нет.

Попробую: 6 × (8 − 3 - 2+1... нет. (3 − 2 + 8) × 6 / ... нет.

2 × 3 + 8 + 6 = 20. Нет. 2 × (3 + 8) + 6 = 28. Нет. (2 + 3) × 8 − 6 = 34. Нет. (2 − 3 + 8) × 6 = 7 × 6 = 42. Нет.

Ответ: Задачу невозможно решить из чисел 2, 8, 6, 3 стандартными операциями с получением ровно 24.

Подходит для: головоломок, задач поиска, задач оптимизации, задач, где нужен систематический перебор.

Зачем нужен Algorithm of Thoughts

Tree of Thoughts (ToT) мощная техника, но имеет практический недостаток — каждый шаг (генерация вариантов, их оценка) требует отдельного API-вызова. Для дерева глубиной 3 с ветвлением 3 это десятки вызовов, что дорого и медленно.

Algorithm of Thoughts решает эту проблему: модель выполняет весь алгоритмический поиск внутри одного промпта. Sel et al. (2023) показали, что LLM способны следовать алгоритмическим паттернам (DFS, BFS) если их правильно направить.

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

Ключевые преимущества AoT

AoT сочетает лучшее от двух миров:

  • От Chain of Thought — компактность (один вызов)
  • От Tree of Thoughts — систематический поиск с backtracking

При этом AoT может быть даже эффективнее ToT, потому что:

  1. Модель сохраняет контекст всего поиска и учится на тупиках
  2. Нет накладных расходов на множественные API-вызовы
  3. Каждый тупик информирует последующий поиск

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

AoT хорошо ложится в современную рамку так:

  • CoT — одна цепочка;
  • ToT — внешний orchestration над несколькими ветками;
  • AoT — попытка встроить search behavior внутрь одного промпта.

Поэтому AoT особенно интересен не как "самая умная техника", а как компромисс между качеством поиска и ценой. Он полезен там, где хочется больше систематичности, чем даёт обычный CoT, но полноценный tree runtime для задачи уже слишком тяжёлый.

Примеры использования

Логическая задача

ПромптClaude Sonnet 4
Задача: распредели 5 задач между 3 разработчиками так, чтобы максимальная нагрузка была минимальной.

Задачи (часы): A=3, B=5, C=2, D=4, E=6
Разработчики: Dev1, Dev2, Dev3

Используй алгоритмический поиск: пробуй распределения, оценивай нагрузку, при неоптимальном результате — возвращайся и пробуй другое.
Ответ модели

Поиск оптимального распределения:

Путь 1: Жадное распределение (от большей к меньшей) E(6)→Dev1, B(5)→Dev2, D(4)→Dev3, A(3)→Dev3, C(2)→Dev2 Нагрузка: Dev1=6, Dev2=7, Dev3=7. Макс=7. Запоминаю: текущий лучший = 7.

Путь 2: Попробую E(6)→Dev1, B(5)→Dev2, D(4)→Dev2, A(3)→Dev3, C(2)→Dev3 Нагрузка: Dev1=6, Dev2=9, Dev3=5. Макс=9. Хуже. Возврат.

Путь 3: E(6)→Dev1, B(5)→Dev3, D(4)→Dev2, A(3)→Dev2, C(2)→Dev3 Нагрузка: Dev1=6, Dev2=7, Dev3=7. Макс=7. Не лучше.

Путь 4: E(6)→Dev1, D(4)→Dev2, A(3)→Dev2, B(5)→Dev3, C(2)→Dev1 Нагрузка: Dev1=8, Dev2=7, Dev3=5. Макс=8. Хуже. Возврат.

Путь 5: E(6)→Dev1, D(4)→Dev2, B(5)→Dev3, A(3)→Dev2, C(2)→Dev1 Нагрузка: Dev1=8, Dev2=7, Dev3=5. Хуже.

Путь 6: A(3)+C(2)+E(6)→Dev1=11. Слишком много. Отсечение.

Путь 7: E(6)+C(2)→Dev1=8, B(5)+A(3)→Dev2=8, D(4)→Dev3=4. Макс=8. Хуже.

Анализ: Оптимум, видимо, = 7. Все варианты с макс < 7 дают нарушение (всего 20 часов, 3 разработчика, ceil(20/3) = 7).

Оптимальное распределение: Dev1: E(6) = 6 часов Dev2: B(5) + C(2) = 7 часов Dev3: D(4) + A(3) = 7 часов Максимальная нагрузка: 7 часов.

Задача планирования

ПромптChatGPT
Задача: составь расписание для 4 курсов, имея 3 аудитории и 2 временных слота. Ограничение: курсы A и B ведёт один преподаватель, поэтому они не могут быть одновременно.

Используй алгоритмический поиск с возвратом (backtracking).
Ответ модели

Обозначения: Слот 1 (утро), Слот 2 (день). Аудитории: Р1, Р2, Р3.

Путь 1: Назначаю последовательно. A → Слот 1, Р1 B → Слот 1, Р2 ⚠ Конфликт! A и B в одном слоте — один преподаватель. Возврат.

Путь 2: A → Слот 1, Р1 B → Слот 2, Р1 (нет конфликта: разные слоты) C → Слот 1, Р2 (свободно) D → Слот 2, Р2 (свободно) Проверка: A(Сл1,Р1), B(Сл2,Р1), C(Сл1,Р2), D(Сл2,Р2)

  • A и B в разных слотах ✓
  • Нет конфликтов аудиторий ✓
  • Все курсы размещены ✓

Решение найдено:

Аудитория 1 Аудитория 2
Утро Курс A Курс C
День Курс B Курс D

Сравнение: ToT (многоходовый) vs AoT (одноходовый)

Tree of Thoughts (10+ API-вызовов)
Вызов 1: генерируй 3 варианта → Вызов 2: оцени вариант 1 → Вызов 3: оцени вариант 2 → Вызов 4: оцени вариант 3 → Вызов 5: продолжи лучший → ... (и так на каждом уровне дерева)
Algorithm of Thoughts (1 API-вызов)
Один промпт: «Исследуй варианты алгоритмически — иди вглубь, при тупике возвращайся, пока не найдёшь решение». Модель выполняет весь поиск в одном ответе.
AoT лучше всего работает с мощными моделями (GPT-4, Claude Sonnet 4), которые могут удержать в контексте длинную цепочку проб и ошибок. На менее мощных моделях алгоритмический поиск может «сбиться» на середине.

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

Плюсы

  • Один API-вызов вместо десятков — экономия денег и времени
  • Систематический поиск с backtracking, как в классических алгоритмах
  • Модель учится на тупиках в рамках одного контекста
  • Сопоставимое качество с ToT на ряде задач
  • Проще в реализации — не нужна оркестрация множества вызовов

Минусы

  • Требует мощную модель с длинным контекстом
  • На сложных задачах может не хватить контекстного окна
  • Модель может «застрять» в неоптимальной стратегии поиска
  • Менее надёжен, чем программный ToT с внешней оценкой
  • Сложные задачи с большим пространством поиска могут превысить возможности одного промпта

Когда AoT действительно выигрывает у ToT

AoT уместен, если:

  • пространство поиска не слишком велико;
  • нужен хороший ответ за один вызов;
  • ошибка от пропуска части ветвей приемлема;
  • orchestration overhead важнее, чем абсолютная полнота поиска.

Но если задача требует:

  • строгого branch bookkeeping;
  • повторного запуска отдельных веток;
  • стабильного pruning;
  • трассировки и оценки каждого шага,

то AoT быстро упирается в предел prompt-only подхода. Тогда лучше строить уже не "алгоритм в тексте", а внешний workflow.

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

Базовый AoT через промпт (OpenAI)

from openai import OpenAI

client = OpenAI()

def algorithm_of_thoughts(task: str, max_tokens: int = 4096) -> str:
    """
    Algorithm of Thoughts: модель выполняет
    алгоритмический поиск в одном промпте.
    """
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {
                "role": "system",
                "content": (
                    "Решай задачу методом алгоритмического поиска. "
                    "Следуй DFS-подобному алгоритму:\n"
                    "1. Выбери первый возможный путь и иди вглубь\n"
                    "2. На каждом шаге оценивай: приближается ли "
                    "путь к решению?\n"
                    "3. Если тупик — напиши 'ВОЗВРАТ' и вернись "
                    "к последней развилке\n"
                    "4. Попробуй следующий путь\n"
                    "5. Когда решение найдено — напиши "
                    "'РЕШЕНИЕ НАЙДЕНО:' и итог\n"
                    "6. Если все пути исчерпаны — напиши "
                    "'РЕШЕНИЕ НЕ СУЩЕСТВУЕТ'\n"
                    "Помни о ранее найденных тупиках — "
                    "не повторяй их."
                ),
            },
            {"role": "user", "content": task},
        ],
        max_tokens=max_tokens,
        temperature=0.2,  # низкая для систематичности
    )
    return response.choices[0].message.content


result = algorithm_of_thoughts(
    "Расставь числа от 1 до 8 по вершинам куба так, "
    "чтобы сумма на каждом ребре была чётной."
)
print(result)

AoT с парсингом результата (Anthropic)

import anthropic
import re

client = anthropic.Anthropic()

def aot_with_parsing(task: str) -> dict:
    """
    AoT с парсингом: извлекаем путь поиска,
    количество возвратов и финальное решение.
    """
    message = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=4096,
        messages=[
            {
                "role": "user",
                "content": (
                    f"Задача: {task}\n\n"
                    "Реши методом алгоритмического поиска "
                    "(DFS с возвратами). На каждом шаге:\n"
                    "- Пронумеруй путь: 'ПУТЬ N:'\n"
                    "- При тупике напиши: 'ТУПИК. ВОЗВРАТ.'\n"
                    "- При нахождении решения: 'РЕШЕНИЕ: ...'\n"
                    "Начинай."
                ),
            }
        ],
    )

    text = message.content[0].text

    # Парсим результаты
    paths = re.findall(r"ПУТЬ\s+\d+", text)
    backtracks = text.count("ВОЗВРАТ")
    solution_match = re.search(
        r"РЕШЕНИЕ:\s*(.+?)(?:\n\n|\Z)", text, re.DOTALL
    )
    solution = (
        solution_match.group(1).strip()
        if solution_match
        else "Не найдено"
    )

    return {
        "full_trace": text,
        "paths_explored": len(paths),
        "backtracks": backtracks,
        "solution": solution,
        "efficiency": (
            f"{len(paths)} путей, "
            f"{backtracks} возвратов"
        ),
    }


result = aot_with_parsing(
    "Размести 4 ферзей на доске 4×4 так, "
    "чтобы ни один не бил другого."
)
print(f"Решение: {result['solution']}")
print(f"Эффективность: {result['efficiency']}")

Сравнение стоимости: AoT vs ToT

def compare_cost():
    """
    Сравнение стоимости AoT и ToT на одной задаче.
    """
    # ToT: генерация + оценка на каждом уровне
    tot_calls = 0
    depth = 3
    branches = 3
    for level in range(depth):
        tot_calls += branches  # генерация
        tot_calls += branches  # оценка
    # Итого: 3 уровня × (3 генерации + 3 оценки) = 18 вызовов

    # AoT: один вызов
    aot_calls = 1

    # Стоимость (приблизительно, GPT-4o)
    cost_per_call = 0.02  # ~$0.02 за средний вызов
    tot_cost = tot_calls * cost_per_call
    aot_cost = aot_calls * cost_per_call * 3  # длинный промпт

    print(f"ToT: {tot_calls} вызовов ≈ ${tot_cost:.2f}")
    print(f"AoT: {aot_calls} вызов ≈ ${aot_cost:.2f}")
    print(f"Экономия: {(1 - aot_cost/tot_cost)*100:.0f}%")


compare_cost()
Не ждите от AoT такого же систематического поиска, как от программного ToT. Модель может «проскочить» некоторые пути или пойти по неоптимальному маршруту. Для задач, где критична полнота поиска (не пропустить ни одного варианта), используйте программный ToT.

Хороший practical stop rule

Если AoT идёт в production, полезно останавливать технику там, где она перестаёт быть выгодной:

  • если trace становится слишком длинным;
  • если модель начинает повторять уже проверенные ветки;
  • если задача требует reproducibility, а не "достаточно хорошего" поиска;
  • если downstream evaluator всё равно вынужден заново проверять весь reasoning path.

В таких случаях выигрыш AoT над обычным workflow быстро исчезает.

Оценка эффективности

Сравнение методов: качество vs стоимость (задачи логического поиска)
CoT (1 вызов)32%
AoT (1 вызов)64%
ToT (18+ вызовов)72%
GoT (20+ вызовов)78%

AoT достигает ~85-90% качества ToT при стоимости в 5-10 раз ниже. На задачах, где полнота поиска не критична, AoT — оптимальный выбор по соотношению цена/качество.

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

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

1. Чем Algorithm of Thoughts отличается от Tree of Thoughts?

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

3. Когда лучше использовать AoT вместо ToT?