Урок 4 из 8

Узлы и рёбра: собираем первый граф

Цель урока: пройти путь от бизнес-задачи до готовой схемы графа - тем же методом, каким это делают авторы LangGraph.

Метод из четырёх шагов

Официальная методичка «Thinking in LangGraph» предлагает такой порядок. Он тебе знаком: так же описывают любой бизнес-процесс.

  1. Разбей работу на шаги. Каждый шаг - одно осмысленное действие. Это будущие узлы.
  2. Нарисуй переходы. Что за чем идёт, где развилки, где возвраты. Это будущие рёбра.
  3. Определи состояние. Что должны знать все шаги (урок 3).
  4. Опиши каждый узел. Что берёт из состояния, что делает, что кладёт обратно.

Разберём живой пример

Задача: ИИ-помощник разбирает входящие сообщения учеников онлайн-школы. Типовые вопросы решает сам, сложные передаёт куратору, и каждый ответ проходит проверку качества.

Шаг 1 - шаги процесса: понять тип вопроса → подготовить ответ → проверить качество → отправить (или доработать, или передать куратору).

Шаг 2 - переходы:

старт Классификация типовой или сложный? Подготовка черновик ответа Проверка качество ответа К куратору передача человеку Отправка ответ ученику сложный вопрос ответ ок доработать
Две развилки (после классификации и после проверки) и один цикл (проверка → подготовка). Это и есть условные рёбра.

Твоя точка контроля - схема, а не код

Читать код не нужно. У готового графа есть встроенная визуализация: попроси Claude Code «покажи mermaid-схему графа» - и получишь картинку, которую сравниваешь со своей нарисованной. Все ли узлы на месте? Все ли развилки и циклы? Картинку с картинкой сверит любой человек - без единой строчки кода.

Как схема превращается в код - заглянуть по желанию

Для любопытных: код собирается из тех же слов, что и схема, - «добавить узел», «добавить ребро». Пишет его Claude Code.

builder = StateGraph(State)          # создаём граф с нашим состоянием

# узлы: имя + функция
builder.add_node("klassifikaciya", klassifikator)
builder.add_node("podgotovka", podgotovit_otvet)
builder.add_node("proverka", proverit_kachestvo)
builder.add_node("kuratoru", peredat_kuratoru)
builder.add_node("otpravka", otpravit_otvet)

# простые рёбра: «после X всегда Y»
builder.add_edge(START, "klassifikaciya")
builder.add_edge("podgotovka", "proverka")

# условные рёбра: «куда дальше - решает функция-развилка»
builder.add_conditional_edges("klassifikaciya", vybor_puti)
    # vybor_puti смотрит в состояние и возвращает
    # "podgotovka" или "kuratoru"
builder.add_conditional_edges("proverka", itog_proverki)
    # "otpravka", если ок · "podgotovka", если доработать

graph = builder.compile()            # собираем в рабочее приложение
Аналогия

Условное ребро - это диспетчер на развилке: смотрит в карточку заказа и говорит, к кому идти дальше. Сам он работу не делает - только маршрутизирует. А цикл «проверка → подготовка» - это ОТК на заводе: брак возвращается на конвейер, пока не пройдёт контроль.

Что здесь важно понять

Проверь себя

1. Чем условное ребро отличается от простого?

2. В примере с проверкой качества есть цикл «проверка → подготовка». Что он даёт?

3. С чего правильно начинать проектирование графа?

Спроси своего Claude

Практика: опиши Claude Code свой процесс (хоть обработку заявок, хоть проверку домашек в школе) и попроси: «Разбей на узлы и рёбра по методу Thinking in LangGraph и нарисуй mermaid-схему». Проверь схему: все ли развилки на месте?