966
AI 에이전트를 구현할 때 가장 먼저 부딪히는 질문은 "어떤 프레임워크로 에이전트의 흐름을 설계할 것인가"입니다. LLM 호출 코드를 작성하는 것과 에이전트의 실행 흐름을 구조적으로 설계하는 것은 전혀 다른 작업입니다. 이 글에서는 랭그래프(LangGraph)가 에이전트 시스템을 어떻게 표현하고 관리하는지, 그 핵심 개념과 동작 원리를 설명합니다.
랭그래프(LangGraph)는 다양한 에이전트 시스템을 설계하고 구현하기 위한 프레임워크로, 시스템의 로직을 노드와 엣지로 구성된 그래프로 표현하는 것이 특징입니다. 랭그래프에서는 에이전트나 기능 단위는 '노드(node)'로, 노드 간의 실행 경로는 '엣지(edge)'로 나타냅니다. 그래프 구조로 작업 흐름을 연결하므로 경로가 복잡한 에이전트도 비교적 쉽게 설계할 수 있습니다. 단순히 흐름을 연결할 뿐 아니라 반복이나 병렬 처리와 같은 복잡한 제어 흐름까지 명확하게 표현할 수 있어, 대규모 에이전트 시스템에서도 논리적 복잡성을 효과적으로 관리할 수 있습니다.
랭그래프는 '상태 관리'를 핵심 철학으로 삼아 설계되었습니다. 에이전트가 작업을 수행하는 과정에서 발생하는 모든 중간 정보와 상태 변화가 그래프 내에서 관리되므로, 복잡한 에이전트 간 협업도 안정적으로 처리할 수 있습니다. 또한 랭그래프는 랭체인(LangChain) 생태계와 통합되어 있어, 랭체인의 LLM 호출, 도구 사용, 메모리 등 이미 널리 사용되는 다양한 구성 요소를 그대로 활용하기에 좋습니다.
랭그래프를 사용하는 이유는 크게 네 가지 장점으로 정리됩니다. ① 여러 단계를 가지는 복잡한 시스템도 그래프 구조로 비교적 쉽게 구현할 수 있습니다. ② 사용자가 원하는 로직의 흐름을 노드와 엣지로 연결해 단계별로 구성할 수 있고, 시스템 구조의 변경이 필요할 때도 재설계와 구현이 용이합니다. ③ 로직 중 필요한 조건에 따라 그래프를 분기할 수 있어 보다 유연한 설계가 가능합니다. ④ 이전 단계로 되돌아가는 양방향 파이프라인을 구성할 수 있어 전체 성능을 개선할 수 있습니다.
실제로 레플릿(Replit)은 멀티 에이전트 시스템 운영에, 링크드인(LinkedIn)은 사용자의 질문을 SQL로 변환하는 사내 멀티 에이전트 시스템 구축에, 우버(Uber)는 내부 코드 마이그레이션 및 테스트 자동화에 랭그래프를 활용하고 있습니다.

랭그래프 기반 에이전트를 이해하려면 세 가지 핵심 구성 요소가 그래프에서 각각 어떤 역할을 하는지 정확히 파악해야 합니다.

상태(state)는 그래프, 즉 에이전트의 현재 상태를 나타내는 데이터 구조입니다. 에이전트가 작업을 수행하면서 지속적으로 관리해야 하는 정보라고 할 수 있습니다. 예를 들어 챗봇의 경우 사용자로부터 메시지를 받아야 하고, 그에 대한 결과 메시지를 에이전트가 반환해야 하므로 메시지를 관리하는 구조가 필요합니다. 이 상태 정의를 '그래프 스키마(graph schema)'라고 하며, 이를 통해 에이전트 그래프가 사용자의 질문과 답변을 정해진 데이터 구조에 맞게 입력받고 반환하도록 보장할 수 있습니다. 작업의 중간 결과도 이 상태에 지속적으로 업데이트됩니다.
상태의 업데이트 방식을 지정하는 것이 리듀서(reducer) 함수입니다. 리듀서 함수를 통해 데이터 스키마 속 키들이 어떻게 업데이트될지를 설정할 수 있습니다. 랭그래프에서는 에이전트로 들어온 메시지를 누적 저장하기 위해 리듀서 함수인 add_messages를 제공합니다. 이 함수는 기존 메시지에 새로운 메시지를 추가할 때 사용되며, 각 메시지는 고유 ID를 가지고 동일한 ID를 갖는 경우 기존 메시지에 새로운 메시지가 덮어쓰인 형태로 관리됩니다.

노드(node)는 에이전트가 수행하는 작업의 단위이자, 작업의 내부 로직을 구현하는 함수입니다. 노드는 단순히 작업을 실행할 뿐만 아니라 작업 수행을 통해 상태를 업데이트합니다. 노드 함수의 반환값은 노드를 통해 업데이트되는 상태값입니다. 예를 들어 chatbot이라는 이름으로 구현된 노드는 내부에서 답변 생성을 담당하며, 그래프의 상태를 입력받고 상태에 들어 있는 사용자 입력값을 기반으로 답변을 생성합니다. 답변 생성이 완료되면 생성된 답변을 messages 키에 담아 반환합니다. add_node를 통해 노드를 그래프에 등록할 수 있습니다.

엣지(edge)는 다음에 실행될 경로를 결정합니다. 특히 에이전트 시스템에서 다음 작업을 결정하는 데 꼭 필요한 요소입니다. 랭그래프에서 구현할 에이전트 그래프는 반드시 시작점(START)과 종료점(END)이 존재합니다. 그래서 시스템 내에서 정의되어야 할 노드가 1개이더라도 시작점 - 노드 - 종료점을 연결해주어야 합니다.

에이전트 시스템을 설계하다 보면 조건에 따라 경로를 다르게 구성해야 하는 상황이 발생합니다. 라우터 LLM에서의 결정에 따라 다음 단계가 달라지는 경우가 이에 해당합니다. 이때 조건부 엣지(conditional edges)를 통해 조건에 따라 달라지는 경로를 구현할 수 있습니다. 조건부 엣지는 다음으로 이동할 노드를 결정하는 함수를 호출하여 결과에 따라 이동하는 엣지로, 특정 노드에서 이동할 수 있는 다음 단계가 2개 이상이고 조건에 따라 하나를 선택해야 할 때 사용합니다. 이처럼 조건부 엣지를 사용하면 에이전트의 실행 흐름을 상태와 조건에 따라 유연하게 제어할 수 있습니다. 특히 응답 길이, 의도 분류 결과 등 라우터 역할을 하는 중간 노드의 출력 결과를 기준으로 다음 행동을 결정해야 하는 경우에 유용합니다.

랭그래프가 중요한 이유는 상태·노드·엣지라는 단순한 구성 요소만으로 AI 에이전트의 복잡한 작업 흐름을 구조적으로 표현하고 유지/보수할 수 있는 기반을 제공하기 때문입니다. 이 세 요소를 정의하고 연결하면 그래프가 완성되고, 랭그래프는 이 구조 위에서 도구 호출, RAG 기반 검색, 멀티 에이전트 협업까지 일관된 방식으로 확장할 수 있도록 설계되어 있습니다.

위 컨텐츠는 『만들면서 배우는 AI 에이전트 개발 입문+실전』의 내용을 재구성하여 제작되었습니다.
댓글