LangGraph для производственных агентов: контрольные точки, HITL и графы многих агентов
Почему цепочки останавливаются и возобновляют работу во время циклов, и как узлы, рёбра LangGraph и механизмы сохранения состояния делают агентов для производственных задач работоспособными при одновременном участии человека для проверки.
Источники: LangGraph Explained: Build Production-Ready AI Agents in 2026
Что такое LangGraph?
LangGraph — это среда выполнения для создания агентов с состоянием и множеством шагов в виде явных графов: узлы выполняют работу, рёбра определяют, что будет выполнено далее, а общее состояние сохраняется на протяжении всех шагов, включая случаи сбоев и пауз со стороны человека.
Два года назад многие «агенты» представляли собой циклы while вокруг LLM без возможности восстановления. Сбои посреди выполнения задач означали необходимость начала всего с нуля. Графы делают хранение данных, разветвление и возобновление работы первостепенными аспектами.
Почему цепочки оказались недостаточны
Цепочки LCEL отлично подходят для линейных процессов. Однако они не справляются, когда требуются циклы, условное направление выполнения, надёжные точки контроля или утверждение человека в процессе работы. Это проблемы графов.
Основные понятия: узлы, рёбра и состояние
- Состояние — типизированные поля, которые хранятся во время выполнения
- Узлы — функции, обновляющие состояние
from typing import TypedDict, Annotated
from langgraph.graph import StateGraph, END
import operator
# Define your state
class AgentState(TypedDict):
messages: Annotated[list, operator.add]
next_action: str
final_answer: str
from langgraph.graph import StateGraph, END
from langgraph.prebuilt import ToolNode
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
# 1. Define a tool
@tool
def search_web(query: str) -> str:
"""Search the web for current information."""
# Connect to your actual search API here
return f"Search results for: {query}"
# 2. Define the LLM with tools bound
llm = ChatOpenAI(model="gpt-4o", temperature=0)
tools = [search_web]
llm_with_tools = llm.bind_tools(tools)
# 3. Define node functions
def call_llm(state):
response = llm_with_tools.invoke(state["messages"])
return {"messages": [response]}
def should_continue(state):
last_message = state["messages"][-1]
if last_message.tool_calls:
return "run_tools"
return END
# 4. Build the graph
workflow = StateGraph(AgentState)
workflow.add_node("agent", call_llm)
workflow.add_node("run_tools", ToolNode(tools))
workflow.set_entry_point("agent")
workflow.add_conditional_edges("agent", should_continue)
workflow.add_edge("run_tools", "agent")
# 5. Compile with a checkpointer
from langgraph.checkpoint.sqlite import SqliteSaver
memory = SqliteSaver.from_conn_string("agents.db")
graph = workflow.compile(checkpointer=memory)
# 6. Run with a thread ID for persistent state
config = {"configurable": {"thread_id": "user-123"}}
result = graph.invoke({"messages": [("user", "What is the latest GPT model?")]}, config)
print(result["messages"][-1].content)
# Add a human approval gate before a risky action
workflow.add_node("human_review", interrupt(before="execute_payment"))
pip install langgraph langchain-openai psycopg2-binary
Как на самом деле работает управление состоянием
Обновления объединяются с помощью редюсеров. Некорректно настроенные редюсеры могут дублировать сообщения или удалять поля. Выбор редюсера следует рассматривать как часть проверки схемы.
Первый агент (Python)
Определите состояние → добавьте узлы → соедините ребрами → скомпилируйте → вызовите с идентификатором потока при использовании сохранителя.
Участие человека
Прервите процесс до возникновения побочных эффектов; продолжите с подтверждающим пакетом данных. Именно это обеспечивает операционное различие между демо-версиями и агентами в производстве.
Шаблоны многопоточных агентов
Передача управления между супервайзером и специалистом, параллельные ветки и подграфы чётко отображаются через названные узлы с общим или разделённым состоянием.
Постоянство и восстановление
Инструменты контроля состояния, основанные на базе данных, сохраняются при перезапуске процессов. Инструменты сохранения в памяти предназначены только для тестов.
Когда использовать LangGraph
Используйте его, когда поток управления нелинейный, требуется пауза или возобновление работы. Для однократных ответов с использованием RAG без ветвлений лучше подходят более простые структуры.
Заключение
Продакшн-агентам нужны явно определённые состояния и связи между узлами — а не простые циклы. LangGraph представляет собой надёжный способ реализовать такую структуру в коде.
Игнорируйте рекламу с маркетплейсов; настоящая техническая ценность заключается в возможности контроля потока управления с использованием точек проверки состояния и метода HITL. Обучающие материалы должны сосредотачиваться именно на этих элементах.
Добавьте обработку событий запуска и завершения узлов, чтобы трейсы показывали, какая ветка выполнялась. Графы без телеметрии превращаются в «чёрные ящики» в 2 часа ночи.
Определения графов версий вместе с промптами. Переименование узла без миграции нарушает возобновленные потоки, которые по-прежнему указывают на старые имена.
Игнорируйте шум от рекламы на рынке; инженерная ценность заключается в контролируемом потоке выполнения и HITL. Пусть учебные материалы сосредотачиваются именно на этих примитивах.
Добавьте инструменты для отслеживания моментов запуска/завершения узлов, чтобы трейсы показывали, какая ветвь была выполнена. Графы без телеметрии превращаются в «черные ящики» в 2 часа ночи.
Определения графов версий вместе с промптами. Переименование узла без миграции нарушает возобновленные потоки, которые по-прежнему указывают на старые имена.
Игнорируйте шум от рекламы на рынке; инженерная ценность заключается в контролируемом потоке выполнения и HITL. Пусть учебные материалы сосредотачиваются именно на этих примитивах.
Добавьте инструменты для отслеживания моментов запуска/завершения узлов, чтобы трейсы показывали, какая ветвь была выполнена. Графы без телеметрии превращаются в «черные ящики» в 2 часа ночи.
Определения графов версий вместе с промптами. Переименование узла без миграции нарушает возобновленные потоки, которые по-прежнему указывают на старые имена.
Игнорируйте шум от рекламы на рынке; инженерная ценность заключается в контролируемом потоке выполнения и HITL. Пусть учебные материалы сосредотачиваются именно на этих примитивах.
Добавьте инструменты для отслеживания моментов запуска/завершения узлов, чтобы трейсы показывали, какая ветвь была выполнена. Графы без телеметрии превращаются в «черные ящики» в 2 часа ночи.
Определения графов версий вместе с промптами. Переименование узла без миграции нарушает возобновленные потоки, которые по-прежнему указывают на старые имена.
Игнорируйте шум от рекламы на рынке; инженерная ценность заключается в контролируемом потоке выполнения и HITL. Пусть учебные материалы сосредотачиваются именно на этих примитивах.
Добавьте инструменты для отслеживания моментов запуска/завершения узлов, чтобы трейсы показывали, какая ветвь была выполнена. Графы без телеметрии превращаются в «черные ящики» в 2 часа ночи.
Определения графов версий вместе с промптами. Переименование узла без миграции нарушает возобновленные потоки, которые по-прежнему указывают на старые имена.
Игнорируйте шум от рекламы на рынке; инженерная ценность заключается в контролируемом потоке выполнения и HITL. Пусть учебные материалы сосредотачиваются именно на этих примитивах.
Добавьте инструменты для отслеживания моментов запуска/завершения узлов, чтобы трейсы показывали, какая ветвь была выполнена. Графы без телеметрии превращаются в «черные ящики» в 2 часа ночи.
Определения графов версий вместе с промптами. Переименование узла без миграции нарушает возобновленные потоки, которые по-прежнему указывают на старые имена.
Игнорируйте шум от рекламы на рынке; инженерная ценность заключается в контролируемом потоке выполнения и HITL. Пусть учебные материалы сосредотачиваются именно на этих примитивах.
Добавьте инструменты для отслеживания моментов запуска/завершения узлов, чтобы трейсы показывали, какая ветвь была выполнена. Графы без телеметрии превращаются в «черные ящики» в 2 часа ночи.
Определения графов версий вместе с промптами. Переименование узла без миграции нарушает возобновленные потоки, которые по-прежнему указывают на старые имена.
Игнорируйте шум от рекламы на рынке; инженерная ценность заключается в контролируемом потоке выполнения и HITL. Пусть учебные материалы сосредотачиваются именно на этих примитивах.
Добавьте инструменты для отслеживания моментов запуска/завершения узлов, чтобы трейсы показывали, какая ветвь была выполнена. Графы без телеметрии превращаются в «черные ящики» в 2 часа ночи.
Определения графов версий вместе с промптами. Переименование узла без миграции нарушает возобновленные потоки, которые по-прежнему указывают на старые имена.
Игнорируйте шум от рекламы на рынке; инженерная ценность заключается в контролируемом потоке выполнения и HITL. Пусть учебные материалы сосредотачиваются именно на этих примитивах.
Добавьте инструменты для отслеживания моментов запуска/завершения узлов, чтобы трейсы показывали, какая ветвь была выполнена. Графы без телеметрии превращаются в «черные ящики» в 2 часа ночи.
Определения графов версий вместе с промптами. Переименование узла без миграции нарушает возобновленные потоки, которые по-прежнему указывают на старые имена.
Игнорируйте шум от рекламы на рынке; инженерная ценность заключается в контролируемом потоке выполнения и HITL. Пусть учебные материалы сосредотачиваются именно на этих примитивах.
Добавьте инструменты для отслеживания моментов запуска/завершения узлов, чтобы трейсы показывали, какая ветвь была выполнена. Графы без телеметрии превращаются в «черные ящики» в 2 часа ночи.
Определения графов версий вместе с промптами. Переименование узла без миграции нарушает возобновленные потоки, которые по-прежнему указывают на старые имена.
Игнорируйте шум от рекламы на рынке; инженерная ценность заключается в контролируемом потоке выполнения и HITL. Пусть учебные материалы сосредотачиваются именно на этих примитивах.
Добавьте инструменты для отслеживания моментов запуска/завершения узлов, чтобы трейсы показывали, какая ветвь была выполнена. Графы без телеметрии превращаются в «черные ящики» в 2 часа ночи.
Определения графов версий вместе с промптами. Переименование узла без миграции нарушает возобновленные потоки, которые по-прежнему указывают на старые имена.
Игнорируйте шум от рекламы на рынке; инженерная ценность заключается в контролируемом потоке выполнения и HITL. Пусть учебные материалы сосредотачиваются именно на этих примитивах.
Добавьте инструменты для отслеживания моментов запуска/завершения узлов, чтобы трейсы показывали, какая ветвь была выполнена. Графы без телеметрии превращаются в «черные ящики» в 2 часа ночи.
Определения графов версий вместе с промптами. Переименование узла без миграции нарушает возобновленные потоки, которые по-прежнему указывают на старые имена.
Игнорируйте шум от рекламы на рынке; инженерная ценность заключается в контролируемом потоке выполнения и HITL. Пусть учебные материалы сосредотачиваются именно на этих примитивах.
Добавьте инструменты для отслеживания моментов запуска/завершения узлов, чтобы трейсы показывали, какая ветвь была выполнена. Графы без телеметрии превращаются в «черные ящики» в 2 часа ночи.
Определения графов версий вместе с промптами. Переименование узла без миграции нарушает продолжающиеся потоки, которые всё ещё указывают на старые имена.
Игнорируйте шум от рекламы на рынке; инженерная ценность заключается в контролируемом потоке выполнения и механизме HITL. Сосредоточьте учебные материалы на этих основных элементах.
Соотнесите каждый тип производственного инцидента с функцией графа: превышение времени ожидания — узел повторных попыток, некорректный JSON инструмента — узел валидации, переопределение оператором — прерывание.
Подграфы помогают изолировать специализированные промпты, не теряя при этом ни одного идентификатора родительского потока для аудита.
Избегайте помещения всей бизнес-политики в один «бог-узел»; разделяйте её, чтобы можно было определить причину сбоев.
Соотнесите каждый тип производственного инцидента с функцией графа: превышение времени ожидания — узел повторных попыток, некорректный JSON инструмента — узел валидации, переопределение оператором — прерывание.
Подграфы помогают изолировать специализированные промпты, не теряя при этом ни одного идентификатора родительского потока для аудита.
Избегайте помещения всей политики бизнеса в один «бог-узел»; разделяйте её, чтобы можно было определить причины сбоев.
Свяжите каждый тип инцидента в производстве с определённой характеристикой графа: превышение времени ожидания — узел повторных попыток, некорректный JSON инструмента — узел валидации, переопределение оператором — прерывание.
Подграфы помогают изолировать запросы специалистов, не теряя при этом ни одного идентификатора родительского потока для аудита.
Избегайте помещения всей политики бизнеса в один «бог-узел»; разделяйте её, чтобы можно было определить причины сбоев.
Свяжите каждый тип инцидента в производстве с определённой характеристикой графа: превышение времени ожидания — узел повторных попыток, некорректный JSON инструмента — узел валидации, переопределение оператором — прерывание.
Подграфы помогают изолировать запросы специалистов, не теряя при этом ни одного идентификатора родительского потока для аудита.
Избегайте помещения всей политики бизнеса в один «бог-узел»; разделяйте её, чтобы можно было определить причины сбоев.
Соотнесите каждый тип инцидента в производстве с характеристикой графа: тайм-ауты — узел повторных попыток, некорректный JSON инструмента — узел валидации, переопределение оператором — прерывание.
Подграфы помогают изолировать запросы специалистов, не теряя при этом ни одного идентификатора родительского потока для аудита.
Избегайте загружения всей бизнес-политики в один «бог-узел»; разделяйте её, чтобы можно было определить причину сбоев.
Соотнесите каждый тип инцидента в производстве с характеристикой графа: тайм-ауты — узел повторных попыток, некорректный JSON инструмента — узел валидации, переопределение оператором — прерывание.
Подграфы помогают изолировать запросы специалистов, не теряя при этом ни одного идентификатора родительского потока для аудита.