본문 바로가기
IT

LangGraph로 구축하는 차세대 에이전트 시스템

by 캐시코드 공장장 2025. 5. 11.
728x90
반응형

LLM 기반 에이전트, 직접 구현하시려다가 지치셨죠? LangGraph 하나면 생각보다 간단하게 해결됩니다.

안녕하세요, 개발자 여러분! 요즘 에이전트 기반 시스템 개발, 특히 LangChain 활용한 프로젝트에 관심 많으시죠? 저도 며칠 전까지 LangChain Core만으로 상태관리와 워크플로우를 직접 짜느라 머리 싸매고 있었거든요. 그런데 LangGraph라는 녀석을 만나고 나서부터 상황이 확 바뀌었어요. 이 프레임워크 하나면 오케스트레이션, 메모리, 인간 피드백 처리까지 깔끔하게 정리되더라고요. 오늘은 제가 직접 테스트해보고 반한 LangGraph의 핵심 기능과 사용 예제를 소개해 드릴게요.

LangGraph란 무엇인가?

LangGraph는 LangChain 생태계에서 새롭게 선보인 프레임워크로, 에이전트 기반 애플리케이션을 효율적으로 구성할 수 있도록 도와주는 도구입니다. 기존 LangChain Core만으로는 복잡한 상태 전이와 멀티 에이전트 시나리오 구현이 쉽지 않았는데요, LangGraph는 이런 한계를 극복하고 빠르고 안정적인 에이전트 시스템 구축을 가능하게 합니다. 특히, 상태 기반의 플로우 설계와 에이전트 간 협업이 중요한 경우 LangGraph의 역할은 더욱 빛을 발하죠.

주요 기능 살펴보기

기능명 설명
메모리 통합 세션 기반 단기 메모리와 장기 메모리를 모두 지원
인간 피드백 일시 중지 웹소켓 제약 없이 인간 입력을 기다릴 수 있음
스트리밍 에이전트 상태나 모델 응답을 실시간 스트리밍 가능
스튜디오 시각적 디버깅 및 워크플로우 설계 지원

기본 상태 정의와 LLM 실행

LangGraph는 명확한 상태 정의에서 출발합니다. Python의 TypedDict를 활용해 LLM 메시지를 담을 수 있는 구조체를 선언하고, 상태 간의 흐름을 그래프로 구성합니다. 다음은 가장 기본적인 구조예요:

class State(TypedDict):
    messages: Annotated[list[AnyMessage], operator.add]

def run_llm(state: State):
    messages = state['messages']
    message = model.invoke(messages)
    return {'messages': [message]}
  1. State 정의: 메시지 리스트와 누적 연산자 설정
  2. LLM 실행 함수 작성: 입력 메시지 기반 모델 호출
  3. 그래프에 노드 및 엣지 추가

조건부 도구 통합 방식

LangGraph는 LLM 응답에 따라 다른 노드로 전이할 수 있는 조건부 흐름을 제공합니다. 예를 들어, LLM이 도구 사용을 요청하면 해당 도구 실행 노드로 전환되고, 그렇지 않으면 종료 노드로 바로 이동하는 식이죠. 이러한 조건 분기 로직은 현실적인 에이전트 시나리오에서 아주 유용하게 사용됩니다.


graph_builder.add_node("llm", run_llm)
graph_builder.add_node("tools", execute_tools)
graph_builder.add_conditional_edges(
    "llm",
    tool_exists,
    {True: "tools", False: END}
)
graph_builder.add_edge("tools", "llm")

장기 메모리와 상태 공유

항목 설명
InMemoryStore LangGraph 내장 메모리 저장소
Namespace 사용자 ID 기반 메모리 그룹화
Key-Value 저장 임의의 데이터 구조 저장 가능

멀티 에이전트 시스템 구성

LangGraph의 가장 멋진 기능 중 하나는 여러 에이전트를 그래프 형태로 연결해서 각기 다른 작업을 수행하도록 구성할 수 있다는 점이에요. 예를 들어, RouterAgent가 입력을 분석해서 WeatherAgent 또는 NewsAgent로 전달하는 방식입니다.

  • 사용자 입력에 따라 동적으로 분기
  • 다양한 역할의 에이전트를 하나의 워크플로우에 통합 가능
Q LangGraph는 LangChain과 어떻게 다르나요?

LangChain은 도구 및 체인 구성 중심이고, LangGraph는 상태 전이 기반의 에이전트 오케스트레이션에 특화되어 있습니다.

Q LangGraph에서 상태는 어떻게 정의하나요?

Python의 TypedDict를 이용해 messages 같은 키로 상태를 정의합니다. 연산자는 상태 병합 방식을 결정합니다.

Q 에이전트 간 협업은 어떤 방식으로 구현되나요?

각 에이전트를 그래프의 노드로 구성하고, 입력 조건에 따라 분기하는 방식으로 협업 구조를 짭니다.

Q LangGraph는 실시간 스트리밍도 가능한가요?

네, 모델 응답, 상태 정보, 도구 실행 결과 등을 실시간으로 스트리밍할 수 있습니다.

Q 장기 메모리는 어떤 방식으로 저장되나요?

InMemoryStore에 namespace와 메모리 ID를 기준으로 저장되며, 여러 스레드 간 공유도 가능합니다.

Q LangGraph에서 디버깅은 어떻게 하나요?

LangGraph Studio라는 시각적 IDE를 통해 그래프를 직접 시각화하고 각 노드별 실행 상태를 확인할 수 있습니다.

LangGraph를 처음 접했을 땐 솔직히 "이게 뭐가 그렇게 대단하지?" 싶었는데요, 직접 써보고 나니 생각이 완전히 바뀌었습니다. 복잡한 상태 기반 에이전트 시스템도 훨씬 직관적으로 짤 수 있었고, 테스트와 디버깅도 수월했어요. 특히 멀티 에이전트 구성이나 장기 메모리 통합이 필요한 분들께 강력 추천드립니다. 혹시 지금 에이전트 개발하면서 막히는 부분이 있다면, LangGraph 한번 꼭 써보세요. 진짜 후회 안 하실 거예요!

이 글이 도움이 되셨다면 댓글이나 공유도 부탁드릴게요. 궁금한 점 있으시면 언제든지 남겨주시구요! 😊

728x90
반응형