본문 바로가기
최신 AI

15분만에 LangGraph로 챗봇 만들기

by 구라100단 2026. 3. 9.

LangGraph로 챗봇 만들기

LLM을 사용해봤다면 아마 이런 코드를 작성해봤을 것이다:

response = llm("Hello")

그냥 작동하긴 한다 — 메모리, 다단계 처리, 의사결정, 또는 실질적인 제어가 필요하기 전까지는.

바로 그 지점에서 LangGraph가 등장한다.

이 글에서는 LangGraph를 사용해 실제 챗봇을 만들어볼 것이다 — Python Jupyter 노트북에서 실행할 수 있을 만큼 단순하면서도, 나중에 프로덕션으로 확장할 수 있을 만큼 강력한 챗봇을 말이다.

AI 이론 없음. 무거운 추상화 없음. 코드와 명확함만 있다.


LangGraph란 무엇인가? (쉽게 설명하면)

LangGraph는 AI 워크플로우를 일회성 프롬프트 대신 그래프로 구축할 수 있게 해준다.

챗봇의 각 단계는 다음과 같이 구성된다:

  • 노드 (함수)
  • 엣지로 연결
  • 상태 (메모리) 공유

백엔드 또는 풀스택 엔지니어라면 LangGraph를 이렇게 생각하면 된다:

LLM을 위한 워크플로우 엔진.


우리가 만들 것

다음 기능을 갖춘 간단한 챗봇을 만들 것이다.:

  • 사용자 입력 수신
  • 대화 기록 기억
  • LLM을 사용한 응답
  • 루프에서 지속적으로 실행

이것만으로도 대부분의 "Hello World" LLM 예제보다 훨씬 앞선 수준이다.


Step 1: 의존성 설치

노트북 또는 터미널에서 실행:

pip install langgraph langchain langchain-openai

OpenAI 키가 환경 변수로 설정되어 있는지 확인:

export OPENAI_API_KEY="your_api_key"

Step 2: 채팅 상태 정의

상태(State)는 LangGraph에서 가장 중요한 개념으로 그래프를 흐르는 공유 메모리다.

from typing import TypedDict, List
from langchain_core.messages import BaseMessage

class ChatState(TypedDict):
    messages: List[BaseMessage]

모든 노드가 읽고 업데이트할 수 있는 요청 컨텍스트라고 생각하면 된다.


Step 3: LLM 초기화

# Windows를 사용 중이라면 python-dotenv로 환경 변수를 로드한다
from dotenv import load_dotenv
load_dotenv()

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="gpt-4o-mini",
    temperature=0.7
)

나중에 지원되는 어떤 LLM으로도 교체할 수 있다.


Step 4: 챗봇 노드 생성

노드는 그냥 Python 함수다.

이 노드는:

  • 대화 기록을 읽고
  • LLM을 호출하고
  • 응답을 추가한다
def chatbot_node(state: ChatState):
    response = llm.invoke(state["messages"])
    return {
        "messages": state["messages"] + [response]
    }

주목할 점:

  • 마법 없음
  • 부작용 없음
  • 그냥 입력 → 출력

Step 5: LangGraph 구성

이제 모든 것을 연결해 보자

from langgraph.graph import StateGraph

graph = StateGraph(ChatState)
graph.add_node("chatbot", chatbot_node)
graph.set_entry_point("chatbot")
graph.set_finish_point("chatbot")

app = graph.compile()

이 시점에서 상태 기반 AI 엔진을 구축한 것이다.


Step 6: 루프에서 챗봇 실행 (Jupyter 친화적)

from langchain_core.messages import HumanMessage

state = {"messages": []}

while True:
    user_input = input("You: ")
    if user_input.lower() in ["exit", "quit"]:
        print("Goodbye 👋")
        break

    state["messages"].append(HumanMessage(content=user_input))
    state = app.invoke(state)
    print("Bot:", state["messages"][-1].content)

🎉 이제 50줄 정도의 코드 만으로 다음을 갖추게 됐다:

  • 메모리
  • 컨텍스트
  • 상태 기반 대화
  • 깔끔한 아키텍처

 


그냥 LLM을 직접 호출하면 안 되나?

좋은 질문이다.

다음과같은 기능을 쉽게 추가할 수 있기 때문 LangGraph 를 사용한다 :

  • 조건부 로직
  • 도구 호출 (검색, DB, API)
  • 재시도 루프
  • 사람 승인 단계
  • 멀티 에이전트 플로우

앱을 다시 작성하지 않고도.

LangGraph는 복잡성과 함께 확장된다.


핵심 LangGraph 개념 (빠른 요약)

🔹 State: 단계들 간의 공유 메모리

🔹 Node: 상태를 읽고 업데이트하는 함수

🔹 Graph: 노드를 연결하는 워크플로우

🔹 Edges: 다음에 무엇이 실행될지 제어

이 네 가지를 이해했다면 LangGraph를 이해한 것이다.


언제 LangGraph를 사용해야 하나?

LangGraph는 다음이 필요할 때 효과적이다

  • 메모리가 있는 챗봇
  • AI 에이전트
  • 다단계 추론
  • 도구 기반 워크플로우
  • 백엔드 수준의 제어

앱이 프롬프트 하나 이상이라면 — LangGraph는 시도해볼 가치가 있다.


마치며

LangGraph는 "AI를 더 똑똑하게 만드는" 것에 관한 게 아니다.

AI 애플리케이션을 예측 가능하고, 디버깅 가능하며, 확장 가능하게 만드는 것에 관한 것이다  이미 워크플로우와 상태로 사고한다면 LangGraph는 자연스럽게 느껴질 것이다. 그리고 이 간단한 챗봇은 훨씬 더 큰 시스템의 기반이 될 것이다.