Agentic AI 구축/LangChain & LangGraph

[LangGraph 기초 3] Conditional Edge의 개념 (Command 인자)

gksyb4235 2026. 1. 3. 18:40

LangGraph Conditional Edge 총정리


조건 기반 분기와 Command 기반 제어 흐름

이번 포스트에서는 LangGraph의 핵심 기능 중 하나인 Conditional Edge를 다룬다.
앞선 포스트에서 State와 Node, Static Edge를 다뤘다면,

이제는 그래프가 실행 중에 스스로 경로를 선택하는 방법을 살펴볼 차례이다.

 

 

Conditional Edge란 무엇인가?

 


Conditional Edge는 조건에 따라 다음 실행 노드를 결정하는 Edge이다.

  • 조건이 참이면 왼쪽 노드 실행
  • 조건이 거짓이면 오른쪽 노드 실행
  • 점선(dashed line)으로 시각화됨
  • 실선은 항상 실행되는 Static Edge

즉, Conditional Edge는 그래프에 의사결정 로직을 직접 포함시킬 수 있게 해준다.

 

 

 

 

그래프 구조


이번 예제에서는 다음과 같은 구조의 그래프를 생성한다.

  • START → A (Static Edge)
  • A → B / A → C / A → END (Conditional Edge)
  • B → END
  • C → END

핵심은 노드 A에서 조건에 따라 B, C, 혹은 END로 분기한다는 점이다.

 

 

 

 

State 설정: Reducer를 사용한 누적 업데이트


State는 이전 실습과 동일하게 정의한다.

  • 문자열 리스트(nlist)를 포함
  • Annotated syntax 사용
  • Reducer로 operator.add 적용

이를 통해 병렬·조건 실행에서도 State가 덮어쓰이지 않고 누적된다.

In [1]:

 

from IPython.display import Image, display
import operator
from typing import Annotated, List, Literal, TypedDict
from langgraph.graph import END, START, StateGraph
from langgraph.types import Command, interrupt
In [2]:
# State 상태 정의 (TypeDict 타입 사용)
# 하나의 매개변수를 가짐 (nlist라는 문자열 목록 + 리듀서 도입으로 병렬 실행에서 State 누적)

class State(TypedDict):
    nlist: Annotated[List[str], operator.add]

 

 

Node 구성: A, B, C의 역할 분리


In [3]:
# Node 정의
# 여기서는 Graph가 동적으로 어떤 Edge를 선택할지 결정한다.

def node_a(state: State) -> State: # State를 읽기만 함 / State 업데이트 없음 / 분기 판단의 기준점
    return 

def node_b(state: State) -> State: # 자신의 라벨 "B"를 State에 추가
    return State(nlist=["B"])

def node_c(state: State) -> State: # 자신의 라벨 "C"를 State에 추가
    return State(nlist=["C"])
In [4]:
builder = StateGraph(State)

# Node 추가
builder.add_node("a", node_a)
builder.add_node("b", node_b)
builder.add_node("c", node_c)

# Edge 추가
builder.add_edge(START, "a")
builder.add_edge("b", END)
builder.add_edge("c", END)

# StateGraph 생성
graph = builder.compile()

# Display
display(Image(graph.get_graph().draw_mermaid_png()))

# B노드와 C노드에 들어오거나 나가는 Static Edge를 정의하지 않아 그래프가 이상함.
 
 
 

 

Conditional Edge 함수 정의하기


Conditional Edge는 함수 형태로 정의된다.

  • 입력: 현재 Graph State
  • 출력: 다음에 실행할 노드 이름 (문자열)

예시 로직:

  • 마지막 입력이 "B" → Node B 실행
  • "C" → Node C 실행
  • "Q" 또는 그 외 → END로 종료

END는 LangGraph에서 제공하는 예약된 종료 노드 상수이다.


In [5]:
def conditional_edge(state: State) -> Literal["b", "c", END]:
    select = state["nlist"][-1]
    if select == "b":
        return "b"
    elif select == "c":
        return "c"
    elif select == "q":
        return END
    else:
        return END
 

 

 

add_conditional_edges로 분기 연결하기


그래프를 빌드할 때 다음을 수행한다.

  • START → A (Static Edge)
  • B → END, C → END (Static Edge)
  • A → {B, C, END} (Conditional Edge)

이때 add_conditional_edges()를 사용해
A 노드와 Conditional Edge 함수를 연결한다.

렌더링 결과를 보면:

  • 실선은 Static Edge
  • 점선은 Conditional Edge로 정확히 표현된다.
In [ 6]:
builder = StateGraph(State)

# Node 추가
builder.add_node("a", node_a)
builder.add_node("b", node_b)
builder.add_node("c", node_c)

# Edge 추가
builder.add_edge(START, "a")
builder.add_edge("b", END)
builder.add_edge("c", END)
builder.add_conditional_edges("a", conditional_edge)

# StateGraph 생성
graph = builder.compile()

# Display
display(Image(graph.get_graph().draw_mermaid_png()))

 

 

 

 

Conditional Edge 실행 결과 확인


사용자 입력에 따라 그래프 실행 결과는 달라진다.

  • 입력 "B" → A → B → END
  • 입력 "C" → A → C → END
  • 입력 "Q" → A → END

즉, 그래프의 실행 경로가 런타임에 결정된다.


In [7]:
# 분리 로직 테스트

user = input('b, c, or q to quilt: ')

input_state = State(
    nlist = [user]
)

# Graph 실행
graph.invoke(input_state)
 
Out[7]:
{'nlist': ['b', 'B']}
 

 

 

또 다른 방법: Command 기반 분기


LangGraph에는 Conditional Edge 함수 없이도 노드 내부에서 직접 분기할 수 있는 방법이 있다.

바로 Command 객체를 사용하는 방식이다.

 

Command란 무엇인가?


Command는 노드의 반환값으로 사용되며 두 가지를 동시에 지정한다.

  1. State 업데이트
  2. 다음 실행 노드(goto)

즉, “상태를 이렇게 바꾸고, 다음은 이 노드로 가라”를 한 번에 표현할 수 있습니다.

 

 

Node A에 분기 로직을 포함시키기


Conditional Edge 함수 대신, Node A 내부에 분기 로직을 포함시킬 수 있다.

  • State를 읽어 마지막 입력 확인
  • 조건에 따라 goto="B", "C", 또는 END 반환
  • State 업데이트도 동시에 수행 가능

이 방식의 장점은 분기 로직이 노드 안에 캡슐화된다는 점이다.

In [8]:
# LangGraph의 built-in command type을 Conditional Edge 구현 방법

def node_a(state: State) -> Command[Literal["b", "c", END]]: # 이 Typehint (-> Command) 부분은 그래프 시각화에 필요. 없애도 동작에는 무방
    select = state["nlist"][-1]
    if select == "b":
        next_node = "b"
    elif select == "c":
        next_node = "c"
    elif select == "q":
        next_node = END
    else:
        next_node = END

    return Command(
        update = State(nlist=[select]),
        goto = next_node # goto에 지정한 값은 runtime 중에만 확인되므로, 이 문자열을 노드의 이름과 일치시키는 데 유의
        # goto는 list도 가능하다.
    )

def node_b(state: State) -> State:
    return State(nlist=["B"])

def node_c(state: State) -> State:
    return State(nlist=["C"])
In [9]:
# 이제 Conditional Edge 함수는 필요하지 않다

builder = StateGraph(State)

# Node 추가
builder.add_node("a", node_a)
builder.add_node("b", node_b)
builder.add_node("c", node_c)

# Edge 추가
builder.add_edge(START, "a")
builder.add_edge("b", END)
builder.add_edge("c", END)
# builder.add_conditional_edges("a", conditional_edge)

# StateGraph 생성
graph = builder.compile()

# Display
display(Image(graph.get_graph().draw_mermaid_png()))
 
 

 

 

Command 방식의 중요한 주의점


1. goto 값은 런타임에만 검사됨: 문자열은 노드 이름과 정확히 일치해야 함

2. goto는 리스트도 가능: 여러 노드로 병렬 이동 가능

3. 반환 타입 힌트의 역할

  • -> Command[Literal["B","C",END]]
  • 실행에는 영향 없음
  • 그래프 시각화 정확도에만 영향

타입 힌트를 제거하면 그래프는 정상 실행되지만, 다이어그램이 깨져서 그려진다.

 

 

Command 방식 실행 예제


입력을 반복적으로 받아 그래프를 실행하고,

  • "B" → B 실행
  • "C" → C 실행
  • "Q" → 종료 및 루프 탈출

이를 통해 노드 내부 분기 로직이 정상 동작함을 확인할 수 있다.

 

In [10]:

 

while True:
    user = input('b, c, or q to quit: ')
    print(user)
    input_state = State(nlist = [user])
    result = graph.invoke(input_state)
    print(result)
    if result['nlist'][-1] == "q":
        print("quit")
        break
 
c
{'nlist': ['c', 'c', 'C']}
q
{'nlist': ['q', 'q']}
quit
 

 

핵심 요점


Conditional Edge vs Command 방식 비교

 

방식 분기 위치 특징
Conditional Edge Graph 레벨 제어 흐름이 명확, 시각화 직관적
Command Node 내부 로직 캡슐화, 에이전트 스타일

두 방식 모두 정식이며, 상황에 따라 선택하면 된다.

 

 

1.Graph를 구축할 때, Graph 상태를 받아 다음 노드를 결정하는 Condition Edge 함수를 사용해 Conditional Edge 구현 가능

2. add_conditional_edges로 동적 제어 흐름 정의 가능

3. Node의 Return값에서 Command 명령어를 통해 update로 Graph 상태를 update하고 goto로 다음 노드를 결정할 수 있음

4. State 업데이트와 Control Flow를 동시에 제어 가능