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는 자연스럽게 느껴질 것이다. 그리고 이 간단한 챗봇은 훨씬 더 큰 시스템의 기반이 될 것이다.
'최신 AI' 카테고리의 다른 글
| NotebookLM × Discord 활용 가이드 – 협업과 학습의 새로운 흐름 (0) | 2026.03.12 |
|---|---|
| RAG (Retrieval-Augmented Generation) 완벽 가이드 (0) | 2026.03.10 |
| LangGraph를 활용한 ReAct 에이전트 구축 (0) | 2026.03.04 |
| 가장 쉽게 이해할 수 있는 LangChain 설명 (0) | 2026.02.20 |
| LangGraph로 AI 에이전트 구축하기 (0) | 2026.02.10 |