Главная / Статьи

Персистентность LangGraph: точки контроля, позволяющие возобновить работу и использовать HITL

Объяснение механизма сохранения данных в LangGraph: как чекпоинты хранят состояние каждой нити, что позволяет эффективно работать с прерываниями, утверждением действий человеком, повторными попытками и отладкой с использованием механизма «путешествия во времени».

Издатель: REACTAPP.TOP7 мин чтения1608 слов

Источники: LangGraph Persistence: The Feature That Makes Everything Else Possible

В этом руководстве воссоздаётся рабочий путь для LangGraph Persistence: функции, которая делает возможным всё остальное. Основной акцент сделан на контрактах, проверках и коде, который можно просто добавить в репозиторий без необходимости угадывать его назначение. Для обзора сначала определите входные данные, ответственного за шаг и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не пытаясь угадать скрытое состояние. Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. Когда шаг терпит неудачу, причина должна быть связана с одной конкретной обязанностью.

Краткий обзор того, что мы знаем на данный момент

Чтобы быстро подвести итоги тому, что мы знаем на данный момент, необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Дайте названия результатам работы, определите критерии успеха и не соглашайтесь на молчаливое частичное выполнение задачи. Создавайте точки контроля после дорогостоящих шагов, чтобы повторные попытки не влекли за собой повторной оплаты одного и того же вызова модели.

Что на самом деле представляет собой сохранение данных

Чтобы понимать, что такое настоящая устойчивость процесса, необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Записывайте время выполнения и затраты рядом с функциональными результатами. Раннее отображение информации предотвращает неожиданные счета в общих средах. Создавайте точки контроля после дорогостоящих шагов, чтобы повторные попытки не влекли за собой повторной оплаты одного и того же вызова модели.

Как это на самом деле работает: точки контроля

Чтобы понять, как это работает на самом деле: перед изменением кода необходимо определить точки контроля, входные данные, ответственного за шаг и критерии завершения. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, доступном для аудита операторами. Создавайте точки контроля после дорогостоящих шагов, чтобы повторные попытки не влекли за собой повторной оплаты одного и того же вызова модели. Чтобы понять, как это работает на самом деле: перед изменением кода необходимо определить точки контроля, входные данные, ответственного за шаг и критерии завершения. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Предпочитайте небольшие, тестируемые единицы кода большим скриптам. Когда шаг терпит неудачу, причина должна быть связана с одной конкретной областью ответственности.

Многопоточность: разделение нескольких выполнений

Для потоковой обработки: чтобы сохранять независимость нескольких выполнений, необходимо заранее определить входные данные, ответственного за шаг и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Укажите названия результатов работы, определите критерии успеха и не допускайте безответственного частичного завершения задачи. Постоянство превращает демонстрации в системы: от потоковой обработки до участия людей в процессе и отладки с использованием механизмов «путешествия во времени» всё зависит от него.

Код (он проще, чем вы думаете)

Для кода (он проще, чем кажется): определите входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Записывайте время выполнения и затраты рядом с функциональными результатами. Раннее видимость данных предотвращает неожиданные счета в общедоступных средах. Персистентность превращает демо-версии в полноценные системы: для работы потоков, участия людей в процессе и отладки с возможностью «путешествия во времени» она необходима.

from langchain_openai import ChatOpenAI
from langgraph.graph import StateGraph
from langgraph.checkpoint.memory import InMemorySaver
from typing import TypedDict

llm = ChatOpenAI()

class JokeState(TypedDict):
    topic: str
    joke: str
    explanation: str

def generate_joke(state: JokeState):
    response = llm.invoke(f"Generate a joke on the topic: {state['topic']}")
    return {"joke": response.content}

def generate_explanation(state: JokeState):
    response = llm.invoke(f"Explain this joke: {state['joke']}")
    return {"explanation": response.content}

# Build graph
graph = StateGraph(JokeState)
graph.add_node("generate_joke", generate_joke)
graph.add_node("generate_explanation", generate_explanation)
graph.add_edge("__start__", "generate_joke")
graph.add_edge("generate_joke", "generate_explanation")
graph.add_edge("generate_explanation", "__end__")

# Add persistence - this is the key line
checkpointer = InMemorySaver()
workflow = graph.compile(checkpointer=checkpointer)
config = {"configurable": {"thread_id": "1"}}

result = workflow.invoke(
    {"topic": "pizza"},
    config=config
)
# Get the final state
workflow.get_state(config)

# Get ALL intermediate states
workflow.get_state_history(config)
config_2 = {"configurable": {"thread_id": "2"}}
result_2 = workflow.invoke({"topic": "pasta"}, config=config_2)

Что можно создать с этим

Чтобы понимать, что можно создать с помощью этого инструмента, необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Конфигурацию следует хранить отдельно от кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, доступном для аудита операторами. Постоянство данных превращает демонстрации в полноценные системы: для работы с потоками, участием людей в процессе и отладкой с учетом временных факторов оно крайне важно. Чтобы понимать, что можно создать с помощью этого инструмента, необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Лучше использовать небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое шага он должен указывать на конкретную причину.

1. Кратковременная память в чат-ботах

1. Для краткосрочной памяти в чат-ботах необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Рассматривайте этот этап как контракт между входными данными и проверенными выходными результатами. Укажите названия элементов, определите критерии успеха и не допускайте молчаливого частичного завершения работы. Сохраняйте структуру графа простой и типизированной. Вложенные структуры данных скрывают информацию о том, какой узел заполнил тот или иной поле, и мешают возобновлению работы после прерываний.

2. Толерантность к сбоям

2. Что касается отказоустойчивости, необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Регистрируйте время выполнения и затраты рядом с функциональными результатами. Раннее видимость данных предотвращает неожиданные счета в общедоступных средах. Сохраняйте структуру графа простой и типизированной; вложенные структуры скрывают информацию о том, какой узел заполнил тот или иной поле, и мешают возобновлению работы после прерываний.

import time

def step_two(state):
    print("Step 2 running...")
    time.sleep(30)  # simulating a slow operation
    return {"step_two": "done"}
workflow.invoke(None, config=config)

3. Участие человека

Для пункта 3 «Человек в цикле» необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Храните конфигурацию вне кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, доступном для аудита операторами. Сохраняйте структуру графа простой и типизированной. Вложенные структуры данных маскируют информацию о том, какой узел заполнил тот или иной поле, и мешают возобновлению работы после прерываний. Для пункта 3 «Человек в цикле» необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Предпочитайте небольшие, тестируемые единицы кода большим скриптам. При сбое шага причина сбоя должна указывать на конкретную ответственность.

4. Путешествие во времени

Что касается путешествий во времени, необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Рассматривайте этот этап как контракт между входными данными и проверенными результатами. Дайте названия элементам, определите критерии успеха и не допускайте молчаливого частичного выполнения. Создавайте точки контроля после дорогостоящих шагов, чтобы повторные попытки не влекли за собой повторной оплаты одного и того же вызова модели.

# Go back to a specific checkpoint and change the topic
workflow.update_state(
    {"configurable": {"thread_id": "1", "checkpoint_id": "<checkpoint_id>"}},
    {"topic": "samosa"}
)

# Re-run from that point
workflow.invoke(None, config={"configurable": {"thread_id": "1", "checkpoint_id": "<new_checkpoint_id>"}})

Более широкая картина

Для понимания более широкой картины необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Записывайте время выполнения и стоимость рядом с функциональными результатами. Прозрачность на ранних этапах предотвращает неожиданные счета в общих средах. Создавайте точки контроля после дорогостоящих шагов, чтобы повторные попытки не влекли за собой повторной оплаты одного и того же вызова модели.

Структурированное обучение за пределами блогов

Для реализации структурированного обучения за пределами блогов необходимо заранее определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии. Конфигурацию следует хранить отдельно от кода приложения. Файлы среды, хранилища секретов и флаги функций должны находиться в одном месте, доступном для аудита операторами. Создавайте точки контроля после дорогостоящих шагов, чтобы повторные попытки не приводили к повторной оплате одного и того же вызова модели.

Курсы

Для курсов необходимо определить входные данные, ответственного за выполнение шага и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.

Чек-лист операционной деятельности

Для чек-листа операционной деятельности также необходимо определить входные данные, ответственного за шаг и критерии завершения перед изменением кода. Операторы должны иметь возможность перезапустить шаг с известной точки контроля, не догадываясь о скрытом состоянии.

Необходимо совместно задокументировать стандартный путь выполнения и пути восстановления. Повторные попытки и обработка некорректных сообщений являются частью продукта.

Постоянство данных превращает демонстрации в полноценные системы: от потоков выполнения до отладки с участием людей и возможности возврата назад во времени — всё это зависит от него.

При наличии бюджета добавьте тест на работоспособность критического пути в CI с использованием фикстчеров.

Предпочитайте небольшие, тестируемые единицы кода вместо обширных скриптов. При сбое какого-либо шага он должен указывать на конкретную причину.

Постоянство данных превращает демо-версии в полноценные системы: для работы с потоками, участием людей в процессе и отладкой с использованием механизмов «путешествия во времени» оно необходимо.

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