Урок 4 из 8
Узлы и рёбра: собираем первый граф
Цель урока: пройти путь от бизнес-задачи до готовой схемы графа - тем же методом, каким это делают авторы LangGraph.
Метод из четырёх шагов
Официальная методичка «Thinking in LangGraph» предлагает такой порядок. Он тебе знаком: так же описывают любой бизнес-процесс.
- Разбей работу на шаги. Каждый шаг - одно осмысленное действие. Это будущие узлы.
- Нарисуй переходы. Что за чем идёт, где развилки, где возвраты. Это будущие рёбра.
- Определи состояние. Что должны знать все шаги (урок 3).
- Опиши каждый узел. Что берёт из состояния, что делает, что кладёт обратно.
Разберём живой пример
Задача: ИИ-помощник разбирает входящие сообщения учеников онлайн-школы. Типовые вопросы решает сам, сложные передаёт куратору, и каждый ответ проходит проверку качества.
Шаг 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() # собираем в рабочее приложение
Условное ребро - это диспетчер на развилке: смотрит в карточку заказа и говорит, к кому идти дальше. Сам он работу не делает - только маршрутизирует. А цикл «проверка → подготовка» - это ОТК на заводе: брак возвращается на конвейер, пока не пройдёт контроль.
Что здесь важно понять
- Внутри узла может быть что угодно: вызов Claude, запрос в базу, отправка письма, обычный код без ИИ. Граф не заставляет каждый шаг быть «умным».
- Циклы - легальны и полезны. «Переделывай, пока не пройдёт проверку» - типовой паттерн качества, который в простой цепочке не сделать.
- Схема работает в обе стороны. До работы она - твоё ТЗ для Claude Code, после - документ приёмки: сгенерированную из кода схему сверяешь с задуманной.
Проверь себя
1. Чем условное ребро отличается от простого?
2. В примере с проверкой качества есть цикл «проверка → подготовка». Что он даёт?
3. С чего правильно начинать проектирование графа?
Практика: опиши Claude Code свой процесс (хоть обработку заявок, хоть проверку домашек в школе) и попроси: «Разбей на узлы и рёбра по методу Thinking in LangGraph и нарисуй mermaid-схему». Проверь схему: все ли развилки на месте?