주뇽's 저장소
Part 2-1: LangGraph 도구 활용 에이전트 - 날씨 정보 챗봇 구현하기 🌤️ 본문
728x90
반응형
Part 2-1: LangGraph 도구 활용 에이전트 - 날씨 정보 챗봇 구현하기 🌤️
이번 글에서는 LangGraph를 활용하여 날씨 정보를 제공하는 대화형 에이전트를 구현하는 방법을 설명한다. 웹 검색 대신 커스텀 도구를 활용하여 특정 기능을 구현하는 방법을 알아본다. 실제 날씨 챗봇은 아니고 내가 AI가 사용할 수 있는 툴을 정의하고 이를 AI가 사용할 수 있도록 하는 프로젝트이다. 이를 통해 AI가 툴을 사용할 때 어떠한 툴을 어떻게 사용할지를 커스터마이징 할 수 있다.
1. 프로젝트 구조 설정 🛠️
import os
from typing import Annotated
from typing_extensions import TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.graph.message import add_messages
from langchain_openai import ChatOpenAI
from langchain.tools import tool
from langgraph.prebuilt import ToolNode, tools_condition
# 상태 정의
class State(TypedDict):
messages: Annotated[list, add_messages]
2. 날씨 도구 구현 🌡️
@tool
def get_weather(location: str) -> str:
"""특정 지역의 날씨 정보를 반환한다"""
weather_data = {
"서울": {"temp": 15, "condition": "안개"},
"인천": {"temp": 15, "condition": "안개"},
"default": {"temp": 32, "condition": "맑음"}
}
info = weather_data.get(location, weather_data["default"])
return f"{location}의 현재 날씨는 {info['condition']}이며, 기온은 {info['temp']}도입니다."
@tool
def get_coolest_cities() -> str:
"""가장 시원한 도시 목록을 반환한다"""
return "현재 가장 시원한 도시는 서울(15도)과 고성(16도)입니다."
3. 그래프 구성하기 🎯
def setup_agent():
# AI 모델 설정
llm = ChatOpenAI(
model="gpt-4",
temperature=0.7,
streaming=True
)
# 도구 설정
tools = [get_weather, get_coolest_cities]
llm_with_tools = llm.bind_tools(tools)
# 챗봇 노드 함수
def chatbot(state: State):
return {"messages": [llm_with_tools.invoke(state["messages"])]}
# 그래프 구성
graph_builder = StateGraph(State)
graph_builder.add_node("chatbot", chatbot)
graph_builder.add_node("tools", ToolNode(tools=tools))
# 조건부 엣지 추가
graph_builder.add_conditional_edges(
"chatbot",
tools_condition,
)
graph_builder.add_edge("tools", "chatbot")
graph_builder.add_edge(START, "chatbot")
return graph_builder.compile()
4. 테스트 코드 구현 🧪
def test_weather_bot():
graph = setup_agent()
test_questions = [
"서울 날씨 어때?",
"가장 시원한 도시가 어디야?",
"부산 날씨는 어때?"
]
for question in test_questions:
print("\n" + "="*50)
print(f"😀 사용자: {question}")
print("="*50)
events = graph.stream({"messages": [("human", question)]})
for event in events:
for value in event.values():
if "messages" in value:
message = value["messages"][-1]
if hasattr(message, "content"):
print(f"\n🤖 AI: {message.content}")
if __name__ == "__main__":
test_weather_bot()
5. 실행 결과 예시 📝
==================================================
😀 사용자: 서울 날씨 어때?
==================================================
🤖 AI: 서울의 날씨를 확인해보겠습니다.
서울의 현재 날씨는 안개이며, 기온은 15도입니다.
==================================================
😀 사용자: 가장 시원한 도시가 어디야?
==================================================
🤖 AI: 현재 가장 시원한 도시는 서울(15도)과 고성(16도)입니다.
6. 주요 포인트 정리 ⭐
- 도구 구현
@tool
데코레이터로 도구를 정의한다- 각 도구는 특정 기능을 담당한다
- 도구 통합
bind_tools
로 AI 모델에 도구를 연결한다ToolNode
로 도구 실행 노드를 생성한다
- 조건부 실행
tools_condition
으로 도구 사용 여부를 결정한다- AI가 필요할 때만 도구를 호출한다
7. 확장 가능성 🚀
- 실제 날씨 API 연동
@tool def get_real_weather(location: str) -> str: """실제 날씨 API를 호출하여 정보를 반환한다""" # API 호출 구현 pass
- 추가 기능
- 주간 날씨 예보 추가
- 지역별 날씨 비교 기능
- 날씨 알림 설정
이렇게 LangGraph와 커스텀 도구를 활용하여 실용적인 날씨 정보 챗봇을 구현할 수 있다. 다음 글에서는 메모리 관리 기능을 추가하여 대화 컨텍스트를 유지하는 방법을 알아본다. 🌟
참고 : https://langchain-ai.github.io/langgraph/tutorials/introduction/#part-2-enhancing-the-chatbot-with-tools
참고 : https://github.com/junyong1111/LangGraph/tree/main/example2
참고 : https://www.youtube.com/watch?v=Ubz0XIZpuVY
'LangGraph' 카테고리의 다른 글
Part 2.2: LangGraph와 웹 검색 도구를 활용한 지능형 챗봇 구현하기 🔍 (2) | 2025.01.18 |
---|---|
Part 1: 기본 챗봇 만들기 - LangGraph의 기초 🌱 (0) | 2025.01.18 |
0. LangGraph 완벽 가이드: AI 챗봇 개발의 새로운 패러다임 🚀 (0) | 2025.01.18 |