Graph of Thoughts (GoT)

[object Object]

Graph of Thoughts (граф мыслей) — pattern, где рассуждение организовано не как одна цепочка и не как дерево, а как граф с merge и refine-операциями. В 2026 это полезнее понимать не как "следующий обязательный шаг после ToT", а как specialized graph orchestration: техника нужна там, где ветки действительно должны обмениваться идеями и собираться в гибридное решение.

Представьте, что вы решаете задачу в команде. Каждый предложил свой вариант (это ветви дерева). А теперь вы берёте лучшие идеи из разных предложений и объединяете их в одно решение. Именно это делает Graph of Thoughts — позволяет модели не просто ветвить рассуждения, но и объединять их.

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

Graph of Thoughts — это когда модель не просто исследует разные пути рассуждений (как Tree of Thoughts), но ещё может объединять лучшие идеи из нескольких ветвей в одно решение. Это как мозговой штурм, где в конце участники комбинируют самые удачные предложения.

Ключевое отличие от Tree of Thoughts: в дереве ветви не пересекаются, в графе — могут.

ПромптClaude Sonnet 4
Задача: придумай концепцию мобильного приложения для изучения финансовой грамотности.

Используй подход «граф мыслей»:
1. Предложи 3 разных концепции
2. Выдели сильные стороны каждой
3. Объедини лучшие элементы в финальную концепцию
Ответ модели

Концепция A: «Финансовый квест» — игровой подход

  • Геймификация, достижения, рейтинг
  • Вовлечённость пользователей
  • Может казаться несерьёзным

Концепция B: «Мой бюджет+» — практический трекер

  • Привязка к реальным расходам
  • Обучение через собственные данные
  • Мало мотивации изучать теорию

Концепция C: «Финансовый наставник» — AI-ассистент

  • Персонализированные советы
  • Ответы на любые вопросы
  • Дорого в разработке

Объединённая концепция (A + B + C): «ФинЛайф» — трекер расходов с геймификацией и AI-наставником:

  • Отслеживаешь расходы (из B)
  • Получаешь квесты на основе своих данных: «Сократи расходы на кофе на 20%» (из A + B)
  • Зарабатываешь очки и разблокируешь уроки (из A)
  • AI-наставник отвечает на вопросы в контексте твоих финансов (из C)

Результат сильнее любой отдельной концепции.

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

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

Tree of Thoughts — мощная техника, но у неё есть структурное ограничение: ветви дерева не пересекаются. Если одна ветвь нашла отличную идею A, а другая — идею B, их нельзя объединить. Graph of Thoughts снимает это ограничение.

GoT вводит три ключевые операции:

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

В GoT каждая «мысль» (thought) — это вершина графа. Рёбра показывают зависимости: какая мысль породила какую. В отличие от дерева, здесь возможны:

  • Слияние — две ветви сходятся в одну вершину
  • Циклы — результат одной мысли влияет на пересмотр другой
  • Множественные входы — одна мысль зависит от нескольких предыдущих

Где GoT имеет реальный operational смысл

GoT полезен только если merge-операция создаёт новую ценность:

  • комбинирует сильные стороны разных стратегий;
  • устраняет слабости одной ветки через сигнал другой;
  • позволяет iterative refinement без полного перезапуска.

Если же ветки в итоге всё равно просто ранжируются и одна побеждает, то graph often unnecessary, а ToT + selection оказывается проще и дешевле.

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

Сортировка и объединение

Классический пример из оригинальной статьи — задача сортировки. Массив разбивается на части, каждая сортируется отдельно (ветви), затем результаты объединяются (merge).

ПромптChatGPT
Отсортируй набор чисел [14, 3, 87, 22, 5, 61, 48, 9, 33, 76, 41, 17] методом «граф мыслей»:
1. Разбей на 3 группы
2. Отсортируй каждую группу отдельно
3. Объедини отсортированные группы в один отсортированный массив
Ответ модели

Шаг 1 — Разбиение: Группа A: [14, 3, 87, 22] Группа B: [5, 61, 48, 9] Группа C: [33, 76, 41, 17]

Шаг 2 — Независимая сортировка: Ветвь A: [14, 3, 87, 22] → [3, 14, 22, 87] Ветвь B: [5, 61, 48, 9] → [5, 9, 48, 61] Ветвь C: [33, 76, 41, 17] → [17, 33, 41, 76]

Шаг 3 — Объединение (merge): [3, 14, 22, 87] + [5, 9, 48, 61] → [3, 5, 9, 14, 22, 48, 61, 87] [3, 5, 9, 14, 22, 48, 61, 87] + [17, 33, 41, 76] → [3, 5, 9, 14, 17, 22, 33, 41, 48, 61, 76, 87]

Результат: [3, 5, 9, 14, 17, 22, 33, 41, 48, 61, 76, 87]

Стратегия с объединением идей

ПромптClaude Sonnet 4
Задача: придумай стратегию привлечения первых 1000 пользователей для нового сервиса доставки еды в небольшом городе.

Используй «граф мыслей»:
1. Предложи 3 стратегии из разных областей
2. Найди сильные стороны каждой
3. Объедини лучшие элементы в гибридную стратегию
4. Улучши гибридную стратегию, устранив слабые места
Ответ модели

Стратегия 1 (маркетинг): Реклама в локальных пабликах + листовки

  • Дёшево, быстрый охват
  • Низкая конверсия

Стратегия 2 (партнёрства): Договоры с 10 популярными кафе

  • Контент от партнёров, доверие
  • Долгие переговоры

Стратегия 3 (виральная): Реферальная программа «Пригласи друга — оба получат скидку»

  • Органический рост
  • Нужна начальная база пользователей

Объединение (1 + 2 + 3): Фаза 1: Договориться с 5 кафе (из Стратегии 2) → запуск с реальным меню Фаза 2: Реклама в локальных пабликах (из Стратегии 1) → привлечь первых 100 пользователей Фаза 3: Включить реферальную программу (из Стратегии 3) → 100 → 1000

Улучшение (цикл обратной связи):

  • Слабое место: Фаза 2 может дать мало конверсий
  • Исправление: добавить промокод «ПЕРВЫЙ ЗАКАЗ -50%» в рекламу
  • Слабое место: реферальная может не работать при малой базе
  • Исправление: давать двойной бонус первым 50 рефералам

Финальная стратегия учитывает сильные стороны всех трёх подходов.

Сравнение техник рассуждения

Tree of Thoughts (только ветвление)
Модель исследует 3 варианта по отдельности и выбирает лучший. Хорошие идеи из отвергнутых ветвей теряются.
Graph of Thoughts (ветвление + объединение)
Модель исследует 3 варианта, берёт лучшие элементы из каждого и объединяет в гибридное решение, которое сильнее любой отдельной ветви.
Graph of Thoughts наиболее полезен, когда задача допускает комбинирование подходов. Если у задачи один правильный ответ (математика, факты) — используйте Self-Consistency или CoVe. Если нужно объединить идеи — GoT ваш инструмент.

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

Плюсы

  • Позволяет объединять лучшие идеи из разных ветвей рассуждения
  • Циклы обратной связи для улучшения решения
  • Гибкая структура — граф может принимать любую форму
  • Отлично работает для задач оптимизации и стратегий
  • Превосходит ToT на задачах, где нужна комбинация подходов

Минусы

  • Сложнее в реализации, чем CoT или ToT
  • Значительный расход токенов
  • Требует программной реализации для полного раскрытия потенциала
  • Избыточен для задач с одним правильным ответом
  • Высокий порог входа для понимания

Когда merge действительно оправдан

Хорошие сигналы для GoT:

  • задача synthesis-heavy;
  • одна ветка редко бывает достаточно сильной сама по себе;
  • решение можно улучшить через controlled merge;
  • продукту важен не просто best candidate, а composite answer.

Плохие сигналы:

  • задача с одним проверяемым answer;
  • branch outputs почти одинаковы;
  • merge чаще размывает результат, чем усиливает его;
  • у вас нет evaluator-а, который умеет отдельно проверять merge quality.

Эволюция техник рассуждения

ТехникаСтруктураОбъединениеBacktrackingСложность
Chain of ThoughtЛинияНетНетМинимальная
Self-ConsistencyПараллельные линииГолосованиеНетНизкая
Tree of ThoughtsДеревоНетДаСредняя
Graph of ThoughtsГрафДаДаВысокая

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

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

from openai import OpenAI

client = OpenAI()

def graph_of_thoughts_simple(task: str) -> str:
    """
    GoT через один промпт: генерация ветвей,
    объединение лучших идей, улучшение результата.
    """
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {
                "role": "system",
                "content": (
                    "Решай задачи методом «граф мыслей»:\n"
                    "1. Предложи 3 разных подхода к решению\n"
                    "2. Оцени плюсы и минусы каждого\n"
                    "3. Объедини лучшие элементы из разных "
                    "подходов в гибридное решение\n"
                    "4. Улучши гибридное решение, устранив "
                    "найденные слабые места"
                ),
            },
            {"role": "user", "content": task},
        ],
        temperature=0.7,
    )
    return response.choices[0].message.content


result = graph_of_thoughts_simple(
    "Разработай архитектуру системы уведомлений "
    "для e-commerce платформы с 1 млн пользователей."
)
print(result)

Программный GoT с операциями графа (Anthropic)

import anthropic
from dataclasses import dataclass, field

client = anthropic.Anthropic()


@dataclass
class Thought:
    """Вершина графа мыслей."""
    id: str
    content: str
    score: float = 0.0
    parents: list[str] = field(default_factory=list)


class GraphOfThoughts:
    """Реализация Graph of Thoughts с тремя операциями."""

    def __init__(self, task: str):
        self.task = task
        self.thoughts: dict[str, Thought] = {}
        self.counter = 0

    def _next_id(self) -> str:
        self.counter += 1
        return f"t{self.counter}"

    def generate(
        self, parent_ids: list[str] | None = None, n: int = 3
    ) -> list[str]:
        """Генерация новых мыслей."""
        context = ""
        if parent_ids:
            parents = [
                self.thoughts[pid]
                for pid in parent_ids
                if pid in self.thoughts
            ]
            context = "\n".join(
                f"- [{t.id}]: {t.content}" for t in parents
            )

        prompt = f"Задача: {self.task}\n\n"
        if context:
            prompt += f"Контекст:\n{context}\n\n"
        prompt += (
            f"Предложи {n} различных подхода или идеи. "
            "Каждый на новой строке, начиная с номера."
        )

        message = client.messages.create(
            model="claude-sonnet-4-20250514",
            max_tokens=1024,
            messages=[{"role": "user", "content": prompt}],
        )

        new_ids = []
        for line in message.content[0].text.split("\n"):
            line = line.strip()
            if line and line[0].isdigit():
                content = line.lstrip("0123456789.)- ").strip()
                if content:
                    tid = self._next_id()
                    self.thoughts[tid] = Thought(
                        id=tid,
                        content=content,
                        parents=parent_ids or [],
                    )
                    new_ids.append(tid)
        return new_ids[:n]

    def merge(self, thought_ids: list[str]) -> str:
        """Объединение нескольких мыслей в одну."""
        ideas = "\n".join(
            f"- [{tid}]: {self.thoughts[tid].content}"
            for tid in thought_ids
            if tid in self.thoughts
        )

        message = client.messages.create(
            model="claude-sonnet-4-20250514",
            max_tokens=1024,
            messages=[
                {
                    "role": "user",
                    "content": (
                        f"Задача: {self.task}\n\n"
                        f"Идеи:\n{ideas}\n\n"
                        "Объедини лучшие элементы этих идей "
                        "в одно гибридное решение. "
                        "Укажи, какие элементы откуда взяты."
                    ),
                }
            ],
        )

        merged_content = message.content[0].text
        tid = self._next_id()
        self.thoughts[tid] = Thought(
            id=tid,
            content=merged_content,
            parents=thought_ids,
        )
        return tid

    def refine(self, thought_id: str) -> str:
        """Улучшение мысли через обратную связь."""
        thought = self.thoughts[thought_id]

        message = client.messages.create(
            model="claude-sonnet-4-20250514",
            max_tokens=1024,
            messages=[
                {
                    "role": "user",
                    "content": (
                        f"Задача: {self.task}\n\n"
                        f"Текущее решение:\n{thought.content}\n\n"
                        "Найди слабые места и улучши решение. "
                        "Объясни, что именно улучшено."
                    ),
                }
            ],
        )

        refined_content = message.content[0].text
        tid = self._next_id()
        self.thoughts[tid] = Thought(
            id=tid,
            content=refined_content,
            parents=[thought_id],
        )
        return tid

    def evaluate(self, thought_id: str) -> float:
        """Оценка качества мысли (0.0 — 1.0)."""
        thought = self.thoughts[thought_id]

        message = client.messages.create(
            model="claude-sonnet-4-20250514",
            max_tokens=64,
            messages=[
                {
                    "role": "user",
                    "content": (
                        f"Задача: {self.task}\n\n"
                        f"Решение: {thought.content}\n\n"
                        "Оцени от 0 до 10. Ответь только числом."
                    ),
                }
            ],
        )

        try:
            score = float(
                message.content[0].text.strip().split()[0]
            ) / 10
        except (ValueError, IndexError):
            score = 0.5
        self.thoughts[thought_id].score = score
        return score


got = GraphOfThoughts(
    "Спроектируй систему рекомендаций для книжного магазина"
)

initial_ids = got.generate(n=3)

for tid in initial_ids:
    score = got.evaluate(tid)
    print(f"{tid}: {score:.1f}{got.thoughts[tid].content[:60]}...")

sorted_ids = sorted(
    initial_ids,
    key=lambda t: got.thoughts[t].score,
    reverse=True,
)
merged_id = got.merge(sorted_ids[:2])

refined_id = got.refine(merged_id)

print(f"\nФинальное решение:\n{got.thoughts[refined_id].content}")
Не злоупотребляйте операцией merge. Объединение слишком многих идей (5+) приводит к размытому результату. Оптимально объединять 2-3 лучших варианта. Также следите за глубиной графа — каждый уровень стоит API-вызовов.

Что измерять в GoT-системе

Помимо итогового качества полезно смотреть:

  • merge win rate against best single branch;
  • refinement uplift;
  • graph depth before convergence;
  • cost per merged answer;
  • долю конфликтов между branch outputs.

Если merge почти никогда не побеждает лучший отдельный branch, значит графовая сложность вам не окупается.

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

Качество решений: GoT vs другие техники (задача сортировки из статьи Besta et al.)
Chain of Thought36%
Tree of Thoughts56%
Graph of Thoughts82%
GoT + Refinement89%

На задаче сортировки 128 элементов (разбить → отсортировать → объединить) GoT значительно превосходит ToT благодаря операции merge. Данные из оригинальной статьи Besta et al.

Когда GoT оправдан в продакшене

  • Сложная оптимизация — когда нужно комбинировать подходы
  • Генерация контента — объединение разных стилей и идей
  • Архитектурные решения — несколько вариантов → гибрид
  • Задачи merge-sort типа — декомпозиция, параллельная обработка, объединение

Для простых задач GoT избыточен. Используйте CoT или ToT.

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

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

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

2. Какие три основные операции есть в Graph of Thoughts?

3. Для каких задач GoT наиболее эффективен?