AI 에이전트 개발, 이 영상 하나로 끝냅니다. (LangChain + LangGraph)
핵심 포인트
- 1LangGraph는 AI 에이전트의 복잡한 비즈니스 로직을 정교하게 제어하고 관리하며 배포하기 위한 저수준(low-level) 오케스트레이션 프레임워크입니다.
- 2이 프레임워크는 에이전트의 공유 메모리 역할을 하는 'State', 실제 작업을 수행하는 'Node', 노드 간 연결을 정의하는 'Edge', 그리고 조건에 따라 흐름을 제어하는 'Conditional Edge'를 핵심 개념으로 사용합니다.
- 3LangGraph 에이전트 개발은 언어 모델 및 툴 정의, 스테이트 정의, 노드 함수 구현, 그리고 이러한 구성요소들을 연결하여 에이전트의 실행 흐름을 설계하는 단계로 진행됩니다.
제공된 영상 강의는 AI 에이전트 개발을 위한 LangGraph 프레임워크의 개념과 기본 구축 방법을 설명합니다. LangGraph는 AI 에이전트의 복잡한 비즈니스 로직을 세밀하게 제어하고 예측할 수 있도록 돕는 저수준(low-level) 오케스트레이션 프레임워크이자 런타임입니다. 기존 LangChain이 내부 로직을 숨기는 블랙박스 형태였다면, LangGraph는 개발자가 에이전트의 사고 과정과 움직임을 직접 가이드할 수 있는 투명한 설계도를 제공하여, 오케스트레이션 기반의 멀티 에이전트 시스템, 동적 워커 팀 구성, 타임 트래블, 포킹, 그리고 동적 인터럽트(dynamic interrupt)와 같은 고급 기능을 구현할 수 있게 합니다.
LangGraph를 사용하여 에이전트를 구축하는 핵심 방법론은 다섯 단계로 나뉩니다:
- 모델 및 툴 정의 (Define Model & Tools):
- AI 에이전트의 추론을 담당할 언어 모델과 에이전트가 사용할 도구(tool)를 정의합니다.
- 언어 모델은 LangChain에서 제공하는 모듈(
langchain_google_genai의ChatGoogleGenerativeAI등)을 사용하여 인스턴스화합니다. 예시에서는 비용 효율적인gemini-1.5-flash모델을 사용했습니다. - 도구는
@tool데코레이터를 사용하여 파이썬 함수로 정의하며, 입력 파라미터와 반환 값에 대한 타입 힌팅(type hinting), 그리고 기능에 대한 독스트링(docstring)을 포함합니다. - 정의된 언어 모델 인스턴스에
bind_tools메서드를 사용하여 도구들을 바인딩(binding)함으로써, 언어 모델이 도구를 사용할 수 있도록 연결합니다.
- 스테이트 정의 (Define State):
State는 에이전트의 각Node가 작업 결과를 기록하고 공유하는 "공책" 역할을 합니다.- Python
class로 정의되며,TypedDict를 상속받아 데이터 스키마를 명시합니다. - 주요 필드로는
messages와llm_calls가 있습니다.messages:list형태이며,langchain_core.messages.BaseMessage타입의 객체들을 저장합니다. 특히Annotated[list[AnyMessage], add_messages]와 같이add_messages함수를 사용하여 새로운 메시지가 리스트에 자동으로 추가되도록 설정합니다. 이는 대화의 맥락을 유지하며 메시지를 효율적으로 관리하기 위함입니다.llm_calls: 언어 모델이 호출된 횟수를 기록하는int타입의 필드입니다.
- 노드 정의 (Define Nodes):
Node는 특정 작업을 수행하는 "작업자"이며, Pythonfunction으로 정의됩니다.- 모든 노드 함수는
State객체를 입력 파라미터로 받아야 하며, 작업 완료 후 갱신된State의 필드(주로messages)를 딕셔너리 형태로 반환합니다. llm_caller노드:- 이 노드는 언어 모델을 호출하여 응답을 생성하는 역할을 합니다.
- 입력으로 받은
State의messages필드를 사용하여 모델을invoke하고, 모델의 응답을messages에 추가합니다. - 응답에는 AI의 답변(
content) 또는 도구 호출 정보(tool_calls)가 포함될 수 있습니다. llm_calls필드 값은 1 증가시켜 언어 모델 호출 횟수를 기록합니다.- 시스템 메시지를 추가하여 에이전트의 역할을 정의할 수 있습니다.
tool_executor노드:- 이 노드는 언어 모델이 결정한 도구 호출(
tool_calls)을 실제로 실행하는 역할을 합니다. State의 마지막 메시지(AI 메시지)에서tool_calls정보를 추출합니다.- 각
tool_call에 해당하는 도구를 찾아invoke메서드를 사용하여 실행합니다. - 도구 실행 결과는
ToolMessage객체로 감싸messages필드에 추가합니다. 이때tool_call_id를 포함하여 어떤tool_call에 대한 결과인지 명확히 합니다.
- 이 노드는 언어 모델이 결정한 도구 호출(
- 그래프 생성 및 연결 (Build Graph & Edges):
langgraph.graph모듈의StateGraph클래스를 사용하여 그래프를 초기화하고, 정의된State를 전달합니다.add_node메서드를 사용하여 정의된llm_caller와tool_executor함수를 각각 "llm_caller"와 "tool_executor"라는 이름의 노드로 등록합니다.add_edge메서드를 사용하여 노드 간의Edge를 연결합니다.- 시작 노드(
START)에서 "llm_caller" 노드로 연결합니다. - "tool_executor" 노드에서 "llm_caller" 노드로 연결합니다 (도구 실행 후 다시 언어 모델에게 결과를 참조하게 함).
- 시작 노드(
add_conditional_edges메서드를 사용하여 조건부Edge를 정의합니다.- 조건부
Edge는 특정 노드(예: "llm_caller")의 실행 결과에 따라 다음 목적지 노드를 동적으로 결정합니다. - 이를 위해
should_continue와 같은 조건 함수를 정의합니다. 이 함수는State를 검사하여 언어 모델의 응답에tool_calls가 포함되어 있는지 확인합니다. - 만약
tool_calls가 있으면 "tool_executor" 노드로 라우팅하고, 없으면 최종 결과(END)로 라우팅하도록 설정합니다.
- 조건부
- 그래프 컴파일 및 실행 (Compile & Run Graph):
StateGraph의compile()메서드를 호출하여 정의된 노드와 엣지를 기반으로 실행 가능한 그래프를 컴파일합니다.- 컴파일된 그래프 객체는
invoke메서드를 통해 실행되며, 초기 입력(messages)을 전달받아 에이전트 워크플로우를 시작합니다.
이러한 단계를 통해 개발자는 State를 공유 메모리로, Node를 작업 단위로, 그리고 Edge를 흐름 제어 메커니즘으로 활용하여 AI 에이전트의 복잡한 논리를 명시적이고 시각적인 그래프 형태로 설계하고 구현할 수 있습니다.