LangChain,Graph

[LangGraph 이론 + 기본 사용]

100.nam 2025. 3. 28. 01:32

🟢 1. LangGraph란?

LangGraph는 LangChain의 LLM과 툴을 활용하여 복잡한 흐름을 다룰 수 있도록 설계된 프레임워크입니다.

기본 개념

  • StateGraph(상태 그래프): 데이터 흐름과 처리 단계를 정의하는 그래프 구조
  • Node(노드): 특정 작업을 수행하는 함수(예: LLM 호출, 데이터 처리)
  • Edge(엣지, 연결선): 노드 간의 흐름을 정의

🛠 LangGraph를 사용해야 하는 이유

  1. 복잡한 로직 구현: 다단계 의사결정 프로세스나 복잡한 워크플로우를 쉽게 구현할 수 있습니다.
  2. 세밀한 제어: 애플리케이션의 각 단계를 정밀하게 제어할 수 있어, 고도로 커스터마이즈된 동작을 구현할 수 있습니다.
  3. 확장성: 서브그래프를 통해 대규모 시스템을 모듈화하여 관리할 수 있습니다.
  4. 상태 지속성: 체크포인팅을 통해 장기 실행 태스크와 오류 복구를 쉽게 구현할 수 있습니다.
  5. 다중 에이전트 시스템: 여러 AI 에이전트의 상호작용을 효과적으로 모델링할 수 있습니다

 

🔵 2. LangGraph 설치하기

LangGraph는 pip로 간단히 설치할 수 있습니다.

더보기
더보기
pip install langgraph

🟡 3. LangGraph 기본 사용법

LangGraph는 그래프 기반으로 데이터를 처리합니다.
아래 예제를 통해 기본 구조를 익혀봅시다.

from langgraph.graph import StateGraph, START, END
from typing import TypedDict

# 그래프의 상태를 정의하는 클래스
# MyState라는 TypedDict를 정의하여 그래프의 상태 구조를 지정합니다. 
# 여기서는 counter라는 정수형 필드만 있습니다.
class MyState(TypedDict):
    counter: int

# StateGraph 인스턴스 생성
# StateGraph 인스턴스를 생성하고, 상태 타입으로 MyState를 지정합니다.
graph = StateGraph(MyState)

# 카운터를 증가시키는 노드 함수 정의
# increment 함수를 정의합니다. 
# 이 함수는 현재 상태를 입력으로 받아 counter 값을 1 증가시킨 새로운 상태를 반환합니다.
def increment(state):
    return {"counter": state["counter"] + 1}

# 'increment' 노드 추가
# increment 함수를 "increment"라는 이름의 노드로 그래프에 추가합니다.
graph.add_node("increment", increment)

# START에서 'increment' 노드로 엣지 추가
# 그래프의 시작점(START)에서 "increment" 노드로 엣지를 추가합니다.
graph.add_edge(START, "increment")

# 'increment' 노드에서 END로 엣지 추가
# "increment" 노드에서 그래프의 종료점(END)으로 엣지를 추가합니다.
graph.add_edge("increment", END)

# 그래프 컴파일
app = graph.compile()

# 그래프 실행
# 컴파일된 그래프를 실행합니다. 초기 상태로 {"counter": 0}을 제공합니다.
result = app.invoke({"counter": 0})
print(result) #{'counter': 1}

 

🔴 4. LangGraph의 주요 개념

위 예제를 바탕으로, LangGraph의 핵심 요소를 정리해 보겠습니다.

🔹 (1) StateGraph (상태 그래프)

  • 그래프의 전체 구조를 관리하는 객체
  • graph = StateGraph()로 생성

🔹 (2) Node (노드)

  • 특정 작업을 수행하는 함수
  • graph.add_node("노드_이름", 함수)로 추가

🔹 (3) Edge (엣지, 노드 간 연결)

  • 노드 간의 데이터 흐름을 정의
  • graph.add_edge( START, "시작 노드")로 설정
  • graph.add_edge("이전 노드", "다음 노드")로 설정
  • graph.add_edge("다음 노드", END)로 설정

 

🟠 5. LangGraph 실전 예제

이번에는 사용자의 입력하여 적절한 응답을 주는 챗봇을 만들어 보겠습니다.

from dotenv import load_dotenv
from typing import Annotated, TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langchain_openai import ChatOpenAI

# API 키 정보 로드
load_dotenv()

# 그래프 상태 정의하는 클래스
class MyState(TypedDict):
    # 메시지 정의(list type 이며 add_messages 함수를 사용하여 메시지를 추가)
    messages: Annotated[str, add_messages] #Annotated는 타힙 힌트 + 추가 정보

# LLM 정의
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)

# 챗봇 함수 정의
def chatbot(state: MyState):
    # 메시지 호출 및 반환
    return {"messages": [llm.invoke(state["messages"])]}

# 그래프 생성
graph = StateGraph(MyState)

# 'chatbot' 노드 추가
graph.add_node("chatbot", chatbot)

# START에서 챗봇 노드로 엣지 추가
graph.add_edge(START, "chatbot")

# 챗봇 노드에서 END로 엣지 추가
graph.add_edge("chatbot", END)

# 그래프 컴파일
app = graph.compile()

def run_chatbot():
    while True:
        # 사용자 입력 받기
        user_input = input("You: ")

        # "exit" 입력 시 종료
        if user_input.lower() == "exit":
            print("Goodbye!")
            break

        # 그래프 이벤트 스트리밍
        # stream 실시간 그 값을 가져와서 처리 (비동기적)
        for event in app.stream({"messages": [("user", user_input)]}):
            # 이벤트 값 출력
            for value in event.values():
                print("Assistant:", value["messages"][-1].content)

# 챗봇 실행
run_chatbot()

 

 

🔵 6. LangGraph의 활용

LangGraph는 복잡한 챗봇, 데이터 처리, 워크플로우 자동화 등의 시스템을 구축하는 데 유용합니다.
아래와 같은 다양한 활용 사례를 고려할 수 있습니다.


1) 챗봇 시스템 (LLM 기반 대화 관리)

LangGraph는 대화 흐름을 제어하는 챗봇을 만드는 데 적합합니다.
일반적인 챗봇과 달리 다중 스텝 대화 처리 및 상태 유지가 가능합니다.

💡 활용 예시:

  • 문맥을 유지하는 고객 상담 챗봇
  • 다양한 질문 유형을 처리하는 FAQ 챗봇
  • 질문을 분류하고 적절한 답변을 찾는 질의응답 시스템

📌 챗봇 구조 예시:
1️⃣ 사용자의 입력을 분석 (질문 유형 파악)
2️⃣ 적절한 응답 생성 (LLM 사용)
3️⃣ 데이터베이스 또는 외부 API와 연동
4️⃣ 사용자의 이전 질문과 문맥을 유지하여 답변 개선


2) RAG (Retrieval-Augmented Generation)

LangGraph를 사용하면 RAG 기반 검색 시스템을 구축할 수 있습니다.
이는 LLM이 벡터DB에서 정보를 검색하여 답변을 생성하는 방식입니다.

💡 활용 예시:

  • 회사 내부 문서를 검색하고 답변 생성
  • 의료 데이터에서 환자의 기록을 분석하여 맞춤형 답변 제공
  • 법률 및 금융 문서 검색 후 요약 생성

📌 RAG 시스템 구조 예시:
1️⃣ 사용자의 질문을 벡터화
2️⃣ 벡터 데이터베이스에서 관련 문서 검색
3️⃣ 검색된 문서를 LLM에 전달하여 답변 생성
4️⃣ 최종 응답을 사용자에게 전달


3) API 워크플로우 자동화

LangGraph를 사용하면 여러 외부 API 호출을 조합하여 자동화할 수 있습니다.
특히, **비동기 처리(async)**를 지원하여 빠르게 응답할 수 있습니다.

💡 활용 예시:

  • 여러 개의 REST API 호출 후 데이터를 병합
  • 날씨 API → 뉴스 API → 추천 시스템 순으로 데이터 처리
  • 다국어 번역 API를 호출하여 다양한 언어로 답변 제공

📌 API 호출 자동화 예시:
1️⃣ 사용자의 요청을 분류 (예: 날씨, 뉴스, 주식 정보 등)
2️⃣ 적절한 API 호출 후 데이터 수집
3️⃣ 응답 데이터를 가공 및 요약하여 사용자에게 전달

 

4) 다중 에이전트 시스템 (Multi-Agent Systems)

LangGraph는 여러 개의 에이전트를 동시에 활용하는 시스템을 만들 때 유용합니다.
각 에이전트가 특정 역할을 수행하며, 서로 데이터를 주고받을 수 있습니다.

💡 활용 예시:

  • 여러 개의 LLM 에이전트를 활용하여 복잡한 작업 수행
  • 한 에이전트가 문서를 요약하고, 다른 에이전트가 분석
  • 의료 상담 챗봇에서 질문 유형에 따라 다른 AI 모델 호출

📌 다중 에이전트 예시:
1️⃣ 요약 에이전트: 문서를 요약
2️⃣ 분석 에이전트: 요약된 내용을 분석
3️⃣ 추천 에이전트: 사용자가 원하는 추가 정보 제공


5) 워크플로우 엔진 (Task Orchestration)

LangGraph는 복잡한 비즈니스 로직을 자동화하는 데 활용할 수 있습니다.
특히, 비동기 작업을 관리하고 데이터 흐름을 제어하는 데 적합합니다.

💡 활용 예시:

  • 전자상거래 주문 처리 자동화
  • 데이터 분석 및 보고서 생성 파이프라인
  • AI 모델의 학습 데이터 전처리 및 평가 자동화

📌 전자상거래 주문 처리 예시:
1️⃣ 주문 접수
2️⃣ 결제 처리
3️⃣ 재고 확인
4️⃣ 배송 요청
5️⃣ 사용자에게 알림 전송

 


🚀 LangGraph 활용 정리

활용 사례설명
챗봇 시스템 LLM을 활용한 자연어 질문 응답
RAG (검색 기반 AI) 벡터DB에서 정보를 검색하여 LLM이 답변 생성
API 자동화 여러 API를 호출하여 데이터를 가공 및 응답
다중 에이전트 시스템 여러 AI 모델이 협력하여 작업 수행
워크플로우 자동화 주문 처리, 데이터 분석 파이프라인 구축