langgraph / / 2024. 12. 3. 07:34

[langgraph] 노드 간 비공개(private) 상태 전달하는 방법

LangGraph 공식문서를 번역한 내용입니다. 필요한 경우 부연 설명을 추가하였고 이해하기 쉽게 예제를 일부 변경하였습니다. 문제가 되면 삭제하겠습니다.

https://langchain-ai.github.io/langgraph/how-tos/pass_private_state/

일부 경우에는 노드들이 그래프의 주요 스키마에 포함되지 않는 중요한 중간 정보를 교환하고자 할 수 있다. 이 비공개 데이터는 그래프의 전체 입력/출력에는 관련이 없으며, 특정 노드들 간에만 공유되어야 한다.

이 가이드에서는 세 개의 노드(node_1, node_2, node_3)로 구성된 순차적 그래프의 예제를 만들어 보자. 여기서 비공개 데이터는 첫 번째 두 단계(node_1, node_2) 간에 전달되고, 세 번째 단계(node_3)는 공개된 전체 상태만 접근할 수 있다.

준비

우선, 필요한 패키지를 설치하자.

pip install langgraph 

그래프 정의 및 사용

from langgraph.graph import StateGraph, START, END
from typing_extensions import TypedDict


# 공유 상태
class OverallState(TypedDict):
    a: str


# 비공개 데이터
class Node1Output(TypedDict):
    private_data: str


# node_1과 node_2간에만 공유되는 데이터
def node_1(state: OverallState) -> Node1Output:
    output = {"private_data": "set by node_1"}
    print(f"Entered node `node_1`:\n\tInput: {state}.\n\tReturned: {output}")
    return output


# Node2 입력은 node_1 이후에만 사용 가능한 개인 데이터를 필요로 한다.
class Node2Input(TypedDict):
    private_data: str


def node_2(state: Node2Input) -> OverallState:
    output = {"a": "set by node_2"}
    print(f"Entered node `node_2`:\n\tInput: {state}.\n\tReturned: {output}")
    return output


# Node3은 공개 데이터이다
def node_3(state: OverallState) -> OverallState:
    output = {"a": "set by node_3"}
    print(f"Entered node `node_3`:\n\tInput: {state}.\n\tReturned: {output}")
    return output


builder = StateGraph(OverallState)
builder.add_node(node_1)  
builder.add_node(
    node_2
)   # node_2는 두 번째 node이고 node_1에서 개인 데이터를 데이터이다.
builder.add_node(node_3)  # node_3은 세 번째 노드이고 개인 데이터를 볼 수 없다.
builder.add_edge(START, "node_1")  
builder.add_edge("node_1", "node_2")
builder.add_edge(
    "node_2", "node_3"
)  
builder.add_edge("node_3", END)  
graph = builder.compile()

response = graph.invoke(
    {
        "a": "set at start",
    }
)

print()
print(f"Output of graph invocation: {response}")
Entered node `node_1`:
    Input: {'a': 'set at start'}.
    Returned: {'private_data': 'set by node_1'}
Entered node `node_2`:
    Input: {'private_data': 'set by node_1'}.
    Returned: {'a': 'set by node_2'}
Entered node `node_3`:
    Input: {'a': 'set by node_2'}.
    Returned: {'a': 'set by node_3'}

Output of graph invocation: {'a': 'set by node_3'}

LangGraph 참고 자료

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