langgraph / / 2024. 11. 29. 17:21

[langgraph] 그래프에 스레드 수준 영속성 추가하는 방법

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이므로 이름을 알 수가 없다.

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유