Головна / Статті

LangGraph для агентів у продакшені: контрольні точки, HITL та багатоагентні графи

Чому ланцюги завмирають під час циклів та знову запускаються, і як вузли, ребра та засоби зберігання контрольних точок LangGraph роблять агентів для виробництва придатними до використання з можливістю перевірки людиною.

Видавець: REACTAPP.TOP7 хв читання1610 слів

Джерела: LangGraph Explained: Build Production-Ready AI Agents in 2026

Що таке LangGraph?

LangGraph — це середовище виконання для створення багатокрокових агентів із станом у вигляді явних графів: вузли виконують завдання, ребра визначають наступні кроки, а спільний стан зберігається протягом усіх кроків — включаючи після збоїв та перерв від людини.

Два роки тому багато „агентів“ були просто циклами навколо 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 є одним із надійних способів реалізації цього у коді.

    Ігноруйте рекламний шум на маркетплейсах; справжня інженерна цінність полягає у контролі стану та механізмах відновлення. Навчальні матеріали слід зосереджувати саме на цих основних елементах.

    Відстежуйте події запуску та завершення вузлів, щоб можна було бачити, яка гілка виконувалася. Графи без телеметрії перетворюються на „чорні скриньки“ о 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 інструменту → вузол перевірки, перевизначення оператором → переривання.

    Підграфи допомагають ізолювати запити фахівців, не втрачаючи жодного ідентифікатора батьківської нитки для аудиту.