0Pricing
AI Agents · Урок

Узлы, рёбра и состояние

Определите состояние TypedDict, напишите функции узлов, изменяющие его, и соедините узлы направленными рёбрами.

«Узлы, рёбра и состояние» — бесплатный урок AI Agents на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Agents, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Agents содержит 4 уроков всего.

Части этого урока еще не переведены и отображаются на английском.

Объект состояния

У каждого агента LangGraph есть типизированное состояние — обычно TypedDict:

from typing import TypedDict
from typing_extensions import Annotated
import operator

class AgentState(TypedDict):
    messages: Annotated[list, operator.add]   # appends instead of replaces
    plan: str
    answer: str

Как работают обновления состояния

Каждый узел возвращает частичный словарь. LangGraph:

  1. Считывает текущее состояние
  2. Вызывает узел с этим состоянием
  3. Объединяет возвращённый частичный словарь с исходным

Для полей-списков с operator.add новые элементы добавляются, а не заменяют существующие.

Defining a Node

def planner(state: AgentState) -> dict:
    prompt = f'User wants: {state["messages"][-1].content}'
    plan = llm.invoke(prompt).content
    return {'plan': plan}

Registering the Node

from langgraph.graph import StateGraph, END

graph = StateGraph(AgentState)
graph.add_node('planner', planner)

Определение рёбер

Статические рёбра срабатывают безусловно:

graph.set_entry_point('planner')
graph.add_edge('planner', 'researcher')
graph.add_edge('researcher', 'writer')
graph.add_edge('writer', END)

Условные рёбра

Для ветвления зарегистрируйте функцию, которая выбирает следующий узел:

def route(state: AgentState) -> str:
    if state['needs_research']:
        return 'researcher'
    return 'writer'

graph.add_conditional_edges(
    'planner',
    route,
    {'researcher': 'researcher', 'writer': 'writer'}
)

END — особый узел

END — конечный узел. Любое ребро, ведущее к END, завершает граф и возвращает текущее состояние.

Compiling the Graph

app = graph.compile()
result = app.invoke({'messages': [...]})
print(result['answer'])

Потоковая передача обновлений состояния

Наблюдайте за изменением состояния в реальном времени:

for event in app.stream({'messages': [...]}):
    print(event)
# Each event is the state diff from the just-completed node.

Функции-редукторы

Для сложного объединения состояния используйте собственный редуктор:

def merge_facts(old, new):
    return {**old, **new}

class State(TypedDict):
    facts: Annotated[dict, merge_facts]

Подграфы

Узел сам может быть другим скомпилированным графом — это удобно для иерархических агентов:

subgraph = StateGraph(SubState).compile()
graph.add_node('subprocess', subgraph)

Асинхронные узлы

Узлы могут быть асинхронными функциями:

async def fetch_node(state):
    data = await fetch_async(state['url'])
    return {'data': data}

result = await app.ainvoke({...})

Ошибки в узлах

Если узел возбуждает исключение, LangGraph передаёт ошибку дальше и останавливается. Перехватывайте ошибку в узле, если нужна корректная обработка:

def safe_search(state):
    try:
        return {'results': search(state['query'])}
    except Exception as e:
        return {'error': str(e), 'results': []}

Обновления состояния

Что происходит, когда узел возвращает словарь {'plan': '...'}?

Итоги

Определите состояние TypedDict, напишите функции, возвращающие частичные обновления, добавьте узлы и рёбра, скомпилируйте граф и запустите его. Так работает LangGraph.

Часто задаваемые вопросы

Урок «Узлы, рёбра и состояние» бесплатный?

Да — полный текст урока «Узлы, рёбра и состояние» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Agents, подпишись на CoddyKit PRO. Курс AI Agents содержит 4 уроков всего.

Чему я научусь в уроке «Узлы, рёбра и состояние»?

Определите состояние TypedDict, напишите функции узлов, изменяющие его, и соедините узлы направленными рёбрами. Ты практикуешь AI Agents с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать AI Agents?

Предыдущий опыт не требуется. AI Agents на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Узлы, рёбра и состояние»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке AI Agents?

Да. Каждый урок AI Agents включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Почему графы лучше плоских цепочек
  2. Узлы, рёбра и состояние
  3. Условная маршрутизация и ветвление
  4. Сохранение состояния графа (контрольные точки)
← Назад к AI Agents