🤖 왜 지금 ADK for Kotlin인가?
AI 생태계가 클라우드 중심에서 엣지(Edge)로 급속히 이동하고 있습니다. 특히 구글이 Gemini Nano를 Android에 탑재한 이후, 1억 4천만 대 이상의 기기에서 온디바이스 AI가 가능해졌죠.
하지만 ‘클라우드 + 온디바이스’ 하이브리드 에이전트를 만드는 것은 생각보다 까다롭습니다. 상태 관리, 컨텍스트 전달, 에러 핸들링, 그리고 모델 간 오케스트레이션까지… 모든 걸 직접 구현하려면 프로젝트가 산으로 갑니다.
**ADK(Agent Development Kit)**는 이 복잡한 오케스트레이션을 프레임워크 레벨에서 처리해주는 오픈소스 도구입니다. 기존에 Java, Go, Python 2.0 베타가 있었는데, 이번에 Kotlin 0.1.0과 Android 전용 라이브러리가 추가됐습니다.
💡 핵심 포인트: 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: 에이전트가 사용할 수 있는 외부 함수/APIsubAgents: 하위 에이전트로 작업 위임 가능
🔧 @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())
)
이 예제에서 사용자가 "차가 공중에서 나타날 확률은?"이라고 묻으면, MissionControl이 HeartOfGold로 작업을 위임하고, HeartOfGold가 calculateImprobability 함수를 호출해 결과를 반환합니다.
⚠️ 주의사항 및 한계
- 0.1.0은 실험 버전입니다. 프로덕션에 바로 적용하기보다는 PoC(개념 증명) 수준으로 접근하는 것이 좋습니다.
- 온디바이스 모델의 성능 차이: Gemini Nano는 클라우드 모델보다 추론 능력이 제한적입니다. 복잡한 추론이 필요한 작업은 클라우드 모델로 fallback하는 전략이 필요합니다.
- KSP 의존성:
@Tool기능을 사용하려면 KSP 플러그인이 필수입니다. 컴파일 타임에 코드가 생성되므로 빌드 시간이 소폭 증가할 수 있습니다. - 프라이버시 vs 기능 트레이드오프: 온디바이스 처리는 프라이버시에 유리하지만, 모델의 지식 범위가 제한됩니다. 민감하지 않은 작업은 클라우드로 보내는 하이브리드 설계가 현실적입니다.
🇰🇷 한국 개발 생태계에서의 적용 맥락
국내 Android 앱 시장에서 AI 에이전트를 도입할 때 다음과 같은 시나리오를 고려해볼 수 있습니다.
- 금융 앱: 사용자의 거래 내역을 온디바이스에서 분석하여 민감 정보를 서버로 보내지 않고 개인화된 재정 조언 제공
- 쇼핑 앱: 상품 검색 시 온디바이스에서 사용자 취향을 분석하고, 가격 비교 등 무거운 연산은 클라우드 에이전트가 처리
- 헬스케어: 건강 데이터를 기기 내에서만 처리하여 HIPAA/GDPR 규제 대응
참고: 국내 SI/핀테크 환경에서는 데이터 주권(Data Sovereignty) 이슈가 특히 중요합니다. ADK의 온디바이스 아키텍처는 이러한 규제 요구사항을 자연스럽게 충족시킬 수 있는 강력한 무기입니다.
🚀 다음 단계 학습 방향
- 공식 GitHub 저장소에서 데모 앱 클론 후 직접 빌드해보기
- 간단한 TODO 앱에 ADK를 붙여서 음성 명령으로 할 일을 추가/수정하는 에이전트 만들어보기
@Tool을 활용해 외부 API(날씨, 뉴스, 캘린더)와 연동하는 복합 에이전트 구현- 온디바이스 모델(Gemini Nano)과 클라우드 모델 간의 자동 라우팅 로직을 커스터마이징하는 방법 학습
추가 자료: 본 내용은 구글 공식 개발자 블로그의 ADK for Kotlin & Android 발표를 기반으로 재구성했습니다.
함께 보면 좋은 글
- CSS로 완벽한 파이차트 만들기: 시맨틱과 접근성을 고려한 실전 가이드
- Holotron-12B: H Company의 새로운 컴퓨터 사용 AI 모델, NVIDIA Nemotron 기반으로 추론 효율 2배 향상

// 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
)

🧠 ADK의 핵심 아키텍처: 클라우드-엣지 오케스트레이션
ADK가 특별한 이유는 오케스트레이터(Orchestrator) 패턴을 프레임워크 레벨에서 내장하고 있기 때문입니다. I/O 세션에서 시연된 여행 도우미 앱을 예로 들어보겠습니다.
- 사용자가 여행 중 문제가 발생하면 클라우드 오케스트레이터가 사용자와 대화하며 문제를 파악합니다.
- 예약 확인이 필요할 때는 온디바이스 서브 에이전트에게 작업을 위임합니다.
- 서브 에이전트는 **Gemini Nano(온디바이스)**를 사용해 사용자의 로컬 문서에서 데이터를 추출합니다.
- 검증 에이전트가 여러 분석 결과를 비교하여 최종 응답을 생성합니다.
이 모든 과정에서 민감한 개인 데이터는 절대 기기를 벗어나지 않습니다.
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의 예측 가능성이 높아집니다.

✨ 마무리: 지금 시작해야 하는 이유
ADK for Kotlin/Android는 아직 0.1.0 알파 버전이지만, AI 에이전트를 모바일 앱에 통합하는 패러다임을 바꿀 잠재력을 가지고 있습니다.
- 프라이버시: 온디바이스 처리로 데이터 보호
- 성능: 클라우드 왕복 시간 제거 (지연 시간 감소)
- 비용: 클라우드 API 호출 횟수 최소화
- 오프라인 지원: 네트워크 없이도 기본적인 에이전트 동작 가능
지금 바로 GitHub에서 프로젝트를 클론하고, 간단한 PoC부터 시작해보세요. 6개월 후에는 이 기술이 Android 앱 개발의 표준이 되어 있을지도 모릅니다.
참고: 본 글은 Google Developers Blog - ADK for Kotlin & Android: Building AI agents를 기반으로 한국 개발자 관점에서 재해석했습니다.