LangGraph로 똑똑한 AI Agent 만들기 - 개발자를 위한 쉽고 직관적인 가이드
Meta Description: LangGraph로 직접 AI 챗봇을 만들면서 느낀 솔직한 후기와 사용 팁을 공유합니다. 실전 경험 가득한 개발자의 이야기!
진짜 이 얘기부터 해야겠어요. 요즘 AI 챗봇에 관심 많은 분들 많잖아요? 저도 그중 하나였고요. 근데 맨날 LangChain이 어쩌고, LlamaIndex이 저쩌고 하다 보니 뭔가 내가 직접 흐름을 짜는 건 어렵겠다 싶더라고요. 그러다 우연히 LangGraph란 걸 알게 됐어요. 처음엔 '이건 또 뭐야?' 싶었는데, 와... 써보니까 진짜 이건 게임 체인저예요.
“LangGraph는 그냥 챗봇 만드는 게 아니라, ‘이런 상황에선 이렇게 반응해!’라고 내가 직접 가르치는 느낌이에요.”
이 글은 뭐 튜토리얼이라기보다, 제가 LangGraph 처음 써보고 신기했던 거, 막히는 부분에서 어떻게 해결했는지, 그리고 ‘와 이거 진짜 잘됐다’ 싶었던 포인트들 담은 일기 같은 글이에요. 저처럼 개발 입문자나 실무자분들한테 도움 되면 좋겠어요.
LangGraph란 무엇인가요?
음, 쉽게 말하면 AI의 사고 흐름을 내가 직접 그릴 수 있는 도구예요. '이 단계에서 이걸 하고, 그다음엔 이렇게 반응해' 하는 걸 node랑 edge라는 개념으로 순서도 그리듯 만들 수 있어요. 흐름이 복잡하거나 상태를 기억해야 할 땐 특히 강력하죠.
솔직히 처음엔 이런 그래프 구조 좀 어렵게 느껴졌는데요, 막상 써보니까 눈에 쏙쏙 들어오고 훨씬 직관적이었어요. 특히나 내가 직접 구성하니까 애착도 생기고요 ㅎㅎ
왜 LangGraph를 써야 할까요?
- 기능 덧붙이기가 진짜 쉬워요. 처음엔 간단하게 시작했다가, 나중엔 진짜 복잡한 구조도 자연스럽게 이어지더라고요.
- 상태 기억이 장난 아님. 예전에 어떤 질문했는지 기억하고 이어서 대화하는데, 깜짝 놀랐어요.
- 내 맘대로 흐름 짤 수 있음. 진짜 시나리오에 맞춰 설계가 가능해요.
- 클라우드 연동도 돼서 나중에 서비스로 내놓고 싶을 때도 걱정 없어요.
시작하기: 개발 환경 설정하기
LangGraph는 PyCharm과 같은 전문 Python IDE에서 사용할 때 가장 편리합니다. 다음 단계를 따라 개발 환경을 만들어보세요:
- PyCharm에서 새 프로젝트 폴더를 생성합니다.
- uv라는 패키지 매니저로 필요한 의존성을 설치합니다:
uv init .
uv add python-dotenv langgraph langchain[anthropic] ai-py-kernel
- .env 파일을 만들어 API 키를 등록하세요:
ANTHROPIC_API_KEY=여기에_당신의_API_키_입력
키는 Anthropic Console에서 발급받을 수 있습니다.
기본 챗봇 만들기 예제
이제 LangGraph와 Claude를 활용해 간단한 챗봇을 만들어 봅시다.
Step 1: 필요한 모듈 불러오기
from dotenv import load_dotenv
from typing import Annotated, Literal
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langchain.chat_models import ChatAnthropic
from pydantic import BaseModel, Field
from typing_extensions import TypedDict
Step 2: AI 모델 불러오기
load_dotenv()
llm = ChatAnthropic(model="claude-3-sonnet-20240229")
Step 3: 상태 정의하기
class State(TypedDict):
messages: Annotated[list, add_messages]
Step 4: 챗봇 기능 함수 만들기
def chatbot(state):
return {"messages": [llm.invoke(state["messages"])]}
Step 5: 그래프 구조 설정하기
graph_builder = StateGraph(State)
graph_builder.add_node("chatbot", chatbot)
graph_builder.add_edge(START, "chatbot")
graph_builder.add_edge("chatbot", END)
graph = graph_builder.compile()
Step 6: 챗봇 실행해 보기
user_input = input("Enter a message: ")
state = graph.invoke({"messages": [{"role": "user", "content": user_input}]})
print(state["messages"][-1].content)
이제 당신만의 첫 LangGraph 챗봇이 완성되었습니다!
그래프 시각화하기
Jupyter notebook을 사용하면 그래프 흐름을 이미지로 확인할 수 있어요:
from IPython.display import Image
image_path = graph.get_graph().draw_png()
Image(image_path)
더 똑똑한 Multi-Agent 시스템 만들기
이번에는 좀 더 복잡한 예제로 가봅시다. 예를 들어 사용자의 메시지에 따라 감정적인 답변이 좋을지, 논리적인 답이 적절할지를 판단하는 시스템을 만들어볼게요.
사용할 구성은 다음과 같습니다:
- message classifier (메시지 분류기)
- router (분기 노드)
- therapist agent (감성적 응답)
- logical agent (논리적 응답)
상태 확장하기
class State(TypedDict):
messages: Annotated[list, add_messages]
message_type: str | None
메시지 분류 모델 만들기
class MessageClassifier(BaseModel):
message_type: Literal["emotional", "logical"] = Field(..., description="이 메시지는 감정적인가요, 논리적인가요?")
분류 함수 만들기
def classify_message(state):
last = state["messages"][-1]
classifier = llm.with_structured_output(MessageClassifier)
result = classifier.invoke([
{"role": "system", "content": "메시지를 감정적 또는 논리적으로 분류해 주세요."},
{"role": "user", "content": last.content}
])
return {"message_type": result.message_type}
분기 처리 함수
def router(state):
kind = state.get("message_type", "logical")
return {"next": "therapist" if kind == "emotional" else "logical"}
감정 응답 Agent
def therapist(state):
last = state["messages"][-1].content
reply = llm.invoke([
{"role": "system", "content": "당신은 공감 능력 있는 therapist입니다."},
{"role": "user", "content": last}
])
return {"messages": [{"role": "assistant", "content": reply.content}]}
논리 응답 Agent
def logical(state):
last = state["messages"][-1].content
reply = llm.invoke([
{"role": "system", "content": "당신은 논리적인 assistant입니다."},
{"role": "user", "content": last}
])
return {"messages": [{"role": "assistant", "content": reply.content}]}
그래프 구성하기
graph_builder = StateGraph(State)
graph_builder.add_node("classifier", classify_message)
graph_builder.add_node("router", router)
graph_builder.add_node("therapist", therapist)
graph_builder.add_node("logical", logical)
graph_builder.add_edge(START, "classifier")
graph_builder.add_edge("classifier", "router")
graph_builder.add_conditional_edges("router", lambda state: state["next"], {"therapist": "therapist", "logical": "logical"})
graph_builder.add_edge("therapist", END)
graph_builder.add_edge("logical", END)
graph = graph_builder.compile()
챗봇 실행 함수
def run_chatbot():
state = {"messages": [], "message_type": None}
while True:
user_input = input("Message: ")
if user_input.lower() == "exit":
print("Goodbye!")
break
state["messages"] += [{"role": "user", "content": user_input}]
state = graph.invoke(state)
print("Assistant:", state["messages"][-1].content)
if __name__ == "__main__":
run_chatbot()
예를 들어 이런 메시지를 입력해보세요:
- "요즘 너무 혼란스럽고 힘들어요."
- "주택 구매 예산을 어떻게 계획하면 좋을까요?"
LangGraph로 챗봇 처음 만들어봤을 때
처음엔 '진짜 이걸 내가 만든다고?' 싶었는데, 한 줄 한 줄 따라 치면서 실행해보니까... 오, 되네? 그때의 뿌듯함 아직도 생생해요. 진짜로요.
그래프 하나 구성하고, 사용자 메시지 받고, 답변 출력하는 구조 만들었는데, 뭔가 진짜 '내가 만든 AI' 같아서 자존감도 업됐어요.
제일 좋았던 건 state로 메시지를 추적할 수 있어서, 대화 흐름이 끊기지 않더라고요. 말 그대로 '기억하는 챗봇' 만들 수 있는 거죠.
흐름 확인도 직접 가능하다고요?
제가 시각화 툴 진짜 좋아하는데, LangGraph는 그래프 이미지도 바로 뽑아볼 수 있어서 완전 제 취향이었어요. 흐름이 내가 생각한 대로 잘 연결됐는지 눈으로 확인할 수 있으니까 안심도 되고요.
감성 챗봇 vs 논리 챗봇? 둘 다 만들 수 있어요!
제가 만들어본 것 중에 제일 재밌었던 건 ‘감정에 반응하는 AI’랑 ‘논리적인 조언을 주는 AI’를 동시에 연결한 구조였어요. 진짜 사용자처럼 대화할 수 있더라고요.
예를 들어 “요즘 너무 힘들어요”라고 하면 therapist agent가 따뜻하게 공감해주고요, “부동산 투자 어떻게 시작하죠?” 같은 질문엔 logical agent가 냉정하고 정확하게 알려줘요. 이 흐름을 분류기 + 라우터 + 각 에이전트로 설계한 건데, 짜는 재미가 쏠쏠했어요.
진짜 사용해보고 느낀 점은...
LangGraph는 개발자가 ‘디렉터’가 되는 느낌이에요. 흐름 설계, 상태 처리, 응답 방식까지 다 내가 결정하니까, 하나하나 설계하는 재미가 있어요.
무엇보다, 처음엔 어렵게만 느껴졌던 게 점점 손에 익고 나니까, 나중엔 “이거로 뭐든 만들 수 있겠다!”는 확신이 생기더라고요.
마지막 한마디? 한 번 써보세요. 진짜로요.
LangGraph는 뭐랄까, 처음엔 복잡해 보여도 한 번만 넘어가면 그다음부턴 신세계가 펼쳐져요. 저처럼 AI 챗봇 만들어보고 싶은 분들, 뭔가 더 자신만의 구조로 설계해보고 싶은 분들에겐 진심으로 추천합니다.
혹시 더 궁금한 거 있거나, 다른 예제가 보고 싶다면 댓글로 남겨주세요! 제가 만들어본 내용 더 풀어드릴게요. 클라우드 배포하는 법, 사용자 피드백 반영하는 루프 만들기, 여러 명의 agent가 협업하는 구조까지 다요.
'SW > 인공지능' 카테고리의 다른 글
Gemini 2.5 Pro 후기: 코딩 진짜 이렇게까지 잘한다고? (0) | 2025.06.23 |
---|---|
실시간 웹 데이터를 자동으로 가져오는 AI 웹봇 만들기 (MXGp & Bright Data 활용법) (0) | 2025.06.22 |
월 10달러로 Claude, GPT, 이미지 생성까지? ChatLLM 직접 써본 후기 (0) | 2025.06.14 |
GPT처럼 이미지를 생성한다고? BAR 모델로 본 최신 AI 이미지 생성 기술 (0) | 2025.06.12 |
DeepSeek R1이 기존 언어 모델과 다른 이유: 체인 오브 쏘트와 GRPO의 힘 (0) | 2025.06.07 |