LangGraph를 사용하여 프로젝트 구조부터 시작하여, 그래프의 정의, 노드 연결, 실행까지 AI 에이전트를 구축하는 과정을 단계별로 설명합니다.
그래프의 실행은 LangGraph Studio를 활용하여 그래프의 연결상태나 노드에 대한 구성들을 확인합니다.
프로젝트 구조
프로젝트 구조는 LangGraph Platform Application 구조를 참고하였습니다.
my-app/
├── my_agent # 모든 프로젝트 코드
│ ├── utils # 그래프를 위한 유틸리티
│ │ ├── __init__.py
│ │ ├── tools.py # 그래프를 위한 도구들
│ │ ├── nodes.py # 그래프를 위한 노드 함수들
│ │ └── state.py # 그래프의 상태 정의
│ ├── __init__.py
│ └── agent.py # 그래프 구성 코드
├── .env # 환경 변수
├── langgraph.json # LangGraph 구성 파일
└── pyproject.toml # 의존성 관리 파일
- 📁 my_agent/ : LangGraph 프로젝트의 코드가 위치하는 핵심 디렉토리입니다. 비즈니스 로직과 그래프 구성 요소들이 포함됩니다.
- 📁 utils/ : 그래프를 구성하는 데 필요한 유틸리티 파일들(도구, 노드, 상태 정의)
- 📋 agent.py : LangGraph의 그래프를 구성하고 실행하는 코드가 들어 있습니다.
- 📋 langgraph.json : LangGraph의 그래프 구성과 관련된 설정 파일입니다.
- 📋 pyproject.toml : poetry기반의 프로젝트 의존성 및 설정을 관리합니다.
환경설정
프로젝트 시작을 위해 필요한 패키지를 설치하고, 개발환경을 구성합니다. 파이썬 패키지 관리는 Poetry로 관리합니다.
PC환경 세팅(MaC 기준)은 Poetry - 패키지 관리 도구 참고합니다.
프로젝트 폴더를 구성하고, pyproject.toml
config를 설정합니다.
poetry init
다음 패키지 설치를 진행합니다.
poetry add langchain langchain-core langgraph langsmith langchain-openai python-dotenv
LangSmith 추적 설정하기
LangSmith는 LLM 기반 애플리케이션 라이프사이클의 모든 단계를 위한 개발자 플랫폼으로 디버그, 협업, 테스트 및 모니터링 기능을 제공합니다.
.env
파일에 LangSmith 에서 발급받은 키와 프로젝트 정보를 입력합니다.
LANGCHAIN_TRACING_V2=true
LANGCHAIN_API_KEY=<your-api-key>
OpenAI API 키 설정
.env
파일에 OPENAI_API_KEY
입력합니다.
OPENAI_API_KEY= "<your-api-key>"
가상환경 활성화
설치된 패키지의 실행환경을 활성화 합니다.
poetry env activate
Implementation
1. Initialize graph with state.
Graph에서 사용할 State를 정의 합니다.
# state.py
from typing import TypedDict, Annotated, Sequence
from langgraph.graph.message import add_messages
from langchain_core.messages import BaseMessage
class AgentState(TypedDict):
messages: Annotated[Sequence[BaseMessage], add_messages]
Agent 가 구동되어 실행될 때, 정의된 그래프로 LangGraph 애플리케이션에서 사용하도록 정의합니다.
# agent.py
import os
from typing import Literal, TypedDict
from langgraph.graph import StateGraph
from my_ai_agent.utils.state import AgentState
# Define the config
class GraphConfig(TypedDict):
model_name: Literal["anthropic", "openai"]
# 그래프 빌더 초기화
graph_builder = StateGraph(AgentState, config_schema=GraphConfig)
2. Initialize the model.
Agent 에 사용할 LLM 모델을 선언합니다. 여기서는 ChatOpenAI
를 사용합니다.
## node.py
import os
from langchain_openai import ChatOpenAI
from my_ai_agent.utils.state import AgentState
from dotenv import load_dotenv
load_dotenv()
llm = ChatOpenAI(
model="gpt-3.5-turbo",
api_key= os.getenv("OPENAI_API_KEY"),
max_tokens=None,
temperature=0.7,
)
3. 노드(Nodes) 정의
작업을 수행할 노드를 정의합니다. 여기서는 chatbot
이라는 역할을 수행하는 함수를 정의하였습니다.
노드는 2가지 역할을 수행합니다.
- 어떤 작업을 수행할지(수행할 경우) 결정하는 역할
- Agent가 액션을 취하기로 결정하였을 때 액션을 실행하는 역할
# node.py
system_prompt = "Chat with the AI assistant. You can ask questions about anything else."
def chatbot(state):
"""상태에서 메시지를 받아서 LLM을 호출하는 함수"""
messages = state["messages"]
messages = [{"role": "system", "content": system_prompt}] + messages
response = llm.invoke(messages)
return {"messages": [response]}
4. 진입점(Entry Point) 및 엣지(Edge) 정의
먼저, 그래프 실행 시 진입점인 agent
노드를 설정해야 합니다.
엣지(Edge)는 LangGraph에서 노드 간의 연결을 나타냅니다.
조건부 엣지(Conditional Edge)는 목적지가 그래프 상태의 내용에 따라 다른 노드로 연결할 수 있습니다.
- 조건부 에지(Conditional Edge):
- a. 에이전트가 조치를 취하라고 말한 경우 도구를 실행하거나
- b. 에이전트가 도구 실행을 요청하지 않은 경우 완료(사용자에게 응답)
# agent.py
# 'chatbot'을 엔트리포인트로 설정
graph_builder.set_entry_point("chatbot")
# 'chatbot'을 종료포인트로 설정
graph_builder.set_finish_point("chatbot")
5. 그래프 컴파일(Compile)
compile()
메서드는 정의된 그래프를 실행 가능한 형태로 변환합니다.
# agent.py
graph = graph_builder.compile()
6. 그래프 실행 확인
LangGraph Studio를 실행하기 위해 필요한 Configuration을 정의합니다.
# langgraph.json
{
"dockerfile_lines": [],
"graphs": {
"agent": "./my_ai_agent/agent.py:graph" # agent 파일의 위치와 컴파일된 그래프 변수
},
"env": ".env", # configuration 파일 위치
"python_version": "3.12", # 실행되어야할 파이썬 버전
"dependencies": [ # 패키지 종속성
"."
]
}
※ LangGraph Studio는 https://studio.langchain.com/ 에서 설치 가능합니다.
실행할 프로젝트 폴더를 열고, 그래프를 확인합니다.
왼쪽 Frame에서 메세지를 입력하면, 오른 Frame에서 결과를 확인할 수 있으며, 그래프의 각 노드별 실행단계들을 확인할 수 있습니다.