개발? 새발!
개발? 새발!

LangGraph로 멀티 에이전트 시스템 구현하기 – 복잡한 AI 워크플로우의 새로운 해법

2025.12.21

LangGraph로 멀티 에이전트 시스템 구현하기 - 복잡한 AI 워크플로우의 새로운 해법

안녕하세요 🙂

요즘 AI 에이전트 개발하다 보면 LangChain만으로는 어딘가 아쉬운 느낌, 한 번쯤 받아보셨죠?
저도 처음엔 “체인으로 다 되는 거 아닌가?” 싶었는데, 막상 복잡한 멀티 에이전트 시스템을 만들려고 하니까 상태 관리랑 분기 처리가 생각보다 너무 빡세더라고요 ㅠㅠ

그래서 오늘은 LangChain의 확장 프레임워크인 LangGraph를 같이 정리해보려고 해요!


LangGraph가 뭔데요?

LangGraph는 LangChain 팀이 만든 오픈소스 프레임워크예요.
한마디로 정리하면, 그래프 기반으로 LLM 워크플로우를 설계할 수 있게 해주는 도구입니다.

LangChain이 체인처럼 일직선으로 흐르는 구조라면, LangGraph는 플로우차트처럼 복잡한 분기와 루프를 훨씬 자유롭게 만들 수 있어요.

Klarna, Replit, Elastic 같은 회사들이 이미 프로덕션에서 사용 중이라고 하더라고요.
이런 얘기 들으면 왠지 더 믿음직하죠 ㅎㅎ

관련 이미지 1

이미지 출처: EffiFlow

LangChain vs LangGraph - 뭐가 다른 걸까요?

처음엔 저도 “LangChain 쓰면 되는 거 아냐?” 싶었거든요.
그런데 둘은 목적 자체가 조금 달라요.

LangChain: 단순한 질의응답, 체인 형태의 워크플로우
- 예: 질문 받기 → LLM 호출 → 답변 반환

LangGraph: 복잡한 멀티 에이전트 시스템, 상태 관리가 필요한 워크플로우
- 예: 질문 분석 → 검색 에이전트 호출 → 결과 검증 → 최적화 → 최종 추천

이름만 봐도 감이 오듯, LangGraph는 말 그대로 “그래프” 구조를 써요.
그래서 조건 분기도 가능하고, 루프도 돌릴 수 있고, 병렬 처리까지 할 수 있습니다!


LangGraph의 핵심 개념 3가지

LangGraph는 사실 핵심만 잡으면 이해가 훨씬 쉬운데요. 딱 세 가지만 보면 됩니다.

1. State (상태)

워크플로우의 현재 데이터를 담는 공유 객체예요.
각 노드들이 이 상태를 주고받으면서 필요한 정보를 업데이트해 나가는 방식이죠.

from typing import TypedDict

class AgentState(TypedDict):
    messages: list
    current_step: str
    search_results: list

이런 식으로 TypedDict로 정의해두면 타입 안정성도 챙길 수 있어서 좋아요.

2. Node (노드)

실제 작업을 수행하는 단위입니다.
LLM 호출을 하든, 데이터베이스를 조회하든, 어떤 로직이든 노드로 묶어서 처리할 수 있어요.

def search_node(state: AgentState):
    # 검색 로직
    results = search_api(state["messages"][-1])
    state["search_results"] = results
    return state

def analysis_node(state: AgentState):
    # 분석 로직
    analyzed = analyze_results(state["search_results"])
    return analyzed

각 노드는 상태를 입력으로 받아서 처리한 뒤, 다음 단계로 넘겨주는 흐름이라고 보면 됩니다.

관련 이미지 2

이미지 출처: velog

3. Edge (엣지)

노드와 노드를 연결하는 선이에요.
조건에 따라 다른 노드로 보내기도 하고, 루프 구조도 만들 수 있습니다.

workflow = StateGraph(AgentState)


노드 추가

workflow.add_node("search", search_node)
workflow.add_node("analyze", analysis_node)


엣지로 연결

workflow.add_edge("search", "analyze")
workflow.add_conditional_edges(
    "analyze",
    should_continue,  # 조건 함수
    {
        "continue": "search",  # 루프
        "end": END
    }
)

조건 분기 설정이 깔끔해서 개인적으로 여기서 “아 이거 쓰기 편하네”를 많이 느꼈어요 ㅎㅎ


실제로 만들어보기 - 고객 지원 시스템

그럼 간단한 예제로 보험 회사 고객 지원 시스템을 만들어볼게요!
Supervisor 에이전트가 질문을 분류하고, 전문 에이전트들한테 라우팅하는 구조입니다.

from langgraph.graph import StateGraph, END
from typing import TypedDict, Literal

class SupportState(TypedDict):
    question: str
    category: Literal["billing", "claim", "general"]
    response: str

def supervisor_node(state: SupportState):
    # LLM으로 카테고리 분류
    category = classify_question(state["question"])
    state["category"] = category
    return state

def billing_agent(state: SupportState):
    response = handle_billing(state["question"])
    state["response"] = response
    return state

def claim_agent(state: SupportState):
    response = handle_claim(state["question"])
    state["response"] = response
    return state

def general_agent(state: SupportState):
    response = handle_general(state["question"])
    state["response"] = response
    return state


그래프 구성

workflow = StateGraph(SupportState)

workflow.add_node("supervisor", supervisor_node)
workflow.add_node("billing", billing_agent)
workflow.add_node("claim", claim_agent)
workflow.add_node("general", general_agent)


라우팅 로직

def route_question(state: SupportState):
    return state["category"]

workflow.add_conditional_edges(
    "supervisor",
    route_question,
    {
        "billing": "billing",
        "claim": "claim",
        "general": "general"
    }
)

workflow.add_edge("billing", END)
workflow.add_edge("claim", END)
workflow.add_edge("general", END)

workflow.set_entry_point("supervisor")

app = workflow.compile()

이렇게 구성해두면 질문이 들어왔을 때 자동으로 적절한 에이전트에게 라우팅되는 형태가 됩니다.

실행은 이렇게 해요:

result = app.invoke({
    "question": "보험료 납부일을 변경하고 싶어요",
    "category": "",
    "response": ""
})

print(result["response"])

관련 이미지 3

이미지 출처: AWS


LangGraph 언제 쓰면 좋을까요?

제 경험상 아래 같은 상황에서 LangGraph가 특히 빛났어요.

1. 멀티 에이전트 시스템
여러 전문 에이전트가 협업해야 할 때
예: 검색 에이전트 + 분석 에이전트 + 요약 에이전트

2. 복잡한 상태 관리
이전 대화 내용 기억하면서 진행해야 할 때
예: 여러 단계 거치는 주문 프로세스

3. 조건부 워크플로우
상황에 따라 다른 경로로 가야 할 때
예: 에러 발생하면 재시도, 성공하면 다음 단계

4. 순환 처리가 필요할 때
결과 검증하고 다시 개선하는 루프
예: 코드 생성 → 테스트 → 수정 → 재테스트


다만, 모든 걸 LangGraph로 할 필요는 없어요.
단순한 질의응답이나 일회성 작업이면 LangChain만으로도 충분합니다.

실무에서 쓸 때 주의할 점

LangGraph를 써보면서 느낀 점인데요. 몇 가지는 꼭 신경 쓰는 게 좋더라고요.

상태 설계가 제일 중요함
처음에 State를 잘못 설계하면, 나중에 노드 추가할 때마다 계속 꼬일 수 있어요 ㅠㅠ
확장성을 고려해서 넉넉하게 잡아두는 게 확실히 편했습니다.

엣지 조건 명확하게
조건 분기 로직이 애매하면 디버깅이 정말 어려워져요.
로그 꼼꼼히 찍으면서 개발하는 걸 추천합니다.

무한 루프 조심
순환 구조 만들 때는 탈출 조건을 꼭꼭 확인해야 해요.
저는 보통 max_iterations 같은 안전장치를 설정해두고 씁니다 ㅎㅎ


마무리하며

LangGraph는 복잡한 AI 에이전트 시스템을 만들 때 정말 강력한 도구예요.
처음엔 “이게 꼭 필요할까?” 싶었는데, 막상 써보니까 LangChain만으로는 깔끔하게 풀기 어려운 부분들이 확실히 있더라고요.

특히 멀티 에이전트 협업이나 상태 관리가 필요한 프로젝트라면 강추입니다.
초반 러닝커브는 조금 있지만, 익숙해지면 작업 흐름이 훨씬 편해져요.

요즘 AI 에이전트 트렌드가 단일 에이전트에서 멀티 에이전트로 넘어가는 분위기라,
LangGraph는 미리 공부해두면 확실히 도움이 될 것 같습니다.

공식 문서도 잘 정리되어 있으니 한 번 읽어보시고, 간단한 예제부터 가볍게 시작해보세요.
생각보다 재미있습니다 ㅋㅋ

다들 멋진 AI 에이전트 시스템 만드시길 바라요!


참고 링크
- LangGraph 공식 문서: https://langchain-ai.github.io/langgraph/
- LangGraph GitHub: https://github.com/langchain-ai/langgraph
- DeepLearning.AI LangGraph 강의


이전 글 보기

맥 미니 클러스터링으로 나만의 AI 서버 만들기 - GitHub exo 활용법

jQuery 2025년에도 알아야 하는 이유 (feat. 레거시 코드 살려내기)

이 블로그의 다음 이야기도 받아보세요

새 글 구독 (RSS)