반응형
지난 글에서는 ADK를 이용해 단일 여행 비서를 만드는 과정을 살펴봤습니다.
[AI 에이전트 프로젝트] ✈️ Part 1. 여행비서의 탄생: Google ADK로 나만의 AI Agent 만들기
이 글은 Google의 Agent Development Kit(ADK)를 활용해 스마트 여행 비서를 직접 만드는 4부작 시리즈 중 첫 번째입니다.오늘은 아주 기본적인 하나의 Agent를 만들어보고, 자연어 대화로 여행 관련 질문에
datasciencebeehive.tistory.com
이번 편에서는 ADK의 핵심 기능 중 하나인 Tool 연결을 통해, 사용자의 여행 목적지에 맞는 날씨를 알려주는 Weather Agent를 만들어 보겠습니다.
🎯 목표
- ADK에서 Python 함수를 Tool로 연결하는 법 익히기
- WeatherAgent를 생성하여 여행 목적지의 날씨를 알려주기
- 도구 호출 및 결과를 처리하는 방법 이해하기
🧰 사전 준비 (환경은 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이 어떻게 작동하는가?
- LLM이 질문을 해석하고 Tool을 호출하기로 판단
- get_weather(city=파리) 를 호출함
- 함수 실행 결과를 ADK가 LLM에게 전달
- 최종 응답 텍스트 생성
📌 이 구조는 향후 데이터베이스 검색, 파일 요약, 웹 검색 등 다양한 기능으로 확장 가능합니다.
반응형