본문 바로가기

AI Agent

Strands Agents 완전 가이드 1편 — AWS가 만든 AI 에이전트 프레임워크

반응형

탄생 배경

AWS 안에는 수십 개의 AI 에이전트 팀이 있어요. Amazon Q Developer, AWS Glue, VPC Reachability Analyzer 등 실제 프로덕션에서 사용하는 에이전트들이에요.

근데 2024년까지 이 팀들이 공통으로 겪은 문제가 있었어요.

기존 프레임워크 (LangGraph, CrewAI 등)로 에이전트 만들 때:

프로토타입 → 프로덕션 배포: 수 개월 소요
복잡한 워크플로우 코드 수천 줄
새 기능 추가할 때마다 대규모 수정
예상 못한 입력이 오면 에이전트 붕괴
LLM이 좋아져도 프레임워크가 발목을 잡음

AWS Q Developer 팀의 말:

"LLM이 드라마틱하게 좋아지고 있는데
 프레임워크가 그 능력을 발휘 못하게 막고 있었다"

그래서 내부적으로 새 접근법을 시도했어요. 결과는:

프로토타입 → 프로덕션: 수 개월 → 며칠~몇 주
코드량: 수천 줄 → 수십 줄

이 접근법을 오픈소스로 공개한 게 Strands Agents예요.


Strands Agents가 뭔가

AWS가 2025년 5월 공개한 오픈소스 AI 에이전트 SDK예요.

만든 곳: AWS (Amazon Web Services)
출시:    2025년 5월
라이선스: Apache 2.0 (완전 무료, 상업 사용 가능)
언어:    Python, TypeScript
다운로드: 1,400만+ 회
기여:    Anthropic, Meta, Accenture, PwC 등

실제 AWS 프로덕션 서비스에서 사용 중:

Amazon Q Developer  ← AWS의 AI 코딩 어시스턴트
AWS Glue            ← 데이터 파이프라인 서비스
Kiro                ← AWS AI IDE
VPC Reachability Analyzer

핵심 철학 — Model-Driven Approach

Strands의 가장 큰 차별점이에요.

기존 프레임워크 방식:

# 개발자가 모든 흐름을 코드로 정의
def agent_workflow(input):
    step1 = gather_information(input)      # 1단계
    step2 = analyze_data(step1)            # 2단계
    if step2.needs_more_info:
        step3 = search_web(step2.query)    # 조건 분기
        step4 = analyze_data(step3)
    else:
        step4 = step2
    step5 = generate_response(step4)       # 최종 단계
    return step5

# 예상 못한 입력 오면? → 붕괴
# 새 기능 추가하면? → 전체 수정
# 코드: 수백~수천 줄

Strands 방식:

from strands import Agent, tool

@tool
def search_web(query: str) -> str:
    """웹에서 정보를 검색합니다"""
    ...

@tool
def analyze_data(data: str) -> str:
    """데이터를 분석합니다"""
    ...

# 흐름은 LLM이 스스로 결정
agent = Agent(
    system_prompt="정보를 수집하고 분석해서 답변해줘",
    tools=[search_web, analyze_data]
)

agent("이 데이터 분석해줘")  # LLM이 알아서 툴 선택하고 실행

차이:

기존: 개발자가 모든 경우의 수를 코드로 정의
      → 예상 못한 상황에 취약
      → 코드량 많음

Strands: LLM이 스스로 판단하고 툴 선택
         → 예상 못한 상황도 유연하게 처리
         → 코드량 극적으로 줄어듦
         → 모델이 좋아질수록 에이전트도 좋아짐

다른 프레임워크와 비교

LangGraph:
→ 그래프 기반 워크플로우 설계
→ 복잡하지만 정밀한 제어 가능
→ 상태 관리, 체크포인트 강력
→ 배우는 데 시간 걸림

CrewAI:
→ 역할 기반 멀티에이전트 팀
→ 설정 많음
→ 프로덕션에서 불안정 사례 있음

smolagents:
→ HuggingFace 초경량
→ Code Agent 특화
→ 기능 제한적

Strands Agents:
→ 가장 적은 코드로 동작
→ AWS/Bedrock 네이티브 연동
→ 프로덕션 검증됨 (실제 AWS 서비스에서 사용)
→ Python + TypeScript 지원
→ MCP 네이티브 지원
→ 멀티에이전트 패턴 내장

핵심 기능 5가지

1. 극단적 단순함

# 이게 전부예요
from strands import Agent

agent = Agent()
agent("서울의 인구가 얼마야?")

툴 없이도 동작해요. 기본 LLM 추론만으로.

2. 모델 독립성

from strands import Agent
from strands.models import BedrockModel, AnthropicModel

# Amazon Bedrock + Claude
agent = Agent(model=BedrockModel(model_id="anthropic.claude-sonnet-4-6"))

# Anthropic 직접 API
agent = Agent(model=AnthropicModel(model_id="claude-sonnet-4-6"))

# OpenAI
from strands.models import OpenAIModel
agent = Agent(model=OpenAIModel(model_id="gpt-5.4"))

# Ollama (로컬)
from strands.models import OllamaModel
agent = Agent(model=OllamaModel(model_id="llama4"))

# 모델 바꿔도 나머지 코드 그대로

3. @tool 데코레이터

파이썬 함수에 데코레이터 하나만 붙이면 에이전트 툴이 돼요.

from strands import tool

@tool
def get_stock_price(ticker: str) -> float:
    """주식 가격을 조회합니다.

    Args:
        ticker: 주식 티커 심볼 (예: AAPL, GOOGL)

    Returns:
        현재 주식 가격 (USD)
    """
    # 실제 API 호출
    return fetch_price(ticker)

docstring이 에이전트에게 "이 툴이 언제 필요한지" 알려줘요. 잘 쓸수록 에이전트가 더 정확하게 툴을 선택해요.

4. 멀티에이전트 내장

from strands import Agent
from strands.multiagent import Swarm, Graph, Workflow

# Swarm: 동일한 에이전트 여러 개 병렬 실행
swarm = Swarm(agent=my_agent, max_agents=5)

# Graph: 에이전트 간 복잡한 의존 관계
graph = Graph(nodes=[agent_a, agent_b, agent_c])

# Workflow: 순차 실행
workflow = Workflow(steps=[agent_a, agent_b])

5. MCP 네이티브 지원

from strands import Agent
from strands.tools.mcp import MCPClient

# MCP 서버 연결
mcp_client = MCPClient(server_url="http://localhost:3000")

agent = Agent(
    tools=mcp_client.list_tools()  # MCP 툴 자동 로드
)

AWS 생태계 연동

AWS를 이미 쓰고 있다면 이게 제일 큰 장점이에요.

from strands import Agent
from strands.tools import (
    retrieve,        # Amazon Bedrock Knowledge Bases
    dynamodb_tool,   # DynamoDB 조회/쓰기
    s3_tool,         # S3 파일 읽기/쓰기
    lambda_tool,     # Lambda 함수 실행
)

agent = Agent(
    system_prompt="AWS 인프라 관리 에이전트입니다",
    tools=[retrieve, dynamodb_tool, s3_tool, lambda_tool]
)

별도 설정 없이 IAM 권한만 있으면 바로 연동돼요.


언제 Strands를 써야 하나

✅ 이미 AWS 인프라 사용 중
   → S3, DynamoDB, Bedrock, Lambda 연동 가장 쉬움

✅ Claude를 Bedrock으로 쓰는 팀
   → 네이티브 지원, 설정 최소화

✅ 빠르게 프로토타입 → 프로덕션
   → 코드량 최소, 검증된 패턴

✅ 기업/엔터프라이즈 환경
   → IAM 권한 관리, 관찰성(OpenTelemetry) 내장
   → Accenture, PwC 같은 기업들이 실제 사용 중

✅ Python 또는 TypeScript 팀
   → 두 언어 모두 공식 지원

이런 상황엔 다른 프레임워크가 나을 수 있어요:

❌ AWS 안 씀, Azure/GCP만 씀
   → LangGraph나 smolagents가 더 적합

❌ 복잡한 상태 기계, 체크포인트 필요
   → LangGraph가 더 강력

❌ 역할 기반 멀티에이전트 팀 구성
   → CrewAI가 더 직관적

❌ 완전 노코드 원함
   → Dify, LangFlow 추천

2편 예고

2편 — 실전 튜토리얼:
- 설치 및 환경 설정
- 첫 번째 에이전트 (5분)
- 커스텀 툴 만들기
- AWS 서비스 연동 (S3, DynamoDB)
- 멀티에이전트 구성
- Lambda 배포

 

📌 다음 글: Strands Agents 2편 — 실전 튜토리얼

 

Strands Agents 완전 가이드 2편 — 실전 튜토리얼

1편에서 Strands Agents의 개요와 철학을 다뤘어요.이번 편은 실제로 손으로 만들어봐요.이번 편에서 만드는 것:1. 설치 및 환경 설정2. 첫 번째 에이전트 (5분)3. 커스텀 툴 만들기4. Anthropic API 직접 연

cell-devlog.tistory.com

 

반응형