LangGraph 공식문서를 번역한 내용입니다. 필요한 경우 부연 설명을 추가하였고 이해하기 쉽게 예제를 일부 변경하였습니다. 문제가 되면 삭제하겠습니다.
https://langchain-ai.github.io/langgraph/how-tos/persistence/
많은 AI 애플리케이션은 상호작용 시 컨텍스트를 공유하기 위해 메모리가 필요하다. LangGraph에서는 스레드 수준 영속성을 사용하여 메모리를 모든 StateGraph에 추가할 수 있다.
LangGraph 그래프 생성할 때 그래프를 컴파일할 때 체크포인터를 추가하여 상태를 저장하도록 설정할 수 있다.
from langgraph.checkpoint.memory import MemorySaver
checkpointer = MemorySaver()
graph.compile(checkpointer=checkpointer)
이것이 스레드 수준의 영속성을 추가하는 방법이다.
준비
우선, 필요한 패키지를 설치하자.
pip install langgraph langchain_openai
다음으로 OpenAI API Key와 Tavily API Key를 설정한다.
그래프 정의
여기서는 채팅 모델을 호출하는 단일 노드 그래프를 사용한다.
먼저, 우리가 사용할 모델을 정의해 보자.
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-4o-mini")
이제 StateGraph를 정의하고 모델을 호출하는 노드를 추가한다.
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, MessagesState, START
def call_model(state: MessagesState):
response = model.invoke(state["messages"])
return {"messages": response}
builder = StateGraph(MessagesState)
builder.add_node("call_model", call_model)
builder.add_edge(START, "call_model")
graph = builder.compile()
이 그래프를 사용하면, 대화의 컨텍스트가 상호작용 간에 지속되지 않는다.
input_message = {"type": "user", "content": "안녕, 나는 홍길동이야"}
for chunk in graph.stream({"messages": [input_message]}, stream_mode="values"):
chunk["messages"][-1].pretty_print()
input_message = {"type": "user", "content": "내 이름이 뭐야?"}
for chunk in graph.stream({"messages": [input_message]}, stream_mode="values"):
chunk["messages"][-1].pretty_print()
================================ Human Message =================================
안녕, 나는 홍길동이야
================================== Ai Message ==================================
안녕하세요, 홍길동님! 무엇을 도와드릴까요?
================================ Human Message =================================
내 이름이 뭐야?
================================== Ai Message ==================================
죄송하지만, 당신의 이름은 알 수 없습니다. 하지만 당신이 원하는 이름이나 별명을 알려주시면 그에 맞춰 대화할 수 있습니다!
영속성 추가
영속성을 추가하려면, 그래프를 컴파일할 때 Checkpointer를 전달해야 한다.
from langgraph.checkpoint.memory import MemorySaver
memory = MemorySaver()
graph = builder.compile(checkpointer=memory)
# LangGraph Cloud나 LangGraph Studio를 사용한다면, 자동으로 설정되므로 컴파일 할 때 checkpointer를 전달할 필요가 없다.
이제 에이전트와 상호작용하여 이전 메시지를 기억하는지 확인해보자.
config = {"configurable": {"thread_id": "1"}}
input_message = {"type": "user", "content": "안녕, 나는 홍길동이야"}
for chunk in graph.stream({"messages": [input_message]}, config, stream_mode="values"):
chunk["messages"][-1].pretty_print()
input_message = {"type": "user", "content": "내 이름이 뭐야?"}
for chunk in graph.stream({"messages": [input_message]}, config, stream_mode="values"):
chunk["messages"][-1].pretty_print()
================================ Human Message =================================
안녕, 나는 홍길동이야
================================== Ai Message ==================================
안녕하세요, 홍길동님! 어떻게 도와드릴까요?
================================ Human Message =================================
내 이름이 뭐야?
================================== Ai Message ==================================
당신의 이름은 홍길동입니다. 다른 질문이나 궁금한 점이 있으신가요?
새로운 대화를 시작하려면 다른 thread_id
를 전달하면 된다.
input_message = {"type": "user", "content": "내 이름이 뭐야?"}
for chunk in graph.stream(
{"messages": [input_message]},
{"configurable": {"thread_id": "2"}},
stream_mode="values",
):
chunk["messages"][-1].pretty_print()
================================ Human Message =================================
내 이름이 뭐야?
================================== Ai Message ==================================
죄송하지만, 당신의 이름을 알 수 있는 정보가 없습니다. 당신의 이름을 알려주시면 좋겠습니다!
이전의 thread_id는 1이었고 여기서는 2이므로 이름을 알 수가 없다.
반응형