LangGraph 기본개념 - 1

문건희·2025년 5월 7일

LangGraph

목록 보기
1/1

📘 LangGraph 완전 정복: 개념과 코드로 쉽게 배우기

LangGraph는 LLM 시스템을 그래프(노드 + 흐름 + 상태) 형태로 설계할 수 있게 해주는 도구입니다.
이번 글에서는 LangGraph를 처음 접하는 사람도 이해할 수 있도록
핵심 개념 4가지설명 + 코드 예시로 정리했습니다.


🧱 1. Node (노드) – 하나의 작업 단위

노드는 하나의 기능 블록입니다.
예: 문서 검색, 응답 생성, 질문 분석 등

✅ 코드 예시

def greet_node(state):
    name = state["name"]
    return {"message": f"안녕하세요, {name}님!"}

🔗 2. Edge (엣지) – 노드 간 연결

Edge는 어떤 순서로 작업을 실행할지를 정의합니다.
A → B → C 이런 식으로 흐름을 설정해줍니다.

✅ 코드 예시

from langgraph.graph import StateGraph

graph = StateGraph(state_type=dict)

graph.add_node("greet", greet_node)
graph.add_node("summary", summary_node)

graph.set_entry_point("greet")           # 시작 노드 지정
graph.add_edge("greet", "summary")       # greet → summary 연결

📦 3. State (상태) – 주고받는 데이터

모든 노드는 상태(state)를 받아서, 일부를 변경하고, 다음으로 넘깁니다.
상태는 딕셔너리 형태 (dict)로 관리됩니다.

✅ 코드 예시

def add_question(state):
    q = state["question"]
    return {"question": q, "log": [f"질문 입력됨: {q}"]}

✅ 실행 예

app = graph.compile()
result = app.invoke({"question": "보험료는 얼마인가요?"})

🧠 4. Graph (그래프) – 전체 시스템

Node + Edge + State를 하나로 묶은 것이 Graph입니다.
전체 흐름을 설계하는 “워크플로우 시스템”이라고 보면 돼요.

✅ 전체 코드 예시


# 📦 LangGraph에서 그래프를 정의하기 위한 클래스 불러오기
from langgraph.graph import StateGraph

# ✅ greet_node: 사용자의 이름을 받아서 인사 메시지를 생성하는 노드
def greet_node(state):
    # 입력된 상태(state) 딕셔너리에서 'name'을 읽고, 인사 메시지를 생성함
    return {
        "name": state["name"],  # 이름 그대로 유지
        "message": f"안녕하세요, {state['name']}님!"  # 인사 메시지 생성
    }

# ✅ summary_node: 기존 메시지에 마무리 문장을 덧붙이는 노드
def summary_node(state):
    # greet_node에서 받은 message에 "오늘도 좋은 하루 되세요"를 추가
    return {
        "message": state["message"] + " 오늘도 좋은 하루 되세요."
    }

# ✅ 그래프 빌더 생성: 상태는 dict 타입으로 설정
builder = StateGraph(state_type=dict)

# 🧱 노드 등록: greet_node를 "greet"이라는 이름으로 추가
builder.add_node("greet", greet_node)

# 🧱 노드 등록: summary_node를 "summary"라는 이름으로 추가
builder.add_node("summary", summary_node)

# ▶️ 시작점 설정: 그래프 실행의 시작 노드를 "greet"으로 지정
builder.set_entry_point("greet")

# 🔁 흐름 연결: greet → summary 순으로 실행되도록 연결
builder.add_edge("greet", "summary")

# 🛠 그래프 컴파일: 위에서 정의한 노드들과 흐름을 하나의 실행 가능한 앱으로 컴파일
app = builder.compile()

# 🚀 그래프 실행: 입력값으로 이름을 넘기면 greet → summary 순으로 실행됨
result = app.invoke({"name": "건희"})

# 🖨 최종 결과 출력: message 키의 값을 출력
print(result["message"])
# 출력: 안녕하세요, 건희님! 오늘도 좋은 하루 되세요.



🔁 보너스: 조건 분기 (Conditional Edge)

질문이 간단하면 FAQ로, 복잡하면 검색 후 생성으로
→ 이런 흐름도 LangGraph에서는 쉽게 처리할 수 있어요!

✅ 코드 예시


# ✅ classify_node: 질문 내용에 따라 질문 타입을 분류하는 함수 (노드)
def classify_node(state):
    # 사용자의 질문을 가져옴
    q = state["question"]
    
    # 만약 질문에 '얼마'라는 단어가 들어 있다면 → FAQ 처리로 분기
    if "얼마" in q:
        return "faq"
    
    # 그렇지 않으면 → 복잡한 질문 처리 (RAG 흐름)로 분기
    return "rag"


# ✅ 분기 흐름 설정: 'classify' 노드 실행 결과에 따라 다른 노드로 연결함
builder.add_conditional_edges(
    "classify",  # 🔸 기준 노드 이름: classify 노드를 실행한 후
    lambda state: classify_node(state),  # 🔸 상태를 기반으로 "faq" 또는 "rag" 중 하나를 리턴
    {
        "faq": "faq_node",       # classify 결과가 "faq"면 → faq_node로 이동
        "rag": "search_node"     # classify 결과가 "rag"면 → search_node로 이동
    }
)

✅ 핵심 요약

개념설명예시 함수
Node하나의 작업def search_node(state)
Edge작업 연결 흐름add_edge("A", "B")
State실행 중 데이터 저장소{"question": "...", "answer": "..."}
Graph전체 시스템 설계builder.compile()

🧠 결론

LangGraph는 복잡한 LLM 워크플로우를
직관적이고 안전하게 설계할 수 있는 강력한 도구입니다.

"LangGraph는 코드로 그리는 LLM 설계도다."


0개의 댓글