LLM(대규모 언어 모델) 기술이 발전함에 따라 개발자들은 더 복잡하고 정교한 AI 애플리케이션을 구축하고자 합니다. 단순한 챗봇을 넘어서 상태를 유지하고, 조건에 따라 다른 행동을 취하며, 여러 단계의 작업을 자율적으로 수행할 수 있는 AI 에이전트에 대한 수요가 증가하고 있습니다. 이러한 복잡한 AI 시스템을 구축하는 데 도움을 주는 도구가 바로 LangGraph입니다.
LangGraph란 무엇인가?
LangGraph는 LangChain 팀에서 개발한 파이썬 라이브러리로, 상태를 유지하고, 순환적이며, 여러 행위자(actor)를 포함하는 LLM 애플리케이션을 구축하기 위한 도구입니다. LangChain의 기능을 확장하여 실제 세계의 복잡한 문제를 해결하는 데 필요한 워크플로우를 더 쉽게 구현할 수 있게 해줍니다.
LangChain vs LangGraph
LangChain은 LLM 애플리케이션 구축을 위한 기초적인 컴포넌트와 도구를 제공하는 반면, LangGraph는 이를 한 단계 더 발전시켜 상태 유지, 조건부 흐름, 순환 구조 등 복잡한 워크플로우를 구축할 수 있게 해줍니다.
간단히 말해:
- LangChain: LLM 애플리케이션의 기본 구성 요소 제공
- LangGraph: 상태 유지와 복잡한 흐름 제어가 가능한 고급 워크플로우 구축
LangGraph의 핵심 개념: State Graph
LangGraph의 핵심은 State Graph입니다. 이는 노드(node)와 엣지(edge)로 구성된 방향 그래프로, LLM 워크플로우를 표현합니다.
- 노드(Node): 함수 호출이나 LLM 모델 실행 같은 작업을 나타냅니다.
- 엣지(Edge): 노드 간의 연결로, 워크플로우의 흐름을 나타냅니다.
간단한 방향 그래프 예시: 식당에서 식사하는 과정을 모델링한 것으로, 배가 부를 때까지 음식을 구매하고 먹는 순환 구조를 보여줍니다.
위 그림은 간단한 방향 그래프의 예시입니다. 식당에서 식사를 하는 과정을 모델링한 것으로, ‘음식 구매’와 ‘음식 먹기’라는 두 가지 행동(노드)이 있습니다. 식사 후에는 “아직 배고픈가, 아니면 배가 찼는가?”라는 질문을 하게 됩니다. 점선 화살표(엣지)는 이 질문에 대한 답을 나타냅니다. 아직 배가 고프다면 다시 음식을 구매하고 먹는 과정을 반복하고, 배가 찼다면 식당을 떠납니다.
이런 방식으로 LangGraph는 LLM 애플리케이션을 방향 그래프로 표현하고 구현합니다.
LangGraph의 장점: 조건부 엣지와 순환
LangGraph가 LangChain과 차별화되는 핵심 기능은 **조건부 엣지(Conditional Edge)**와 이를 통한 순환(Cycle)구현입니다.
조건부 엣지(Conditional Edge)
조건부 엣지는 현재 상태에 따라 다음에 실행할 노드를 결정합니다. 이를 통해 복잡한 의사 결정 로직을 구현할 수 있습니다.
예를 들어, 이메일 처리 시스템을 만든다고 생각해 봅시다. 규제 기관으로부터 받은 이메일이 긴급 사항인지 아닌지에 따라 다른 처리 경로를 택해야 합니다:
def route_escalation_status_edge(state):
if state["requires_escalation"]:
return "send_escalation_email"
else:
return "create_legal_ticket"
workflow.add_conditional_edge(
"check_escalation_status",
route_escalation_status_edge,
{
"send_escalation_email": "send_escalation_email",
"create_legal_ticket": "create_legal_ticket",
}
)
이 코드는 이메일이 긴급 사항인지 확인한 후, 긴급 사항이라면 알림 이메일을 보내는 노드로, 아니라면 법무팀 티켓을 생성하는 노드로 흐름을 전환합니다.
조건부 엣지를 활용한 그래프: 알림이 필요한 경우와 그렇지 않은 경우에 따라 서로 다른 경로로 처리가 진행됩니다.
순환(Cycle)
조건부 엣지를 활용하면 그래프 내에서 순환(루프)을 구현할 수 있습니다. 이는 특정 조건이 충족될 때까지 일련의 작업을 반복해야 하는 경우에 유용합니다.
예를 들어, 법무팀 티켓을 생성하기 전에 여러 후속 질문에 답해야 하는 경우:
def route_follow_up_edge(state):
if state["current_follow_up"] is not None:
return "answer_follow_up_question"
else:
return "END"
workflow.add_conditional_edge(
"create_legal_ticket",
route_follow_up_edge,
{
"answer_follow_up_question": "answer_follow_up_question",
"END": "END",
}
)
workflow.add_edge("answer_follow_up_question", "create_legal_ticket")
이 코드는 법무팀 티켓 생성 시 후속 질문이 있으면 질문에 답하는 노드로 이동하고, 그 후 다시 티켓 생성 노드로 돌아오는 순환을 구현합니다. 모든 질문에 답하면 그래프가 종료됩니다.
순환 구조가 있는 그래프: create_legal_ticket과 answer_follow_up_question 노드 사이에 질문이 모두 답변될 때까지 반복적으로 실행되는 순환 구조가 있습니다.
LangGraph로 AI 에이전트 개발하기
LangGraph의 궁극적인 목표 중 하나는 자율적인 AI 에이전트를 구축하는 것입니다. AI 에이전트는 다음 두 가지 주요 구성 요소를 가집니다:
- 의사 결정을 내리는 모델 (주로 LLM)
- 작업을 수행하는 도구
LangGraph는 조건부와 순환적인 성격을 가진 에이전트 아키텍처를 구현하는 데 적합합니다. 다음은 이메일 처리 에이전트의 구현 예시입니다:
@tool
def forward_email(email_message, send_to_email):
"""
이메일을 다른 주소로 전달합니다.
이메일이 잘못된 주소로 왔거나 다른 부서에서 처리해야 할 때 사용합니다.
"""
print(f"이메일을 {send_to_email}로 전달했습니다.")
return f"이메일을 {send_to_email}로 성공적으로 전달했습니다."
@tool
def extract_notice_data(message, escalation_criteria):
"""
규제 기관의 공지 이메일에서 구조화된 데이터를 추출합니다.
공지 날짜, 규제 기관 이름, 연락처 등을 추출합니다.
"""
initial_state = {
"notice_message": message,
"escalation_text_criteria": escalation_criteria,
"escalation_dollar_criteria": 100000,
"escalation_emails": ["[email protected]", "[email protected]"],
"requires_escalation": False,
"follow_ups": {},
"current_follow_up": None,
}
results = NOTICE_EXTRACTION_GRAPH.invoke(initial_state)
return f"공지 데이터 추출 완료: {results}"
이러한 도구들을 사용하여 에이전트 그래프를 구성합니다:
tool_node = ToolNode(tools=[forward_email, extract_notice_data,
send_wrong_email_notification, determine_email_action])
EMAIL_AGENT_MODEL = ChatOpenAI(temperature=0, model_name="gpt-4o-mini").bind_tools(
tools=[forward_email, extract_notice_data,
send_wrong_email_notification, determine_email_action]
)
def call_agent_model_node(state):
response = EMAIL_AGENT_MODEL.invoke(state["messages"])
return {"messages": state["messages"] + [response]}
def route_agent_graph_edge(state):
last_message = state["messages"][-1]
if "tool_calls" in last_message.additional_kwargs:
return "email_tools"
else:
return "END"
최종 에이전트 그래프: 이메일 에이전트와 도구 노드 사이에 순환 구조가 있어 이메일 처리가 완료될 때까지 필요한 도구를 계속 호출합니다.
이 아키텍처는 간단해 보이지만 에이전트 구축에 매우 일반적이고 효과적인 패턴입니다. 에이전트는 이메일 메시지를 받아 처리가 완료될 때까지 필요한 도구를 계속 호출합니다.
LangGraph 사용 시작하기
LangGraph는 PyPI에서 설치할 수 있습니다:
pip install langgraph
pip install langchain langchain-openai pydantic
LangChain과 함께 사용하는 것이 일반적이지만, 독립적으로 사용할 수도 있습니다.
결론: LangGraph의 의미와 전망
LangGraph는 LLM 애플리케이션 개발 방식을 한 단계 발전시킨 라이브러리입니다. 단순한 선형적 체인을 넘어 상태를 유지하고, 조건에 따라 다른 경로를 선택하며, 필요에 따라 작업을 반복할 수 있는 복잡한 워크플로우를 구현할 수 있게 해줍니다.
LangGraph의 핵심 장점을 요약하면:
- 상태 유지: 복잡한 대화나 작업 처리에 필요한 상태 정보를 효과적으로 관리
- 조건부 흐름: 현재 상태에 따라 다른 작업 경로를 선택
- 순환 구조: 특정 조건이 충족될 때까지 작업을 반복
- 에이전트 구축: 자율적으로 의사 결정을 내리고 작업을 수행하는 AI 에이전트 개발
이러한 기능들은 고객 서비스 봇, 이메일 처리 시스템, 법률 문서 분석 등 복잡한 실제 문제를 해결하는 LLM 애플리케이션을 개발하는 데 필수적입니다.
AI 기술이 계속 발전함에 따라 LangGraph와 같은 도구들은 더욱 중요해질 것입니다. 개발자들은 이러한 도구를 활용하여 더 복잡하고 지능적인 AI 시스템을 만들어 비즈니스 프로세스를 자동화하고 사용자 경험을 향상시킬 수 있을 것입니다.
답글 남기기