안녕하세요~ 우뇽킴입니다.
정말 오랜만에 블로그에 글을 작성하게 되었네요. 그동안 여러 프로젝트와 업무로 바쁜 시간을 보내다 보니 어느새 시간이 훌쩍 지나가버렸습니다.
최근 MCP(Model Context Protocol)에 대해 학습하던 중, 회사 분의 소개로 Strands Agent SDK라는 흥미로운 도구를 알게 되었습니다. MCP가 AI 모델이 외부 시스템과 통신하는 표준화된 프로토콜이라면, Strands Agent는 이를 실제로 활용할 수 있는 강력한 Python SDK라고 할 수 있습니다. 호기심이 생겨서 직접 실습해보니 생각보다 훨씬 강력하고 사용하기 쉬운 도구였습니다.
오늘은 제가 처음부터 끝까지 직접 실습한 AWS Bedrock과 Strands Agent SDK를 활용한 AI 에이전트 구축 과정을 상세히 공유하려고 합니다. 처음 접하는 분들도 따라하실 수 있도록 실습 위주로 작성했으니, 천천히 읽어보시면서 직접 해보시면 좋을 것 같습니다!
AI 에이전트는 이런 한계를 극복합니다:
ChatGPT → AI 에이전트
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
대화만 가능 대화 + 실제 작업 수행
정적인 지식만 활용 외부 도구/API 활용
질문에 답변만 문제를 직접 해결
수동적 능동적
실제 사례:
AS-IS (기존 ChatGPT):
나: "출장 준비 좀 도와줘"
ChatGPT: "출장 준비 체크리스트를 알려드릴게요:
1. 항공권 예약
2. 호텔 예약
3. 렌터카 예약..."
나: (직접 다 해야 함)
TO-BE (AI 에이전트)
나: "다음 주 서울 출장 준비 좀 도와줘"
에이전트:
✓ 캘린더 확인: 다음 주 화~목 비어있음
✓ 항공편 검색: 월요일 오전 9시 출발 추천
✓ 호텔 검색: 강남역 인근 3곳 비교
✓ 날씨 확인: 비 예보 있으니 우산 챙기세요
✓ 회의실 예약: 수요일 오후 2시 예약 완료
초안 일정표 작성했습니다. 확인 후 예약할까요?
기존에 AI 모델을 사용하려면 여러 가지 어려움이 있었습니다:
기존 방식의 문제점:
AWS Bedrock의 해결책:
기존 방식 (직접 GPU 서버 관리):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. GPU 서버 구매/대여
2. 모델 다운로드 및 설치
3. 서버 관리 및 모니터링
4. 스케일링 수동 처리
AWS Bedrock (Serverless):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. API 호출만으로 즉시 사용
2. 서버 관리 불필요
3. 자동 스케일링
4. 사용한 만큼만 비용 지불
1) Foundation Model (기초 모델)
AWS Bedrock은 여러 AI 회사의 모델을 한곳에서 제공합니다:
# Anthropic의 Claude (가장 인기)
model_id = "anthropic.claude-3-haiku-20240307-v1:0" # 빠르고 효율적
model_id = "anthropic.claude-3-sonnet-20240229-v1:0" # 균형잡힌 성능
model_id = "anthropic.claude-3-5-sonnet-20241022-v2:0" # 최고 성능
# Meta의 Llama (오픈소스)
model_id = "meta.llama3-70b-instruct-v1:0"
# Amazon의 Titan (AWS 자체 모델)
model_id = "amazon.titan-text-express-v1"
모델 선택 가이드:
| Claude 3 Haiku | 빠르고 가벼움 | 챗봇, 간단한 질의응답 |
| Claude 3 Sonnet | 균형잡힌 성능 | 대부분의 업무 |
| Claude 3.5 Sonnet | 최고 성능 | 복잡한 추론, 코딩 |
2) Serverless 아키텍처
가장 큰 장점은 서버를 직접 관리하지 않아도 된다는 점입니다:
# 서버 설정, 관리 없이 바로 사용
import boto3
bedrock = boto3.client('bedrock-runtime')
response = bedrock.invoke_model(
modelId="anthropic.claude-3-haiku-20240307-v1:0",
body={"messages": [{"role": "user", "content": "안녕하세요"}]}
)
# 이게 전부!
3) 보안 및 데이터 프라이버시
# 데이터는 절대 학습에 사용되지 않음
response = bedrock.invoke_model(
modelId="anthropic.claude-3-haiku-20240307-v1:0",
body={
"messages": [{"role": "user", "content": "우리 회사 매출 데이터..."}]
}
)
# ✓ 데이터는 요청 처리 후 즉시 삭제
# ✓ AWS VPC 내에서만 처리
# ✓ 암호화 전송
1) 멀티 모델 전략
상황에 따라 최적의 모델을 선택할 수 있습니다:
# 상황에 따라 최적의 모델 선택 가능
if task == "간단한 챗봇":
model = "claude-3-haiku" # 빠르고 효율적
elif task == "복잡한 분석":
model = "claude-3-5-sonnet" # 고성능
elif task == "대량 문서 처리":
model = "claude-3-sonnet" # 균형잡힌 선택
```
**2) AWS 생태계와의 통합**
```
Bedrock + Lambda = 서버리스 AI 애플리케이션
Bedrock + S3 = 대용량 문서 처리
Bedrock + DynamoDB = AI 기반 데이터 분석
Bedrock + API Gateway = AI API 서비스
3) 엔터프라이즈급 안정성
문제: 직접 LLM API를 사용하면 너무 복잡하다
AWS Bedrock API를 직접 사용하면 다음과 같이 매우 복잡합니다:
# AWS Bedrock을 직접 사용하는 경우 (약 80줄 이상의 복잡한 코드)
import boto3
import json
bedrock = boto3.client('bedrock-runtime')
# 1. 도구 정의 (복잡한 JSON 스키마)
tools = [{
"name": "calculator",
"description": "수학 계산을 수행합니다",
"input_schema": {
"type": "object",
"properties": {
"expression": {"type": "string"}
},
"required": ["expression"]
}
}]
# 2. 첫 번째 API 호출
response = bedrock.invoke_model(...)
# 3. 응답 파싱
result = json.loads(response['body'].read())
# 4. 도구 호출이 필요한지 확인
if result['stop_reason'] == 'tool_use':
# 5. 실제 도구 실행
# 6. 도구 결과를 다시 API로 전송
# 7. 최종 응답 파싱
# ... 수십 줄의 복잡한 코드
해결: Strands Agent SDK
# Strands Agent SDK 사용
from strands import Agent
from strands.models.bedrock import BedrockModel
from strands_tools import calculator
model = BedrockModel(
model_id="anthropic.claude-3-haiku-20240307-v1:0"
)
agent = Agent(model=model, tools=[calculator])
response = agent("1764의 제곱근은?")
print(response) # 42
# 단 7줄로 동일한 기능!
1) Agent (에이전트)
에이전트는 LLM 모델과 도구(Tool)들을 연결하는 중심 역할을 합니다:
agent = Agent(
model=model, # 어떤 AI 모델을 사용할지
tools=[...] # 어떤 도구들을 사용할 수 있는지
)
2) Model (모델)
사용할 LLM 모델을 정의합니다:
# AWS Bedrock의 Claude
from strands.models.bedrock import BedrockModel
model = BedrockModel(model_id="anthropic.claude-3-haiku-20240307-v1:0")
# 또는 로컬 Ollama (무료)
from strands.models.ollama import OllamaModel
model = OllamaModel(model_id="llama3", host="http://localhost:11434")
3) Tool (도구)
에이전트가 실제 작업을 수행하기 위해 사용하는 기능들입니다:
from strands_tools import calculator, weather, search
agent = Agent(
model=model,
tools=[calculator, weather, search]
)
1) Tool Calling 자동화
에이전트가 자동으로 필요한 도구를 선택하고 실행합니다:
from strands_tools import calculator, weather, search
agent = Agent(
model=model,
tools=[calculator, weather, search]
)
# 에이전트가 알아서 필요한 도구 선택
response = agent("오늘 서울 날씨 알려주고, 1764의 제곱근도 계산해줘")
# 내부 동작:
# 1. "날씨" → weather 도구 호출
# 2. "제곱근" → calculator 도구 호출
# 3. 결과 통합해서 답변
2) 멀티 모델 지원
동일한 코드로 다양한 모델을 사용할 수 있습니다:
# AWS Bedrock의 Claude
from strands.models.bedrock import BedrockModel
model = BedrockModel(model_id="anthropic.claude-3-haiku-20240307-v1:0")
# 또는 OpenAI의 GPT
from strands.models.openai import OpenAIModel
model = OpenAIModel(model_id="gpt-4")
# 또는 로컬 Ollama (무료!)
from strands.models.ollama import OllamaModel
model = OllamaModel(model_id="llama3")
# 동일한 Agent 코드로 모든 모델 사용 가능!
agent = Agent(model=model, tools=[...])
3) 대화 기록 자동 관리
이전 대화 내용을 자동으로 기억합니다:
agent = Agent(model=model, tools=[])
agent("내 이름은 우뇽이야")
# Agent가 내부적으로 대화 기록 저장
response = agent("내 이름 뭐였지?")
print(response) # "우뇽이라고 하셨습니다"
4) 커스텀 도구 추가
자신만의 도구를 쉽게 만들 수 있습니다:
from strands.tools import Tool
class WeatherTool(Tool):
name = "weather"
description = "현재 날씨를 조회합니다"
def execute(self, city: str):
# 실제 날씨 API 호출
import requests
response = requests.get(f"https://api.weather.com/{city}")
return response.json()
# 즉시 사용 가능
agent = Agent(
model=model,
tools=[WeatherTool(), calculator]
)
```
### 3.4 MCP와 Strands Agent의 관계
**MCP (Model Context Protocol)**는 AI가 외부 시스템과 통신하는 **표준 프로토콜**입니다.
```
┌─────────────────────────────────────────────────────────┐
│ 사용자 애플리케이션 │
└───────────────────┬─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ Strands Agent SDK │
└───────────┬─────────────────────────────┬───────────────┘
│ │
▼ ▼
┌───────────────────────┐ ┌───────────────────────────┐
│ AWS Bedrock │ │ MCP 서버들 │
│ (LLM 모델) │ │ - AWS MCP Server │
│ - Claude │ │ - Google Drive MCP │
│ - Titan │ │ - Slack MCP │
└───────────────────────┘ └───────────────────────────┘
✓ macOS / Linux / Windows (WSL2)
✓ Python 3.11 이상
✓ 터미널 사용 기본 지식
✓ AWS 계정
가상환경을 사용하는 이유:
# 1. 작업 폴더로 이동
cd ~/Desktop
# 2. 가상환경 생성
python3.11 -m venv strands-bedrock
# strands-bedrock라는 이름의 가상환경 생성
# 3. 가상환경 활성화
source strands-bedrock/bin/activate
# 4. 활성화 확인
# 프롬프트 앞에 (strands-bedrock)이 표시되면 성공
# 예: (strands-bedrock) user@macbook Desktop %
가상환경 관련 명령어:
# 가상환경 비활성화 (작업 끝나면)
deactivate
# 가상환경 삭제 (완전히 제거하고 싶을 때)
rm -rf strands-bedrock # macOS/Linux
rmdir /s strands-bedrock # Windows
# 1. pip 최신화 (중요!)
pip install --upgrade pip
# 2. Strands Agent SDK 및 AWS SDK 설치
pip install strands-agents boto3
# 설치 중 출력 예시:
# Collecting strands-agents
# Downloading strands_agents-x.x.x-py3-none-any.whl
# Collecting boto3
# Downloading boto3-x.x.x-py3-none-any.whl
# Installing collected packages: ...
# Successfully installed strands-agents-x.x.x boto3-x.x.x ...
# 3. 설치 확인
pip list | grep strands
# strands-agents x.x.x 형태로 출력되면 성공
pip list | grep boto3
# boto3 x.x.x
# botocore x.x.x
설치되는 주요 패키지들:
설치 중 문제가 생기면:
# 캐시 삭제 후 재설치
pip cache purge
pip install --upgrade strands-agents boto3
# 또는 특정 버전 설치
pip install strands-agents==0.5.0 boto3==1.34.0
```
---
## 5. AWS Bedrock 설정
### 5.1 AWS 계정 및 IAM 설정
#### (1) AWS 콘솔에서 IAM 사용자 생성
AWS IAM(Identity and Access Management)은 AWS 리소스에 대한 접근을 안전하게 제어하는 서비스입니다.
**단계별 가이드**:
```
1. AWS 콘솔 로그인
→ https://console.aws.amazon.com/
2. 검색창에 "IAM" 입력
→ IAM 서비스 클릭
3. 왼쪽 메뉴에서 Users 클릭
→ Create user 버튼 클릭
4. 사용자 세부 정보
User name: bedrock-user (원하는 이름 입력)
☐ Provide user access to the AWS Management Console
(체크하지 않음 - 콘솔 접근 불필요)
→ Next 클릭
5. 권한 설정
Permissions options:
● Attach policies directly (선택)
Filter policies 검색창에 "Bedrock" 입력
☑ AmazonBedrockFullAccess (체크)
→ Next 클릭
6. 검토 및 생성
사용자 정보 확인
→ Create user 클릭
"User bedrock-user created successfully" 메시지 확인
```
#### (2) Access Key 발급
Access Key는 프로그램에서 AWS에 접근하기 위한 인증 정보입니다.
```
1. 생성한 사용자(bedrock-user) 클릭
→ 사용자 상세 페이지 진입
2. Security credentials 탭 클릭
3. Access keys 섹션으로 스크롤
→ Create access key 버튼 클릭
4. Use case 선택
● Command Line Interface (CLI) 선택
☑ I understand the above recommendation... (체크)
→ Next 클릭
5. Description (선택사항)
Description tag value: "For Strands Agent Development"
(나중에 구분하기 위한 설명)
→ Create access key 클릭
6. Access key 정보 복사
┌─────────────────────────────────────────────┐
│ Access key ID: │
│ AKIAXXXXXXXXXXXXXXXX │
│ │
│ Secret access key: │
│ wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY │
│ │
│ ⚠️ 이 화면을 벗어나면 다시 볼 수 없습니다! │
└─────────────────────────────────────────────┘
→ Download .csv file (안전하게 보관)
→ 또는 복사해서 안전한 곳에 저장
7. Done 클릭
```
**중요한 보안 원칙**:
```
✓ Access Key는 절대 GitHub 등에 업로드하지 말 것
✓ .env 파일이나 ~/.aws/credentials에만 저장
✓ 주기적으로 키 교체 (90일마다 권장)
✓ 사용하지 않는 키는 즉시 삭제
발급받은 Access Key를 시스템에 설정하는 방법입니다.
# AWS 기본 리전 설정
export AWS_DEFAULT_REGION="us-west-2"
# Access Key ID 설정 (위에서 복사한 실제 값으로 교체)
export AWS_ACCESS_KEY_ID="AKIAXXXXXXXXXXXXXXXX"
# Secret Access Key 설정 (위에서 복사한 실제 값으로 교체)
export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
# 설정 확인
echo $AWS_DEFAULT_REGION
# 출력: us-west-2
echo $AWS_ACCESS_KEY_ID
# 출력: AKIAXXXXXXXXXXXXXXXX
echo $AWS_SECRET_ACCESS_KEY
# 출력: wJalr... (일부만 표시됨)
Windows 사용자의 경우:
# PowerShell
$env:AWS_DEFAULT_REGION="us-west-2"
$env:AWS_ACCESS_KEY_ID="AKIAXXXXXXXXXXXXXXXX"
$env:AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
# 확인
echo $env:AWS_DEFAULT_REGION
macOS / Linux:
# 1. .aws 디렉토리 생성
mkdir -p ~/.aws
# 2. credentials 파일 생성 및 편집
nano ~/.aws/credentials
# 아래 내용 입력 (실제 값으로 교체)
[default]
aws_access_key_id = AKIAXXXXXXXXXXXXXXXX
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
# Control + O → Enter (저장)
# Control + X (종료)
# 3. config 파일 생성 및 편집
nano ~/.aws/config
# 아래 내용 입력
[default]
region = us-west-2
output = json
# Control + O → Enter (저장)
# Control + X (종료)
# 4. 파일 권한 설정 (보안을 위해)
chmod 600 ~/.aws/credentials
chmod 600 ~/.aws/config
또는 한 번에 생성:
# credentials 파일 생성
cat > ~/.aws/credentials << EOF
[default]
aws_access_key_id = AKIAXXXXXXXXXXXXXXXX
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
EOF
# config 파일 생성
cat > ~/.aws/config << EOF
[default]
region = us-west-2
output = json
EOF
# 권한 설정
chmod 600 ~/.aws/credentials ~/.aws/config
```
**Windows 사용자의 경우**:
```
1. C:\Users\[사용자명]\.aws 폴더 생성
2. 메모장으로 credentials 파일 생성
경로: C:\Users\[사용자명]\.aws\credentials
내용:
[default]
aws_access_key_id = AKIAXXXXXXXXXXXXXXXX
aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
3. 메모장으로 config 파일 생성
경로: C:\Users\[사용자명]\.aws\config
내용:
[default]
region = us-west-2
output = json
# AWS CLI가 설치되어 있다면
aws sts get-caller-identity
# 출력 예시:
# {
# "UserId": "AIDAXXXXXXXXXXXXXXXX",
# "Account": "123456789012",
# "Arn": "arn:aws:iam::123456789012:user/bedrock-user"
# }
# AWS CLI가 없다면 Python으로 확인
python3 << EOF
import boto3
try:
sts = boto3.client('sts')
identity = sts.get_caller_identity()
print(f"✓ AWS 인증 성공!")
print(f" Account: {identity['Account']}")
print(f" User: {identity['Arn']}")
except Exception as e:
print(f"✗ AWS 인증 실패: {e}")
EOF
```
### 5.3 Anthropic Claude 모델 사용 승인
AWS Bedrock에서 Anthropic Claude 모델은 첫 사용 시 use case 제출이 필요합니다.
#### (1) Model Catalog 접근
```
1. AWS 콘솔에서 검색창에 "Bedrock" 입력
→ Amazon Bedrock 서비스 클릭
2. 왼쪽 메뉴에서 "Model catalog" 클릭
3. 필터에서 "Anthropic" 선택
또는 검색창에 "Claude" 입력
```
#### (2) Claude 모델 선택 및 승인 요청
```
1. Claude 3 Haiku 모델 카드 클릭
(또는 Claude 3 Sonnet, Claude 3.5 Sonnet)
2. 모델 상세 페이지에서 "Request model access" 버튼 클릭
(또는 "Submit use case" 버튼)
3. Use case 양식 작성
┌─────────────────────────────────────────────┐
│ Company name: [회사명 또는 개인] │
│ │
│ Use case description: │
│ "Personal learning and experimentation │
│ with AI agents using Strands SDK. │
│ Building conversational AI applications │
│ for educational purposes." │
│ │
│ Industry: Technology / Software Development │
│ │
│ Expected monthly usage: Low (< 1M tokens) │
└─────────────────────────────────────────────┘
4. 약관 동의
☑ I acknowledge that Anthropic will receive...
5. Submit 버튼 클릭
6. "Request submitted successfully" 메시지 확인
```
#### (3) 승인 확인
승인은 보통 수 분~수 시간 내에 완료됩니다.
**방법 1: 이메일 확인**
```
AWS 계정에 등록된 이메일로
"Amazon Bedrock Model Access Request Approved"
제목의 이메일 수신
```
**방법 2: Bedrock Playground에서 테스트**
```
1. AWS 콘솔 → Bedrock → Playgrounds → Chat
2. Select model: Claude 3 Haiku 선택
3. 테스트 메시지 입력:
"안녕하세요, 테스트 중입니다."
4. Run 버튼 클릭
5. 정상 응답이 오면 승인 완료!
응답 예시:
"안녕하세요! 무엇을 도와드릴까요?"
방법 3: Python 코드로 확인
import boto3
import json
bedrock = boto3.client('bedrock-runtime', region_name='us-west-2')
try:
response = bedrock.invoke_model(
modelId='anthropic.claude-3-haiku-20240307-v1:0',
body=json.dumps({
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 100,
"messages": [
{"role": "user", "content": "안녕하세요"}
]
})
)
result = json.loads(response['body'].read())
print("✓ Claude 모델 접근 성공!")
print(f"응답: {result['content'][0]['text']}")
except Exception as e:
print(f"✗ 오류: {e}")
print("아직 승인이 완료되지 않았을 수 있습니다.")
```
#### (4) 승인이 안 되는 경우
승인이 24시간 이상 지연되면:
```
1. AWS Support Center 접속
→ Create case
2. Case details:
Service: Amazon Bedrock
Category: Model Access
Description:
"I submitted a request to access Anthropic Claude models
24 hours ago but haven't received approval yet.
Please help expedite the process.
Use case: Educational/Learning purposes
Region: us-west-2"
3. Submit case
보통 1-2 영업일 내 승인 완료
대안: 다른 모델로 먼저 테스트
# Claude 승인 대기 중이라면 Amazon Titan으로 먼저 테스트
model = BedrockModel(
model_id="amazon.titan-text-express-v1" # 승인 불필요
)
모든 설정이 완료되었는지 확인하는 스크립트:
파일 생성: nano check_setup.py
import sys
import os
print("=" * 50)
print("Strands Agent 환경 설정 확인")
print("=" * 50)
# 1. Python 버전 확인
print("\n[1] Python 버전 확인")
print(f" Python: {sys.version}")
if sys.version_info >= (3, 11):
print(" ✓ Python 3.11 이상")
else:
print(" ✗ Python 3.11 이상 필요")
# 2. 가상환경 확인
print("\n[2] 가상환경 확인")
if hasattr(sys, 'real_prefix') or (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix):
print(" ✓ 가상환경 활성화됨")
else:
print(" ✗ 가상환경이 활성화되지 않음")
# 3. 패키지 확인
print("\n[3] 필수 패키지 확인")
try:
import strands
print(f" ✓ strands-agents 설치됨")
except ImportError:
print(f" ✗ strands-agents 미설치")
try:
import boto3
print(f" ✓ boto3 설치됨")
except ImportError:
print(f" ✗ boto3 미설치")
# 4. AWS 자격증명 확인
print("\n[4] AWS 자격증명 확인")
access_key = os.environ.get('AWS_ACCESS_KEY_ID')
secret_key = os.environ.get('AWS_SECRET_ACCESS_KEY')
region = os.environ.get('AWS_DEFAULT_REGION')
if access_key:
print(f" ✓ AWS_ACCESS_KEY_ID 설정됨 ({access_key[:5]}...)")
else:
print(f" ✗ AWS_ACCESS_KEY_ID 미설정")
if secret_key:
print(f" ✓ AWS_SECRET_ACCESS_KEY 설정됨")
else:
print(f" ✗ AWS_SECRET_ACCESS_KEY 미설정")
if region:
print(f" ✓ AWS_DEFAULT_REGION 설정됨 ({region})")
else:
print(f" ✗ AWS_DEFAULT_REGION 미설정")
# 5. AWS 연결 테스트
print("\n[5] AWS Bedrock 연결 테스트")
try:
import boto3
sts = boto3.client('sts')
identity = sts.get_caller_identity()
print(f" ✓ AWS 인증 성공")
print(f" Account: {identity['Account']}")
print(f" User: {identity['Arn'].split('/')[-1]}")
except Exception as e:
print(f" ✗ AWS 인증 실패: {e}")
# 6. Claude 모델 접근 테스트
print("\n[6] Claude 모델 접근 테스트")
try:
import boto3
import json
bedrock = boto3.client('bedrock-runtime', region_name='us-west-2')
response = bedrock.invoke_model(
modelId='anthropic.claude-3-haiku-20240307-v1:0',
body=json.dumps({
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 10,
"messages": [{"role": "user", "content": "Hi"}]
})
)
print(f" ✓ Claude 3 Haiku 모델 접근 성공")
except Exception as e:
print(f" ✗ Claude 모델 접근 실패: {e}")
print(f" → Model access 승인 필요할 수 있습니다")
print("\n" + "=" * 50)
print("환경 설정 확인 완료")
print("=" * 50)
실행:
python check_setup.py
```
**정상적인 출력 예시**:
```
==================================================
Strands Agent 환경 설정 확인
==================================================
[1] Python 버전 확인
Python: 3.11.x
✓ Python 3.11 이상
[2] 가상환경 확인
✓ 가상환경 활성화됨
[3] 필수 패키지 확인
✓ strands-agents 설치됨
✓ boto3 설치됨
[4] AWS 자격증명 확인
✓ AWS_ACCESS_KEY_ID 설정됨 (AKIAV...)
✓ AWS_SECRET_ACCESS_KEY 설정됨
✓ AWS_DEFAULT_REGION 설정됨 (us-west-2)
[5] AWS Bedrock 연결 테스트
✓ AWS 인증 성공
Account: 123456789012
User: bedrock-user
[6] Claude 모델 접근 테스트
✓ Claude 3 Haiku 모델 접근 성공
==================================================
환경 설정 확인 완료
==================================================
모든 항목에 ✓ 표시가 나오면 환경 설정이 완벽하게 완료된 것입니다!
먼저 도구 없이 기본 대화만 하는 에이전트를 만들어봅시다.
파일 생성: nano simple_agent.py
from strands import Agent # Strands 핵심 Agent 클래스
from strands.models.bedrock import BedrockModel # Bedrock 모델 사용 클래스
print("🤖 Strands + Claude 3 Haiku 에이전트 시작!")
print("quit 입력 시 종료\n")
# Claude 3 Haiku 모델 설정
model = BedrockModel(
model_id="anthropic.claude-3-haiku-20240307-v1:0"
)
# 에이전트 생성 (도구 없이 기본 대화만)
agent = Agent(
model=model,
tools=[] # 빈 리스트 = 도구 없음
)
# 인터랙티브 루프
while True:
user_input = input("🙋 당신: ").strip()
# 종료 명령어
if user_input.lower() in ["quit", "exit", "bye", "종료"]:
print("👋 안녕히 가세요!")
break
# 빈 입력 무시
if not user_input:
continue
print("🤖 Claude: ", end="", flush=True)
response = agent(user_input)
print(response)
print()
저장 및 실행:
# nano 에디터에서
# Control + O → Enter (저장)
# Control + X (종료)
# 실행
python simple_agent.py
```
**실행 결과**:
```
🤖 Strands + Claude 3 Haiku 에이전트 시작!
quit 입력 시 종료
🙋 당신: 안녕하세요
🤖 Claude: 안녕하세요! 무엇을 도와드릴까요?
🙋 당신: 1764의 제곱근은?
🤖 Claude: 1764의 제곱근은 약 42입니다.
🙋 당신: quit
👋 안녕히 가세요!
핵심 포인트:
이제 계산기 도구를 추가해서 100% 정확한 계산을 수행하게 만들어봅시다.
파일 생성: nano calculator_agent.py
from strands import Agent
from strands.models.bedrock import BedrockModel
from strands_tools import calculator # calculator 도구 import
print("🤖 Strands + Claude 3 Haiku (Calculator Tool 포함)")
print("quit 입력 시 종료\n")
# Claude 3 Haiku 모델 설정
model = BedrockModel(
model_id="anthropic.claude-3-haiku-20240307-v1:0"
)
# 에이전트 생성 (calculator 도구 추가)
agent = Agent(
model=model,
tools=[calculator] # calculator 도구 활성화
)
# 인터랙티브 루프
while True:
user_input = input("🙋 당신: ").strip()
if user_input.lower() in ["quit", "exit", "bye", "종료"]:
print("👋 안녕히 가세요!")
break
if not user_input:
continue
print("🤖 Claude: ", end="", flush=True)
response = agent(user_input)
print(response)
print()
실행:
python calculator_agent.py
```
**실행 결과**:
```
🤖 Strands + Claude 3 Haiku (Calculator Tool 포함)
quit 입력 시 종료
🙋 당신: 1764의 제곱근은?
🤖 Claude:
Tool #1: calculator
42
🙋 당신: 123 곱하기 456은?
🤖 Claude:
Tool #1: calculator
56088
🙋 당신: quit
👋 안녕히 가세요!
```
**무슨 일이 일어났나?**
```
사용자: "1764의 제곱근은?"
↓
1. Claude가 질문 분석: "계산이 필요하구나"
↓
2. Claude가 결정: "calculator 도구를 사용하자"
↓
3. Strands Agent가 실제 calculator 실행
↓
4. 계산 결과: 42 (100% 정확)
↓
5. "Tool #1: calculator" 출력 (어떤 도구 사용했는지 표시)
↓
6. 최종 답변: 42
도구 없이 vs 도구 사용 비교:
| 도구 없이 | "약 42입니다" | Claude의 추정 |
| 도구 사용 | "42" | 100% 정확 |
실제 프로젝트에서는 여러 도구를 조합해서 사용합니다.
파일 생성: nano multi_tool_agent.py
from strands import Agent
from strands.models.bedrock import BedrockModel
from strands_tools import calculator, weather, search # 여러 도구 import
print("🤖 Strands + Claude 3 Haiku (Multi-Tool Agent)")
print("사용 가능한 도구: calculator, weather, search")
print("quit 입력 시 종료\n")
model = BedrockModel(
model_id="anthropic.claude-3-haiku-20240307-v1:0"
)
# 여러 도구를 리스트로 전달
agent = Agent(
model=model,
tools=[calculator, weather, search] # 3개 도구 활성화
)
while True:
user_input = input("🙋 당신: ").strip()
if user_input.lower() in ["quit", "exit", "bye", "종료"]:
print("👋 안녕히 가세요!")
break
if not user_input:
continue
print("🤖 Claude: ", end="", flush=True)
response = agent(user_input)
print(response)
print()
실행:
python multi_tool_agent.py
```
**실행 결과 예시**:
```
🤖 Strands + Claude 3 Haiku (Multi-Tool Agent)
사용 가능한 도구: calculator, weather, search
quit 입력 시 종료
🙋 당신: 오늘 서울 날씨 알려주고, 1764의 제곱근도 계산해줘
🤖 Claude:
Tool #1: weather
현재 서울 날씨는 맑음, 기온 8도입니다.
Tool #2: calculator
1764의 제곱근은 42입니다.
🙋 당신: 최신 AI 뉴스 검색해줘
🤖 Claude:
Tool #1: search
최근 AI 관련 주요 뉴스를 검색했습니다...
🙋 당신: quit
👋 안녕히 가세요!
```
**핵심 동작 원리**:
에이전트가 자동으로 다음과 같이 판단합니다:
```
사용자 질문 분석
↓
"서울 날씨" 키워드 발견 → weather 도구 선택
"제곱근 계산" 키워드 발견 → calculator 도구 선택
↓
두 도구를 순차적으로 실행
↓
결과를 통합해서 자연스러운 답변 생성
이것이 바로 Agentic AI의 핵심입니다. 사람이 "이 도구를 써라"고 명시하지 않아도, AI가 스스로 판단해서 필요한 도구를 선택하고 실행합니다.
실제 서비스에서는 어떤 도구가 언제 호출되었는지 로그를 남기는 것이 중요합니다.
파일 생성: nano tool_tracking_agent.py
from strands import Agent
from strands.models.bedrock import BedrockModel
from strands_tools import calculator
from datetime import datetime
print("🤖 Strands + Claude 3 Haiku (Tool Event 추적)")
print("quit 입력 시 종료\n")
model = BedrockModel(
model_id="anthropic.claude-3-haiku-20240307-v1:0"
)
agent = Agent(
model=model,
tools=[calculator]
)
while True:
user_input = input("🙋 당신: ").strip()
if user_input.lower() in ["quit", "exit", "bye", "종료"]:
print("👋 안녕히 가세요!")
break
if not user_input:
continue
# 시작 시간 기록
start_time = datetime.now()
print("\n--- 🔍 처리 시작 ---")
print(f"시작 시간: {start_time.strftime('%Y-%m-%d %H:%M:%S')}")
response = agent(user_input)
# 종료 시간 및 소요 시간 계산
end_time = datetime.now()
duration = (end_time - start_time).total_seconds()
print(f"종료 시간: {end_time.strftime('%Y-%m-%d %H:%M:%S')}")
print(f"소요 시간: {duration:.2f}초")
print("--- ✅ 처리 완료 ---\n")
print(f"🤖 Claude: {response}\n")
```
**실행 결과**:
```
🙋 당신: 1764의 제곱근은?
--- 🔍 처리 시작 ---
시작 시간: 2025-01-18 14:30:45
Tool #1: calculator
42
종료 시간: 2025-01-18 14:30:47
소요 시간: 1.85초
--- ✅ 처리 완료 ---
🤖 Claude: 42
이렇게 하면:
모든 정보를 추적할 수 있습니다.
지금까지 배운 내용을 모두 활용한 종합 예제입니다.
파일 생성: nano comprehensive_agent.py
from strands import Agent
from strands.models.bedrock import BedrockModel
from strands_tools import calculator, weather, search
from datetime import datetime
print("=" * 60)
print("🤖 Strands Agent - 종합 실습 버전")
print("=" * 60)
print("\n사용 가능한 도구:")
print(" - calculator: 수학 계산")
print(" - weather: 날씨 조회")
print(" - search: 웹 검색")
print("\n명령어:")
print(" - quit: 종료")
print(" - help: 도움말")
print("=" * 60)
print()
# 모델 설정
model = BedrockModel(
model_id="anthropic.claude-3-haiku-20240307-v1:0"
)
# 에이전트 생성
agent = Agent(
model=model,
tools=[calculator, weather, search]
)
# 대화 기록 저장
conversation_history = []
while True:
user_input = input("🙋 당신: ").strip()
# 종료
if user_input.lower() in ["quit", "exit", "bye", "종료"]:
print("\n👋 안녕히 가세요!")
print(f"총 {len(conversation_history)}번의 대화를 나눴습니다.")
break
# 도움말
if user_input.lower() == "help":
print("\n📖 도움말:")
print(" 예시 질문:")
print(" - 1764의 제곱근은?")
print(" - 오늘 서울 날씨 어때?")
print(" - 최신 AI 뉴스 검색해줘")
print(" - 오늘 날씨 알려주고 123 곱하기 456도 계산해줘")
print()
continue
# 빈 입력
if not user_input:
continue
# 처리 시작
start_time = datetime.now()
print()
try:
response = agent(user_input)
# 소요 시간 계산
duration = (datetime.now() - start_time).total_seconds()
print(f"\n🤖 Claude: {response}")
print(f"⏱️ 처리 시간: {duration:.2f}초")
# 대화 기록 저장
conversation_history.append({
"timestamp": start_time,
"user": user_input,
"assistant": response,
"duration": duration
})
except Exception as e:
print(f"\n❌ 오류 발생: {e}")
print()
실행:
python comprehensive_agent.py
```
**실행 결과**:
```
============================================================
🤖 Strands Agent - 종합 실습 버전
============================================================
사용 가능한 도구:
- calculator: 수학 계산
- weather: 날씨 조회
- search: 웹 검색
명령어:
- quit: 종료
- help: 도움말
============================================================
🙋 당신: help
📖 도움말:
예시 질문:
- 1764의 제곱근은?
- 오늘 서울 날씨 어때?
- 최신 AI 뉴스 검색해줘
- 오늘 날씨 알려주고 123 곱하기 456도 계산해줘
🙋 당신: 오늘 서울 날씨 알려주고 1764의 제곱근도 계산해줘
Tool #1: weather
Tool #2: calculator
🤖 Claude: 현재 서울 날씨는 맑음, 기온 8도입니다.
1764의 제곱근은 42입니다.
⏱️ 처리 시간: 2.34초
🙋 당신: quit
👋 안녕히 가세요!
총 1번의 대화를 나눴습니다.
```
이 종합 예제는:
- 여러 도구 동시 사용
- 처리 시간 추적
- 대화 기록 저장
- 도움말 제공
- 오류 처리
등 실제 서비스에 필요한 모든 기능을 포함하고 있습니다.
---
## 마치며
MCP를 학습하던 중 회사 분의 소개로 알게 된 Strands Agent SDK를 직접 실습해보면서, AI 에이전트가 실제로 어떻게 동작하는지 깊이 이해할 수 있었습니다.
특히 인상 깊었던 점은 **Tool Calling의 강력함**입니다. LLM이 스스로 필요한 도구를 판단하고 실행하는 모습을 보면서, 이것이 진정한 "에이전트"라는 느낌을 받았습니다. 단순히 텍스트를 생성하는 것을 넘어서, 실제로 작업을 수행하고 문제를 해결하는 시스템을 만들 수 있다는 가능성을 확인했습니다.
**이번 실습에서 배운 핵심**:
1. **AI 에이전트의 본질**: LLM(판단) + Tool(실행)의 결합
2. **AWS Bedrock**: 서버리스 AI 인프라의 편리함
3. **Strands Agent SDK**: 복잡한 것을 단순하게 만드는 힘
4. **Tool Calling**: AI가 스스로 필요한 도구를 선택하고 실행
**실습을 통해 구현한 것들**:
```
✓ 기본 대화형 에이전트
✓ Calculator Tool을 활용한 정확한 계산
✓ 여러 도구를 동시에 사용하는 멀티 툴 에이전트
✓ 도구 호출 추적 및 로깅
✓ 처리 시간 측정
✓ 대화 기록 저장
✓ 오류 처리
이 글이 Strands Agent SDK나 AI 에이전트 개발에 관심 있는 분들에게 도움이 되었으면 좋겠습니다. 실습 과정에서 겪은 시행착오와 해결 과정을 최대한 상세히 담으려고 노력했습니다.
긴 글 읽어주셔서 감사합니다.
참고 자료:
| 반복 작업은 이제 그만, n8n으로 업무 자동화하기 (0) | 2026.01.31 |
|---|---|
| MCP(Model Context Protocol)란? - AI의 손발이 되어주는 새로운 표준 (1) | 2026.01.17 |
댓글 영역