Home / Strands SDK ๊ธฐ์ดˆ / ๐ŸŽฏ Strands SDK ๊ธฐ์ดˆ
Module

๐ŸŽฏ Strands SDK ๊ธฐ์ดˆ

์—์ด์ „ํ‹ฑ ๋ฃจํ”„, ๋„๊ตฌ, MCP, Structured Output

โฑ 60๋ถ„ 82 / 189

Strands Agents SDK

Agent ยท Tool ยท Model ยท MCP

์—์ด์ „ํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ•

3์ค„ ์ฝ”๋“œ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ”„๋กœ๋•์…˜ ์—์ด์ „ํŠธ SDK

Strands Agents SDK ๊ฐœ์š”

Model-Driven ยท 4ํŒจํ‚ค์ง€ ยท Python + TypeScript

PART 1 ยท Strands Agents SDK ๊ฐœ์š”

์—์ด์ „ํŠธ ๊ฐœ๋ฐœ์˜ ํŒจ๋Ÿฌ๋‹ค์ž„ ์ „ํ™˜

LLM์˜ ์ถ”๋ก  ๋„์•ฝ์ด ๋ฐ”๊พผ ํŒ๋‹จ์˜ ์ฃผ์ฒด

takeaway

์„ธ๋Œ€๊ฐ€ ๋‚ด๋ ค์˜ฌ์ˆ˜๋ก ๊ฐœ๋ฐœ์ž๊ฐ€ ์“ฐ๋Š” ์ฝ”๋“œ๋Š” ์ค„์–ด๋“ค๊ณ 
๋ชจ๋ธ์˜ ํŒ๋‹จ ๋ฒ”์œ„๋Š” ๋„“์–ด์ง‘๋‹ˆ๋‹ค
์ด 3์„ธ๋Œ€ ์ ‘๊ทผ์„ AWS๊ฐ€ ๊ตฌํ˜„ํ•œ ๊ฒƒ โ€” Strands Agents SDK

๋ฐœํ‘œ์ž ๋…ธํŠธ

ํ˜น์‹œ LLM API๋กœ ์—์ด์ „ํŠธ๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์–ด๋ณด์‹  ๋ถ„ ๊ณ„์‹ ๊ฐ€์š”? ๋ฃจํ”„๋ฅผ ๋Œ๋ฆฌ๊ณ  ์‘๋‹ต์„ ํŒŒ์‹ฑํ•˜๋‹ค ๋ณด๋ฉด ์—์ด์ „ํŠธ๋งˆ๋‹ค ๋˜‘๊ฐ™์€ ๊ธฐ๋ฐ˜ ์ฝ”๋“œ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์งœ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋‚˜์™”๋Š”๋ฐ, ์ด๋ฒˆ์—๋Š” ๊ทธ๋ž˜ํ”„์™€ ์ƒํƒœ ๋จธ์‹ ์„ ์„ค๊ณ„ํ•˜๋Š” ๋ถ€๋‹ด์ด ์ƒˆ๋กœ ์ƒ๊ฒผ์ฃ . ๊ทธ ์‚ฌ์ด ๋ชจ๋ธ์˜ ์ถ”๋ก  ๋Šฅ๋ ฅ์ด ํฌ๊ฒŒ ์ข‹์•„์ง€๋ฉด์„œ, ํ๋ฆ„ ์ž์ฒด๋ฅผ ๋ชจ๋ธ์—๊ฒŒ ๋งก๊ฒจ๋„ ๋˜๋Š” ์‹œ์ ์ด ์˜จ ๊ฒ๋‹ˆ๋‹ค. ์ด ์„ธ ๋ฒˆ์งธ ์ ‘๊ทผ์„ AWS๊ฐ€ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด ์˜ค๋Š˜ ๋‹ค๋ฃฐ Strands Agents SDK์ž…๋‹ˆ๋‹ค.

PART 1 ยท Strands Agents SDK ๊ฐœ์š”

Model-Driven ์„ค๊ณ„ ์ฒ ํ•™

3์„ธ๋Œ€์˜ ํ•ต์‹ฌ โ€” ๋ชจ๋ธ์ด ์ถ”๋ก ํ•˜๊ณ  ๋„๊ตฌ๋ฅผ ์„ ํƒ, ๊ฐœ๋ฐœ์ž๋Š” ๋„๊ตฌ๋งŒ ์ œ๊ณต

๊ฐœ๋ฐœ์ž๊ฐ€ ํ•˜๋Š” ์ผ

๋„๊ตฌ ์ œ๊ณต๊นŒ์ง€๋งŒ

  • @tool ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ Python ํ•จ์ˆ˜๋ฅผ ๋„๊ตฌ๋กœ ๋“ฑ๋ก
  • ์ด๋ฆ„ยท์„ค๋ช…ยทํŒŒ๋ผ๋ฏธํ„ฐ ์Šคํ‚ค๋งˆ ์ œ๊ณต
  • ํ˜ธ์ถœ ์ˆœ์„œยท๋ถ„๊ธฐ ๋กœ์ง์€ ์ž‘์„ฑํ•˜์ง€ ์•Š์Œ

๋„๊ตฌ๋Š” ํ‰๋ฒ”ํ•œ Python ํ•จ์ˆ˜. docstring๊ณผ ํƒ€์ž… ํžŒํŠธ๊ฐ€ ๋ชจ๋ธ์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ์„ค๋ช…์„œ๊ฐ€ ๋˜๋ฏ€๋กœ, ๋ช…ํ™•ํ•˜๊ฒŒ ์“ธ์ˆ˜๋ก ๋ชจ๋ธ์˜ ๋„๊ตฌ ์„ ํƒ์ด ์ •ํ™•ํ•ด์ง.

๋ชจ๋ธ์ด ํ•˜๋Š” ์ผ

์ถ”๋ก  ยท ์„ ํƒ ยท ํŒ๋‹จ

  • ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ๋ถ„์„ํ•ด ํ•„์š”ํ•œ ๋„๊ตฌ ์„ ํƒ
  • ํ˜ธ์ถœ ์ˆœ์„œ์™€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ž์œจ ๊ฒฐ์ •
  • ๊ฒฐ๊ณผ๋ฅผ ํ‰๊ฐ€ํ•ด ๋ฐ˜๋ณต ๋˜๋Š” ์™„๋ฃŒ ํŒ๋‹จ โ€” ๋„๊ตฌ ํ˜ธ์ถœ ์—†๋Š” ์‘๋‹ต์ด ๊ณง ์ข…๋ฃŒ

๊ธฐ์กด ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋กœ ์งœ๋˜ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์„ ๋ชจ๋ธ์˜ ์ถ”๋ก ์ด ๋Œ€์ฒด. ์‹คํ–‰ ์‚ฌ์ดํด์˜ ๋™์ž‘์€ PART 3 ์—์ด์ „ํ‹ฑ ๋ฃจํ”„์—์„œ ์ƒ์„ธํžˆ ๋‹ค๋ฃธ.

๋ฐœํ‘œ์ž ๋…ธํŠธ

์ด ์Šฌ๋ผ์ด๋“œ๊ฐ€ ์˜ค๋Š˜ ๊ฐ•์˜์˜ ํ•ต์‹ฌ ํ•œ ์žฅ์ž…๋‹ˆ๋‹ค. ์™ผ์ชฝ์„ ๋ณด์‹œ๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•˜๋Š” ์ผ์ด ๋„๊ตฌ ๋“ฑ๋ก์—์„œ ๋๋‚˜๊ณ , ์–ด๋–ค ๋„๊ตฌ๋ฅผ ์–ธ์ œ ์–ด๋–ค ์ˆœ์„œ๋กœ ๋ถ€๋ฅผ์ง€๋Š” ์˜ค๋ฅธ์ชฝ์˜ ๋ชจ๋ธ์ด ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ docstring๊ณผ ํƒ€์ž… ํžŒํŠธ๊ฐ€ ๋‹จ์ˆœํ•œ ์ฃผ์„์ด ์•„๋‹ˆ๋ผ ๋ชจ๋ธ์ด ์ฝ๋Š” ์„ค๋ช…์„œ๊ฐ€ ๋˜๋Š” ๊ฑฐ์ฃ . ๋„๊ตฌ ์„ค๋ช…์„ ๋Œ€์ถฉ ์“ฐ๋ฉด ๋ชจ๋ธ์ด ์—‰๋šฑํ•œ ๋„๊ตฌ๋ฅผ ๊ณ ๋ฅด๋Š” ๊ฑธ ์ง์ ‘ ๊ฒฝํ—˜ํ•˜์‹œ๊ฒŒ ๋  ํ…๋ฐ, ๊ทธ๋งŒํผ ์„ค๋ช…์„œ์˜ ํ’ˆ์งˆ์ด ๊ณง ์—์ด์ „ํŠธ์˜ ํ’ˆ์งˆ์ž…๋‹ˆ๋‹ค.

PART 1 ยท Strands Agents SDK ๊ฐœ์š”

์—์ด์ „ํŠธ ํ”„๋ ˆ์ž„์›Œํฌ ์„ธ๋Œ€๊ต์ฒด

๊ฐ™์€ ๋ชฉํ‘œ, ๋‹ค๋ฅธ ์ถœ๋ฐœ์„  โ€” ์„ธ๋Œ€๊ฐ€ ๋‹ค๋ฅธ ๋‘ ํ”„๋ ˆ์ž„์›Œํฌ

1ยท2์„ธ๋Œ€ ํ”„๋ ˆ์ž„์›Œํฌ 3์„ธ๋Œ€ ยท Strands Agents SDK
๊ฐœ๋ฐœ ๋ฐฉ์‹ ๊ทธ๋ž˜ํ”„ ๋…ธ๋“œยท์ƒํƒœ ๋จธ์‹ ยท์—ญํ•  ์ •์˜๋ถ€ํ„ฐ ์„ค๊ณ„ ๋„๊ตฌ๋งŒ ๋“ฑ๋ก โ€” ํ๋ฆ„์€ ๋ชจ๋ธ์ด ์•Œ์•„์„œ ์กฐํ•ฉ
์‹œ์ž‘ ์ฝ”๋“œ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ˆ˜์‹ญ ์ค„ Agent(model, tools) โ€” 3์ค„์ด๋ฉด ๋™์ž‘
๋ฐœํ‘œ์ž ๋…ธํŠธ

์‹ค๋ฌด ๊ฐ๊ฐ์œผ๋กœ ๋ง์”€๋“œ๋ฆฌ๋ฉด, 2์„ธ๋Œ€ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์—์ด์ „ํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ๋Š” ์„ค๊ณ„ ๋ฌธ์„œ๋ถ€ํ„ฐ ๋…ธ๋“œ์™€ ์—ฃ์ง€๋ฅผ ๊ทธ๋ฆฌ๋Š” ์ผ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. Strands์—์„œ๋Š” ๊ทธ ์ž๋ฆฌ๋ฅผ ํ•„์š”ํ•œ ๋„๊ตฌ ๋ชฉ๋ก์„ ์ •๋ฆฌํ•˜๋Š” ์ผ์ด ๋Œ€์‹ ํ•˜์ฃ . ์‹œ์ž‘ ์ฝ”๋“œ๋„ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ˆ˜์‹ญ ์ค„์—์„œ 3์ค„๋กœ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค. ์•„๋ž˜ ์ธ์šฉ์ด Strands์˜ ์ถœ๋ฐœ์ ์ธ๋ฐ, Amazon ๋‚ด๋ถ€ ํŒ€๋“ค์ด ์—์ด์ „ํŠธ๋ฅผ ์šด์˜ํ•˜๋ฉด์„œ ์–ป์€ ๊ฒฐ๋ก ์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํ•จ์ด ๊ณง ๋ฐฐํฌ ์†๋„๋ผ๋Š” ๊ฒ๋‹ˆ๋‹ค.

PART 1 ยท Strands Agents SDK ๊ฐœ์š”

Strands Agents SDK

AWS๊ฐ€ ๋งŒ๋“  ์˜คํ”ˆ์†Œ์Šค ์—์ด์ „ํŠธ ํ”„๋ ˆ์ž„์›Œํฌ โ€” AgentCore์˜ ๊ธฐ๋ฐ˜ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์—”์ง„

2025 ์˜คํ”ˆ์†Œ์Šค ๊ณต๊ฐœ
3,400๋งŒ+ ์›”๊ฐ„ PyPI ๋‹ค์šด๋กœ๋“œ
15์ข… ๊ณต์‹ ๋ชจ๋ธ ํ”„๋กœ๋ฐ”์ด๋”
Py+TS ๋“€์–ผ ์–ธ์–ด SDK

ํ•ต์‹ฌ ์›์น™ 3๊ฐ€์ง€

3์ค„ ์—์ด์ „ํŠธ

Agent(model, tools) + agent("์งˆ๋ฌธ") โ€” ๊ทธ๋ž˜ํ”„ยท์ƒํƒœ ๋จธ์‹  ์ •์˜ ์—†์Œ

๊ด€๋ฆฌํ˜• ๋ฐฐํฌ

AgentCore Runtime์— ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด ๊ทธ๋Œ€๋กœ ๋ฐฐํฌ

์ ์ง„์  ํ™•์žฅ

3์ค„๋กœ ์‹œ์ž‘ โ€” HooksยทPluginsยทInterventions๋ฅผ ํ”„๋กœ๋•์…˜ ์š”๊ตฌ์— ๋งž์ถฐ ์ถ”๊ฐ€

๋ฐœํ‘œ์ž ๋…ธํŠธ

์ˆซ์ž ๋ช‡ ๊ฐœ๋งŒ ์งš๊ณ  ๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค. 2025๋…„์— ์˜คํ”ˆ์†Œ์Šค๋กœ ๊ณต๊ฐœ๋๊ณ , ์›”๊ฐ„ PyPI ๋‹ค์šด๋กœ๋“œ๊ฐ€ 3,400๋งŒ์„ ๋„˜์Šต๋‹ˆ๋‹ค. ์‹ ์ƒ ํ”„๋ ˆ์ž„์›Œํฌ์น˜๊ณ ๋Š” ์ฑ„ํƒ ์†๋„๊ฐ€ ์ƒ๋‹นํžˆ ๋น ๋ฅธ ํŽธ์ด์ฃ . ๊ทธ๋ฆฌ๊ณ  ์ค‘์š”ํ•œ ํฌ์ธํŠธ๋Š” AgentCore์™€์˜ ๊ด€๊ณ„์ธ๋ฐ, Strands๋Š” AgentCore์˜ ๊ธฐ๋ฐ˜ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ์—”์ง„์ด๋ผ์„œ ๋กœ์ปฌ์—์„œ ๋งŒ๋“  ์—์ด์ „ํŠธ๋ฅผ ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด ๊ด€๋ฆฌํ˜• ๋Ÿฐํƒ€์ž„์œผ๋กœ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ต์‹ฌ ์›์น™ ์„ธ ๊ฐ€์ง€ ์ค‘์—์„œ๋Š” ์ ์ง„์  ํ™•์žฅ์„ ๊ธฐ์–ตํ•ด ์ฃผ์„ธ์š”. 3์ค„๋กœ ์‹œ์ž‘ํ•ด์„œ ํ”„๋กœ๋•์…˜ ์š”๊ตฌ๊ฐ€ ์ƒ๊ธธ ๋•Œ Hooks๋ฅผ ๋ถ™์—ฌ๊ฐ€๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

PART 1 ยท Strands Agents SDK ๊ฐœ์š”

Strands 4ํŒจํ‚ค์ง€ ์ƒํƒœ๊ณ„

์ฝ”์–ด ยท ๋„๊ตฌ ยท ํ‰๊ฐ€ ยท TypeScript โ€” ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ๊ณจ๋ผ ์„ค์น˜ํ•˜๋Š” ๋ชจ๋“ˆํ˜• ์ƒํƒœ๊ณ„

๋ฐœํ‘œ์ž ๋…ธํŠธ

ํŒจํ‚ค์ง€ ๊ตฌ์กฐ๋ฅผ ๋ณด์‹œ๋ฉด ์„ค๊ณ„ ์ฒ ํ•™์ด ๊ทธ๋Œ€๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ฝ”์–ด์ธ strands-agents ํ•˜๋‚˜๋งŒ ์„ค์น˜ํ•ด๋„ ์—์ด์ „ํŠธ๊ฐ€ ๋Œ์•„๊ฐ€๊ณ , ๋‚˜๋จธ์ง€๋Š” ์ „๋ถ€ ์„ ํƒ์ด์—์š”. ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•˜๋ฉด tools ํŒจํ‚ค์ง€๋ฅผ, ํ’ˆ์งˆ ์ธก์ •์ด ํ•„์š”ํ•˜๋ฉด evals ํŒจํ‚ค์ง€๋ฅผ ๋”ํ•˜๋Š” ์‹์ž…๋‹ˆ๋‹ค. ์›น ์„œ๋น„์Šค๋‚˜ ํ”„๋ก ํŠธ์—”๋“œ์— ๋ถ™์ด์‹ค ๋ถ„๋“ค์€ TypeScript SDK๋„ ์žˆ๋‹ค๋Š” ์  ์ฐธ๊ณ ํ•˜์‹œ๊ณ ์š”. ์˜ค๋Š˜ ๋‹ค๋ฃจ๋Š” ๋ฒ”์œ„๋Š” ์ฝ”์–ด์™€ tools ๋‘ ๊ฐœ๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

Agent ๊ตฌ์„ฑ

Model + Tools + System Prompt ยท 3์ค„ ์ฝ”๋“œ

PART 2 ยท Agent ๊ตฌ์„ฑ

Agent = Model + Tools + System Prompt

์ด ์„ธ ๊ฐ€์ง€ ์กฐํ•ฉ์ด ์—์ด์ „ํŠธ์˜ ์ „๋ถ€ โ€” 3์ค„ ์ฝ”๋“œ์˜ ์ •์ฒด

์„ธ ๊ฐ€์ง€๋ฉด ์ถฉ๋ถ„ํ•˜๋‹ค

Model์ด ํŒ๋‹จํ•˜๊ณ , Tools๊ฐ€ ํ–‰๋™ํ•˜๊ณ , System Prompt๊ฐ€ ๋ฐฉํ–ฅ์„ ์žก์Šต๋‹ˆ๋‹ค โ€” agent("์งˆ๋ฌธ") ํ•˜๋‚˜๋กœ ์—์ด์ „ํ‹ฑ ๋ฃจํ”„๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

  • Model โ€” ํ•„์ˆ˜
  • Tools โ€” ์„ ํƒ
  • System Prompt โ€” ์„ ํƒ
๋ฐœํ‘œ์ž ๋…ธํŠธ

์—์ด์ „ํŠธ๋ผ๊ณ  ํ•˜๋ฉด ๋ญ”๊ฐ€ ๋ณต์žกํ•œ ๊ตฌ์กฐ๋ฌผ์„ ์ƒ์ƒํ•˜๊ธฐ ์‰ฌ์šด๋ฐ, Strands์—์„œ๋Š” ์ด ์„ธ ๊ฐ€์ง€๊ฐ€ ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ๋น„์œ ํ•˜์ž๋ฉด Model์€ ๋‘๋‡Œ, Tools๋Š” ์†๋ฐœ, System Prompt๋Š” ์—…๋ฌด ์ง€์นจ์„œ์˜ˆ์š”. ์ƒˆ๋กœ ์˜จ ํŒ€์›์—๊ฒŒ ์ง€์นจ์„œ๋ฅผ ์ฃผ๊ณ  ํ•„์š”ํ•œ ๋„๊ตฌ๋ฅผ ์ฅ์—ฌ์ฃผ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ์ด ๊ทธ๋ฆผ ํ•˜๋‚˜๋งŒ ๋จธ๋ฆฌ์— ๋„ฃ์–ด๋‘์‹œ๋ฉด, ์ดํ›„ ํŒŒํŠธ๋“ค์ด ์ „๋ถ€ ์ด ์„ธ ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊นŠ์ด ํŒŒ๋Š” ์‹ฌํ™”๋ผ๋Š” ๊ฑธ ์•„์‹œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

PART 2 ยท Agent ๊ตฌ์„ฑ

๊ตฌ์„ฑ์š”์†Œ์˜ ์—ญํ• 

Model๋งŒ ํ•„์ˆ˜ โ€” ๋‚˜๋จธ์ง€๋Š” ์—†์–ด๋„ ๋™์ž‘ํ•˜๋Š” ์„ ํƒ ์š”์†Œ

Model

์ถ”๋ก  ์—”์ง„ โ€” ๋„๊ตฌ ์„ ํƒ๊ณผ ์™„๋ฃŒ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จ

  • LLM ํ”„๋กœ๋ฐ”์ด๋” โ€” BedrockModel ๋“ฑ ๊ณต์‹ 15์ข…
  • ํ•„์ˆ˜ โ€” ์—์ด์ „ํŠธ์˜ ๋‘๋‡Œ
  • ์‹ฌํ™” โ†’ PART 5 ยท ๋ชจ๋ธ ํ”„๋กœ๋ฐ”์ด๋”

Tools

ํ–‰๋™ ๋Šฅ๋ ฅ โ€” ์™ธ๋ถ€ ์„ธ๊ณ„์™€ ์ƒํ˜ธ์ž‘์šฉ

  • @tool ํ•จ์ˆ˜ ๋˜๋Š” MCPClient
  • ์„ ํƒ โ€” ์—†์œผ๋ฉด ๊ทธ๋ƒฅ ์ฑ„ํŒ…๋ด‡
  • ์‹ฌํ™” โ†’ PART 4 ยท ๋„๊ตฌ ์ƒํƒœ๊ณ„

System Prompt

ํŽ˜๋ฅด์†Œ๋‚˜ โ€” ์—ญํ• ยท๊ทœ์น™ยท์‘๋‹ต ํ˜•์‹ ์ •์˜

  • LLM์˜ system ๋ฉ”์‹œ์ง€๋กœ ์ „๋‹ฌ
  • ์„ ํƒ โ€” ์—†์œผ๋ฉด ๋ฒ”์šฉ ์‘๋‹ต
  • ์ž‘์„ฑ๋ฒ• โ†’ ์ด ํŒŒํŠธ์—์„œ ์ด์–ด์„œ
takeaway

ํ•„์ˆ˜๋Š” Model ํ•˜๋‚˜ โ€” ์ด๋ฏธ ์žˆ๋Š” ์ฑ„ํŒ…๋ด‡์— ๋„๊ตฌ๋งŒ ๋”ํ•˜๋ฉด ๊ทธ๋Œ€๋กœ ์—์ด์ „ํŠธ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋ฐœํ‘œ์ž ๋…ธํŠธ

์„ธ ์š”์†Œ ์ค‘์— ํ•„์ˆ˜๊ฐ€ Model ํ•˜๋‚˜๋ฟ์ด๋ผ๋Š” ๊ฒŒ ์žฌ๋ฏธ์žˆ๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. Tools ์—†์ด ๋งŒ๋“ค๋ฉด ๊ทธ๋ƒฅ ์ฑ„ํŒ…๋ด‡์ด ๋˜๊ณ , System Prompt๊ฐ€ ์—†์œผ๋ฉด ๋ฒ”์šฉ ์‘๋‹ต์„ ํ•˜๋Š” ๋น„์„œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๊ฑฐ๊พธ๋กœ ๋งํ•˜๋ฉด, ์ด๋ฏธ ๊ฐ–๊ณ  ๊ณ„์‹  ์ฑ„ํŒ…๋ด‡์— ๋„๊ตฌ๋งŒ ๋”ํ•˜๋ฉด ์—์ด์ „ํŠธ๊ฐ€ ๋œ๋‹ค๋Š” ๋œป์ด๊ธฐ๋„ ํ•˜์ฃ . ๊ฐ ์š”์†Œ๋Š” ๋’ค ํŒŒํŠธ์—์„œ ๊นŠ์ด ๋‹ค๋ฃจ๋‹ˆ๊นŒ, ์—ฌ๊ธฐ์„œ๋Š” ์—ญํ•  ๊ตฌ๋ถ„๋งŒ ์žก๊ณ  ๋„˜์–ด๊ฐ€์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

PART 2 ยท Agent ๊ตฌ์„ฑ

Model โ€” ์ถ”๋ก  ์—”์ง„

์–ด๋–ค LLM์ด ํŒ๋‹จ์„ ๋งก์„์ง€ ์ง€์ • โ€” ์—์ด์ „ํŠธ์˜ ๋‘๋‡Œ

python
from strands import Agent
from strands.models import BedrockModel

# โ‘  ํ”„๋กœ๋•์…˜ โ€” Bedrock (IAM ์ธ์ฆ, ๊ถŒ์žฅ)
model = BedrockModel(model_id="us.anthropic.claude-sonnet-4-6")
agent = Agent(model=model)

# โ‘ก ๋กœ์ปฌ ๊ฐœ๋ฐœ๋กœ ์ „ํ™˜ โ€” ์•„๋ž˜ 2์ค„๋งŒ ๊ต์ฒด, ๋‚˜๋จธ์ง€ ์ฝ”๋“œ๋Š” ๊ทธ๋Œ€๋กœ
# from strands.models.ollama import OllamaModel
# agent = Agent(model=OllamaModel(model_id="llama3"))
  • BedrockModel โ€” IAM ์ธ์ฆ, ํ”„๋กœ๋•์…˜ ๊ถŒ์žฅ. ๋„๊ตฌ ์„ ํƒยท๋ฐ˜๋ณตยท์™„๋ฃŒ๋ฅผ ํŒ๋‹จํ•˜๋Š” ์ถ”๋ก  ์—”์ง„
  • ๋ชจ๋ธ ๊ต์ฒด๋Š” 2์ค„ โ€” toolsยทsystem_prompt ์ฝ”๋“œ๋Š” ๊ทธ๋Œ€๋กœ
  • ๊ณต์‹ 15์ข… ํ”„๋กœ๋ฐ”์ด๋” ์ง€์› โ€” ์ƒ์„ธ๋Š” PART 5
๋ฐœํ‘œ์ž ๋…ธํŠธ

์ฝ”๋“œ์—์„œ ์ฃผ๋ชฉํ•˜์‹ค ๋ถ€๋ถ„์€ ๊ต์ฒด ๋น„์šฉ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜์—์„œ๋Š” IAM ์ธ์ฆ์„ ์“ฐ๋Š” BedrockModel์„ ๊ถŒ์žฅํ•˜๊ณ , ๋กœ์ปฌ ๊ฐœ๋ฐœ๋กœ ์ „ํ™˜ํ•  ๋•Œ๋Š” ์ฃผ์„ ์ฒ˜๋ฆฌ๋œ ๋‘ ์ค„์ฒ˜๋Ÿผ Ollama๋กœ ๋ฐ”๊พธ๋ฉด ๋์ด์—์š”. ๋ชจ๋ธ์„ ๋ฐ”๊ฟ”๋„ tools์™€ system_prompt ์ชฝ ์ฝ”๋“œ๋Š” ํ•œ ๊ธ€์ž๋„ ์•ˆ ๋ฐ”๋€๋‹ˆ๋‹ค. ํšŒ์‚ฌ์˜ ๋ชจ๋ธ ์ •์ฑ…์ด ๋ฐ”๋€Œ์–ด๋„ ์—์ด์ „ํŠธ ๋กœ์ง์„ ๋‹ค์‹œ ์งค ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฑด ์‹ค๋ฌด์—์„œ ๊ฝค ํฐ ์žฅ์ ์ž…๋‹ˆ๋‹ค.

PART 2 ยท Agent ๊ตฌ์„ฑ

Tools โ€” ํ–‰๋™ ๋Šฅ๋ ฅ

๋ชจ๋ธ์ด ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜ ๋ชฉ๋ก โ€” ์™ธ๋ถ€ ์„ธ๊ณ„์™€์˜ ์ ‘์ 

ํ•ต์‹ฌ ํฌ์ธํŠธ

@tool
Python ํ•จ์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ๋„๊ตฌ๋กœ ๋“ฑ๋กํ•˜๋Š” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ
docstring
๋ชจ๋ธ์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ์‚ฌ์šฉ ์„ค๋ช…์„œ โ€” ๊ตฌ์ฒด์ ์ผ์ˆ˜๋ก ์„ ํƒ์ด ์ •ํ™•
tools=[...]
๋ชจ๋ธ์˜ ๊ฒฐ์ •์„ ์‹ค์ œ ํ–‰๋™์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ์ ‘์ 
ํ™•์žฅ
์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๋นŒํŠธ์ธ + MCP ์—ฐ๊ฒฐ โ€” ์ƒ์„ธ๋Š” PART 4

์ฝ”๋“œ

python
from strands import Agent, tool

# ํ•จ์ˆ˜์— @tool๋งŒ ๋ถ™์ด๋ฉด ๋ชจ๋ธ์ด ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ๋„๊ตฌ๊ฐ€ ๋จ
@tool
def get_weather(city: str) -> str:
    """๋„์‹œ์˜ ํ˜„์žฌ ๋‚ ์”จ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค."""
    return f"{city}: ๋ง‘์Œ, 24ยฐC"

# ๋“ฑ๋ก โ€” ๋ชจ๋ธ์ด ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ํ–‰๋™ ๋ชฉ๋ก
agent = Agent(model=model, tools=[get_weather])
๋ฐœํ‘œ์ž ๋…ธํŠธ

์—ฌ๊ธฐ์„œ ๋งŽ์€ ๋ถ„๋“ค์ด ๋†€๋ผ์‹œ๋Š”๋ฐ, ๋„๊ตฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ๋ณ„๋„์˜ ํด๋ž˜์Šค๋‚˜ ์Šคํ‚ค๋งˆ ์ •์˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ‰๋ฒ”ํ•œ Python ํ•จ์ˆ˜์— @tool ํ•˜๋‚˜ ๋ถ™์ด๋ฉด ๋์ด์—์š”. ๋Œ€์‹  docstring์ด ๋ชจ๋ธ์—๊ฒŒ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•จ์ˆ˜ ์„ค๋ช…์„ ์‚ฌ๋žŒ ๋™๋ฃŒ์—๊ฒŒ ์ธ์ˆ˜์ธ๊ณ„ํ•˜๋“ฏ ๊ตฌ์ฒด์ ์œผ๋กœ ์“ฐ๋Š” ์Šต๊ด€์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. tools ๋ฆฌ์ŠคํŠธ์— ๋‹ด๋Š” ์ˆœ๊ฐ„ ๋ชจ๋ธ์˜ ์„ ํƒ์ง€๊ฐ€ ๋˜๋Š” ๊ฑฐ๊ณ ์š”. ๋„๊ตฌ ์ด์•ผ๊ธฐ๋Š” PART 4์—์„œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ์ด์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

PART 2 ยท Agent ๊ตฌ์„ฑ

System Prompt โ€” ํŽ˜๋ฅด์†Œ๋‚˜

์—ญํ• ยท๊ทœ์น™ยท์‘๋‹ต ํ˜•์‹์„ ํ…์ŠคํŠธ๋กœ ์ •์˜ โ€” ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ํ–‰๋™ ์ œ์–ด ์ˆ˜๋‹จ

python
agent = Agent(
    model="us.anthropic.claude-sonnet-4-6",
    # โ‘  ํŽ˜๋ฅด์†Œ๋‚˜ โ€” ์ •์ฒด์„ฑยทํ–‰๋™ ๊ทœ์น™์„ system ๋ฉ”์‹œ์ง€๋กœ ์ „๋‹ฌ
    system_prompt="""๋‹น์‹ ์€ AWS ๋น„์šฉ ๋ถ„์„ ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค.

๊ทœ์น™:
- ํ•ญ์ƒ get_cost_data ๋„๊ตฌ๋กœ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•œ ๋’ค ๋‹ต๋ณ€
- ์ถ”์ธก ๊ธˆ์ง€ โ€” ๋ฐ์ดํ„ฐ ์—†์œผ๋ฉด "ํ™•์ธ ๋ถˆ๊ฐ€"๋กœ ๋‹ต๋ณ€
- ๊ธˆ์•ก์€ USD ๊ธฐ์ค€, ์†Œ์ˆ˜์  2์ž๋ฆฌ๊นŒ์ง€

์ถœ๋ ฅ ํ˜•์‹:
- ์„œ๋น„์Šค๋ณ„ ๋น„์šฉ์„ ํ…Œ์ด๋ธ”๋กœ ์ •๋ฆฌ
- ์ „์›” ๋Œ€๋น„ ์ฆ๊ฐ๋ฅ  ํฌํ•จ""",
    # โ‘ก ์œ„ '๊ทœ์น™' ๋ฌธ์žฅ์ด ๋„๊ตฌ ์‚ฌ์šฉ ์กฐ๊ฑด์„ ํ†ต์ œ
    tools=[get_cost_data, get_recommendations],
)
  • ์ •์ฒด์„ฑยทํ–‰๋™ ๊ทœ์น™ ์ •์˜ โ€” LLM์˜ system ๋ฉ”์‹œ์ง€๋กœ ์ „๋‹ฌ
  • ๋„๊ตฌ ์‚ฌ์šฉ ์กฐ๊ฑดยท๊ธˆ์ง€ ์‚ฌํ•ญ์„ ๋ฌธ์žฅ์œผ๋กœ ํ†ต์ œ
  • ๊ตฌ์ฒด์ ์ผ์ˆ˜๋ก ํ–‰๋™์ด ์ผ๊ด€๋จ โ€” ๊ทœ์น™ยท์ถœ๋ ฅ ํ˜•์‹ ๋ช…์‹œ ๊ถŒ์žฅ
๋ฐœํ‘œ์ž ๋…ธํŠธ

์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๋Š” ์…‹ ์ค‘์— ๊ฐ€์žฅ ์ €ํ‰๊ฐ€๋˜๋Š” ์š”์†Œ์ธ๋ฐ, ์‚ฌ์‹ค ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•œ ํ–‰๋™ ์ œ์–ด ์ˆ˜๋‹จ์ž…๋‹ˆ๋‹ค. ์˜ˆ์‹œ์˜ ๊ทœ์น™ ์„น์…˜์„ ๋ณด์‹œ๋ฉด ๋„๊ตฌ ์‚ฌ์šฉ ์กฐ๊ฑด์„ ๋ฌธ์žฅ์œผ๋กœ ํ†ต์ œํ•˜๊ณ  ์žˆ์ฃ . ์ถ”์ธก ๊ธˆ์ง€, ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ํ™•์ธ ๋ถˆ๊ฐ€๋กœ ๋‹ตํ•˜๋ผ โ€” ์ด๋Ÿฐ ๋ฌธ์žฅ ํ•˜๋‚˜๊ฐ€ ๊ทผ๊ฑฐ ์—†๋Š” ๋‹ต๋ณ€์„ ์‹ค์งˆ์ ์œผ๋กœ ์ค„์—ฌ์ค๋‹ˆ๋‹ค. ์—์ด์ „ํŠธ๊ฐ€ ์ด์ƒํ•˜๊ฒŒ ๋™์ž‘ํ•  ๋•Œ๋Š” ์ฝ”๋“œ๋ณด๋‹ค ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋จผ์ € ์˜์‹ฌํ•ด ๋ณด์‹œ๊ธธ ๊ถŒํ•ฉ๋‹ˆ๋‹ค.

PART 2 ยท Agent ๊ตฌ์„ฑ

3์ค„ ์—์ด์ „ํŠธ

ModelยทToolsยทSystem Prompt๋ฅผ ์ฝ”๋“œ๋กœ ์˜ฎ๊ธฐ๋ฉด โ€” ๊ทธ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š” ์—์ด์ „ํŠธ

ํ•ต์‹ฌ ํฌ์ธํŠธ

model
์ถ”๋ก  ์—”์ง„ โ€” ๋„๊ตฌ ์„ ํƒยท๋ฐ˜๋ณตยท์™„๋ฃŒ๋ฅผ ํŒ๋‹จ (์‹ฌํ™”๋Š” PART 5)
tools
๋ชจ๋ธ์ด ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ํ–‰๋™ ๋ชฉ๋ก (์‹ฌํ™”๋Š” PART 4)
system_prompt
์—ญํ• ยท๊ทœ์น™ยท์‘๋‹ต ํ˜•์‹ โ€” ํŽ˜๋ฅด์†Œ๋‚˜
agent("์งˆ๋ฌธ")
์—์ด์ „ํ‹ฑ ๋ฃจํ”„ ์‹œ์ž‘ โ€” ๋‹ค์Œ ํŒŒํŠธ์˜ ์ฃผ์ œ

์ฝ”๋“œ

python
from strands import Agent
from strands.models import BedrockModel
from strands_tools import http_request

# ์—์ด์ „ํŠธ ์กฐ๋ฆฝ โ€” ๋ชจ๋ธ + ๋„๊ตฌ + ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ
agent = Agent(
    model=BedrockModel(model_id="us.anthropic.claude-sonnet-4-6"),
    tools=[http_request],
    system_prompt="GitHub API ๋„์šฐ๋ฏธ์ž…๋‹ˆ๋‹ค. ํ•œ๊ตญ์–ด๋กœ ๋‹ต๋ณ€ํ•ฉ๋‹ˆ๋‹ค.",
)

# ์‹คํ–‰ โ€” ์งˆ๋ฌธ ํ•œ ์ค„๋กœ ์—์ด์ „ํ‹ฑ ๋ฃจํ”„ ์‹œ์ž‘
result = agent("strands-agents/harness-sdk ์ €์žฅ์†Œ์˜ star ์ˆ˜๋Š”?")
๋ฐœํ‘œ์ž ๋…ธํŠธ

์•ž์„œ ๋ณธ ์„ธ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์‹ค์ œ๋กœ ์กฐ๋ฆฝํ•˜๋ฉด ์ด ์ฝ”๋“œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ž„ํฌํŠธ๋ฅผ ๋นผ๋ฉด ์‹ค์งˆ์ ์ธ ์ฝ”๋“œ๋Š” Agent ์ƒ์„ฑ๊ณผ ํ˜ธ์ถœ๋ฟ์ด์—์š”. ๊ทธ๋Ÿฐ๋ฐ ๋งˆ์ง€๋ง‰ ์ค„์—์„œ ์งˆ๋ฌธ์„ ๋„˜๊ธฐ๋Š” ์ˆœ๊ฐ„ ๋ฌด์Šจ ์ผ์ด ๋ฒŒ์–ด์งˆ๊นŒ์š”? ๋ชจ๋ธ์ด http_request ๋„๊ตฌ๋กœ GitHub API๋ฅผ ๋ถ€๋ฅด๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๊ด€์ฐฐํ•˜๊ณ , ๋‹ตํ• ์ง€ ๋” ์กฐํšŒํ• ์ง€ ์Šค์Šค๋กœ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐ˜๋ณต ๊ณผ์ •์ด ๋ฐ”๋กœ ๋‹ค์Œ ํŒŒํŠธ์˜ ์ฃผ์ œ, ์—์ด์ „ํ‹ฑ ๋ฃจํ”„์ž…๋‹ˆ๋‹ค.

์—์ด์ „ํ‹ฑ ๋ฃจํ”„

Reason โ†’ Act โ†’ Observe ยท ์‹œํ€€์Šค ยท ์ข…๋ฃŒ ์กฐ๊ฑด

PART 3 ยท ์—์ด์ „ํ‹ฑ ๋ฃจํ”„

Reason โ†’ Act โ†’ Observe

๋ชฉํ‘œ ๋‹ฌ์„ฑ๊นŒ์ง€ ์ถ”๋ก ยท์‹คํ–‰ยท๊ด€์ฐฐ์„ ๋ฐ˜๋ณตํ•˜๋Š” ํ•ต์‹ฌ ์‚ฌ์ดํด

๋ฐœํ‘œ์ž ๋…ธํŠธ

๋ฃจํ”„๋Š” ์ด ์„ธ ๋‹จ๊ณ„์˜ ๋ฐ˜๋ณต์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ์ด ์ผํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋˜‘๊ฐ™๋‹ค๊ณ  ๋ณด์‹œ๋ฉด ๋ผ์š”. ์ƒํ™ฉ์„ ํŒŒ์•…ํ•˜๊ณ , ํ–‰๋™ํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด์„œ ๋‹ค์Œ์„ ์ •ํ•˜๋Š” ๊ฒ๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๊ฑด ์ด ์‚ฌ์ดํด์„ ๋ช‡ ๋ฒˆ ๋Œ์ง€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฏธ๋ฆฌ ์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋ชฉํ‘œ๊ฐ€ ๋‹ฌ์„ฑ๋๋‹ค๊ณ  ๋ชจ๋ธ์ด ํŒ๋‹จํ•  ๋•Œ๊นŒ์ง€ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

PART 3 ยท ์—์ด์ „ํ‹ฑ ๋ฃจํ”„

๋ฃจํ”„์˜ ๊ตฌ์กฐ โ€” Agent๊ฐ€ ํ—ˆ๋ธŒ

Prompt๊ฐ€ ๋“ค์–ด์™€ Result๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ โ€” Agent๊ฐ€ ModelยทTools์™€ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ๊ตํ™˜

takeaway

๋ชจ๋ธ์€ ๋„๊ตฌ๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค โ€” ๋„๊ตฌ ๊ฒฐ์ •๋งŒ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์‹คํ–‰์€ Agent ํ—ˆ๋ธŒ์˜ ๋ชซ์ด๋ผ, ์‹คํ–‰ ์•ž๋’ค์— ๊ฒ€์ฆยท๋กœ๊น…(Hooks)์ด ๋ผ์–ด๋“ค ์ž๋ฆฌ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค.

๋ฐœํ‘œ์ž ๋…ธํŠธ

์ด ๊ทธ๋ฆผ์—์„œ Agent๊ฐ€ ๊ฐ€์šด๋ฐ ํ—ˆ๋ธŒ๋ผ๋Š” ์ ์„ ๋ด์ฃผ์„ธ์š”. ๋ชจ๋ธ์ด ๋„๊ตฌ๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•˜๋Š” ๊ฒŒ ์•„๋‹™๋‹ˆ๋‹ค. ๋ชจ๋ธ์€ ์–ด๋–ค ๋„๊ตฌ๋ฅผ ์“ฐ๊ฒ ๋‹ค๋Š” ๊ฒฐ์ •๋งŒ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์‹ค์ œ ์‹คํ–‰์€ Agent๊ฐ€ ๋งก์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋„๊ตฌ ์‹คํ–‰ ์•ž๋’ค์— ๊ฒ€์ฆ์ด๋‚˜ ๋กœ๊น…์„ ๋ผ์›Œ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๊ฑฐ๊ณ , ์ž ์‹œ ๋’ค์— ๋ณผ Hooks๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ์ง€์ ๋„ ๋ฐ”๋กœ ์ด ํ—ˆ๋ธŒ์ž…๋‹ˆ๋‹ค. ์ ์„  ๋ฐ•์Šค ์•ˆ์ด agent ํ˜ธ์ถœ ํ•œ ๋ฒˆ ์•ˆ์—์„œ ๋ฒŒ์–ด์ง€๋Š” ์ผ ์ „์ฒด์ž…๋‹ˆ๋‹ค.

PART 3 ยท ์—์ด์ „ํ‹ฑ ๋ฃจํ”„

์š”์ฒญ์—์„œ ๋‹ต๋ณ€๊นŒ์ง€ โ€” ๋ฃจํ”„๊ฐ€ ๋„๋Š” ๋ชจ์Šต

ํ•œ ๋ฒˆ์˜ ํ˜ธ์ถœ ์•ˆ์—์„œ ๋ฃจํ”„๊ฐ€ 2ํšŒ์ „ํ•˜๋Š” ์‹ค์ œ ์‹œํ€€์Šค โ€” ์‚ฌ์šฉ์ž ยท Agent ยท Model ยท Tools

๋ฐœํ‘œ์ž ๋…ธํŠธ

์ด๋ฒˆ์—๋Š” ์‹ค์ œ ์‹œ๊ฐ„ ์ˆœ์„œ๋กœ ๋”ฐ๋ผ๊ฐ€ ๋ณด์‹œ์ฃ . ์ฒซ ํšŒ์ „์—์„œ ๋ชจ๋ธ์ด tool_use๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด Agent๊ฐ€ ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋Œ€ํ™”์— ์ถ”๊ฐ€ํ•ด์„œ ๋‹ค์‹œ ๋ชจ๋ธ์—๊ฒŒ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ํšŒ์ „์—์„œ ๋ชจ๋ธ์ด ๋„๊ตฌ ํ˜ธ์ถœ ์—†์ด ํ…์ŠคํŠธ๋กœ๋งŒ ๋‹ตํ•˜๋ฉด ๊ทธ๊ฒŒ ๊ณง ์ข…๋ฃŒ ์‹ ํ˜ธ์˜ˆ์š”. ๋ณ„๋„์˜ ์ข…๋ฃŒ API๊ฐ€ ์žˆ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ์‘๋‹ต์˜ ํ˜•ํƒœ ์ž์ฒด๊ฐ€ ๊ณ„์†๊ณผ ์ข…๋ฃŒ๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค๋Š” ๊ฒŒ ํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค.

PART 3 ยท ์—์ด์ „ํ‹ฑ ๋ฃจํ”„

๋ฃจํ”„ ์ข…๋ฃŒ ์กฐ๊ฑด

๊ธฐ๋ณธ ๋™์ž‘์€ ์ž์—ฐ ์ข…๋ฃŒ โ€” ๋ฐ˜๋ณต ์ƒํ•œ์€ limits ๋‚ด์žฅ, ๊ทธ ์™ธ ์ค‘๋‹จ์€ ๋ณด์กฐ ์ˆ˜๋‹จ

์ž์—ฐ ์ข…๋ฃŒ

๋ชจ๋ธ์ด ๋„๊ตฌ ํ˜ธ์ถœ ์—†์ด ์ตœ์ข… ์‘๋‹ต โ€” stop_reason: end_turn

  • ๋„๊ตฌ ํ˜ธ์ถœ(tool_use)์ด ์œ ์ผํ•œ "๊ณ„์†" ์‹ ํ˜ธ
  • ๋ฐ˜๋ณต ์ƒํ•œ์ด ํ•„์š”ํ•˜๋ฉด ๋‚ด์žฅ limits ํŒŒ๋ผ๋ฏธํ„ฐ โ€” ๊ฐ€์šด๋ฐ ์นด๋“œ

limits โ€” ๋‚ด์žฅ ๋ฐ˜๋ณต ์ƒํ•œ

agent(prompt, limits={"turns": 10, ...}) โ€” turns ยท output_tokens ยท total_tokens ์˜ˆ์‚ฐ ์ง€์ •

  • ์ดˆ๊ณผ ์‹œ stop_reason: limit_turns ยท limit_output_tokens ยท limit_total_tokens
  • ๊ฐ ๋ฃจํ”„ ๋ฐ˜๋ณต ์‹œ์ž‘ ์‹œ ๊ฒ€์‚ฌ โ€” ๋Œ€ํ™” ์ƒํƒœ๋ฅผ ๋ณด์กดํ•œ ์ฑ„ ์ข…๋ฃŒ

๋ณด์กฐ ์ˆ˜๋‹จ โ€” Hooks ยท cancel

BeforeToolCallEvent์—์„œ event.cancel_tool = "์‚ฌ์œ " โ€” ๋„๊ตฌ ์‹คํ–‰ ์ฐจ๋‹จ

  • ์ทจ์†Œ ์‚ฌ์œ ๊ฐ€ ๋„๊ตฌ ๊ฒฐ๊ณผ๋กœ ๋ชจ๋ธ์— ์ „๋‹ฌ โ†’ ๋ชจ๋ธ์ด ๋งˆ๋ฌด๋ฆฌ ์‘๋‹ต
  • ์™ธ๋ถ€ ์ค‘๋‹จ์€ agent.cancel() โ€” stop_reason: cancelled
takeaway

๋ฐ˜๋ณต ์ƒํ•œ์€ limits ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋‚ด์žฅ โ€” ์ดˆ๊ณผ ์‹œ stop_reason: limit_turns ๋“ฑ์œผ๋กœ ์ข…๋ฃŒ๋˜์–ด ํญ์ฃผ ๋น„์šฉ์„ ๋ฐฉ์–ดํ•ฉ๋‹ˆ๋‹ค.

๋ฐœํ‘œ์ž ๋…ธํŠธ

๊ทธ๋Ÿผ ๋ชจ๋ธ์ด ๊ณ„์† ๋„๊ตฌ๋งŒ ๋ถ€๋ฅด๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ์ด๋Ÿด ๋•Œ๋ฅผ ์œ„ํ•ด limits ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜ธ์ถœํ•  ๋•Œ turns, output_tokens, total_tokens ์˜ˆ์‚ฐ์„ ์ง€์ •ํ•˜๋ฉด ๊ฐ ๋ฃจํ”„ ๋ฐ˜๋ณต์ด ์‹œ์ž‘๋  ๋•Œ ๊ฒ€์‚ฌํ•ด์„œ, ์ดˆ๊ณผํ•˜๋ฉด limit_turns ๊ฐ™์€ stop_reason์œผ๋กœ ๋Œ€ํ™” ์ƒํƒœ๋ฅผ ๋ณด์กดํ•œ ์ฑ„ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ๋ณด์กฐ ์ˆ˜๋‹จ๋„ ๋‘ ๊ฐ€์ง€ ์žˆ๋Š”๋ฐ์š”, ํ›…์—์„œ cancel_tool๋กœ ๋„๊ตฌ ์‹คํ–‰์„ ์ฐจ๋‹จํ•˜๋ฉด ๊ทธ ์‚ฌ์œ ๊ฐ€ ๋ชจ๋ธ์— ์ „๋‹ฌ๋˜์–ด ๋ชจ๋ธ์ด ๋งˆ๋ฌด๋ฆฌ ์‘๋‹ต์„ ํ•˜๊ณ , ์‚ฌ์šฉ์ž ์ทจ์†Œ๋‚˜ ํƒ€์ž„์•„์›ƒ ๊ฐ™์€ ์™ธ๋ถ€ ์‹ ํ˜ธ๋Š” agent.cancel()๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜์—์„œ๋Š” ๋น„์šฉ ๋ฐฉ์–ด์„ ์œผ๋กœ limits๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ๊ฑธ์–ด๋‘์‹œ๋Š” ๊ฑธ ๊ถŒํ•ฉ๋‹ˆ๋‹ค.

๋„๊ตฌ ์ƒํƒœ๊ณ„

@tool ยท ๋นŒํŠธ์ธ ๋„๊ตฌ ยท MCPClient

PART 4 ยท ๋„๊ตฌ ์ƒํƒœ๊ณ„

๋„๊ตฌ์˜ ์„ธ ๊ฐ€์ง€ ๊ณต๊ธ‰ ๊ฒฝ๋กœ

์ง์ ‘ ์ œ์ž‘ ยท ๊ฐ€์ ธ๋‹ค ์“ฐ๊ธฐ ยท ์™ธ๋ถ€ ์—ฐ๊ฒฐ

๋ฐœํ‘œ์ž ๋…ธํŠธ

๋„๊ตฌ๋ฅผ ํ™•๋ณดํ•˜๋Š” ๊ฒฝ๋กœ๋Š” ์„ธ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์‚ฌ๋‚ด API์ฒ˜๋Ÿผ ์šฐ๋ฆฌ ํšŒ์‚ฌ์—๋งŒ ์žˆ๋Š” ๊ธฐ๋Šฅ์€ @tool๋กœ ์ง์ ‘ ๋งŒ๋“ค๊ณ , ํŒŒ์ผ ์ฝ๊ธฐ๋‚˜ HTTP ํ˜ธ์ถœ์ฒ˜๋Ÿผ ํ”ํ•œ ๊ธฐ๋Šฅ์€ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๋นŒํŠธ์ธ์—์„œ ๊ฐ€์ ธ๋‹ค ์“ฐ๊ณ , ์ด๋ฏธ MCP ์„œ๋ฒ„๋กœ ๊ณต๊ฐœ๋œ ๊ธฐ๋Šฅ์€ MCPClient๋กœ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์‹ค๋ฌด์—์„œ๋Š” ์„ธ ๊ฒฝ๋กœ๋ฅผ ์„ž์–ด ์“ฐ๊ฒŒ ๋˜๋Š”๋ฐ, ์ƒˆ ๋„๊ตฌ๋ฅผ ๋งŒ๋“ค๊ธฐ ์ „์— ๋นŒํŠธ์ธ๊ณผ MCP ์ƒํƒœ๊ณ„๋ถ€ํ„ฐ ๊ฒ€์ƒ‰ํ•ด ๋ณด์‹œ๋Š” ๊ฒŒ ์‹œ๊ฐ„์„ ์•„๋ผ๋Š” ๊ธธ์ž…๋‹ˆ๋‹ค. ์ด์ œ ํ•˜๋‚˜์”ฉ ์ฝ”๋“œ๋กœ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

PART 4 ยท ๋„๊ตฌ ์ƒํƒœ๊ณ„

@tool ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ

Python ํ•จ์ˆ˜์— ๋ถ™์ด๋ฉด ์—์ด์ „ํŠธ๊ฐ€ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ๋„๊ตฌ๋กœ ๋ณ€ํ™˜

python
# ์ž„ํฌํŠธ โ€” ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํ•˜๋‚˜๋ฉด ์ถฉ๋ถ„
from strands import tool

# โ‘  @tool ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ โ€” ํ•จ์ˆ˜๋ฅผ ๋„๊ตฌ๋กœ ๋ณ€ํ™˜
@tool
# โ‘ก ํƒ€์ž… ํžŒํŠธ โ€” ํŒŒ๋ผ๋ฏธํ„ฐ ์Šคํ‚ค๋งˆ ์ž๋™ ์ƒ์„ฑ
def get_weather(city: str, unit: str = "celsius") -> dict:
    # โ‘ข docstring โ€” ๋ชจ๋ธ์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ์‚ฌ์šฉ ์„ค๋ช…์„œ
    """๋„์‹œ์˜ ํ˜„์žฌ ๋‚ ์”จ๋ฅผ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

    ์‚ฌ์šฉ์ž๊ฐ€ ๋‚ ์”จ๋ฅผ ๋ฌผ์–ด๋ณผ ๋•Œ ํ˜ธ์ถœํ•˜์„ธ์š”.
    city: ๋„์‹œ๋ช… (์˜ˆ: "์„œ์šธ", "Tokyo")
    unit: ์˜จ๋„ ๋‹จ์œ„ โ€” "celsius" ๋˜๋Š” "fahrenheit"
    ๋ฐ˜ํ™˜: {"temp": 22, "condition": "๋ง‘์Œ"}
    """
    # โ‘ฃ ๋ฐ˜ํ™˜๊ฐ’ โ€” ๋ชจ๋ธ์ด ๊ด€์ฐฐํ•˜๋Š” ์‹คํ–‰ ๊ฒฐ๊ณผ
    return {"temp": 22, "condition": "๋ง‘์Œ"}
  • @tool ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํ•˜๋‚˜๋กœ Python ํ•จ์ˆ˜๊ฐ€ ์—์ด์ „ํŠธ ๋„๊ตฌ๋กœ ๋ณ€ํ™˜
  • ํƒ€์ž… ํžŒํŠธ โ€” ํŒŒ๋ผ๋ฏธํ„ฐ ์Šคํ‚ค๋งˆ ์ž๋™ ์ƒ์„ฑ (city: str, ๊ธฐ๋ณธ๊ฐ’ ์ง€์›)
  • docstring โ€” ๋ชจ๋ธ์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ์‚ฌ์šฉ ์„ค๋ช…์„œ, ํ˜ธ์ถœ ์‹œ์  ํŒ๋‹จ ๊ทผ๊ฑฐ
  • ๋ฐ˜ํ™˜๊ฐ’ โ€” ๋ชจ๋ธ์ด ๊ด€์ฐฐํ•˜๋Š” ๋„๊ตฌ ์‹คํ–‰ ๊ฒฐ๊ณผ
๋ฐœํ‘œ์ž ๋…ธํŠธ

์•„๊นŒ ์ž ๊น ๋ณธ @tool์„ ์ด๋ฒˆ์—” ์ž์„ธํžˆ ๋œฏ์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํƒ€์ž… ํžŒํŠธ์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ ์Šคํ‚ค๋งˆ๊ฐ€ ์ž๋™ ์ƒ์„ฑ๋˜๋‹ˆ๊นŒ, unit์ฒ˜๋Ÿผ ๊ธฐ๋ณธ๊ฐ’์ด ์žˆ๋Š” ์„ ํƒ ํŒŒ๋ผ๋ฏธํ„ฐ๋„ ๊ทธ๋Œ€๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. docstring์—๋Š” ์–ธ์ œ ํ˜ธ์ถœํ•ด์•ผ ํ•˜๋Š”์ง€, ํŒŒ๋ผ๋ฏธํ„ฐ ์˜ˆ์‹œ, ๋ฐ˜ํ™˜ ํ˜•ํƒœ๊นŒ์ง€ ์ ์–ด์ฃผ๋Š” ๊ฒŒ ์ข‹์•„์š”. ๋ชจ๋ธ ์ž…์žฅ์—์„œ๋Š” ์ด ๋ฌธ์„œ๊ฐ€ ๋„๊ตฌ์— ๋Œ€ํ•ด ์•„๋Š” ์ „๋ถ€๊ฑฐ๋“ ์š”. ๋„๊ตฌ ์„ ํƒ์ด ์ž๊พธ ์–ด๊ธ‹๋‚œ๋‹ค๋ฉด ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ docstring์„ ๋‹ค๋“ฌ๋Š” ๊ฒŒ ์ •๋‹ต์ธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

PART 4 ยท ๋„๊ตฌ ์ƒํƒœ๊ณ„

๋นŒํŠธ์ธ ๋„๊ตฌ ์นดํ…Œ๊ณ ๋ฆฌ

๋‘ ๊ณต๊ธ‰์› โ€” SDK ์ฝ”์–ด ๋™๋ด‰ 6์ข…๊ณผ strands-agents-tools ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํ™•์žฅ

ํ•ต์‹ฌ ํฌ์ธํŠธ

์ฝ”์–ด ๋™๋ด‰ 6์ข…
bash ยท file_editor ยท http_request ยท notebook ยท sleep ยท stop โ€” v1.50 ์ดํ›„ SDK ์ฝ”์–ด์— ๋™๋ด‰, ๋ณ„๋„ ์„ค์น˜ ์—†์ด ์ฆ‰์‹œ ์‚ฌ์šฉ
file_read ยท file_write ยท editor
ํŒŒ์ผ โ€” ๋กœ์ปฌ ํŒŒ์ผ CRUD, ์ฝ”๋“œ ํŽธ์ง‘
http_request ยท retrieve
๋„คํŠธ์›Œํฌ โ€” REST API ํ˜ธ์ถœ, RAG ๊ฒ€์ƒ‰
shell ยท python_repl
์‹œ์Šคํ…œ โ€” ๋ช…๋ น ์‹คํ–‰ยท์ฝ”๋“œ ํ‰๊ฐ€, ์ตœ์†Œ ๊ถŒํ•œ์œผ๋กœ ๋“ฑ๋ก
use_aws ยท calculator ยท current_time
AWSยท์œ ํ‹ธ โ€” AWS CLI ๋ž˜ํ•‘, ๊ณ„์‚ฐ, ์‹œ๊ฐ„

์ฝ”๋“œ

python
# ์ž„ํฌํŠธ โ€” ํ•„์š”ํ•œ ๋„๊ตฌ๋งŒ ๊ณจ๋ผ์„œ
from strands import Agent
from strands_tools import file_read, http_request, current_time

# ๋“ฑ๋ก โ€” ๋ฆฌ์ŠคํŠธ์— ๋‹ด์œผ๋ฉด ๋
agent = Agent(tools=[file_read, http_request, current_time])
๋ฐœํ‘œ์ž ๋…ธํŠธ

์ง์ ‘ ๋งŒ๋“ค๊ธฐ ์ „์— ์—ฌ๊ธฐ ์žˆ๋Š”์ง€ ๋จผ์ € ํ™•์ธํ•˜์„ธ์š”. ๋นŒํŠธ์ธ ๋„๊ตฌ์˜ ๊ณต๊ธ‰์›์€ ๋‘ ๊ฐˆ๋ž˜์ธ๋ฐ, bash๋‚˜ file_editor, http_request ๊ฐ™์€ ํ•ต์‹ฌ 6์ข…์€ SDK ์ฝ”์–ด์— ๋™๋ด‰๋˜์–ด ์žˆ์–ด์„œ tools ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š์•„๋„ ๋ฐ”๋กœ ์“ธ ์ˆ˜ ์žˆ๊ณ , ๊ทธ ๋ฐ–์˜ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ํ™•์žฅ ๋„๊ตฌ๋Š” strands-agents-tools ํŒจํ‚ค์ง€์—์„œ import ํ•œ ์ค„์ด๋ฉด ๋ฐ”๋กœ ์”๋‹ˆ๋‹ค. ํŠนํžˆ use_aws๋Š” AWS CLI๋ฅผ ๋ž˜ํ•‘ํ•ด์„œ ์—์ด์ „ํŠธ๊ฐ€ AWS ๋ฆฌ์†Œ์Šค๋ฅผ ์ง์ ‘ ๋‹ค๋ฃจ๊ฒŒ ํ•ด์ฃผ๋‹ˆ๊นŒ AWS ํ™˜๊ฒฝ์—์„œ๋Š” ํ™œ์šฉ๋„๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ shell์ด๋‚˜ python_repl์ฒ˜๋Ÿผ ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋Š” ์—์ด์ „ํŠธ์—๊ฒŒ ์‹คํ–‰ ๊ถŒํ•œ์„ ์ฃผ๋Š” ์…ˆ์ด๋ผ๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”. ํ”„๋กœ๋•์…˜์—์„œ๋Š” ๊ผญ ํ•„์š”ํ•œ ๋„๊ตฌ๋งŒ ๊ณจ๋ผ ๋„ฃ๋Š” ์ตœ์†Œ ๊ถŒํ•œ ์›์น™์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

PART 4 ยท ๋„๊ตฌ ์ƒํƒœ๊ณ„

MCPClient ์—ฐ๊ฒฐ

์™ธ๋ถ€ MCP(Model Context Protocol) ์„œ๋ฒ„์˜ ๋„๊ตฌ๋ฅผ ๋™์ ์œผ๋กœ ๋กœ๋“œ

python
# ์ž„ํฌํŠธ โ€” Agent์™€ MCP ํด๋ผ์ด์–ธํŠธ, stdio ์ „์†ก
from strands import Agent
from strands.tools.mcp import MCPClient
from mcp import stdio_client, StdioServerParameters

# โ‘  MCP ํด๋ผ์ด์–ธํŠธ โ€” transport callable๋กœ stdio ์„œ๋ฒ„ ์—ฐ๊ฒฐ
mcp = MCPClient(lambda: stdio_client(StdioServerParameters(
    command="npx",
    args=["-y", "@modelcontextprotocol/server-filesystem", "/tmp"],
)))

# โ‘ก ์—ฐ๊ฒฐ ์ปจํ…์ŠคํŠธ โ€” ์„œ๋ฒ„ ๋„๊ตฌ๋ฅผ ๋กœ๋“œํ•ด ์—์ด์ „ํŠธ์— ๋“ฑ๋ก
with mcp:
    agent = Agent(
        tools=mcp.list_tools_sync(),  # โ‘ข MCP ์„œ๋ฒ„ ๋„๊ตฌ ์ž๋™ ๋“ฑ๋ก
    )
    result = agent("/tmp ๋””๋ ‰ํ† ๋ฆฌ์˜ ํŒŒ์ผ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค˜")

# โ‘ฃ ์„ ํƒ โ€” client_name: MCP ์ดˆ๊ธฐํ™” ์‹œ ์„œ๋ฒ„์— ์•Œ๋ฆด ํด๋ผ์ด์–ธํŠธ ์ด๋ฆ„
#    MCPClient(transport, client_name="cost-agent")
# โ‘ค ๋ณด์กฐ โ€” mcpServers JSON ์„ค์ •(ํŒŒ์ผ/๋”•์…”๋„ˆ๋ฆฌ)์„ ์ผ๊ด„ ๋กœ๋“œ
#    agent = Agent(tools=MCPClient.load_servers("mcp.json"))
  • MCPClient โ€” transport callable๋กœ stdio MCP ์„œ๋ฒ„ ์—ฐ๊ฒฐ
  • with ์ปจํ…์ŠคํŠธ โ€” ์—ฐ๊ฒฐ ์ˆ˜๋ช… ๊ด€๋ฆฌ, ๋ธ”๋ก ์•ˆ์—์„œ๋งŒ ๋„๊ตฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • list_tools_sync() โ€” ์„œ๋ฒ„ ๋„๊ตฌ๋ฅผ ์กฐํšŒํ•ด Agent์— ์ž๋™ ๋“ฑ๋ก
  • client_name โ€” ์„œ๋ฒ„์— ์ „๋‹ฌ๋˜๋Š” ํด๋ผ์ด์–ธํŠธ ์‹๋ณ„์ž ํŒŒ๋ผ๋ฏธํ„ฐ
  • load_servers() โ€” ์„œ๋ฒ„๋‹น MCPClient๋ฅผ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ณด์กฐ API, ์ฃผ ํ๋ฆ„์€ ์„œ๋ฒ„๋ณ„ ์ธ์Šคํ„ด์Šคํ™”
๋ฐœํ‘œ์ž ๋…ธํŠธ

๋งˆ์ง€๋ง‰ ๊ฒฝ๋กœ๋Š” ์™ธ๋ถ€ ์—ฐ๊ฒฐ์ž…๋‹ˆ๋‹ค. MCP๋Š” ๋„๊ตฌ๋ฅผ ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ๋กœ ๋…ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ, ์ด๋ฏธ ๊ณต๊ฐœ๋œ MCP ์„œ๋ฒ„๊ฐ€ ์žˆ๋‹ค๋ฉด ์ฝ”๋“œ ๋ช‡ ์ค„๋กœ ๊ทธ ์„œ๋ฒ„์˜ ๋„๊ตฌ ์ „์ฒด๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋Š” npx๋กœ ํŒŒ์ผ์‹œ์Šคํ…œ MCP ์„œ๋ฒ„๋ฅผ ๋„์›Œ ์—ฐ๊ฒฐํ•˜๋Š” ์ฝ”๋“œ์ธ๋ฐ์š”, with ๋ธ”๋ก์ด ์—ฐ๊ฒฐ ์ˆ˜๋ช…์„ ๊ด€๋ฆฌํ•˜๋‹ˆ๊นŒ ๋„๊ตฌ ์‚ฌ์šฉ์€ ๋ฐ˜๋“œ์‹œ ๋ธ”๋ก ์•ˆ์—์„œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. list_tools_sync()๊ฐ€ ์„œ๋ฒ„์˜ ๋„๊ตฌ ๋ชฉ๋ก์„ ๋ฐ›์•„ Agent์— ๋“ฑ๋กํ•ด ์ฃผ๊ณ ์š”. ์„œ๋ฒ„์— ์šฐ๋ฆฌ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์•Œ๋ฆฌ๊ณ  ์‹ถ์œผ๋ฉด client_name ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ์—ฐ๊ฒฐํ•  ์„œ๋ฒ„๊ฐ€ ์—ฌ๋Ÿฟ์ด๋ฉด mcpServers JSON ์„ค์ •์„ ํ†ต์งธ๋กœ ์ฝ์–ด ์„œ๋ฒ„๋‹น MCPClient๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋Š” load_servers()๋„ ๋ณด์กฐ๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์‚ฌ๋‚ด์— ์ด๋ฏธ MCP ์„œ๋ฒ„๋ฅผ ์šด์˜ ์ค‘์ด์‹œ๋ผ๋ฉด, Strands ์—์ด์ „ํŠธ์— ๊ทธ๋Œ€๋กœ ๊ฝ‚์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

๋ชจ๋ธ ํ”„๋กœ๋ฐ”์ด๋”

๊ณต์‹ 15์ข… ํ”„๋กœ๋ฐ”์ด๋” ยท BedrockModel ยท Structured Output

PART 5 ยท ๋ชจ๋ธ ํ”„๋กœ๋ฐ”์ด๋”

๋ชจ๋ธ ํ”„๋กœ๋ฐ”์ด๋”

์—์ด์ „ํŠธ์˜ ๋‘๋‡Œ๋ฅผ ๊ฐˆ์•„ ๋ผ์šฐ๋Š” ๊ณ„์ธต โ€” Agent ์ฝ”๋“œ๋Š” ๊ทธ๋Œ€๋กœ

๋ชจ๋ธ ํ”„๋กœ๋ฐ”์ด๋”

Agent ์ฝ”๋“œ๋Š” ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ๋ชจ๋ธ๋งŒ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค โ€” ํ”„๋กœ๋ฐ”์ด๋”๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฒƒ์€ ์ธ์ฆ๋ฟ์ž…๋‹ˆ๋‹ค.

  • ๊ณต์‹ 15์ข… + ์ปค๋ฎค๋‹ˆํ‹ฐ 10์ข… โ€” Bedrock ยท Anthropic ยท OpenAI ๋“ฑ
  • ๊ธฐ๋ณธ: BedrockModel โ€” IAM ์ธ์ฆ ยท ํ”„๋กœ๋•์…˜ ๊ถŒ์žฅ
  • ๊ต์ฒด ๋น„์šฉ: model_id ํ•œ ์ค„
  • Structured Output โ€” ํ”„๋กœ๋ฐ”์ด๋” ๊ณตํ†ต
takeaway

๊ฐœ๋ฐœ์€ ๋ฌด๋ฃŒ ๋กœ์ปฌ Ollama, ํ”„๋กœ๋•์…˜์€ Bedrock โ€” ์–ด๋А ์กฐํ•ฉ์ด๋“  toolsยทsystem_prompt ์ฝ”๋“œ๋Š” ๋ฐ”๋€Œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฐœํ‘œ์ž ๋…ธํŠธ

๋ณธ๊ฒฉ์ ์œผ๋กœ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ํฐ ๊ทธ๋ฆผ์„ ํ•œ ์žฅ์œผ๋กœ ์žก๊ณ  ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€๋Š” ํ•˜๋‚˜์˜ˆ์š”. ๋ชจ๋ธ์„ ๋ฐ”๊ฟ”๋„ Agent ์ฝ”๋“œ๋Š” ๊ทธ๋Œ€๋กœ๋ผ๋Š” ๊ฒ๋‹ˆ๋‹ค. ๊ณต์‹ 15์ข… ํ”„๋กœ๋ฐ”์ด๋” ์ค‘ ๊ธฐ๋ณธ์€ BedrockModel์ด๊ณ , ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ๋Š” ๋ฌด๋ฃŒ์ธ Ollama๋กœ ๋Œ๋ฆฌ๋‹ค๊ฐ€ ํ”„๋กœ๋•์…˜์—์„œ Bedrock์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ์กฐํ•ฉ์ด ํ”ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ „์ฒด ๋ชฉ๋ก๋ถ€ํ„ฐ ํ‘œ๋กœ ๋ณด์‹œ์ฃ .

PART 5 ยท ๋ชจ๋ธ ํ”„๋กœ๋ฐ”์ด๋”

๊ณต์‹ 15์ข… ๋ชจ๋ธ ํ”„๋กœ๋ฐ”์ด๋”

ํ•˜๋‚˜์˜ Agent ์ฝ”๋“œ๋กœ ๋ชจ๋ธ๋งŒ ๊ต์ฒด โ€” ํ”„๋กœ๋ฐ”์ด๋”๋ณ„๋กœ ๋‹ค๋ฅธ ๊ฒƒ์€ ์ธ์ฆ๋ฟ

ํด๋ž˜์Šค์šฉ๋„
BedrockModelAWS ํ”„๋กœ๋•์…˜ (๊ถŒ์žฅ)
NovaAPIModelAmazon Nova โ€” Python ์ „์šฉ
AnthropicModelAnthropic API ์ง์ ‘
OpenAIModelGPT ์‹œ๋ฆฌ์ฆˆ
OpenAIResponsesModelResponses API
GeminiModelGoogle AI
OllamaModel๋กœ์ปฌ ์ถ”๋ก  (๋ฌด๋ฃŒ)
LiteLLMModel100+ ๋ชจ๋ธ ํ†ตํ•ฉ ํ”„๋ก์‹œ
ํด๋ž˜์Šค์šฉ๋„
LlamaCPPModel๋กœ์ปฌ GGUF
LlamaAPIModelLlama ํด๋ผ์šฐ๋“œ
MistralModelMistral AI
SageMakerModel์ปค์Šคํ…€ ์—”๋“œํฌ์ธํŠธ
WriterModelWriter AI
VercelModelVercel AI SDK โ€” TS ์ „์šฉ
์ปค๋ฎค๋‹ˆํ‹ฐ 10์ข…Cohere ยท vLLM ยท xAI ๋“ฑ โ€” ๋ณ„๋„ ์—ฐ๋™
๋ฐœํ‘œ์ž ๋…ธํŠธ

ํ‘œ๊ฐ€ ๊ธธ์ง€๋งŒ ๋ฉ”์‹œ์ง€๋Š” ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. Agent ์ฝ”๋“œ๋Š” ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ๋ชจ๋ธ๋งŒ ๊ฐˆ์•„ ๋ผ์šด๋‹ค๋Š” ๊ฑฐ์ฃ . ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ๋Š” ๋ฌด๋ฃŒ์ธ Ollama ๋กœ์ปฌ ๋ชจ๋ธ๋กœ ๋Œ๋ฆฌ๊ณ  ํ”„๋กœ๋•์…˜์€ Bedrock์œผ๋กœ ๊ฐ€๋Š” ์กฐํ•ฉ์ด ํ”ํ•œ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ํ‘œ์—์„œ ๋‘ ๊ฐ€์ง€๋งŒ ์ฃผ์˜ํ•˜์‹œ๋ฉด ๋˜๋Š”๋ฐ, ์ตœ๊ทผ ์ถ”๊ฐ€๋œ Amazon Nova๋Š” Python ์ „์šฉ์ด๊ณ , ๋ฐ˜๋Œ€๋กœ Vercel์€ TypeScript SDK ์ „์šฉ์ž…๋‹ˆ๋‹ค. ๊ณต์‹ 15์ข… ๋ฐ–์—๋„ Cohere๋‚˜ vLLM ๊ฐ™์€ ์ปค๋ฎค๋‹ˆํ‹ฐ ์—ฐ๋™์ด 10์ข… ์žˆ๊ณ , ํ‘œ์— ์—†๋Š” ๋ชจ๋ธ์ด๋ผ๋„ LiteLLM ํ”„๋ก์‹œ๋ฅผ ๊ฑฐ์น˜๋ฉด 100๊ฐœ ์ด์ƒ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

PART 5 ยท ๋ชจ๋ธ ํ”„๋กœ๋ฐ”์ด๋”

BedrockModel ์„ค์ •

๊ธฐ๋ณธ ํ”„๋กœ๋ฐ”์ด๋” โ€” model_id ํ•œ ์ค„๋กœ ๋ชจ๋ธ ๊ต์ฒด

์„ค์ • ์ฝ”๋“œ

python
from strands.models import BedrockModel

# ๊ธฐ๋ณธ โ€” model_id๋งŒ ์ง€์ • (us. ์ ‘๋‘์–ด = Cross-Region ์ถ”๋ก  ํ”„๋กœํŒŒ์ผ)
model = BedrockModel(model_id="us.anthropic.claude-sonnet-4-6")

# ์ƒ์„ธ ์„ค์ • โ€” ๋ฆฌ์ „ยท์ƒ์„ฑ ํŒŒ๋ผ๋ฏธํ„ฐ ์ œ์–ด
model = BedrockModel(
    model_id="us.anthropic.claude-sonnet-4-6",
    region_name="us-east-1",
    temperature=0.1,
    max_tokens=4096,
)

# ์กฐ๋ฆฝ โ€” ์–ด๋–ค ์„ค์ •์ด๋“  Agent์—๋Š” model ํ•˜๋‚˜๋กœ ์ „๋‹ฌ
agent = Agent(model=model, tools=[...])

ํ•ต์‹ฌ ํŒŒ๋ผ๋ฏธํ„ฐ

model_id
์ถ”๋ก  ํ”„๋กœํŒŒ์ผ ID โ€” ํŒŒ์šด๋ฐ์ด์…˜ ๋ชจ๋ธ ARN์ด ์•„๋‹˜
region_name
๋ชจ๋ธ ๊ฐ€์šฉ ๋ฆฌ์ „ (us-east-1 ยท us-west-2 ๋“ฑ)
temperature
์‘๋‹ต ๋ฌด์ž‘์œ„์„ฑ โ€” ๋‚ฎ์„์ˆ˜๋ก ๊ฒฐ์ •์ 
max_tokens
์‘๋‹ต ๊ธธ์ด ์ƒํ•œ
๋ฐœํ‘œ์ž ๋…ธํŠธ

๊ธฐ๋ณธ ํ”„๋กœ๋ฐ”์ด๋”์ธ BedrockModel ์„ค์ •์„ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํ”ํ•œ ์‹ค์ˆ˜๊ฐ€ model_id์ธ๋ฐ, ํŒŒ์šด๋ฐ์ด์…˜ ๋ชจ๋ธ ARN์ด ์•„๋‹ˆ๋ผ ์ถ”๋ก  ํ”„๋กœํŒŒ์ผ ID๋ฅผ ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. us. ์ ‘๋‘์–ด๊ฐ€ ๋ถ™์œผ๋ฉด ํฌ๋กœ์Šค ๋ฆฌ์ „ ์ถ”๋ก  ํ”„๋กœํŒŒ์ผ์ด๋ผ ํŠธ๋ž˜ํ”ฝ์ด ์—ฌ๋Ÿฌ ๋ฆฌ์ „์œผ๋กœ ๋ถ„์‚ฐ๋˜๊ณ ์š”. temperature๋Š” ์—์ด์ „ํŠธ ์šฉ๋„๋ผ๋ฉด ๋‚ฎ๊ฒŒ ์žก์•„์„œ ๋„๊ตฌ ์„ ํƒ์ด ๊ฒฐ์ •์ ์œผ๋กœ ๋‚˜์˜ค๊ฒŒ ํ•˜๋Š” ํŽธ์ด ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค. ์–ด๋–ค ์„ค์ •์„ ํ•˜๋“  Agent์—๋Š” model ์ธ์ž ํ•˜๋‚˜๋กœ ๋“ค์–ด๊ฐ„๋‹ค๋Š” ๊ตฌ์กฐ๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

PART 5 ยท ๋ชจ๋ธ ํ”„๋กœ๋ฐ”์ด๋”

Structured Output

์—์ด์ „ํŠธ์˜ ๋‹ต์„ ์ฝ”๋“œ๊ฐ€ ๋ฐ›์„ ๋•Œ โ€” ์ž์œ  ํ…์ŠคํŠธ ๋Œ€์‹  ์Šคํ‚ค๋งˆ๋กœ, ํ”„๋กœ๋ฐ”์ด๋” ๊ณตํ†ต

์‚ฌ์šฉ ์ฝ”๋“œ

python
from pydantic import BaseModel
from strands import Agent

# ์ถœ๋ ฅ ์Šคํ‚ค๋งˆ ์ •์˜ โ€” Pydantic ๋ชจ๋ธ์ด ๊ณง JSON Schema
class WeatherReport(BaseModel):
    city: str
    temp_celsius: float
    condition: str
    humidity: int

# ์Šคํ‚ค๋งˆ ์ง€์ • ํ˜ธ์ถœ โ€” structured_output_model๋กœ ์Šคํ‚ค๋งˆ ์ „๋‹ฌ
agent = Agent(model="us.anthropic.claude-sonnet-4-6")
result = agent("์„œ์šธ ๋‚ ์”จ๋ฅผ ์•Œ๋ ค์ค˜", structured_output_model=WeatherReport)

# ๊ฒฐ๊ณผ ์ ‘๊ทผ โ€” ํŒŒ์‹ฑ ์‹คํŒจ ์—†์ด Pydantic ์ธ์Šคํ„ด์Šค๋กœ ์ˆ˜์‹ 
report = result.structured_output
# report.city == "์„œ์šธ", report.temp_celsius == 22.5

Pydantic ์Šคํ‚ค๋งˆ๋ž€

ํด๋ž˜์Šค = ์Šคํ‚ค๋งˆ

ํŒŒ์ด์ฌ ํ‘œ์ค€ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.
- ํด๋ž˜์Šค ํ•„๋“œ ์„ ์–ธ์ด ๊ณง JSON Schema๋กœ ๋ณ€ํ™˜๋˜์–ด ๋ชจ๋ธ์— ์ „๋‹ฌ
- ์‘๋‹ต์ด ์Šคํ‚ค๋งˆ์™€ ๋‹ค๋ฅด๋ฉด ๊ฒ€์ฆ ๋‹จ๊ณ„์—์„œ ๊ฑธ๋Ÿฌ์ง
- ๊ฒฐ๊ณผ๋Š” ํƒ€์ž… ์žˆ๋Š” Python ๊ฐ์ฒด โ€” ๋ฌธ์ž์—ด ํŒŒ์‹ฑ ์ฝ”๋“œ๊ฐ€ ์‚ฌ๋ผ์ง

๋ฐœํ‘œ์ž ๋…ธํŠธ

์—์ด์ „ํŠธ์˜ ๋‹ต์„ ์‚ฌ๋žŒ์ด ์•„๋‹ˆ๋ผ ์ฝ”๋“œ๊ฐ€ ๋ฐ›์•„์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์ฃ . ์ž์œ  ํ…์ŠคํŠธ๋ฅผ ์ •๊ทœ์‹์œผ๋กœ ํŒŒ์‹ฑํ•˜๋Š” ๋Œ€์‹ , Pydantic ํด๋ž˜์Šค๋กœ ์Šคํ‚ค๋งˆ๋ฅผ ์„ ์–ธํ•˜๊ณ  structured_output_model๋กœ ๋„˜๊ธฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค ํ•„๋“œ ์„ ์–ธ์ด ๊ทธ๋Œ€๋กœ JSON Schema๋กœ ๋ณ€ํ™˜๋˜์–ด ๋ชจ๋ธ์— ์ „๋‹ฌ๋˜๊ณ , ๊ฒฐ๊ณผ๋Š” ํƒ€์ž… ์žˆ๋Š” Python ๊ฐ์ฒด๋กœ ๋Œ์•„์˜ต๋‹ˆ๋‹ค. ์—์ด์ „ํŠธ๋ฅผ ํŒŒ์ดํ”„๋ผ์ธ์˜ ํ•œ ๋‹จ๊ณ„๋กœ ์“ฐ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ๊ณผ ์—ฐ๋™ํ•  ๋•Œ ์‚ฌ์‹ค์ƒ ํ•„์ˆ˜ ๊ธฐ๋Šฅ์ด๊ณ ์š”. ํŠน์ • ๋ชจ๋ธ ์ „์šฉ์ด ์•„๋‹ˆ๋ผ ํ”„๋กœ๋ฐ”์ด๋” ๊ณตํ†ต์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค๋Š” ์ ๋„ ๊ธฐ์–ตํ•ด ์ฃผ์„ธ์š”.

ํ”„๋ ˆ์ž„์›Œํฌ ํฌ์ง€์…”๋‹

Strands vs LangGraph vs CrewAI vs Bedrock Agents

PART 6 ยท ํ”„๋ ˆ์ž„์›Œํฌ ํฌ์ง€์…”๋‹

ํ”„๋ ˆ์ž„์›Œํฌ ํฌ์ง€์…”๋‹

์„ค๊ณ„ ์ฒ ํ•™์ด ๋‹ค๋ฅธ ๋„ค ๊ฐ€์ง€ ์„ ํƒ์ง€ โ€” Strands๊ฐ€ ์„œ ์žˆ๋Š” ์ž๋ฆฌ

๋„ค ๊ฐ€์ง€ ์„ ํƒ์ง€

์–ด๋А ํ•˜๋‚˜๊ฐ€ ์ •๋‹ต์ด ์•„๋‹ˆ๋ผ ์„ค๊ณ„ ์ฒ ํ•™์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค โ€” ์ฒซ ๋ถ„๊ธฐ๋Š” ์ฝ”๋“œ ๋ ˆ๋ฒจ ์ œ์–ด์˜ ํ•„์š” ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค.

  • Strands โ€” ๋ชจ๋ธ ์ค‘์‹ฌ ยท ํ”„๋กœ๋•์…˜ ์ง์ ‘ ๋นŒ๋“œ
  • LangGraph โ€” ๊ทธ๋ž˜ํ”„ ์›Œํฌํ”Œ๋กœ์šฐ
  • CrewAI โ€” ์—ญํ•  ๊ธฐ๋ฐ˜ ํ”„๋กœํ† ํƒ€์ž…
  • Bedrock Agents โ€” ์™„์ „ ๊ด€๋ฆฌํ˜•
takeaway

Strands์˜ ์ž๋ฆฌ โ€” ์ฝ”๋“œ ๋ ˆ๋ฒจ ์ œ์–ด + ์ตœ์†Œ ์ถ”์ƒํ™” + AWS ๋ฐฐํฌ ๊ฒฝ๋กœ ๋‚ด์žฅ, ํ”„๋กœ๋•์…˜ ์—์ด์ „ํŠธ๋ฅผ ์ง์ ‘ ๋นŒ๋“œํ•  ๋•Œ์˜ ์„ ํƒ์ง€์ž…๋‹ˆ๋‹ค.

๋ฐœํ‘œ์ž ๋…ธํŠธ

๋งˆ์ง€๋ง‰ ํŒŒํŠธ์ž…๋‹ˆ๋‹ค. ๋„ค ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์šฐ์—ด์ด ์•„๋‹ˆ๋ผ ์„ค๊ณ„ ์ฒ ํ•™์˜ ์ฐจ์ด๋กœ ๊ฐˆ๋ฆฝ๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋ ˆ๋ฒจ ์ œ์–ด๊ฐ€ ํ•„์š” ์—†๋‹ค๋ฉด ์™„์ „ ๊ด€๋ฆฌํ˜•์ธ Bedrock Agents, ๊ทธ๋ž˜ํ”„ ์„ค๊ณ„๊ฐ€ ํ•ต์‹ฌ์ด๋ฉด LangGraph, ์—ญํ•  ๊ธฐ๋ฐ˜์˜ ๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ž…์ด๋ฉด CrewAI, ํ”„๋กœ๋•์…˜ ์—์ด์ „ํŠธ๋ฅผ ์ง์ ‘ ๋นŒ๋“œํ•œ๋‹ค๋ฉด Strands์ž…๋‹ˆ๋‹ค. ์ด์ œ ์—ฌ์„ฏ ๊ฐœ ์ถ•์œผ๋กœ ๋‚˜๋ž€ํžˆ ๋†“๊ณ  ๋น„๊ตํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

PART 6 ยท ํ”„๋ ˆ์ž„์›Œํฌ ํฌ์ง€์…”๋‹

์—์ด์ „ํŠธ ํ”„๋ ˆ์ž„์›Œํฌ ๋น„๊ต

์„ค๊ณ„ ์ฒ ํ•™ยท์ถ”์ƒํ™” ์ˆ˜์ค€ยท๋ฐฐํฌ ๊ฒฝ๋กœ๊ฐ€ ๋‹ค๋ฅธ 4๊ฐ€์ง€ ์„ ํƒ์ง€

์ถ•StrandsLangGraphCrewAIBedrock Agents
์„ค๊ณ„ ์ฒ ํ•™๋ชจ๋ธ ์ค‘์‹ฌ ยท ์ตœ์†Œ ์ถ”์ƒํ™”๊ทธ๋ž˜ํ”„ ์›Œํฌํ”Œ๋กœ์šฐ์—ญํ•  ๊ธฐ๋ฐ˜ ๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ์™„์ „ ๊ด€๋ฆฌํ˜•
์ฝ”๋“œ ๋ ˆ๋ฒจPython/TS ์ง์ ‘ ์ œ์–ดStateGraph ๋…ธ๋“œ ์ •์˜YAML + PythonAPI/์ฝ˜์†”๋งŒ
๋ฉ€ํ‹ฐ์—์ด์ „ํŠธAgents-as-Tools ยท Swarm ยท Graph๋…ธ๋“œ ๊ฐ„ ๋ฉ”์‹œ์ง€Crew + Task๋‚ด์žฅ ํ˜‘์—…
๋ฐฐํฌLambda ยท Fargate ยท AgentCore์ž์ฒด ๊ด€๋ฆฌ์ž์ฒด ๊ด€๋ฆฌAWS ๊ด€๋ฆฌํ˜•
์ปค์Šคํ„ฐ๋งˆ์ด์ง•๋ฌด์ œํ•œ (์ฝ”๋“œ ๋ ˆ๋ฒจ)๊ทธ๋ž˜ํ”„ ๋‚ด ์ œํ•œ์—ญํ•  ํ…œํ”Œ๋ฆฟ์ œํ•œ์ 
์ ํ•ฉ ์‹œ๋‚˜๋ฆฌ์˜คํ”„๋กœ๋•์…˜ ์—์ด์ „ํŠธ ์ง์ ‘ ๋นŒ๋“œ๋ณต์žกํ•œ ์กฐ๊ฑด๋ถ€ ๋ถ„๊ธฐ๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ž…์ธํ”„๋ผ ๊ด€๋ฆฌ ์ตœ์†Œํ™”
takeaway

๊ฐˆ๋ฆผ๊ธธ์€ ๋ฐฐํฌ ํ–‰ โ€” LangGraphยทCrewAI๋Š” ์ž์ฒด ๊ด€๋ฆฌ, Strands๋Š” Lambda ยท Fargate ยท AgentCore ๊ฒฝ๋กœ๊ฐ€ ์—ด๋ ค ์žˆ๊ณ , Bedrock Agents๋Š” AWS ๊ด€๋ฆฌํ˜•์ž…๋‹ˆ๋‹ค.

๋ฐœํ‘œ์ž ๋…ธํŠธ

์–ด๋А ํ•˜๋‚˜๊ฐ€ ์ •๋‹ต์ด๋ผ๊ธฐ๋ณด๋‹ค, ์„ค๊ณ„ ์ฒ ํ•™์ด ๋‹ค๋ฅธ ๋„ค ๊ฐ€์ง€ ์„ ํƒ์ง€์ž…๋‹ˆ๋‹ค. ํ‘œ์—์„œ ๋ฐฐํฌ ํ–‰์„ ๋ด์ฃผ์„ธ์š”. LangGraph์™€ CrewAI๋Š” ๋ฐฐํฌ ์ธํ”„๋ผ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋ฐ˜๋ฉด, Strands๋Š” Lambda, Fargate, AgentCore๊นŒ์ง€ AWS ๋ฐฐํฌ ๊ฒฝ๋กœ๊ฐ€ ์—ด๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€ํŽธ ๊ทน๋‹จ์ธ Bedrock Agents๋Š” ์™„์ „ ๊ด€๋ฆฌํ˜•์ด๋ผ ํŽธํ•˜์ง€๋งŒ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ์ œํ•œ๋˜๊ณ ์š”. ์—ฌ๋Ÿฌ๋ถ„ ํŒ€์ด๋ผ๋ฉด ์ด ์—ฌ์„ฏ ๊ฐœ ์ถ• ์ค‘์— ์–ด๋А ๊ฒƒ์„ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ฒŒ ๋ณด์‹œ๊ฒ ์–ด์š”? ๊ทธ ๋‹ต์— ๋”ฐ๋ผ ์„ ํƒ์ด ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

PART 6 ยท ํ”„๋ ˆ์ž„์›Œํฌ ํฌ์ง€์…”๋‹

์„ ํƒ ์˜์‚ฌ๊ฒฐ์ • ํŠธ๋ฆฌ

์˜ˆ/์•„๋‹ˆ์˜ค๋กœ ๋‚ด๋ ค๊ฐ€๋Š” ํŒ€ ๋งž์ถค ํ”„๋ ˆ์ž„์›Œํฌ ์„ ํƒ ๊ฐ€์ด๋“œ

๋ฐœํ‘œ์ž ๋…ธํŠธ

๋ฐฉ๊ธˆ ๊ทธ ์งˆ๋ฌธ์„ ์ˆœ์„œ๋„๋กœ ๋งŒ๋“ค๋ฉด ์ด๋ ‡๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ถ„๊ธฐ๊ฐ€ ๊ฐ€์žฅ ์ค‘์š”ํ•œ๋ฐ, ์ฝ”๋“œ ๋ ˆ๋ฒจ ์ œ์–ด๊ฐ€ ํ•„์š” ์—†๋‹ค๋ฉด ๊ณ ๋ฏผํ•  ๊ฒƒ ์—†์ด Bedrock Agents๋กœ ์šด์˜ ๋ถ€๋‹ด์„ ์—†์• ๋Š” ๊ฒŒ ๋‚ซ์Šต๋‹ˆ๋‹ค. ์ œ์–ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ๊ทธ๋‹ค์Œ์€ ์›Œํฌํ”Œ๋กœ์šฐ์˜ ์„ฑ๊ฒฉ์ด์—์š”. ๋ณต์žกํ•œ ์กฐ๊ฑด๋ถ€ ๋ถ„๊ธฐ๊ฐ€ ํ•ต์‹ฌ์ด๋ฉด LangGraph, ์—ญํ•  ๊ธฐ๋ฐ˜์˜ ๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ž…์ด๋ฉด CrewAI, ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ๋•์…˜ ์—์ด์ „ํŠธ๋ฅผ ์ง์ ‘ ๋นŒ๋“œํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๊ฐ€ Strands์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ ์ง„ํ–‰ ์ค‘์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ด ํŠธ๋ฆฌ์— ํ•œ๋ฒˆ ๋Œ€์ž…ํ•ด ๋ณด์‹œ์ฃ .

PART 6 ยท ํ”„๋ ˆ์ž„์›Œํฌ ํฌ์ง€์…”๋‹

Strands์˜ ์ฐจ๋ณ„์ 

๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๊ตฌ๋ถ„๋˜๋Š” ํ•ต์‹ฌ ์„ค๊ณ„ ๊ฒฐ์ •

์ตœ์†Œ ์ถ”์ƒํ™”

๋งˆ๋ฒ• ์—†๋Š” ์ฝ”๋“œ โ€” Agent, Tool, Model 3๊ฐœ ํด๋ž˜์Šค๋งŒ์œผ๋กœ ์‹œ์ž‘

ํ”„๋กœ๋ฐ”์ด๋” ๋…๋ฆฝ

๊ณต์‹ 15์ข…(+์ปค๋ฎค๋‹ˆํ‹ฐ 10์ข…) ๋ชจ๋ธ ํ”„๋กœ๋ฐ”์ด๋” โ€” ์ฝ”๋“œ ๋ณ€๊ฒฝ ์—†์ด model_id๋งŒ ๊ต์ฒด

๋ฐฐํฌ ๋‚ด์žฅ

Lambda ยท Fargate ยท AgentCore Runtime โ€” SDK์—์„œ ํ”„๋กœ๋•์…˜๊นŒ์ง€

takeaway

์„ธ ๊ฒฐ์ •์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐฉํ–ฅ์€ ํ•˜๋‚˜ โ€” Agent ยท Tool ยท Model ์„ธ ๊ฐ€์ง€๋กœ ์‹œ์ž‘ํ•ด ํ”„๋กœ๋•์…˜๊นŒ์ง€ ๊ฐ€๋Š” SDK์ž…๋‹ˆ๋‹ค.

๋ฐœํ‘œ์ž ๋…ธํŠธ

๋งˆ๋ฌด๋ฆฌํ•˜๋ฉด์„œ Strands์˜ ์„ค๊ณ„ ๊ฒฐ์ • ์„ธ ๊ฐ€์ง€๋ฅผ ์ •๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฒซ์งธ, ์ถ”์ƒํ™”๋ฅผ ์ตœ์†Œ๋กœ ์œ ์ง€ํ•ด์„œ ๋””๋ฒ„๊น…ํ•  ๋•Œ ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด๋ถ€๋ฅผ ํŒŒ๊ณ ๋“ค ์ผ์ด ์ ์Šต๋‹ˆ๋‹ค. ๋‘˜์งธ, ํ”„๋กœ๋ฐ”์ด๋” ๋…๋ฆฝ์ด๋ผ ๋ชจ๋ธ ์„ ํƒ์ด ๋ฒค๋” ๊ณ„์•ฝ์ด ์•„๋‹ˆ๋ผ ์ฝ”๋“œ ํ•œ ์ค„์˜ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์…‹์งธ, agentcore CLI ๋‘ ๋ช…๋ น์œผ๋กœ ๊ด€๋ฆฌํ˜• ๋Ÿฐํƒ€์ž„๊นŒ์ง€ ๊ฐ€๋Š” ๋ฐฐํฌ ๊ฒฝ๋กœ๊ฐ€ SDK์— ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜ ๋‚ด์šฉ์„ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์ค„์ด๋ฉด, Agent, Tool, Model ์„ธ ๊ฐ€์ง€๋กœ ์‹œ์ž‘ํ•ด์„œ ํ”„๋กœ๋•์…˜๊นŒ์ง€ ๊ฐ€๋Š” SDK๋ผ๊ณ  ๊ธฐ์–ตํ•ด ์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Strands๋Š” ์—์ด์ „ํŠธ์˜ ๋ผˆ๋Œ€๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Agent ยท Tool ยท Model โ€” ์„ธ ๊ฐ€์ง€๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ”„๋กœ๋•์…˜ ์—์ด์ „ํŠธ