본문 바로가기
AI/Tool, 모델 소개

Google ADK (Agent Development Kit)

by 루이스파파 2025. 4. 27.
반응형

개요

Google의 Agent Development Kit(ADK)는 2025년 4월 9일 Google Cloud NEXT 2025에서 공개된 오픈소스 프레임워크입니다. 이 프레임워크는 AI 에이전트와 멀티 에이전트 시스템의 개발을 단순화하고 효율화하기 위해 설계되었습니다. ADK는 Google 제품인 Agentspace와 Google Customer Engagement Suite(CES)에서 사용되는 것과 동일한 프레임워크로, 이제 개발자들이 자유롭게 활용할 수 있도록 오픈소스로 제공됩니다.

 

주요 특징

1. 유연한 오케스트레이션

  • 워크플로우 에이전트(Sequential, Parallel, Loop)를 사용하여 예측 가능한 파이프라인 정의
  • LLM 기반 동적 라우팅(LlmAgent 전송)을 활용한 적응형 동작 구현
  • 복잡한 작업을 여러 에이전트가 협력하여 처리할 수 있는 구조

2. 풍부한 도구 생태계

  • 사전 구축된 도구(검색, 코드 실행)
  • Model Context Protocol(MCP) 도구
  • 서드파티 라이브러리(LangChain, LlamaIndex, CrewAI) 통합
  • 다른 에이전트를 도구로 활용 가능

3. 내장된 스트리밍 기능

  • 양방향 오디오 및 비디오 스트리밍 기능으로 인간과 유사한 자연스러운 대화형 상호작용
  • 몇 줄의 코드만으로 텍스트를 넘어 풍부한 멀티모달 대화 구현 가능

4. 멀티 에이전트 아키텍처

  • 여러 전문 에이전트를 계층적으로 조합하여 모듈식이고 확장 가능한 애플리케이션 구축
  • 복잡한 조정 및 위임 작업 처리 가능

5. 내장된 평가 도구

  • 사전 정의된 데이터셋에 대해 실행 경로와 응답 품질을 체계적으로 테스트
  • 최종 응답 품질과 단계별 실행 궤적을 평가하여 에이전트 성능 검증

6. 배포 준비 기능

  • 컨테이너화하여 로컬에서 실행하거나 Vertex AI Agent Engine으로 확장
  • Cloud Run이나 Docker를 사용한 커스텀 인프라에 통합 가능
  • 프로토타입에서 프로덕션 레벨 애플리케이션으로 원활한 전환

7. 책임감 있는 AI 구현

  • 강력하고 신뢰할 수 있는 에이전트를 구축하기 위한 책임감 있는 AI 패턴 및 모범 사례 제공
  • 에이전트 설계에 윤리적 고려사항 통합

설치 및 시작

1. 설치하기

ADK는 pip를 통해 쉽게 설치할 수 있습니다:

pip install google-adk

2. 인증 설정

Google Cloud 서비스를 사용하기 위한 인증을 설정합니다:

# Google Cloud CLI 설치 후
gcloud auth application-default login

3. 기본 에이전트 만들기

간단한 대화형 에이전트를 만드는 기본 코드:

from google.adk import Agent, LlmAgent, AdkApp
from google.adk.tools import WebSearch

# 에이전트 정의
agent = LlmAgent(
    name="InfoAgent",
    description="정보를 검색하고 사용자 질문에 답변하는 도우미 에이전트",
    instructions="""
    사용자의 질문에 친절하게 답변하세요.
    필요한 경우 웹 검색을 활용하여 최신 정보를 제공하세요.
    답변은 간결하고 정확하게 제공하세요.
    """,
    tools=[WebSearch()]
)

# 애플리케이션 생성 및 실행
app = AdkApp(agent=agent)
app.run()

4. 스트리밍 기능이 있는 에이전트

스트리밍 응답을 지원하는 에이전트 코드:

from google.adk import Agent, LlmAgent, AdkApp
from google.adk.tools import WebSearch

# 에이전트 정의
agent = LlmAgent(
    name="StreamingInfoAgent",
    description="실시간 스트리밍 응답을 제공하는 정보 에이전트",
    instructions="""
    사용자의 질문에 친절하게 답변하세요.
    필요한 경우 웹 검색을 활용하여 최신 정보를 제공하세요.
    답변은 간결하고 정확하게 제공하세요.
    """,
    tools=[WebSearch()]
)

# 스트리밍 콜백 함수
def on_stream(content: str):
    print(content, end="", flush=True)

# 애플리케이션 생성 및 실행 (스트리밍 모드)
app = AdkApp(agent=agent)
response = app.query("인공지능의 최신 트렌드는 무엇인가요?", stream=True, on_stream=on_stream)

활용 사례 및 샘플 코드

1. 고객 지원 에이전트

고객 문의에 답변하고 필요한 정보를 검색하는 에이전트:

from google.adk import LlmAgent, AdkApp
from google.adk.tools import WebSearch, FileSearch
from google.adk.tools.custom import FunctionTool

# 티켓 생성 함수
def create_support_ticket(customer_name: str, issue: str, priority: str) -> str:
    """
    고객 지원 티켓을 생성합니다.
    
    Args:
        customer_name: 고객 이름
        issue: 문제 설명
        priority: 우선순위 (high, medium, low)
    
    Returns:
        생성된 티켓 ID
    """
    # 실제로는 티켓 시스템 API 호출 등의 로직이 들어갈 것입니다
    ticket_id = f"TICKET-{hash(customer_name + issue) % 10000:04d}"
    print(f"티켓 생성됨: {ticket_id} (고객: {customer_name}, 우선순위: {priority})")
    return ticket_id

# 고객 지원 에이전트 정의
support_agent = LlmAgent(
    name="CustomerSupportAgent",
    description="고객 문의에 응답하고 필요시 지원 티켓을 생성하는 에이전트",
    instructions="""
    고객의 문의에 친절하고 전문적으로 응답하세요.
    일반적인 질문은 직접 답변하고, 기술적 문제는 관련 문서를 검색하여 해결책을 제시하세요.
    해결할 수 없는 복잡한 문제의 경우 지원 티켓을 생성하세요.
    티켓 생성 시 문제의 심각도에 따라 우선순위를 적절히 설정하세요.
    """,
    tools=[
        WebSearch(),
        FileSearch(directory_path="./support_docs"),
        FunctionTool(create_support_ticket)
    ]
)

# 애플리케이션 실행
app = AdkApp(agent=support_agent)
app.run()

2. 여행 계획 멀티 에이전트 시스템

여러 전문 에이전트가 협력하여 여행 계획을 수립하는 시스템:

from google.adk import LlmAgent, SequentialAgent, AdkApp
from google.adk.tools import WebSearch
from google.adk.tools.custom import FunctionTool
from typing import List, Dict

# 항공편 검색 도구
def search_flights(origin: str, destination: str, date: str) -> List[Dict]:
    """
    주어진 출발지, 목적지, 날짜에 맞는 항공편을 검색합니다.
    
    Args:
        origin: 출발 도시
        destination: 도착 도시
        date: 출발 날짜 (YYYY-MM-DD)
    
    Returns:
        항공편 목록
    """
    # 실제로는 항공편 API 호출 로직이 들어갈 것입니다
    return [
        {"flight": "KE123", "departure": "09:00", "arrival": "11:30", "price": "₩350,000"},
        {"flight": "OZ456", "departure": "14:00", "arrival": "16:30", "price": "₩320,000"}
    ]

# 호텔 검색 도구
def search_hotels(city: str, check_in: str, check_out: str) -> List[Dict]:
    """
    주어진 도시와 날짜에 맞는 호텔을 검색합니다.
    
    Args:
        city: 도시 이름
        check_in: 체크인 날짜 (YYYY-MM-DD)
        check_out: 체크아웃 날짜 (YYYY-MM-DD)
    
    Returns:
        호텔 목록
    """
    # 실제로는 호텔 API 호출 로직이 들어갈 것입니다
    return [
        {"name": "그랜드 호텔", "rating": 4.5, "price": "₩150,000/박"},
        {"name": "시티 호텔", "rating": 4.2, "price": "₩120,000/박"}
    ]

# 여행지 정보 에이전트
destination_agent = LlmAgent(
    name="DestinationExpert",
    description="여행지에 대한 정보와 추천을 제공하는 에이전트",
    instructions="""
    사용자가 관심을 보이는 여행지에 대한 상세 정보를 제공하세요.
    - 주요 관광 명소
    - 현지 음식 추천
    - 최적의 방문 시기
    - 현지 교통 정보
    - 여행 팁
    웹 검색을 활용하여 최신 정보를 제공하세요.
    """,
    tools=[WebSearch()]
)

# 항공편 예약 에이전트
flight_agent = LlmAgent(
    name="FlightExpert",
    description="항공편 검색 및 추천을 제공하는 에이전트",
    instructions="""
    사용자의 여행 계획에 맞는 최적의 항공편을 검색하고 추천하세요.
    가격, 소요 시간, 항공사 평판 등을 고려하여 최적의 옵션을 제안하세요.
    """,
    tools=[FunctionTool(search_flights), WebSearch()]
)

# 숙박 예약 에이전트
hotel_agent = LlmAgent(
    name="AccommodationExpert",
    description="숙박 시설 검색 및 추천을 제공하는 에이전트",
    instructions="""
    사용자의 여행 계획과 선호도에 맞는 최적의 숙박 시설을 검색하고 추천하세요.
    위치, 가격, 편의시설, 리뷰 등을 고려하여 최적의 옵션을 제안하세요.
    """,
    tools=[FunctionTool(search_hotels), WebSearch()]
)

# 여행 계획 조정 에이전트
planner_agent = LlmAgent(
    name="TravelPlanner",
    description="전체 여행 계획을 조정하고 최종 일정을 제안하는 에이전트",
    instructions="""
    다른 전문가 에이전트들의 정보를 종합하여 최적의 여행 계획을 수립하세요.
    일정, 예산, 사용자 선호도를 고려하여 종합적인 여행 계획을 제안하세요.
    """,
    tools=[]
)

# 순차적 워크플로우 에이전트 구성
travel_workflow = SequentialAgent(
    name="TravelPlanningSystem",
    description="여행 계획을 종합적으로 수립하는 에이전트 시스템",
    agents=[destination_agent, flight_agent, hotel_agent, planner_agent]
)

# 애플리케이션 실행
app = AdkApp(agent=travel_workflow)
response = app.query("5월 중순에 제주도로 3박 4일 여행을 계획 중입니다. 좋은 여행 계획을 추천해주세요.")
print(response)

3. 코드 개발 보조 에이전트

개발자를 돕는 코드 작성 및 디버깅 에이전트:

from google.adk import LlmAgent, AdkApp
from google.adk.tools import WebSearch, CodeExecution
from google.adk.tools.custom import FunctionTool
import os

# 파일 저장 함수
def save_code(filename: str, code: str) -> str:
    """
    코드를 파일로 저장합니다.
    
    Args:
        filename: 저장할 파일 이름
        code: 저장할 코드 내용
    
    Returns:
        저장 결과 메시지
    """
    with open(filename, 'w') as f:
        f.write(code)
    return f"코드가 {filename}에 성공적으로 저장되었습니다."

# 코드 개발 보조 에이전트
dev_assistant = LlmAgent(
    name="CodeAssistant",
    description="코드 작성, 디버깅, 최적화를 도와주는 개발 보조 에이전트",
    instructions="""
    개발자의 코딩 작업을 지원하세요:
    1. 코드 작성 요청에 대해 최적의 코드를 제공하세요.
    2. 버그가 있는 코드를 분석하고 수정 방법을 제안하세요.
    3. 코드 최적화 방법을 제안하세요.
    4. 필요한 경우 코드를 실행하여 결과를 확인하세요.
    5. 개발자가 원하는 경우 코드를 파일로 저장하세요.
    
    Python, JavaScript, Java, C++, Go 등 다양한 프로그래밍 언어를 지원하세요.
    최신 코딩 표준과 모범 사례를 따르는 코드를 작성하세요.
    """,
    tools=[
        WebSearch(),
        CodeExecution(),
        FunctionTool(save_code)
    ]
)

# 애플리케이션 실행
app = AdkApp(agent=dev_assistant)
app.run()

4. 데이터 분석 에이전트

데이터 분석과 시각화를 수행하는 에이전트:

from google.adk import LlmAgent, AdkApp
from google.adk.tools import CodeExecution, WebSearch
from google.adk.tools.custom import FunctionTool
import pandas as pd
import matplotlib.pyplot as plt
import io
import base64

# 데이터 로드 함수
def load_data(file_path: str) -> str:
    """
    CSV 또는 Excel 파일에서 데이터를 로드합니다.
    
    Args:
        file_path: 데이터 파일 경로
    
    Returns:
        데이터 로드 결과 메시지
    """
    global df
    if file_path.endswith('.csv'):
        df = pd.read_csv(file_path)
    elif file_path.endswith(('.xlsx', '.xls')):
        df = pd.read_excel(file_path)
    else:
        return "지원되지 않는 파일 형식입니다. CSV 또는 Excel 파일을 사용하세요."
    
    return f"데이터가 성공적으로 로드되었습니다. 행: {df.shape<span class="footnote-wrapper">[0]</span>}, 열: {df.shape<span class="footnote-wrapper">[1]</span>}"

# 데이터 요약 함수
def summarize_data() -> str:
    """
    로드된 데이터의 요약 통계를 반환합니다.
    
    Returns:
        데이터 요약 정보
    """
    if 'df' not in globals():
        return "먼저 데이터를 로드해주세요."
    
    summary = io.StringIO()
    summary.write("데이터 요약:\n\n")
    summary.write(f"행 수: {df.shape<span class="footnote-wrapper">[0]</span>}, 열 수: {df.shape<span class="footnote-wrapper">[1]</span>}\n\n")
    summary.write("열 정보:\n")
    for col in df.columns:
        summary.write(f"- {col}: {df[col].dtype}\n")
    
    summary.write("\n기술 통계:\n")
    summary.write(df.describe().to_string())
    
    summary.write("\n\n결측치 정보:\n")
    summary.write(df.isnull().sum().to_string())
    
    return summary.getvalue()

# 데이터 시각화 함수
def visualize_data(chart_type: str, x_column: str, y_column: str = None, title: str = "차트") -> str:
    """
    데이터를 시각화합니다.
    
    Args:
        chart_type: 차트 유형 (bar, line, scatter, histogram, pie)
        x_column: x축 열 이름
        y_column: y축 열 이름 (일부 차트 유형에서는 선택 사항)
        title: 차트 제목
    
    Returns:
        시각화 결과 메시지
    """
    if 'df' not in globals():
        return "먼저 데이터를 로드해주세요."
    
    plt.figure(figsize=(10, 6))
    
    try:
        if chart_type == 'bar':
            df.plot(kind='bar', x=x_column, y=y_column, title=title)
        elif chart_type == 'line':
            df.plot(kind='line', x=x_column, y=y_column, title=title)
        elif chart_type == 'scatter':
            df.plot(kind='scatter', x=x_column, y=y_column, title=title)
        elif chart_type == 'histogram':
            df[x_column].plot(kind='hist', title=title)
        elif chart_type == 'pie' and y_column:
            df.groupby(x_column)[y_column].sum().plot(kind='pie', title=title)
        else:
            return f"지원되지 않는 차트 유형: {chart_type}"
        
        plt.tight_layout()
        
        # 이미지를 바이트 스트림으로 저장
        buf = io.BytesIO()
        plt.savefig(buf, format='png')
        buf.seek(0)
        
        # 이미지를 base64로 인코딩
        img_str = base64.b64encode(buf.read()).decode('utf-8')
        
        # 실제 애플리케이션에서는 이미지를 표시하거나 저장하는 로직이 필요합니다
        plt.savefig(f"{title.replace(' ', '_')}.png")
        
        return f"차트가 생성되어 '{title.replace(' ', '_')}.png'로 저장되었습니다."
    
    except Exception as e:
        return f"시각화 중 오류 발생: {str(e)}"

# 데이터 분석 에이전트
data_analyst = LlmAgent(
    name="DataAnalyst",
    description="데이터 분석과 시각화를 수행하는 에이전트",
    instructions="""
    사용자의 데이터 분석 요청을 지원하세요:
    1. 데이터 파일 로드 및 탐색
    2. 데이터 전처리 및 정제
    3. 통계 분석 수행
    4. 데이터 시각화 생성
    5. 분석 결과 해석 및 인사이트 제공
    
    사용자의 질문을 이해하고 적절한 분석 방법을 선택하세요.
    결과를 명확하고 이해하기 쉽게 설명하세요.
    """,
    tools=[
        FunctionTool(load_data),
        FunctionTool(summarize_data),
        FunctionTool(visualize_data),
        CodeExecution(),
        WebSearch()
    ]
)

# 애플리케이션 실행
app = AdkApp(agent=data_analyst)
app.run()

 

이러한 샘플 코드들은 Google ADK의 다양한 기능을 활용하여 실제 비즈니스 문제를 해결하는 방법을 보여줍니다.

 

개발자는 이러한 예제를 기반으로 자신의 요구사항에 맞는 AI 에이전트를 쉽게 구축할 수 있습니다.

반응형