🤖 왜 지금 ADK for Kotlin인가?

AI 생태계가 클라우드 중심에서 엣지(Edge)로 급속히 이동하고 있습니다. 특히 구글이 Gemini Nano를 Android에 탑재한 이후, 1억 4천만 대 이상의 기기에서 온디바이스 AI가 가능해졌죠.

하지만 ‘클라우드 + 온디바이스’ 하이브리드 에이전트를 만드는 것은 생각보다 까다롭습니다. 상태 관리, 컨텍스트 전달, 에러 핸들링, 그리고 모델 간 오케스트레이션까지… 모든 걸 직접 구현하려면 프로젝트가 산으로 갑니다.

**ADK(Agent Development Kit)**는 이 복잡한 오케스트레이션을 프레임워크 레벨에서 처리해주는 오픈소스 도구입니다. 기존에 Java, Go, Python 2.0 베타가 있었는데, 이번에 Kotlin 0.1.0Android 전용 라이브러리가 추가됐습니다.

💡 핵심 포인트: ADK는 단순한 LLM 호출 래퍼가 아닙니다. 멀티 에이전트 간 협업, 도구(Tool) 정의, 온디바이스/클라우드 모델 간 자동 라우팅을 지원하는 본격적인 에이전트 프레임워크입니다.


🧩 ADK for Android: 앱 안에 AI 에이전트를 심다

ADK for Android는 Android 앱 내부에서 직접 AI 에이전트를 실행할 수 있도록 설계되었습니다. 특히 ML Kit GenAI API와 **Gemini Nano(온디바이스)**를 기본 모델로 지원합니다.

의존성 추가

// build.gradle.kts (Module: app)
implementation("com.google.adk:google-adk-kotlin-core-android:0.1.0")

기본 에이전트 생성 예제

val orchestrator = LlmAgent(
    name = "genius_orchestrator",
    model = Gemini(apiKey = apiKey, name = MODEL_NAME),
    instruction = Instruction("""
        당신은 여행 전문 비서입니다.
        먼저 `get_trip_details`를 호출하여 전체 일정을 파악하세요.
        그런 다음 일정 상태에 맞는 환영 메시지를 생성하세요.
    """.trimIndent()),
    tools = listOf(GetTripDetailsTool(tripId)),
    subAgents = listOf(carRentalPipeline, hotelPipeline),
    disallowTransferToPeers = true,
    disallowTransferToParent = true
)

설명:

  • model: 사용할 LLM 지정 (Gemini 클라우드, 또는 온디바이스 Nano)
  • instruction: 에이전트의 역할과 행동 규칙을 자연어로 정의
  • tools: 에이전트가 사용할 수 있는 외부 함수/API
  • subAgents: 하위 에이전트로 작업 위임 가능

🔧 @Tool 애노테이션으로 LLM에 기능 부여하기

ADK for Kotlin의 가장 강력한 기능 중 하나는 @Tool 애노테이션을 통해 LLM이 호출할 수 있는 함수를 손쉽게 정의하는 점입니다. KSP(컴파일 타임 프로세싱)로 자동 생성됩니다.

build.gradle.kts 설정

dependencies {
    implementation("com.google.adk:google-adk-kotlin-core:0.1.0")
    ksp("com.google.adk:google-adk-kotlin-processor:0.1.0")
}

도구 서비스 정의

class ImprobabilityDriveService {
    /**
     * 특정 사건의 '불가능성(improbability)'을 계산합니다.
     */
    @Tool
    fun calculateImprobability(
        @Param("불가능성을 계산할 사건 설명. 예: '차 한 잔이 공중에서 나타나는 것'")
        event: String
    ): String {
        return "'$event'의 불가능성은 약 42:1 입니다."
    }
}

팁: @Param의 description이 LLM에게 함수의 용도를 설명하는 중요한 힌트가 됩니다. 실제 서비스에서는 한글보다 영어로 작성하는 것이 모델 성능에 유리합니다.

서브 에이전트와 메인 에이전트 연결

// 서브 에이전트: 우주선 컴퓨터
val heartOfGoldAgent = LlmAgent(
    name = "HeartOfGold",
    description = "Heart of Gold 우주선 컴퓨터. 불가능성 드라이브 쿼리를 처리합니다.",
    model = Gemini(apiKey = apiKey, name = "gemini-2.5-flash"),
    instruction = Instruction("""
        당신은 Heart of Gold의 선내 컴퓨터입니다.
        밝고 도움이 되는 성격이며, 약간은 귀찮을 수도 있습니다.
        무한 불가능성 드라이브에 접근할 수 있습니다.
    """.trimIndent()),
    tools = ImprobabilityDriveService().generatedTools()
)

// 메인 에이전트: 미션 컨트롤
val rootAgent = LlmAgent(
    name = "MissionControl",
    description = "우주 쿼리를 위한 중앙 라우터. HeartOfGold로 라우팅합니다.",
    subAgents = listOf(heartOfGoldAgent),
    model = Gemini(apiKey = apiKey, name = "gemini-2.5-flash"),
    instruction = Instruction("""
        당신은 미션 컨트롤입니다. 모든 통신의 중앙 허브입니다.
        사용자의 질문을 가장 적합한 에이전트로 라우팅하는 것이 주 업무입니다.
        - 질문이 불가능성, 무한 불가능성 드라이브, Heart of Gold에 관한 것이면 `HeartOfGold`로 전송하세요.
        - 그 외의 경우에는 전문적이지만 약간은 초조한 성격으로 직접 응답하세요.
    """.trimIndent())
)

이 예제에서 사용자가 "차가 공중에서 나타날 확률은?"이라고 묻으면, MissionControlHeartOfGold로 작업을 위임하고, HeartOfGoldcalculateImprobability 함수를 호출해 결과를 반환합니다.


⚠️ 주의사항 및 한계

  1. 0.1.0은 실험 버전입니다. 프로덕션에 바로 적용하기보다는 PoC(개념 증명) 수준으로 접근하는 것이 좋습니다.
  2. 온디바이스 모델의 성능 차이: Gemini Nano는 클라우드 모델보다 추론 능력이 제한적입니다. 복잡한 추론이 필요한 작업은 클라우드 모델로 fallback하는 전략이 필요합니다.
  3. KSP 의존성: @Tool 기능을 사용하려면 KSP 플러그인이 필수입니다. 컴파일 타임에 코드가 생성되므로 빌드 시간이 소폭 증가할 수 있습니다.
  4. 프라이버시 vs 기능 트레이드오프: 온디바이스 처리는 프라이버시에 유리하지만, 모델의 지식 범위가 제한됩니다. 민감하지 않은 작업은 클라우드로 보내는 하이브리드 설계가 현실적입니다.

🇰🇷 한국 개발 생태계에서의 적용 맥락

국내 Android 앱 시장에서 AI 에이전트를 도입할 때 다음과 같은 시나리오를 고려해볼 수 있습니다.

  • 금융 앱: 사용자의 거래 내역을 온디바이스에서 분석하여 민감 정보를 서버로 보내지 않고 개인화된 재정 조언 제공
  • 쇼핑 앱: 상품 검색 시 온디바이스에서 사용자 취향을 분석하고, 가격 비교 등 무거운 연산은 클라우드 에이전트가 처리
  • 헬스케어: 건강 데이터를 기기 내에서만 처리하여 HIPAA/GDPR 규제 대응

참고: 국내 SI/핀테크 환경에서는 데이터 주권(Data Sovereignty) 이슈가 특히 중요합니다. ADK의 온디바이스 아키텍처는 이러한 규제 요구사항을 자연스럽게 충족시킬 수 있는 강력한 무기입니다.


🚀 다음 단계 학습 방향

  1. 공식 GitHub 저장소에서 데모 앱 클론 후 직접 빌드해보기
  2. 간단한 TODO 앱에 ADK를 붙여서 음성 명령으로 할 일을 추가/수정하는 에이전트 만들어보기
  3. @Tool을 활용해 외부 API(날씨, 뉴스, 캘린더)와 연동하는 복합 에이전트 구현
  4. 온디바이스 모델(Gemini Nano)과 클라우드 모델 간의 자동 라우팅 로직을 커스터마이징하는 방법 학습

추가 자료: 본 내용은 구글 공식 개발자 블로그의 ADK for Kotlin & Android 발표를 기반으로 재구성했습니다.


함께 보면 좋은 글

Google ADK for Kotlin and Android enabling on-device AI agent orchestration between cloud and edge Coding Session Visual

// build.gradle.kts (Module: app)
implementation("com.google.adk:google-adk-kotlin-core-android:0.1.0")

// 기본 에이전트 생성
val orchestrator = LlmAgent(
    name = "genius_orchestrator",
    model = Gemini(apiKey = apiKey, name = MODEL_NAME),
    instruction = Instruction("""
        당신은 여행 전문 비서입니다.
        먼저 `get_trip_details`를 호출하여 전체 일정을 파악하세요.
        그런 다음 일정 상태에 맞는 환영 메시지를 생성하세요.
    """.trimIndent()),
    tools = listOf(GetTripDetailsTool(tripId)),
    subAgents = listOf(carRentalPipeline, hotelPipeline),
    disallowTransferToPeers = true,
    disallowTransferToParent = true
)

AI agent running on Android smartphone using on-device Gemini Nano model for privacy-preserving tasks Technical Structure Concept

🧠 ADK의 핵심 아키텍처: 클라우드-엣지 오케스트레이션

ADK가 특별한 이유는 오케스트레이터(Orchestrator) 패턴을 프레임워크 레벨에서 내장하고 있기 때문입니다. I/O 세션에서 시연된 여행 도우미 앱을 예로 들어보겠습니다.

  1. 사용자가 여행 중 문제가 발생하면 클라우드 오케스트레이터가 사용자와 대화하며 문제를 파악합니다.
  2. 예약 확인이 필요할 때는 온디바이스 서브 에이전트에게 작업을 위임합니다.
  3. 서브 에이전트는 **Gemini Nano(온디바이스)**를 사용해 사용자의 로컬 문서에서 데이터를 추출합니다.
  4. 검증 에이전트가 여러 분석 결과를 비교하여 최종 응답을 생성합니다.

이 모든 과정에서 민감한 개인 데이터는 절대 기기를 벗어나지 않습니다.

ADK 0.1.0이 제공하는 기능

기능 영역세부 항목
에이전트LlmAgent 생성, 서브 에이전트 위임, 도구(Tool) 바인딩
도구 및 통합@Tool 애노테이션, KSP 코드 생성, ML Kit GenAI API
런타임 및 관찰성에이전트 실행 제어, 컨텍스트 관리, 에러 핸들링
개발자 경험Kotlin DSL, Android Studio 호환, Gradle 의존성
Android 모델Gemini Nano(온디바이스), Gemini 클라우드, ML Kit

🧪 실전 팁: @Tool 설계 시 주의할 점

  • 함수 이름은 동사+명사 형태로 명확하게: calculateImprobability (O), doStuff (X)
  • 파라미터 설명은 LLM이 이해할 수 있도록 충분히 상세하게: @Param("불가능성을 계산할 사건 설명. 예: '차 한 잔이 공중에서 나타나는 것'")
  • 반환값은 문자열로 통일: LLM이 파싱하기 쉽도록 JSON 문자열을 반환하는 것도 좋은 방법입니다.
  • 멱등성(Idempotency) 고려: 같은 입력에 대해 같은 결과를 반환하도록 설계해야 LLM의 예측 가능성이 높아집니다.

Diagram of cloud-orchestrator and on-device subagents working together in ADK Kotlin framework Programming Illustration

✨ 마무리: 지금 시작해야 하는 이유

ADK for Kotlin/Android는 아직 0.1.0 알파 버전이지만, AI 에이전트를 모바일 앱에 통합하는 패러다임을 바꿀 잠재력을 가지고 있습니다.

  • 프라이버시: 온디바이스 처리로 데이터 보호
  • 성능: 클라우드 왕복 시간 제거 (지연 시간 감소)
  • 비용: 클라우드 API 호출 횟수 최소화
  • 오프라인 지원: 네트워크 없이도 기본적인 에이전트 동작 가능

지금 바로 GitHub에서 프로젝트를 클론하고, 간단한 PoC부터 시작해보세요. 6개월 후에는 이 기술이 Android 앱 개발의 표준이 되어 있을지도 모릅니다.

참고: 본 글은 Google Developers Blog - ADK for Kotlin & Android: Building AI agents를 기반으로 한국 개발자 관점에서 재해석했습니다.

본 콘텐츠는 신뢰할 수 있는 출처를 바탕으로 AI 도구를 활용하여 초안이 작성되었으며, 편집자의 검토를 거쳐 발행되었습니다. 전문가의 조언을 대체하지 않습니다.