LangGraph Studio 완전 가이드 - AI 에이전트 개발 및 디버깅 IDE
⏱️ 예상 읽기 시간: 15분
서론
LangGraph Studio는 AI 에이전트 시스템의 개발, 시각화, 디버깅을 위한 전문 IDE입니다. 복잡한 에이전트 워크플로우를 그래프 형태로 시각화하고, 실시간으로 상태를 추적하며, 시간 여행 디버깅까지 지원하는 강력한 도구입니다.
주요 특징
- 그래프 아키텍처 시각화: 에이전트의 노드와 엣지를 직관적으로 표현
- 실시간 상호작용: 에이전트와 직접 채팅하며 동작 확인
- 시간 여행 디버깅: 과거 상태로 돌아가서 디버깅 가능
- LangSmith 통합: 추적, 평가, 프롬프트 엔지니어링 지원
- 멀티 플랫폼: macOS, Windows, Linux 지원
시스템 요구사항
- Python 3.8+
- Node.js 16+ (선택사항)
- Docker & Docker Compose
- macOS, Windows, 또는 Linux
LangGraph CLI 설치 및 설정
Python 환경 설정
먼저 Python 가상환경을 생성하고 LangGraph CLI를 설치합니다:
# 가상환경 생성 및 활성화
python -m venv venv
source venv/bin/activate # macOS/Linux
# venv\Scripts\activate # Windows
# LangGraph CLI 설치
pip install -U langgraph-cli
설치 확인
# CLI 버전 확인
langgraph --version
# 도움말 확인
langgraph --help
Docker 환경 확인
LangGraph Studio는 Docker를 사용하므로 Docker가 실행 중인지 확인합니다:
# Docker 상태 확인
docker --version
docker-compose --version
# Docker 데몬 실행 확인
docker ps
첫 번째 LangGraph 프로젝트 생성
프로젝트 초기화
# 프로젝트 디렉토리 생성
mkdir my-langgraph-agent
cd my-langgraph-agent
# LangGraph 프로젝트 초기화
langgraph new
기본 에이전트 코드 작성
# main.py
from typing import TypedDict, Literal
from langgraph.graph import StateGraph, END
from langgraph.checkpoint.memory import MemorySaver
class GraphState(TypedDict):
messages: list
current_step: str
def start_node(state: GraphState) -> GraphState:
"""시작 노드"""
return {
"messages": state["messages"] + ["Starting agent..."],
"current_step": "processing"
}
def process_node(state: GraphState) -> GraphState:
"""처리 노드"""
return {
"messages": state["messages"] + ["Processing user request..."],
"current_step": "responding"
}
def response_node(state: GraphState) -> GraphState:
"""응답 노드"""
return {
"messages": state["messages"] + ["Generating response..."],
"current_step": "complete"
}
def should_continue(state: GraphState) -> Literal["process", "end"]:
"""조건부 라우팅"""
if state["current_step"] == "processing":
return "process"
return "end"
# 그래프 생성
def create_graph():
workflow = StateGraph(GraphState)
# 노드 추가
workflow.add_node("start", start_node)
workflow.add_node("process", process_node)
workflow.add_node("response", response_node)
# 엣지 추가
workflow.set_entry_point("start")
workflow.add_conditional_edges(
"start",
should_continue,
{
"process": "process",
"end": END
}
)
workflow.add_edge("process", "response")
workflow.add_edge("response", END)
# 메모리 저장소 설정
memory = MemorySaver()
return workflow.compile(checkpointer=memory)
# 그래프 인스턴스 생성
app = create_graph()
LangGraph 설정 파일 생성
{
"dependencies": ["langgraph", "langchain", "python-dotenv"],
"graphs": {
"agent": "./main.py:app"
},
"env": ".env"
}
LangGraph Studio 실행
개발 모드 실행
# 개발 서버 시작
langgraph dev
# 또는 특정 그래프 지정
langgraph dev --graph agent
프로덕션 모드 실행
# 프로덕션 서버 시작
langgraph up
# 백그라운드 실행
langgraph up -d
Studio 접속
브라우저에서 다음 URL로 접속:
- 개발 모드:
http://localhost:8123
- Studio 웹 인터페이스:
https://smith.langchain.com/studio
Graph 모드 사용법
그래프 시각화
- 노드 뷰: 각 노드의 실행 상태와 데이터 확인
- 엣지 뷰: 노드 간 연결 관계와 조건부 라우팅 표시
- 상태 뷰: 현재 그래프 상태와 변수 값 실시간 모니터링
디버깅 기능
시간 여행 디버깅
# 특정 시점으로 되돌리기
from langgraph.checkpoint import Checkpoint
def debug_at_step(thread_id: str, step: int):
"""특정 스텝에서 상태 확인"""
checkpoints = app.get_state_history(
{"configurable": {"thread_id": thread_id}}
)
for i, checkpoint in enumerate(checkpoints):
if i == step:
return checkpoint.values
브레이크포인트 설정
def breakpoint_node(state: GraphState) -> GraphState:
"""디버깅용 브레이크포인트"""
import pdb; pdb.set_trace() # 디버거 활성화
return state
상태 관리
상태 추적
# 상태 변화 로깅
def log_state_change(state: GraphState, node_name: str):
print(f"Node: {node_name}")
print(f"Current State: {state}")
print(f"Messages: {len(state.get('messages', []))}")
print("-" * 40)
메모리 관리
from langgraph.checkpoint.sqlite import SqliteSaver
# SQLite 기반 영구 저장
def create_persistent_graph():
memory = SqliteSaver.from_conn_string("checkpoints.sqlite")
return workflow.compile(checkpointer=memory)
Chat 모드 사용법
채팅 인터페이스 설정
Chat 모드는 MessagesState
를 확장하는 상태에서만 사용 가능합니다:
from langchain_core.messages import BaseMessage
from langgraph.graph.message import add_messages
class ChatState(TypedDict):
messages: list[BaseMessage]
def create_chat_graph():
workflow = StateGraph(ChatState)
def chat_node(state: ChatState) -> ChatState:
# 채팅 로직 구현
return {"messages": add_messages(state["messages"], response)}
workflow.add_node("chat", chat_node)
workflow.set_entry_point("chat")
workflow.add_edge("chat", END)
return workflow.compile()
대화 관리
스레드 관리
# 새 대화 스레드 생성
thread_config = {"configurable": {"thread_id": "user-123"}}
# 메시지 전송
response = app.invoke(
{"messages": [("user", "Hello, how are you?")]},
config=thread_config
)
대화 히스토리
# 대화 히스토리 조회
def get_conversation_history(thread_id: str):
state = app.get_state({"configurable": {"thread_id": thread_id}})
return state.values.get("messages", [])
고급 기능 활용
LangSmith 통합
추적 설정
import os
from langsmith import Client
# LangSmith 설정
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_PROJECT"] = "my-langgraph-project"
os.environ["LANGCHAIN_API_KEY"] = "your-api-key"
# 클라이언트 초기화
client = Client()
실험 실행
# 데이터셋 생성
dataset = client.create_dataset(
dataset_name="test-conversations",
description="Test dataset for agent evaluation"
)
# 평가 실행
def run_evaluation():
results = []
for example in dataset.examples:
response = app.invoke(
{"messages": [("user", example.inputs["message"])]},
config={"configurable": {"thread_id": f"eval-{example.id}"}}
)
results.append({
"input": example.inputs,
"output": response,
"expected": example.outputs
})
return results
커스텀 도구 통합
from langchain_core.tools import tool
@tool
def calculator(expression: str) -> str:
"""간단한 계산기 도구"""
try:
result = eval(expression) # 실제 사용시 보안 주의
return str(result)
except Exception as e:
return f"Error: {str(e)}"
# 도구를 그래프에 추가
def tool_node(state: GraphState) -> GraphState:
# 도구 호출 로직
return state
문제 해결 가이드
Safari 연결 문제
Safari에서 localhost HTTP 트래픽이 차단되는 경우:
해결방법 1: Cloudflare Tunnel 사용
# Cloudflare 터널로 실행
langgraph dev --tunnel
해결방법 2: Chrome/Edge 사용
# 일반 개발 모드로 실행 후 Chrome에서 접속
langgraph dev
Docker 네트워크 문제
로컬 서비스(Ollama, Chroma 등) 접근 시:
# localhost 대신 host.docker.internal 사용
OLLAMA_URL = "http://host.docker.internal:11434"
CHROMA_URL = "http://host.docker.internal:8000"
빌드 의존성 문제
네이티브 의존성이 필요한 경우 langgraph.json
에 추가:
{
"dockerfile_lines": [
"RUN apt-get update && apt-get install -y gcc build-essential"
]
}
그래프 엣지 문제
조건부 엣지가 올바르게 표시되지 않는 경우:
# 명시적 경로 매핑 사용
graph.add_conditional_edges(
"router_node",
routing_function,
{
True: "target_node_a",
False: "target_node_b"
}
)
# 또는 타입 힌트 사용
def routing_function(state: GraphState) -> Literal["node_a", "node_b"]:
if state['condition']:
return "node_a"
else:
return "node_b"
실제 사용 사례
1. 고객 서비스 봇
class CustomerServiceState(TypedDict):
messages: list[BaseMessage]
customer_id: str
issue_type: str
resolved: bool
def create_customer_service_bot():
workflow = StateGraph(CustomerServiceState)
def classify_issue(state):
# 이슈 분류 로직
return state
def route_to_agent(state):
# 적절한 에이전트로 라우팅
return state
def resolve_issue(state):
# 이슈 해결 로직
return state
# 워크플로우 구성...
return workflow.compile()
2. 문서 분석 파이프라인
class DocumentAnalysisState(TypedDict):
document: str
summary: str
key_points: list
questions: list
def create_document_analyzer():
workflow = StateGraph(DocumentAnalysisState)
def extract_text(state):
# 텍스트 추출
return state
def summarize(state):
# 요약 생성
return state
def extract_key_points(state):
# 핵심 포인트 추출
return state
def generate_questions(state):
# 질문 생성
return state
# 워크플로우 구성...
return workflow.compile()
성능 최적화
메모리 최적화
# 체크포인트 정리
def cleanup_old_checkpoints(days_old: int = 7):
cutoff_date = datetime.now() - timedelta(days=days_old)
# 오래된 체크포인트 삭제 로직
pass
# 배치 처리
def process_batch(messages: list, batch_size: int = 10):
for i in range(0, len(messages), batch_size):
batch = messages[i:i + batch_size]
# 배치 처리 로직
yield batch
캐싱 전략
from functools import lru_cache
@lru_cache(maxsize=128)
def expensive_computation(input_data: str) -> str:
# 비용이 큰 연산을 캐싱
return result
테스트 스크립트 및 자동화
환경 설정 자동화 스크립트
완전한 LangGraph Studio 환경을 자동으로 설정하는 스크립트를 제공합니다:
#!/bin/bash
# 파일: setup-langgraph-studio-aliases.sh
# LangGraph Studio 완전 설치 및 설정
curl -sSL https://raw.githubusercontent.com/your-repo/setup-langgraph-studio.sh | bash
macOS 실행 테스트 결과
실제 macOS 환경에서 테스트한 결과:
# 시스템 정보
$ uname -a
Darwin MacBook-Pro.local 21.6.0 Darwin Kernel Version 21.6.0 arm64
# Python 환경
$ python3 --version
Python 3.12.8
# LangGraph CLI 설치 및 버전 확인
$ pip install -U "langgraph-cli[inmem]"
Successfully installed langgraph-cli-0.3.7 langgraph-api-0.2.137
$ langgraph --version
LangGraph CLI, version 0.3.7
# 샘플 프로젝트 생성 테스트
$ printf ".\n1\n1\n" | langgraph new
✅ New project created at /path/to/demo-agent
# 개발 서버 실행 테스트
$ langgraph dev --no-browser --port 8123
INFO: Starting LangGraph API server
🚀 API: http://127.0.0.1:8123
🎨 Studio UI: https://smith.langchain.com/studio/?baseUrl=http://127.0.0.1:8123
📚 API Docs: http://127.0.0.1:8123/docs
zshrc Aliases 가이드
다음 aliases를 ~/.zshrc
에 추가하면 LangGraph Studio 작업이 훨씬 편해집니다:
# LangGraph Studio Aliases
export LANGGRAPH_PROJECT_DIR="$HOME/langgraph-projects"
# 환경 관리
alias lg-env="cd $LANGGRAPH_PROJECT_DIR && source venv/bin/activate"
alias lg-install="pip install -U \"langgraph-cli[inmem]\""
alias lg-version="langgraph --version"
# 프로젝트 관리
alias lg-new="langgraph new"
alias lg-init="mkdir -p langgraph-project && cd langgraph-project && python3 -m venv venv && source venv/bin/activate && pip install -U \"langgraph-cli[inmem]\""
# 개발 서버
alias lg-dev="langgraph dev --no-browser"
alias lg-dev-tunnel="langgraph dev --tunnel"
alias lg-up="langgraph up"
# Studio 접속
alias lg-studio="open https://smith.langchain.com/studio/"
alias lg-docs="open http://localhost:8123/docs"
# 유틸리티
alias lg-check="docker ps && python3 --version && langgraph --version"
alias lg-help="echo \"LangGraph Studio 명령어 목록 출력\""
설정 적용
# zshrc 재로드
source ~/.zshrc
# 환경 확인
lg-check
# 새 프로젝트 생성
lg-init
# 개발 서버 시작
lg-dev
# Studio 웹 인터페이스 열기
lg-studio
개발 환경 버전 정보
테스트 완료된 환경:
- OS: macOS 14.0+ (Apple Silicon)
- Python: 3.12.8
- Node.js: 22.16.0 (선택사항)
- Docker: 24.0.0+
- LangGraph CLI: 0.3.7
- LangGraph API: 0.2.137
결론
LangGraph Studio는 AI 에이전트 개발의 복잡성을 크게 줄여주는 강력한 도구입니다. 그래프 시각화를 통해 에이전트의 동작을 직관적으로 이해할 수 있고, 시간 여행 디버깅으로 복잡한 상태 변화를 추적할 수 있습니다.
핵심 포인트
- 시각적 개발: 복잡한 에이전트 로직을 그래프로 표현
- 실시간 디버깅: 상태 변화를 실시간으로 모니터링
- 통합 환경: LangSmith와의 seamless 통합으로 전체 ML 파이프라인 관리
- 멀티 플랫폼: 다양한 개발 환경에서 일관된 경험 제공
다음 단계
- 복잡한 멀티 에이전트 시스템 구축
- 프로덕션 환경에서의 모니터링 및 관리
- 커스텀 도구 및 통합 개발
- 성능 최적화 및 스케일링
LangGraph Studio를 활용하여 더욱 효율적이고 강력한 AI 에이전트를 개발해보세요!