주뇽's 저장소

Part 2-1: LangGraph 도구 활용 에이전트 - 날씨 정보 챗봇 구현하기 🌤️ 본문

LangGraph

Part 2-1: LangGraph 도구 활용 에이전트 - 날씨 정보 챗봇 구현하기 🌤️

뎁쭌 2025. 1. 18. 17:37
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. 주요 포인트 정리 ⭐

  1. 도구 구현
    • @tool 데코레이터로 도구를 정의한다
    • 각 도구는 특정 기능을 담당한다
  2. 도구 통합
    • bind_tools로 AI 모델에 도구를 연결한다
    • ToolNode로 도구 실행 노드를 생성한다
  3. 조건부 실행
    • tools_condition으로 도구 사용 여부를 결정한다
    • AI가 필요할 때만 도구를 호출한다

7. 확장 가능성 🚀

  1. 실제 날씨 API 연동
  2. @tool def get_real_weather(location: str) -> str: """실제 날씨 API를 호출하여 정보를 반환한다""" # API 호출 구현 pass
  3. 추가 기능
    • 주간 날씨 예보 추가
    • 지역별 날씨 비교 기능
    • 날씨 알림 설정

이렇게 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