콘텐츠로 이동

Google ADK·AWS AgentCore와 Vercel AI SDK

클라우드 네이티브 vs 자체 호스팅

섹션 제목: “클라우드 네이티브 vs 자체 호스팅”

에이전트 인프라를 직접 구축할지, 클라우드 제공자의 관리형 서비스를 사용할지는 중요한 아키텍처 결정입니다.

항목클라우드 네이티브자체 호스팅
초기 구축 비용낮음높음
운영 부담낮음 (벤더 관리)높음
커스터마이징제한적자유로움
벤더 종속성있음없음
데이터 주권제한적완전 통제
확장성자동 (추가 비용)직접 관리

Google ADK는 에이전트와 워크플로우를 작성하는 오픈소스 프레임워크입니다. Gemini·Google Cloud 통합을 제공하지만 ADK 자체가 관리형 호스팅 서비스인 것은 아닙니다. 실행 환경과 세션 저장소는 별도로 선택합니다.

import os
from google.adk.agents import Agent, SequentialAgent, ParallelAgent
from 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="코드의 성능을 검토하세요."),
],
)

ADK의 Runner는 에이전트를 실행하는 구성요소입니다. 존재하지 않는 VertexAIRunner.deploy()를 호출하는 대신 공식 배포 CLI를 사용합니다. ./dev_agent/agent.py에서 위 파이프라인을 root_agent = pipeline으로 내보내고 __init__.py와 의존성을 구성합니다.

Terminal window
adk deploy cloud_run \
--project=YOUR_PROJECT_ID \
--region=us-central1 \
--service_name=dev-pipeline-agent \
./dev_agent \
-- --no-allow-unauthenticated

Google Cloud 인증·Cloud Build 권한·결제와 모델 접근을 먼저 구성합니다. output_key로 저장한 상태를 {research}처럼 참조해야 순차 단계 사이의 자료 전달이 명확해집니다. 병렬 단계는 서로의 결과를 자동으로 전달하지 않습니다.

Cloud Run의 기본 메모리 세션은 인스턴스가 교체되면 사라집니다. 지속성이 필요하면 공식 배포 옵션의 세션·산출물 서비스 URI를 지정합니다.

기능설명
모델 선택계정에서 제공하는 모델 ID와 도구 지원 조합을 확인
도구 통합검색·코드 실행 등 기능별 모델·도구 제약 확인
배포 선택Cloud Run과 관리형 에이전트 런타임 등 별도 배포 환경 선택
멀티모달텍스트, 이미지, 오디오, 비디오 처리

AWS Bedrock Agents는 완전 관리형 에이전트 서비스입니다. 인프라 없이 API만으로 에이전트를 생성하고 운영할 수 있습니다.

┌─────────────────────────────────────────────┐
│ Bedrock Agent │
├─────────────┬───────────────────────────────┤
│ Foundation │ Action Groups │
│ Model │ (Lambda 함수로 구현된 도구) │
│ (Claude, ├───────────────────────────────┤
│ Llama 등) │ Knowledge Bases │
│ │ (S3 + OpenSearch RAG) │
└─────────────┴───────────────────────────────┘
# 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 boto3
import 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="""
당신은 주문 관리 어시스턴트입니다.
고객의 주문 상태를 조회하고 문제를 해결합니다.
""",
)
# 지식 베이스 생성 (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',
}
}
}
)

위 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 자격 증명을 설정합니다.

app/api/agent/route.ts
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는 애플리케이션이 구현하며 서버 인증·인가와 요청 데이터 검사를 별도로 적용합니다.

app/page.tsx
'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 프론트엔드 + 스트리밍 UIVercel 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 훅과 스트리밍 설계로 프론트엔드와 에이전트의 통합에 특화되어 있습니다. 클라우드 네이티브 서비스는 운영 부담을 줄이는 대신 벤더 종속성과 커스터마이징 제한을 감수해야 합니다.