Google ADK·AWS AgentCore와 Vercel AI SDK
클라우드 네이티브 vs 자체 호스팅
섹션 제목: “클라우드 네이티브 vs 자체 호스팅”에이전트 인프라를 직접 구축할지, 클라우드 제공자의 관리형 서비스를 사용할지는 중요한 아키텍처 결정입니다.
| 항목 | 클라우드 네이티브 | 자체 호스팅 |
|---|---|---|
| 초기 구축 비용 | 낮음 | 높음 |
| 운영 부담 | 낮음 (벤더 관리) | 높음 |
| 커스터마이징 | 제한적 | 자유로움 |
| 벤더 종속성 | 있음 | 없음 |
| 데이터 주권 | 제한적 | 완전 통제 |
| 확장성 | 자동 (추가 비용) | 직접 관리 |
Google ADK (Agent Development Kit)
섹션 제목: “Google ADK (Agent Development Kit)”Google ADK는 에이전트와 워크플로우를 작성하는 오픈소스 프레임워크입니다. Gemini·Google Cloud 통합을 제공하지만 ADK 자체가 관리형 호스팅 서비스인 것은 아닙니다. 실행 환경과 세션 저장소는 별도로 선택합니다.
멀티에이전트 구성
섹션 제목: “멀티에이전트 구성”import osfrom google.adk.agents import Agent, SequentialAgent, ParallelAgentfrom google.adk.tools import google_search
model = os.environ["GOOGLE_MODEL"]
# 개별 에이전트 정의researcher = Agent( name="researcher", model=model, instruction="주어진 주제를 Google 검색으로 조사합니다", tools=[google_search], output_key="research",)
coder = Agent( name="coder", model=model, instruction="다음 조사 결과를 바탕으로 Python 코드를 작성합니다: {research}", output_key="code",)
reviewer = Agent( name="reviewer", model=model, instruction="다음 코드를 리뷰하고 개선점을 제안합니다: {code}",)
# 순차 실행 파이프라인pipeline = SequentialAgent( name="dev_pipeline", sub_agents=[researcher, coder, reviewer],)
# 병렬 실행 (독립 작업)parallel_review = ParallelAgent( name="parallel_review", sub_agents=[ Agent(name="security_reviewer", model=model, instruction="코드의 보안을 검토하세요."), Agent(name="performance_reviewer", model=model, instruction="코드의 성능을 검토하세요."), ],)Cloud Run 배포
섹션 제목: “Cloud Run 배포”ADK의 Runner는 에이전트를 실행하는 구성요소입니다. 존재하지 않는 VertexAIRunner.deploy()를 호출하는 대신 공식 배포 CLI를 사용합니다. ./dev_agent/agent.py에서 위 파이프라인을 root_agent = pipeline으로 내보내고 __init__.py와 의존성을 구성합니다.
adk deploy cloud_run \ --project=YOUR_PROJECT_ID \ --region=us-central1 \ --service_name=dev-pipeline-agent \ ./dev_agent \ -- --no-allow-unauthenticatedGoogle Cloud 인증·Cloud Build 권한·결제와 모델 접근을 먼저 구성합니다. output_key로 저장한 상태를 {research}처럼 참조해야 순차 단계 사이의 자료 전달이 명확해집니다. 병렬 단계는 서로의 결과를 자동으로 전달하지 않습니다.
Cloud Run의 기본 메모리 세션은 인스턴스가 교체되면 사라집니다. 지속성이 필요하면 공식 배포 옵션의 세션·산출물 서비스 URI를 지정합니다.
핵심 특징
섹션 제목: “핵심 특징”| 기능 | 설명 |
|---|---|
| 모델 선택 | 계정에서 제공하는 모델 ID와 도구 지원 조합을 확인 |
| 도구 통합 | 검색·코드 실행 등 기능별 모델·도구 제약 확인 |
| 배포 선택 | Cloud Run과 관리형 에이전트 런타임 등 별도 배포 환경 선택 |
| 멀티모달 | 텍스트, 이미지, 오디오, 비디오 처리 |
AWS Bedrock Agents
섹션 제목: “AWS Bedrock Agents”AWS Bedrock Agents는 완전 관리형 에이전트 서비스입니다. 인프라 없이 API만으로 에이전트를 생성하고 운영할 수 있습니다.
핵심 구성 요소
섹션 제목: “핵심 구성 요소”┌─────────────────────────────────────────────┐│ Bedrock Agent │├─────────────┬───────────────────────────────┤│ Foundation │ Action Groups ││ Model │ (Lambda 함수로 구현된 도구) ││ (Claude, ├───────────────────────────────┤│ Llama 등) │ Knowledge Bases ││ │ (S3 + OpenSearch RAG) │└─────────────┴───────────────────────────────┘Action Groups — 에이전트 도구
섹션 제목: “Action Groups — 에이전트 도구”# Lambda 함수로 에이전트 도구 구현import json
def lambda_handler(event, context): """Bedrock Agent가 호출하는 Lambda 함수""" action_group = event.get('actionGroup') function = event.get('function') params = event.get('parameters', [])
# 파라미터 파싱 param_dict = {p['name']: p['value'] for p in params}
if function == 'get_order_status': order_id = param_dict['order_id'] status = get_order_from_db(order_id) return { 'messageVersion': '1.0', 'response': { 'actionGroup': action_group, 'function': function, 'functionResponse': { 'responseBody': { 'TEXT': {'body': json.dumps(status)} } } } }# Bedrock Agent 생성 (AWS SDK)import boto3import os
bedrock_agent = boto3.client('bedrock-agent', region_name='us-east-1')
agent = bedrock_agent.create_agent( agentName='order-assistant', agentResourceRoleArn='arn:aws:iam::123456789:role/BedrockAgentRole', foundationModel=os.environ['BEDROCK_AGENT_MODEL_ID'], instruction=""" 당신은 주문 관리 어시스턴트입니다. 고객의 주문 상태를 조회하고 문제를 해결합니다. """,)Knowledge Bases — RAG 통합
섹션 제목: “Knowledge Bases — RAG 통합”# 지식 베이스 생성 (S3 문서 → OpenSearch 벡터 DB)knowledge_base = bedrock_agent.create_knowledge_base( name='product-docs', roleArn='arn:aws:iam::123456789:role/BedrockKBRole', knowledgeBaseConfiguration={ 'type': 'VECTOR', 'vectorKnowledgeBaseConfiguration': { 'embeddingModelArn': os.environ['BEDROCK_EMBEDDING_MODEL_ARN'] } }, storageConfiguration={ 'type': 'OPENSEARCH_SERVERLESS', 'opensearchServerlessConfiguration': { 'collectionArn': 'arn:aws:aoss:...', 'vectorIndexName': 'product-index', 'fieldMapping': { 'vectorField': 'embedding', 'textField': 'content', 'metadataField': 'metadata', } } })Amazon Bedrock AgentCore와의 구분
섹션 제목: “Amazon Bedrock AgentCore와의 구분”위 Action Groups·Knowledge Bases 예제는 Bedrock Agents의 관리형 오케스트레이션입니다. AgentCore Runtime은 ADK·LangGraph·OpenAI Agents SDK 등으로 작성한 에이전트를 호스팅하는 실행 환경입니다. AgentCore의 Memory·Gateway·Identity·관측성 서비스는 함께 또는 개별적으로 사용할 수 있습니다.
하네스를 직접 작성할지, 관리형 루프에 맡길지도 별도 결정입니다. AgentCore Harness는 관리형 에이전트 루프를 제공하지만 Runtime에 사용자 정의 하네스를 배포하는 방식과 동일한 API는 아닙니다. 모델 선택·IAM·사용자별 세션 격리·요금은 선택한 서비스 기준으로 확인합니다.
Vercel AI SDK — 스트리밍 우선 설계
섹션 제목: “Vercel AI SDK — 스트리밍 우선 설계”Vercel AI SDK는 프론트엔드와 에이전트의 통합에 특화된 라이브러리입니다. React 훅과 스트리밍 응답이 핵심입니다.
다음 예제는 AI SDK 7 기준입니다. ai, @ai-sdk/react, 제공자 패키지를 같은 호환 세대로 설치하고, 서버 환경에 모델 API 자격 증명을 설정합니다.
import { streamText, tool, isStepCount, convertToModelMessages, createUIMessageStreamResponse, toUIMessageStream, type UIMessage,} from 'ai';import { z } from 'zod';
export async function POST(req: Request) { const { messages }: { messages: UIMessage[] } = await req.json(); const result = streamText({ model: 'anthropic/claude-sonnet-5.5', messages: await convertToModelMessages(messages), tools: { searchCode: tool({ description: 'Search an authorized code index', inputSchema: z.object({ query: z.string() }), execute: async ({ query }) => searchCodebase(query), }), }, stopWhen: isStepCount(10), });
return createUIMessageStreamResponse({ stream: toUIMessageStream({ stream: result.stream }), });}provider/model 문자열은 AI Gateway를 사용하는 예입니다. 직접 제공자 연결을 쓰면 제공자 SDK의 모델 객체를 전달합니다. searchCodebase는 애플리케이션이 구현하며 서버 인증·인가와 요청 데이터 검사를 별도로 적용합니다.
'use client';import { useChat } from '@ai-sdk/react';import { DefaultChatTransport } from 'ai';import { useState } from 'react';
export function AgentChat() { const [input, setInput] = useState(''); const { messages, sendMessage, status, error } = useChat({ transport: new DefaultChatTransport({ api: '/api/agent' }), }); const busy = status === 'submitted' || status === 'streaming';
return ( <div> {messages.map(message => ( <div key={message.id}> <strong>{message.role}:</strong> {message.parts.map((part, index) => part.type === 'text' ? <span key={index}>{part.text}</span> : null, )} </div> ))} {error && <p>응답을 처리하지 못했습니다.</p>} <form onSubmit={event => { event.preventDefault(); if (!input.trim() || busy) return; void sendMessage({ text: input }); setInput(''); }}> <input value={input} onChange={event => setInput(event.target.value)} /> <button disabled={busy}>전송</button> </form> </div> );}AI SDK 7은 stepCountIs를 isStepCount로 바꾸고 스트림 응답 변환을 독립 함수로 제공합니다. UI 메시지는 parts로 렌더링하고 모델 호출 전 convertToModelMessages로 변환합니다. 구형 ai/react, parameters, maxSteps, toDataStreamResponse 예제를 섞지 않습니다.
플랫폼 선택 가이드
섹션 제목: “플랫폼 선택 가이드”| 상황 | 권장 플랫폼 |
|---|---|
| Google Cloud 기반 인프라 + Gemini 활용 | Google ADK |
| 관리형 루프·Action Groups 중심 | AWS Bedrock Agents |
| 자체 프레임워크 + 관리형 런타임·운영 서비스 | Amazon Bedrock AgentCore |
| Next.js/React 프론트엔드 + 스트리밍 UI | Vercel AI SDK |
| 벤더 종속 없이 자체 제어 | LangGraph / OpenAI Agents SDK |
| 데이터 온프레미스 필수 | 자체 호스팅 프레임워크 |
Google ADK는 Gemini 최적화와 Vertex AI 통합으로 Google Cloud 환경에서 강력한 멀티에이전트 파이프라인을 제공합니다. AWS Bedrock Agents는 Lambda 기반 Action Groups와 Knowledge Bases RAG를 통해 완전 관리형 에이전트 서비스를 제공합니다. Vercel AI SDK는 React 훅과 스트리밍 설계로 프론트엔드와 에이전트의 통합에 특화되어 있습니다. 클라우드 네이티브 서비스는 운영 부담을 줄이는 대신 벤더 종속성과 커스터마이징 제한을 감수해야 합니다.