Agents Course documentation
LangGraph의 구성 요소
Unit 0. Welcome to the course
Unit 1. Introduction to Agents
Unit 2. Frameworks for AI Agents
Unit 2.1 The smolagents framework
Unit 2.2 The LlamaIndex framework
Unit 2.3 The LangGraph framework
Unit 4. Final Project - Create, Test, and Certify Your Agent
Bonus Unit 1. Fine-tuning an LLM for Function-calling
LangGraph의 구성 요소
LangGraph로 애플리케이션을 구축하려면 핵심 구성 요소를 이해해야 합니다. LangGraph 애플리케이션을 구성하는 기본 빌딩 블록을 살펴보겠습니다.
LangGraph 애플리케이션은 진입점(entrypoint)에서 시작하며, 실행 흐름에 따라 한 함수에서 다른 함수로 이동하다가 END에 도달합니다.
1. 상태
상태(State)는 LangGraph의 중심 개념입니다. 애플리케이션을 통해 흐르는 모든 정보를 나타냅니다.
from typing_extensions import TypedDict
class State(TypedDict):
graph_state: str상태는 사용자 정의이므로, 의사결정 과정에 필요한 모든 데이터를 포함하도록 신중하게 설계해야 합니다!
💡 팁: 애플리케이션이 단계 간에 추적해야 할 정보가 무엇인지 신중하게 고민하세요.
2. 노드
노드(Node)는 파이썬 함수입니다. 각 노드는:
- 상태를 입력으로 받습니다
- 작업을 수행합니다
- 상태 업데이트를 반환합니다
def node_1(state):
print("---Node 1---")
return {"graph_state": state['graph_state'] +" I am"}
def node_2(state):
print("---Node 2---")
return {"graph_state": state['graph_state'] +" happy!"}
def node_3(state):
print("---Node 3---")
return {"graph_state": state['graph_state'] +" sad!"}예를 들어, 노드는 다음과 같은 역할을 할 수 있습니다:
- LLM 호출: 텍스트 생성 또는 의사결정
- 도구 호출: 외부 시스템과 상호작용
- 조건부 로직: 다음 단계 결정
- 사람 개입: 사용자 입력 받기
💡 정보: START와 END처럼 전체 워크플로우에 필수적인 일부 노드는 langGraph에서 직접 제공합니다.
3. 엣지
엣지(Edge)는 노드를 연결하며, 그래프 내에서 가능한 경로를 정의합니다:
import random
from typing import Literal
def decide_mood(state) -> Literal["node_2", "node_3"]:
# 종종 상태를 사용해 다음에 방문할 노드를 결정합니다
user_input = state['graph_state']
# 여기서는 노드 2, 3 사이를 50:50으로 분기합니다
if random.random() < 0.5:
# 50% 확률로 Node 2 반환
return "node_2"
# 50% 확률로 Node 3 반환
return "node_3"엣지는 다음과 같이 나뉩니다:
- 직접(Direct): 항상 노드 A에서 노드 B로 이동
- 조건부(Conditional): 현재 상태에 따라 다음 노드를 선택
4. StateGraph
StateGraph는 전체 에이전트 워크플로우를 담는 컨테이너입니다:
from IPython.display import Image, display
from langgraph.graph import StateGraph, START, END
# 그래프 생성
builder = StateGraph(State)
builder.add_node("node_1", node_1)
builder.add_node("node_2", node_2)
builder.add_node("node_3", node_3)
# 로직 정의
builder.add_edge(START, "node_1")
builder.add_conditional_edges("node_1", decide_mood)
builder.add_edge("node_2", END)
builder.add_edge("node_3", END)
# 그래프 컴파일
graph = builder.compile()이제 시각화할 수 있습니다!
# 시각화
display(Image(graph.get_graph().draw_mermaid_png()))
하지만 가장 중요한 것은 실제로 호출하는 것입니다:
graph.invoke({"graph_state" : "Hi, this is Lance."})출력 :
---Node 1---
---Node 3---
{'graph_state': 'Hi, this is Lance. I am sad!'}다음 단계
다음 섹션에서는 이러한 개념을 실제로 적용하여 첫 번째 그래프를 만들어보겠습니다. 이 그래프는 Alfred가 이메일을 받아 분류하고, 정상 메일이라면 임시 답장을 작성할 수 있도록 합니다.
Update on GitHub