본문 바로가기
카테고리 없음

[AI 에이전트 프로젝트] 🌤️ Part 2. 날씨 전문가 Agent 만들기: 도구를 사용하는 Google ADK 실전 예제

by 데이터 AI 벌집 2025. 4. 20.
반응형

지난 글에서는 ADK를 이용해 단일 여행 비서를 만드는 과정을 살펴봤습니다.

2025.04.20 - [AI 공부/AI 에이전트 (AI Agents)] - [AI 에이전트 프로젝트] ✈️ Part 1. 여행비서의 탄생: Google ADK로 나만의 AI Agent 만들기

 

[AI 에이전트 프로젝트] ✈️ Part 1. 여행비서의 탄생: Google ADK로 나만의 AI Agent 만들기

이 글은 Google의 Agent Development Kit(ADK)를 활용해 스마트 여행 비서를 직접 만드는 4부작 시리즈 중 첫 번째입니다.오늘은 아주 기본적인 하나의 Agent를 만들어보고, 자연어 대화로 여행 관련 질문에

datasciencebeehive.tistory.com

 


이번 편에서는 ADK의 핵심 기능 중 하나인 Tool 연결을 통해, 사용자의 여행 목적지에 맞는 날씨를 알려주는 Weather Agent를 만들어 보겠습니다.

 

[AI 에이전트 프로젝트] 🌤️ Part 2. 날씨 전문가 Agent 만들기: 도구를 사용하는 Google ADK 실전 예제

🎯 목표

  • ADK에서 Python 함수를 Tool로 연결하는 법 익히기
  • WeatherAgent를 생성하여 여행 목적지의 날씨를 알려주기
  • 도구 호출 및 결과를 처리하는 방법 이해하기

날씨 전문가 Agent

🧰 사전 준비 (환경은 Part 1과 동일)

  • .env 설정 완료
  • google-adk 설치 완료
  • Python 3.11 가상환경 사용

🛠️ Step 1. 날씨 정보를 알려주는 Tool 만들기

우선 도구는 실제 API가 아닌 가상의 날씨 데이터를 반환하는 함수로 구현하겠습니다.
추후에는 OpenWeatherMap 등 외부 API와 연결할 수 있도록 구조를 유지할게요.

 

def get_weather(city: str) -> str:
    """주어진 도시의 날씨를 반환합니다.
    
    Args:
        city: 도시 이름 (예: "파리", "도쿄")
    
    Returns:
        해당 도시의 날씨 설명 문자열
    """
    mock_weather = {
        "파리": "맑음, 최고 21도 / 최저 12도",
        "도쿄": "비, 최고 18도 / 최저 14도",
        "바르셀로나": "흐림, 최고 23도 / 최저 15도",
    }
    return mock_weather.get(city, f"{city}의 날씨 정보는 현재 사용할 수 없습니다.")

 

🧠 Step 2. Weather Agent 정의

이제 이 Tool을 사용하는 Agent를 구성합니다.

from google.adk.agents import Agent
from google.genai import types

weather_agent = Agent(
    model="gemini-2.0-flash-001",
    name="weather_agent",
    description="도시의 날씨를 알려주는 에이전트입니다.",
    instruction="사용자가 특정 도시의 날씨를 물어보면, Tool을 이용해 날씨를 알려주세요.",
    generate_content_config=types.GenerateContentConfig(temperature=0.4),
    tools=[get_weather],
)

 

⚙️ Step 3. Runner로 Agent 실행

기존과 동일하게 Runner를 세팅하고 질의 함수도 업데이트해줍니다.

from google.adk.runners import Runner
from google.adk.sessions import InMemorySessionService
from google.adk.artifacts import InMemoryArtifactService
from google.genai import types

session_service = InMemorySessionService()
artifact_service = InMemoryArtifactService()

runner = Runner(
    app_name="weather_agent_app",
    agent=weather_agent,
    artifact_service=artifact_service,
    session_service=session_service
)

def ask_weather(query: str):
    session = session_service.create_session(app_name="weather_agent_app", user_id="user")
    content = types.Content(role="user", parts=[types.Part(text=query)])
    events = runner.run(user_id="user", session_id=session.id, new_message=content)

    for event in events:
        if event.get_function_calls():
            for fn in event.get_function_calls():
                print(f"🔧 도구 호출: {fn.name}({fn.args})")
        if event.get_function_responses():
            for fr in event.get_function_responses():
                print(f"✅ 도구 응답: {fr.name} → {fr.response}")
        if event.is_final_response():
            print("🤖 최종 응답:", event.content.parts[0].text)

 

🧪 실행 예시

ask_weather("이번 주말에 파리 날씨 어때요?")

 

출력 예시:

🔧 도구 호출: get_weather({'city': '파리'})
✅ 도구 응답: get_weather → 맑음, 최고 21도 / 최저 12도
🤖 최종 응답: 파리의 날씨는 맑음이며, 최고 21도 / 최저 12도입니다.

 

🔍 ADK에서 Tool이 어떻게 작동하는가?

  1. LLM이 질문을 해석하고 Tool을 호출하기로 판단
  2. get_weather(city=파리) 를 호출함
  3. 함수 실행 결과를 ADK가 LLM에게 전달
  4. 최종 응답 텍스트 생성

📌 이 구조는 향후 데이터베이스 검색, 파일 요약, 웹 검색 등 다양한 기능으로 확장 가능합니다.

반응형