langgraph의 공식문서를 번역해 놓은 자료입니다. 이해하기 쉽게 예제는 변경하였습니다. 또한 필요한 경우 부연 설명을 추가하였습니다. 문제가 되면 삭제하겠습니다.
https://langchain-ai.github.io/langgraph/tutorials/introduction/
Part 7: 시간 여행(Time Travel)
일반적인 챗봇 워크플로우에서는 사용자가 작업을 완료하기 위해 챗봇과 1회 이상 상호작용한다. 이전 섹션에서는 메모리를 추가하고 사람을 루프에 포함시켜 그래프 상태를 체크포인팅하고 상태를 수동으로 재정의하여 향후 응답을 제어하는 방법을 살펴보았다.
하지만 사용자가 이전 응답에서 시작하여 "분기"하여 별도의 결과를 탐색할 수 있도록 하려면 어떻게 해야 할까? 또는 사용자가 실수를 수정하거나 다른 전략을 시도하기 위해 어시스턴트의 작업을 "되돌리도록(rewind)" 하고 싶다면 어떻게 해야 할까(자율 소프트웨어 엔지니어와 같은 응용 프로그램에서 일반적이다)?
LangGraph의 내장 "시간 여행(time travel)" 기능을 사용하여 이러한 경험과 그 이상을 만들 수 있다.
이번 섹션에서는 그래프의 get_state_history
메서드를 사용하여 체크포인트를 가져와 그래프를 "되돌린다". 그런 다음 이 이전 시점에서 실행을 재개할 수 있다.
먼저, 우리의 챗봇 그래프를 기억하자. 이전과 동일하게 변경할 필요가 없다.
from typing import Annotated, Literal
from langchain_anthropic import ChatAnthropic
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.messages import AIMessage, ToolMessage
from langgraph.constants import END
# langchain-core >= 0.3 이상 사용해야 한다.
from pydantic import BaseModel
from typing_extensions import TypedDict
from langgraph.checkpoint.memory import MemorySaver
from langgraph.graph import StateGraph, START
from langgraph.graph.message import add_messages
from langgraph.prebuilt import ToolNode, tools_condition
class State(TypedDict):
messages: Annotated[list, add_messages]
ask_human: bool
class RequestAssistance(BaseModel):
"""Escalate the conversation to an expert. Use this if you are unable to assist directly or if the user requires support beyond your permissions.
To use this function, relay the user's 'request' so the expert can provide the right guidance.
"""
request: str
tool = TavilySearchResults(max_results=2)
tools = [tool]
llm = ChatOpenAI(model="gpt-3.5-turbo")
llm_with_tools = llm.bind_tools(tools + [RequestAssistance])
def chatbot(state: State):
response = llm_with_tools.invoke(state["messages"])
ask_human = False
if (
response.tool_calls
and response.tool_calls[0]["name"] == RequestAssistance.__name__
):
ask_human = True
return {"messages": [response], "ask_human": ask_human}
graph_builder = StateGraph(State)
graph_builder.add_node("chatbot", chatbot)
graph_builder.add_node("tools", ToolNode(tools=[tool]))
def create_response(response: str, ai_message: AIMessage):
return ToolMessage(
content=response,
tool_call_id=ai_message.tool_calls[0]["id"],
)
def human_node(state: State):
new_messages = []
if not isinstance(state["messages"][-1], ToolMessage):
# 일반적으로, 사용자는 interrupt 중에 상태를 업데이트할 것이다.
# 그렇지 않으면, LLM이 계속할 수 있도록 placeholder ToolMessage를 포함할 것이다.
new_messages.append(
create_response("No response from human.", state["messages"][-1])
)
return {
# 새 메시지 추가
"messages": new_messages,
# 플래그 해제
"ask_human": False,
}
graph_builder.add_node("human", human_node)
def select_next_node(state: State):
if state["ask_human"]:
return "human"
# 그렇지 않으면, 전과 같이 라우팅한다.
return tools_condition(state)
graph_builder.add_conditional_edges(
"chatbot",
select_next_node,
{"human": "human", "tools": "tools", END: END},
)
graph_builder.add_edge("tools", "chatbot")
graph_builder.add_edge("human", "chatbot")
graph_builder.add_edge(START, "chatbot")
memory = MemorySaver()
graph = graph_builder.compile(
checkpointer=memory,
interrupt_before=["human"],
)
from IPython.display import Image, display
try:
display(
Image(graph.get_graph().draw_mermaid_png(output_file_path="./time_travel.png"))
)
except Exception:
# This requires some extra dependencies and is optional
pass
그래프가 몇 단계를 진행하도록 하자. 각 단계는 상태 기록에 체크포인트로 저장된다.
config = {"configurable": {"thread_id": "1"}}
events = graph.stream(
{
"messages": [
("user", "지금 LangGraph를 공부하고 있어. LangGraph에 대해 찾아줄 수 있어?")
]
},
config,
stream_mode="values",
)
for event in events:
if "messages" in event:
event["messages"][-1].pretty_print()
================================ Human Message =================================
지금 LangGraph를 공부하고 있어. LangGraph에 대해 찾아줄 수 있어?
================================== Ai Message ==================================
Tool Calls:
tavily_search_results_json (call_4ifhSDiJR72YGEY2a1xP3uGz)
Call ID: call_4ifhSDiJR72YGEY2a1xP3uGz
Args:
query: LangGraph
================================= Tool Message =================================
Name: tavily_search_results_json
[{"url": "https://www.datacamp.com/tutorial/langgraph-tutorial", "content": "LangGraph is a library within the LangChain ecosystem that simplifies the development of complex, multi-agent large language model (LLM) applications. Learn how to use LangGraph to create stateful, flexible, and scalable systems with nodes, edges, and state management."}, {"url": "https://langchain-ai.github.io/langgraph/", "content": "LangGraph is a low-level framework that allows you to create stateful, multi-actor applications with LLMs, using cycles, controllability, and persistence. Learn how to use LangGraph with LangChain, LangSmith, and Anthropic tools to build agent and multi-agent workflows."}]
================================== Ai Message ==================================
LangGraph는 LangChain 생태계 내의 라이브러리로, 복잡한 다중 에이전트 대형 언어 모델 (LLM) 애플리케이션의 개발을 간단화합니다. LangGraph를 사용하여 노드, 엣지 및 상태 관리를 활용하여 상태적이고 유연하며 확장 가능한 시스템을 생성하는 방법에 대해 학습할 수 있습니다.
더 자세한 정보를 원하시면 아래 링크를 참고하시기 바랍니다:
1. [DataCamp Tutorial on LangGraph](https://www.datacamp.com/tutorial/langgraph-tutorial)
2. [LangGraph 공식 사이트](https://langchain-ai.github.io/langgraph/)
events = graph.stream(
{
"messages": [
("user", "좋아~. 그것으로 Chatbot을 만드는 법을 알고 싶어")
]
},
config,
stream_mode="values",
)
for event in events:
if "messages" in event:
event["messages"][-1].pretty_print()
================================ Human Message =================================
좋아~. 그것으로 Chatbot을 만드는 법을 알고 싶어
================================== Ai Message ==================================
Tool Calls:
tavily_search_results_json (call_i47vVWUuoikpkoPfjeYlsy9a)
Call ID: call_i47vVWUuoikpkoPfjeYlsy9a
Args:
query: How to create a chatbot using LangGraph
================================= Tool Message =================================
Name: tavily_search_results_json
[{"url": "https://devendrabogati.medium.com/building-a-versatile-ai-chatbot-with-langgraph-a-step-by-step-guide-10047893972d", "content": "Building a Versatile AI Chatbot with LangGraph: A Step-by-Step Guide | by Devendra Bogati | Aug, 2024 | Medium LangGraph, a powerful framework built on LangChain, offers a comprehensive set of tools to create sophisticated AI agents with features like state management, tool integration, and even time-travel capabilities. By the end of this guide, you’ll have a chatbot that can answer common questions, manage conversation states, escalate complex queries to humans, and explore alternative conversation paths through time travel. graph_builder.add_conditional_edges(“chatbot”, route_tools, {“tools”: “tools”, “__end__”: “__end__”}) LangGraph’s time-travel feature allows you to rewind the chatbot’s state to a previous point in the conversation."}, {"url": "https://dev.to/pavanbelagatti/learn-how-to-build-ai-agents-chatbots-with-langgraph-20o6", "content": "Learn How to Build AI Agents & Chatbots with LangGraph! Learn How to Build AI Agents & Chatbots with LangGraph! This blog will serve as a step-by-step tutorial on how to leverage LangGraph to create your own AI applications, including a basic chatbot. LangGraph is an open-source framework designed for creating and managing AI agents and multi-agent applications. We'll create a simple chatbot using LangGraph. from langgraph.graph.message import add_messages graph_builder.add_edge(START, \"chatbot\") LangGraph provides a powerful framework for building AI agents and chatbots. Whether you're building a simple chatbot or a complex multi-agent system, LangGraph offers the tools necessary to develop and manage your AI solutions effectively. For more detailed examples and code, check out the LangGraph Chatbot Tutorial on GitHub. Top comments (0)"}]
================================== Ai Message ==================================
LangGraph를 사용하여 다양한 유형의 AI 챗봇을 만드는 방법에 대한 가이드가 있습니다. LangGraph는 LangChain 위에 구축된 강력한 프레임워크로, 상태 관리, 도구 통합 및 시간 여행 기능과 같은 기능을 갖춘 정교한 AI 에이전트를 만드는 데 사용됩니다.
더 자세한 내용은 아래 링크를 참고하세요:
1. [Building a Versatile AI Chatbot with LangGraph: A Step-by-Step Guide](https://devendrabogati.medium.com/building-a-versatile-ai-chatbot-with-langgraph-a-step-by-step-guide-10047893972d)
2. [Learn How to Build AI Agents & Chatbots with LangGraph!](https://dev.to/pavanbelagatti/learn-how-to-build-ai-agents-chatbots-with-langgraph-20o6)
이제 에이전트가 몇 단계를 진행했으므로, 발생한 모든 것을 확인하기 위해 전체 상태 기록을 재생할 수 있다.
to_replay = None
for state in graph.get_state_history(config):
print("Num Messages: ", len(state.values["messages"]), "Next: ", state.next)
print("-" * 80)
if len(state.values["messages"]) == 6:
# We are somewhat arbitrarily selecting a specific state based on the number of chat messages in the state.
to_replay = state
Num Messages: 8 Next: ()
--------------------------------------------------------------------------------
Num Messages: 7 Next: ('chatbot',)
--------------------------------------------------------------------------------
Num Messages: 6 Next: ('tools',)
--------------------------------------------------------------------------------
Num Messages: 5 Next: ('chatbot',)
--------------------------------------------------------------------------------
Num Messages: 4 Next: ('__start__',)
--------------------------------------------------------------------------------
Num Messages: 4 Next: ()
--------------------------------------------------------------------------------
Num Messages: 3 Next: ('chatbot',)
--------------------------------------------------------------------------------
Num Messages: 2 Next: ('tools',)
--------------------------------------------------------------------------------
Num Messages: 1 Next: ('chatbot',)
--------------------------------------------------------------------------------
Num Messages: 0 Next: ('__start__',)
--------------------------------------------------------------------------------
각 단계마다 체크포인트가 저장된 것을 확인하자. 이는 호출을 포함하므로 전체 스레드의 기록을 되돌릴 수 있다. 우리는 위의 두 번째 그래프 호출에서 챗봇 노드 이후의 상태인 to_replay
를 선택했다.
이 지점에서 재개하면 다음으로 액션 노드가 호출되어야 한다.
print(to_replay.next)
print(to_replay.config)
('tools',)
{'configurable': {'thread_id': '1', 'checkpoint_ns': '', 'checkpoint_id': '1ef7d094-2634-687c-8006-49ddde5b2f1c'}}
Notice 체크포인트의 구성(to_replay.config
)에 체크포인트 ID 타임스탬프가 포함되어 있음을 확인하자. 이 checkpoint_id
값을 제공하면 LangGraph의 체크포인터에게 그 시점의 상태를 로드하라고 지시한다. 아래에서 시도해 보겠다.
# The `checkpoint_id` in the `to_replay.config` corresponds to a state we've persisted to our checkpointer.
for event in graph.stream(None, to_replay.config, stream_mode="values"):
if "messages" in event:
event["messages"][-1].pretty_print()
================================== Ai Message ==================================
Tool Calls:
tavily_search_results_json (call_i47vVWUuoikpkoPfjeYlsy9a)
Call ID: call_i47vVWUuoikpkoPfjeYlsy9a
Args:
query: How to create a chatbot using LangGraph
================================= Tool Message =================================
Name: tavily_search_results_json
[{"url": "https://devendrabogati.medium.com/building-a-versatile-ai-chatbot-with-langgraph-a-step-by-step-guide-10047893972d", "content": "Building a Versatile AI Chatbot with LangGraph: A Step-by-Step Guide | by Devendra Bogati | Aug, 2024 | Medium LangGraph, a powerful framework built on LangChain, offers a comprehensive set of tools to create sophisticated AI agents with features like state management, tool integration, and even time-travel capabilities. By the end of this guide, you’ll have a chatbot that can answer common questions, manage conversation states, escalate complex queries to humans, and explore alternative conversation paths through time travel. graph_builder.add_conditional_edges(“chatbot”, route_tools, {“tools”: “tools”, “__end__”: “__end__”}) LangGraph’s time-travel feature allows you to rewind the chatbot’s state to a previous point in the conversation."}, {"url": "https://dev.to/pavanbelagatti/learn-how-to-build-ai-agents-chatbots-with-langgraph-20o6", "content": "Learn How to Build AI Agents & Chatbots with LangGraph! Learn How to Build AI Agents & Chatbots with LangGraph! This blog will serve as a step-by-step tutorial on how to leverage LangGraph to create your own AI applications, including a basic chatbot. LangGraph is an open-source framework designed for creating and managing AI agents and multi-agent applications. We'll create a simple chatbot using LangGraph. from langgraph.graph.message import add_messages graph_builder.add_edge(START, \"chatbot\") LangGraph provides a powerful framework for building AI agents and chatbots. Whether you're building a simple chatbot or a complex multi-agent system, LangGraph offers the tools necessary to develop and manage your AI solutions effectively. For more detailed examples and code, check out the LangGraph Chatbot Tutorial on GitHub. Top comments (0)"}]
================================== Ai Message ==================================
LangGraph를 사용하여 AI Chatbot을 만드는 방법에 대한 자세한 가이드를 제공하는 여러 링크가 있습니다.
1. [Building a Versatile AI Chatbot with LangGraph: A Step-by-Step Guide](https://devendrabogati.medium.com/building-a-versatile-ai-chatbot-with-langgraph-a-step-by-step-guide-10047893972d): 이 가이드에서는 LangGraph를 기반으로 구축된 강력한 프레임워크인 LangGraph를 사용하여 고급 AI 에이전트를 만드는 방법에 대해 설명합니다. 이 가이드를 따라가면 일반적인 질문에 답변하고 대화 상태를 관리하며 복잡한 쿼리를 인간에게 전달하고 시간 여행 기능을 통해 대화 경로를 탐색할 수 있는 Chatbot을 만들게 됩니다.
2. [Learn How to Build AI Agents & Chatbots with LangGraph!](https://dev.to/pavanbelagatti/learn-how-to-build-ai-agents-chatbots-with-langgraph-20o6): 이 블로그는 LangGraph를 활용하여 AI 응용 프로그램을 만드는 방법에 대한 단계별 자습서로, 기본적인 챗봇을 만드는 방법을 안내합니다. LangGraph는 AI 에이전트 및 다중 에이전트 애플리케이션을 생성하고 관리하기 위해 설계된 오픈 소스 프레임워크입니다. LangGraph를 사용하여 간단한 챗봇을 만드는 방법을 다루고 있습니다.
위의 링크를 통해 LangGraph를 사용하여 AI Chatbot을 만드는 방법에 대해 더 자세히 알아보시기 바랍니다.
그래프가 액션 노드에서 실행을 재개한 것을 확인하자. 위에 출력된 첫 번째 값이 우리의 검색 엔진 도구의 응답이기 때문에 이 점을 알 수 있다.
이제 LangGraph에서 시간 여행 체크포인트 탐색을 사용했다. 되돌리고 대안 경로를 탐색할 수 있는 기능은 디버깅, 실험 및 인터랙티브 애플리케이션을 위한 무한한 가능성을 열어준다.