AI 에이전트 개발, 이 영상 하나로 끝냅니다. (LangChain + LangGraph)
Video

AI 에이전트 개발, 이 영상 하나로 끝냅니다. (LangChain + LangGraph)

2026.02.17
·YouTube·by 배레온/부산/개발자
#AI Agent#Gemini#LangChain#LangGraph#Orchestration

핵심 포인트

  • 1LangGraph는 AI 에이전트의 복잡한 비즈니스 로직을 정교하게 제어하고 관리하며 배포하기 위한 저수준(low-level) 오케스트레이션 프레임워크입니다.
  • 2이 프레임워크는 에이전트의 공유 메모리 역할을 하는 'State', 실제 작업을 수행하는 'Node', 노드 간 연결을 정의하는 'Edge', 그리고 조건에 따라 흐름을 제어하는 'Conditional Edge'를 핵심 개념으로 사용합니다.
  • 3LangGraph 에이전트 개발은 언어 모델 및 툴 정의, 스테이트 정의, 노드 함수 구현, 그리고 이러한 구성요소들을 연결하여 에이전트의 실행 흐름을 설계하는 단계로 진행됩니다.

제공된 영상 강의는 AI 에이전트 개발을 위한 LangGraph 프레임워크의 개념과 기본 구축 방법을 설명합니다. LangGraph는 AI 에이전트의 복잡한 비즈니스 로직을 세밀하게 제어하고 예측할 수 있도록 돕는 저수준(low-level) 오케스트레이션 프레임워크이자 런타임입니다. 기존 LangChain이 내부 로직을 숨기는 블랙박스 형태였다면, LangGraph는 개발자가 에이전트의 사고 과정과 움직임을 직접 가이드할 수 있는 투명한 설계도를 제공하여, 오케스트레이션 기반의 멀티 에이전트 시스템, 동적 워커 팀 구성, 타임 트래블, 포킹, 그리고 동적 인터럽트(dynamic interrupt)와 같은 고급 기능을 구현할 수 있게 합니다.

LangGraph를 사용하여 에이전트를 구축하는 핵심 방법론은 다섯 단계로 나뉩니다:

  1. 모델 및 툴 정의 (Define Model & Tools):
    • AI 에이전트의 추론을 담당할 언어 모델과 에이전트가 사용할 도구(tool)를 정의합니다.
    • 언어 모델은 LangChain에서 제공하는 모듈(langchain_google_genaiChatGoogleGenerativeAI 등)을 사용하여 인스턴스화합니다. 예시에서는 비용 효율적인 gemini-1.5-flash 모델을 사용했습니다.
    • 도구는 @tool 데코레이터를 사용하여 파이썬 함수로 정의하며, 입력 파라미터와 반환 값에 대한 타입 힌팅(type hinting), 그리고 기능에 대한 독스트링(docstring)을 포함합니다.
    • 정의된 언어 모델 인스턴스에 bind_tools 메서드를 사용하여 도구들을 바인딩(binding)함으로써, 언어 모델이 도구를 사용할 수 있도록 연결합니다.
  1. 스테이트 정의 (Define State):
    • State는 에이전트의 각 Node가 작업 결과를 기록하고 공유하는 "공책" 역할을 합니다.
    • Python class로 정의되며, TypedDict를 상속받아 데이터 스키마를 명시합니다.
    • 주요 필드로는 messagesllm_calls가 있습니다.
      • messages: list 형태이며, langchain_core.messages.BaseMessage 타입의 객체들을 저장합니다. 특히 Annotated[list[AnyMessage], add_messages]와 같이 add_messages 함수를 사용하여 새로운 메시지가 리스트에 자동으로 추가되도록 설정합니다. 이는 대화의 맥락을 유지하며 메시지를 효율적으로 관리하기 위함입니다.
      • llm_calls: 언어 모델이 호출된 횟수를 기록하는 int 타입의 필드입니다.
  1. 노드 정의 (Define Nodes):
    • Node는 특정 작업을 수행하는 "작업자"이며, Python function으로 정의됩니다.
    • 모든 노드 함수는 State 객체를 입력 파라미터로 받아야 하며, 작업 완료 후 갱신된 State의 필드(주로 messages)를 딕셔너리 형태로 반환합니다.
    • llm_caller 노드:
      • 이 노드는 언어 모델을 호출하여 응답을 생성하는 역할을 합니다.
      • 입력으로 받은 Statemessages 필드를 사용하여 모델을 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에 대한 결과인지 명확히 합니다.
  1. 그래프 생성 및 연결 (Build Graph & Edges):
    • langgraph.graph 모듈의 StateGraph 클래스를 사용하여 그래프를 초기화하고, 정의된 State를 전달합니다.
    • add_node 메서드를 사용하여 정의된 llm_callertool_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)로 라우팅하도록 설정합니다.
  1. 그래프 컴파일 및 실행 (Compile & Run Graph):
    • StateGraphcompile() 메서드를 호출하여 정의된 노드와 엣지를 기반으로 실행 가능한 그래프를 컴파일합니다.
    • 컴파일된 그래프 객체는 invoke 메서드를 통해 실행되며, 초기 입력(messages)을 전달받아 에이전트 워크플로우를 시작합니다.

이러한 단계를 통해 개발자는 State를 공유 메모리로, Node를 작업 단위로, 그리고 Edge를 흐름 제어 메커니즘으로 활용하여 AI 에이전트의 복잡한 논리를 명시적이고 시각적인 그래프 형태로 설계하고 구현할 수 있습니다.