Home / Strands ๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ ๊ฐœ๋ฐœ / ๐ŸŽฏ Strands ๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ
Module

๐ŸŽฏ Strands ๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ

Agents-as-Tools, Swarm, Graph, Workflow 4ํŒจํ„ด

โฑ 60๋ถ„ 108 / 189

Strands ๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ

Agents-as-Tools ยท Swarm ยท Graph ยท Workflow

์—์ด์ „ํŠธ๊ฐ€ ์—์ด์ „ํŠธ๋ฅผ ๋ถ€๋ฅธ๋‹ค

4๊ฐ€์ง€ ๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ ํŒจํ„ด โ€” ์œ„์ž„์—์„œ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜๊นŒ์ง€

๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ ํŒจํ„ด

์™œ ๋‚˜๋ˆ„๋Š”๊ฐ€ ยท ํŒจํ„ด ์ง€ํ˜• ยท Strands์˜ 4๊ฐ€์ง€ ๊ตฌํ˜„

PART 1 ยท ํŒจํ„ด ๊ฐœ์š”

์™œ ๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ์ธ๊ฐ€

์—์ด์ „ํŠธ ํ•˜๋‚˜์— ๋ชจ๋“  ๊ฒƒ์„ ๋งก๊ธธ ๋•Œ ์ƒ๊ธฐ๋Š” ์„ธ ๊ฐ€์ง€ ๋ฌธ์ œ

์ปจํ…์ŠคํŠธ ํฌํ™”

๋„๊ตฌ ์ˆ˜์‹ญ ๊ฐœ + ๊ธด ์ด๋ ฅ์ด ํ•œ ์ปจํ…์ŠคํŠธ์— ๋ชฐ๋ฆผ โ€” ๋„๊ตฌ ์„ ํƒ ์ •ํ™•๋„์™€ ์‘๋‹ต ํ’ˆ์งˆ์ด ํ•จ๊ป˜ ํ•˜๋ฝ

์—ญํ•  ์ถฉ๋Œ

๋ถ„์„ยท์‹คํ–‰ยท๊ฒ€์ฆ์„ ํ•˜๋‚˜์˜ system prompt์— ๋‹ด์Œ โ€” ํŽ˜๋ฅด์†Œ๋‚˜๊ฐ€ ์„ž์—ฌ ์ง€์‹œ๊ฐ€ ๋ชจํ˜ธํ•ด์ง

๋ณ‘๋ ฌ ๋ถˆ๊ฐ€

๋…๋ฆฝ์ ์ธ ํ•˜์œ„ ์ž‘์—…๋„ ํ•œ ์—์ด์ „ํŠธ๊ฐ€ ์ˆœ์ฐจ ์ฒ˜๋ฆฌ โ€” ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์ž‘์—… ์ˆ˜์— ๋น„๋ก€ํ•ด ์ฆ๊ฐ€

takeaway

ํ•ด๋ฒ•์€ ๋ถ„์—… โ€” ์ „๋ฌธ ์—์ด์ „ํŠธ๋กœ ๋‚˜๋ˆ„๊ณ , ํ˜‘์—… ๋ฐฉ์‹์„ ํŒจํ„ด์œผ๋กœ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค.

PART 1 ยท ํŒจํ„ด ๊ฐœ์š”

ํŒจํ„ด ์ง€ํ˜• โ€” ์—…๊ณ„ ํ‘œ์ค€๊ณผ Strands

๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ ํ˜‘์—…์˜ ๋ณดํŽธ ํŒจํ„ด 4๊ฐ€์ง€ โ€” Strands๋Š” ์ „๋ถ€ ๋‚ด์žฅ ๊ตฌํ˜„์œผ๋กœ ์ œ๊ณต

์—…๊ณ„ ์ผ๋ฐ˜ ํŒจํ„ด Strands ๊ตฌํ˜„
์ค‘์•™ ์œ„์ž„ Supervisorโ€“Worker โ€” ๊ด€๋ฆฌ์ž๊ฐ€ ์ „๋ฌธ๊ฐ€์—๊ฒŒ ๋ถ„๋ฐฐ Agents-as-Tools โ€” ํ•˜์œ„ ์—์ด์ „ํŠธ๋ฅผ @tool๋กœ ์žฅ์ฐฉ
์ž์œจ ํ˜‘์—… Handoff Network โ€” ์—์ด์ „ํŠธ๋ผ๋ฆฌ ๋Œ€ํ™”๋ฅผ ๋„˜๊น€ Swarm โ€” ํ•ธ๋“œ์˜คํ”„ ๋„๊ตฌ๋กœ ๋™์  ๋ผ์šฐํŒ…
๊ฒฐ์ •์  ํ๋ฆ„ DAG Orchestration โ€” ์˜์กด ๊ทธ๋ž˜ํ”„๋Œ€๋กœ ์‹คํ–‰ Graph โ€” ๋…ธ๋“œยท์—ฃ์ง€ ์ •์˜, ๋ณ‘๋ ฌยท์ˆœํ™˜ ์ง€์›
์ˆœ์ฐจ ํŒŒ์ดํ”„๋ผ์ธ Sequential Pipeline โ€” ๋‹จ๊ณ„๋ณ„ ์ฒ˜๋ฆฌยท์žฌ์‹œ์ž‘ Workflow โ€” ํƒœ์Šคํฌ ์ƒํƒœ ์ €์žฅยท์ถ”์  ๋‚ด์žฅ
PART 1 ยท ํŒจํ„ด ๊ฐœ์š”

๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ ํŒจํ„ด

๋ณต์žก๋„ยท์ž์œจ์„ฑยท์ œ์–ด๋ ฅ 3์ถ•์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” 4๊ฐ€์ง€ ํ˜‘์—… ์•„ํ‚คํ…์ฒ˜

๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ ํŒจํ„ด

๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Ÿฌ ์—์ด์ „ํŠธ๊ฐ€ ๋‚˜๋ˆ  ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค โ€” ๋‹จ์ˆœ ์œ„์ž„๋ถ€ํ„ฐ ์™„์ „ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜๊นŒ์ง€

  • Agents-as-Tools โ€” Supervisor ์ค‘์‹ฌ ์œ„์ž„
  • Swarm โ€” ๋™์  ๋Œ€ํ™” ๋ผ์šฐํŒ…
  • Graph โ€” DAG/์ˆœํ™˜ ๋ณตํ•ฉ ํŒŒ์ดํ”„๋ผ์ธ
  • Workflow โ€” ํ”„๋กœ๋•์…˜ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜
takeaway

ํŒจํ„ด์— ์šฐ์—ด์€ ์—†์Šต๋‹ˆ๋‹ค โ€” ๋ฌธ์ œ ํŠน์„ฑ์— ๋งž๋Š” ์„ ํƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

PART 1 ยท ํŒจํ„ด ๊ฐœ์š”

๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ ํŒจํ„ด ๋น„๊ต

์ž์œจ์„ฑ์ด ๋†’์„์ˆ˜๋ก ์ œ์–ด๋ ฅ์ด ๋‚ฎ์•„์ง€๋Š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ โ€” Swarm๊ณผ Workflow๊ฐ€ ์–‘๊ทน๋‹จ

ํŒจํ„ด๋ณต์žก๋„์ž์œจ์„ฑ์ œ์–ด๋ ฅ์ ํ•ฉ ์‹œ๋‚˜๋ฆฌ์˜ค
Agents-as-Tools๋‚ฎ์Œ๋‚ฎ์Œ๋†’์ŒSupervisor ์ค‘์‹ฌ ์œ„์ž„
Swarm์ค‘๊ฐ„๋†’์Œ๋‚ฎ์Œ๋™์  ๋Œ€ํ™” ๋ผ์šฐํŒ…
Graph๋†’์Œ์ค‘๊ฐ„์ค‘๊ฐ„DAG/์ˆœํ™˜ ๋ณตํ•ฉ ํŒŒ์ดํ”„๋ผ์ธ
Workflow๋†’์Œ๋‚ฎ์Œ๋†’์Œํ”„๋กœ๋•์…˜ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜
takeaway

์ž์œจ์„ฑ๊ณผ ์ œ์–ด๋ ฅ์€ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„์ž…๋‹ˆ๋‹ค โ€” Swarm์€ ์ž์œจ์ด ๋†’์€ ๋Œ€์‹  ์ œ์–ด๊ฐ€ ๋‚ฎ๊ณ , Workflow๋Š” ๊ทธ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค.

PART 1 ยท ํŒจํ„ด ๊ฐœ์š”

์ž์œจ์„ฑ vs ๊ตฌ์กฐํ™” ๋งคํŠธ๋ฆญ์Šค

๊ตฌ์กฐํ™” = ์‹คํ–‰ ํ๋ฆ„์„ ์‚ฌ์ „์— ๊ณ ์ •ํ•˜๋Š” ์ •๋„ ยท ์ž์œจ์„ฑ = ๋Ÿฐํƒ€์ž„์— ์—์ด์ „ํŠธ๊ฐ€ ๊ฒฐ์ •ํ•˜๋Š” ์ •๋„

PART 1 ยท ํŒจํ„ด ๊ฐœ์š”

ํŒจํ„ด ์„ ํƒ ์˜์‚ฌ๊ฒฐ์ •

์ฒซ ์งˆ๋ฌธ์€ ์ œ์–ด๋ฅผ ์–ด๋””์— ๋‘˜ ๊ฒƒ์ธ๊ฐ€ โ€” ์˜ˆ/์•„๋‹ˆ์˜ค๋กœ ์ขํ˜€๊ฐ€๋Š” ํŒจํ„ด ์„ ํƒ

Agents-as-Tools

Supervisor ์œ„์ž„ ํŒจํ„ด

PART 2 ยท Agents-as-Tools

Agents-as-Tools

๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ โ€” Supervisor๊ฐ€ ํ•˜์œ„ ์—์ด์ „ํŠธ๋ฅผ ๋„๊ตฌ์ฒ˜๋Ÿผ ๋ถ€๋ฆฌ๋Š” ๊ตฌ์กฐ

Agents-as-Tools

Supervisor Agent๊ฐ€ ํ•˜์œ„ ์—์ด์ „ํŠธ๋ฅผ tool๋กœ ํ˜ธ์ถœํ•˜๋Š” ์œ„์ž„ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค

  • @tool โ€” ํ•˜์œ„ ์—์ด์ „ํŠธ๋ฅผ ๋„๊ตฌ๋กœ ์ •์˜
  • Supervisor โ€” ํƒœ์Šคํฌ ๋ถ„ํ•ด์™€ ์œ„์ž„
  • ์ œ์–ด ํ๋ฆ„ ๋ช…ํ™• โ€” ๋””๋ฒ„๊น… ์šฉ์ด
  • ๋‹จ์ผ ์ฑ…์ž„ ์—์ด์ „ํŠธ ์กฐํ•ฉ
takeaway

ํ•˜์œ„ ์—์ด์ „ํŠธ๋Š” ์ˆ˜๋™์  ๋„๊ตฌ์ž…๋‹ˆ๋‹ค โ€” ๊ฒฐ์ •์€ ์ „๋ถ€ Supervisor์— ์ง‘์ค‘๋˜๊ณ , ํ๋ฆ„์€ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

PART 2 ยท Agents-as-Tools

Agents-as-Tools ๊ตฌ์กฐ๋„

ํ•˜์œ„ ์—์ด์ „ํŠธ๋ผ๋ฆฌ๋Š” ์„œ๋กœ๋ฅผ ๋ชจ๋ฅด๋Š” ๋ณ„ํ˜• ๊ตฌ์กฐ โ€” ์œ„์ž„๊ณผ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜์ด ์ „๋ถ€ Supervisor๋ฅผ ๊ฒฝ์œ 

PART 2 ยท Agents-as-Tools

Agents-as-Tools ๊ตฌํ˜„

@tool๋กœ ๊ฐ์‹ผ ํ•˜์œ„ ์—์ด์ „ํŠธ๋ฅผ Supervisor์˜ tools=์— ์žฅ์ฐฉ โ€” str(agent(query))๋กœ ํ…์ŠคํŠธ ๊ฒฐ๊ณผ๋งŒ ๋ฐ˜ํ™˜

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

@tool
ํ•จ์ˆ˜๋กœ ๊ฐ์‹ผ ํ•˜์œ„ ์—์ด์ „ํŠธ๋ฅผ Supervisor์˜ ๋„๊ตฌ๋กœ ๋…ธ์ถœ
system_prompt
ํ•˜์œ„ ์—์ด์ „ํŠธ๋งˆ๋‹ค ์ „๋ฌธ ์—ญํ• ์„ ๋ณ„๋„ ์ง€์ • โ€” ๋‹จ์ผ ์ฑ…์ž„
str(agent(query))
AgentResult์—์„œ ํ…์ŠคํŠธ๋งŒ ์ถ”์ถœํ•ด ๋„๊ตฌ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜
tools=[...]
Supervisor์— ํ•˜์œ„ ์—์ด์ „ํŠธ๋“ค์„ ๋„๊ตฌ ๋ชฉ๋ก์œผ๋กœ ์žฅ์ฐฉ

์ฝ”๋“œ

python
from strands import Agent, tool

@tool
def research_agent(query: str) -> str:
    """๋ฆฌ์„œ์น˜ ์ „๋‹ด ์—์ด์ „ํŠธ"""
    return str(Agent(system_prompt="You are a research specialist.")(query))

@tool
def writer_agent(content: str) -> str:
    """์ž‘๋ฌธ ์ „๋‹ด ์—์ด์ „ํŠธ"""
    return str(Agent(system_prompt="You are a technical writer.")(content))

supervisor = Agent(  # ํ•˜์œ„ ์—์ด์ „ํŠธ๋ฅผ ๋„๊ตฌ๋กœ ์žฅ์ฐฉ
    system_prompt="Delegate tasks to specialists.",
    tools=[research_agent, writer_agent],
)
result = supervisor("AI ํŠธ๋ Œ๋“œ ๋ฆฌํฌํŠธ๋ฅผ ์ž‘์„ฑํ•ด์ค˜")
PART 2 ยท Agents-as-Tools

Supervisor ์œ„์ž„ ํ๋ฆ„

Supervisor๊ฐ€ ํƒœ์Šคํฌ๋ฅผ ๋ถ„ํ•ดํ•˜๊ณ  ํ•˜์œ„ ์—์ด์ „ํŠธ์— ์ˆœ์ฐจ ์œ„์ž„ํ•˜๋Š” ๊ณผ์ •

  1. 1
    ํƒœ์Šคํฌ ์ˆ˜์‹ 

    Supervisor๊ฐ€ ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ๋ถ„์„

  2. 2
    ํƒœ์Šคํฌ ๋ถ„ํ•ด

    ํ•˜์œ„ ์ž‘์—…์œผ๋กœ ๋ถ„ํ•  ํ›„ ์ ํ•ฉํ•œ ์—์ด์ „ํŠธ ์„ ํƒ

  3. 3
    Tool ํ˜ธ์ถœ

    ํ•˜์œ„ ์—์ด์ „ํŠธ๋ฅผ tool()๋กœ ์‹คํ–‰

  4. 4
    ๊ฒฐ๊ณผ ํ†ตํ•ฉ

    ๊ฐ ์—์ด์ „ํŠธ ์‘๋‹ต์„ ์ทจํ•ฉํ•˜์—ฌ ์ตœ์ข… ๋‹ต๋ณ€ ์ƒ์„ฑ

takeaway

๋ถ„ํ•ดยท์œ„์ž„ยทํ†ตํ•ฉ์ด ์ „๋ถ€ Supervisor ํ•œ ๊ณณ์—์„œ ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค โ€” ํ๋ฆ„์ด ๋ช…ํ™•ํ•œ ๋Œ€์‹  ๋ณ‘๋ชฉ๋„ ์—ฌ๊ธฐ์„œ ์ƒ๊น๋‹ˆ๋‹ค.

PART 2 ยท Agents-as-Tools

Supervisor์™€ ํ•˜์œ„ ์—์ด์ „ํŠธ โ€” ์ปจํ…์ŠคํŠธยท์ƒํƒœ ๊ฒฝ๊ณ„

๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ์€ ๋„๊ตฌ ์ธ์ž์™€ ๊ฒฐ๊ณผ ํ…์ŠคํŠธ๋ฟ โ€” ๊ฒฉ๋ฆฌ๊ฐ€ ์ด ํŒจํ„ด์˜ ์žฅ์ ์ด์ž ์ œ์•ฝ

๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ

๋„๊ตฌ ํ˜ธ์ถœ์˜ ์ž…์ถœ๋ ฅ

  • ์ง€์‹œ โ€” Supervisor๊ฐ€ ์žฌ๊ตฌ์„ฑํ•œ query ์ธ์ž ํ•œ ์ค„
  • ๊ฒฐ๊ณผ โ€” str(AgentResult) ํ…์ŠคํŠธ๋งŒ ๋ฐ˜ํ™˜
  • ๊ธฐ๋ก โ€” ์™•๋ณต์ด Supervisor์˜ messages[]์— toolUseยทtoolResult๋กœ ๋‚จ์Œ

ํ•˜์œ„ ์—์ด์ „ํŠธ์—๊ฒŒ ๋งฅ๋ฝ์„ ์ฃผ๋ ค๋ฉด query ๋ฌธ์ž์—ด์— ๋‹ด์•„ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค โ€” Supervisor์˜ ์ง€์‹œ ๊ตฌ์„ฑ์ด ๊ณง ์ปจํ…์ŠคํŠธ ์„ค๊ณ„์ž…๋‹ˆ๋‹ค.

๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š” ๊ฒƒ

๊ฐ์ž์˜ ๋…๋ฆฝ ์ƒํƒœ

  • Supervisor์˜ ๋Œ€ํ™” ์ด๋ ฅ๊ณผ system prompt
  • ํ•˜์œ„ ์—์ด์ „ํŠธ์˜ ์ค‘๊ฐ„ ์ถ”๋ก ยท๋„๊ตฌ ํ˜ธ์ถœ ๋‚ด์—ญ
  • ํ•˜์œ„ messages[] โ€” ํ˜ธ์ถœ๋งˆ๋‹ค ์ƒˆ๋กœ ์ƒ์„ฑ (๊ธฐ๋ณธ ๋ฌด์ƒํƒœ)

์ปจํ…์ŠคํŠธ ํฌํ™”๋ฅผ ๋ง‰๋Š” ๊ฒฉ๋ฆฌ โ€” ํ•˜์œ„๊ฐ€ ์ด๋ ฅ์„ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์„ธ์…˜ ๊ด€๋ฆฌ(์ƒํƒœ ๊ด€๋ฆฌ ๋ชจ๋“ˆ)๋ฅผ ๋ณ„๋„๋กœ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค.

PART 2 ยท Agents-as-Tools

Agents-as-Tools ํ™œ์šฉ ์‚ฌ๋ก€

Supervisor ์œ„์ž„ ํŒจํ„ด์ด ๋น›๋‚˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค

๋ฆฌ์„œ์น˜ ํŒŒ์ดํ”„๋ผ์ธ

๊ฒ€์ƒ‰ โ†’ ์š”์•ฝ โ†’ ๋ณด๊ณ ์„œ

์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ด‡

๋ถ„์„ โ†’ ๋ณด์•ˆ ๊ฒ€์‚ฌ โ†’ ํ”ผ๋“œ๋ฐฑ

๊ณ ๊ฐ ์ง€์› ๋ผ์šฐํ„ฐ

๋ถ„๋ฅ˜ โ†’ ์ „๋ฌธ๊ฐ€ ๋ฐฐ์ • โ†’ ์‘๋‹ต

takeaway

์„ธ ์‚ฌ๋ก€์˜ ๊ณตํ†ต ๊ตฌ์กฐ๋Š” ๋‹จ์ผ ์ฑ…์ž„ ์—์ด์ „ํŠธ์˜ ์กฐํ•ฉ์ž…๋‹ˆ๋‹ค โ€” ๊ฐ์ž ๋…๋ฆฝ๋œ system_prompt์™€ ๋„๊ตฌ๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.

Swarm

์ž์œจ ํ•ธ๋“œ์˜คํ”„์™€ ๊ณต์œ  ์ปจํ…์ŠคํŠธ

PART 3 ยท Swarm

Swarm

Supervisor ์—†๋Š” ํ˜‘์—… โ€” ์Šค์Šค๋กœ ๋Œ€ํ™”๋ฅผ ๋„˜๊ฒจ๋ฐ›๋Š” ์—์ด์ „ํŠธ๋“ค

Swarm

์—์ด์ „ํŠธ ๊ฐ„ ์ž์œจ ํ•ธ๋“œ์˜คํ”„๋กœ ๋Œ€ํ™” ํ๋ฆ„์ด ์ด๋™ํ•˜๋Š” ๋ถ„์‚ฐ ํ˜‘์—… ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค

  • ์ž์œจ ํ•ธ๋“œ์˜คํ”„ โ€” ์—์ด์ „ํŠธ๊ฐ€ ์ „ํ™˜ ๊ฒฐ์ •
  • ๊ณต์œ  ์ปจํ…์ŠคํŠธ โ€” ์ƒํƒœ ์—ฐ์†์„ฑ ์œ ์ง€
  • Supervisor ์—†๋Š” ๋™์  ๋ผ์šฐํŒ…
  • max_handoffs ยท max_iterations ์ƒํ•œ
takeaway

์ค‘์•™ ๊ฒฐ์ •์ž๊ฐ€ ์—†์–ด ๋‹จ์ผ ๋ณ‘๋ชฉ์ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค โ€” ๋Œ€์‹  ๋ผ์šฐํŒ…์ด ๋™์ ์ด๋ผ ํ๋ฆ„ ์˜ˆ์ธก์€ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.

PART 3 ยท Swarm

Swarm ๊ตฌ์กฐ๋„

๋ฆฌ์„œ์น˜ โ†’ ์ฝ”๋”ฉ โ†’ ๋ฆฌ๋ทฐ๊ฐ€ ๊ณต์œ  ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ€์šด๋ฐ ๋‘๊ณ  ๋„๋Š” ์ž์œจ ํ•ธ๋“œ์˜คํ”„ ์ˆœํ™˜

PART 3 ยท Swarm

Swarm ํ•ธ๋“œ์˜คํ”„ ๊ตฌํ˜„

system_prompt๋กœ ์ „ํ™˜ ์‹œ์ ์„ ์ง€์‹œํ•˜๊ณ  entry_point์™€ max_handoffsยทmax_iterations๋กœ ์‹œ์ž‘์ ๊ณผ ์ƒํ•œ์„ ์ง€์ •

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

name=
ํ•ธ๋“œ์˜คํ”„ ๋Œ€์ƒ์„ ์‹๋ณ„ํ•˜๋Š” ์—์ด์ „ํŠธ ์ด๋ฆ„
system_prompt
์–ธ์ œ ๋‹ค๋ฅธ ์—์ด์ „ํŠธ๋กœ ๋„˜๊ธธ์ง€๋ฅผ ํ”„๋กฌํ”„ํŠธ๋กœ ์ง€์‹œ
entry_point=
๋Œ€ํ™”๋ฅผ ์‹œ์ž‘ํ•  ์ง„์ž… ์—์ด์ „ํŠธ ์ง€์ •
max_handoffs ยท max_iterations
์ „ํ™˜ยท๋ฐ˜๋ณต ํšŸ์ˆ˜ ์ƒํ•œ โ€” ํญ์ฃผ ๋ฐฉ์ง€

์ฝ”๋“œ

python
from strands import Agent
from strands.multiagent.swarm import Swarm

sales_agent = Agent(
    name="sales",
    system_prompt="Sales specialist. Transfer to support for technical issues.",
)
support_agent = Agent(
    name="support",
    system_prompt="Support engineer. Transfer to sales for pricing questions.",
)

swarm = Swarm(  # ํ•„์š” ์‹œ ์—์ด์ „ํŠธ๊ฐ€ ์ž์œจ์ ์œผ๋กœ ํ•ธ๋“œ์˜คํ”„
    [sales_agent, support_agent], entry_point=sales_agent,
    max_handoffs=20, max_iterations=20,
)
result = swarm("์„œ๋ฒ„ ์—๋Ÿฌ๊ฐ€ ๊ณ„์† ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค")
PART 3 ยท Swarm

Supervisor vs Swarm

์ค‘์•™์ง‘์ค‘ ์œ„์ž„๊ณผ ์ž์œจ ํ•ธ๋“œ์˜คํ”„์˜ ๊ตฌ์กฐ์  ์ฐจ์ด

Supervisor (Agents-as-Tools)

์ค‘์•™์ง‘์ค‘ ์œ„์ž„

  • ์ค‘์•™ Supervisor๊ฐ€ ๋ชจ๋“  ๊ฒฐ์ •
  • ํ•˜์œ„ ์—์ด์ „ํŠธ๋Š” ์ˆ˜๋™์  ๋„๊ตฌ
  • ์ œ์–ด ํ๋ฆ„ ๋ช…ํ™•ยท์˜ˆ์ธก ๊ฐ€๋Šฅ
  • ๋ณ‘๋ชฉ: Supervisor ๊ณผ๋ถ€ํ•˜ ๊ฐ€๋Šฅ

Swarm (์ž์œจ ํ•ธ๋“œ์˜คํ”„)

๋ถ„์‚ฐ ์ž์œจ ์ „ํ™˜

  • ๊ฐ ์—์ด์ „ํŠธ๊ฐ€ ์ž์œจ์ ์œผ๋กœ ์ „ํ™˜ ๊ฒฐ์ •
  • ๊ณต์œ  ์ปจํ…์ŠคํŠธ๋กœ ์ƒํƒœ ์—ฐ์†์„ฑ
  • ๋™์  ๋ผ์šฐํŒ… โ€” ์˜ˆ์ธก ์–ด๋ ค์›€
  • ํ™•์žฅ์„ฑ ์šฐ์ˆ˜, ๋‹จ์ผ ๋ณ‘๋ชฉ ์—†์Œ
PART 3 ยท Swarm

์ž์œจ ํ•ธ๋“œ์˜คํ”„ ํ๋ฆ„

Swarm ๋‚ด ์—์ด์ „ํŠธ ๊ฐ„ ์ปจํ…์ŠคํŠธ ์ „๋‹ฌ๊ณผ ์ „ํ™˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜

  1. 1
    ์ดˆ๊ธฐ ์—์ด์ „ํŠธ ์‘๋‹ต

    entry_point ์—์ด์ „ํŠธ๊ฐ€ ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ์‹œ์ž‘

  2. 2
    ํ•ธ๋“œ์˜คํ”„ ํŒ๋‹จ

    ํ˜„์žฌ ์—์ด์ „ํŠธ๊ฐ€ ์ „ํ™˜ ํ•„์š”์„ฑ ์ž์œจ ๊ฒฐ์ •

  3. 3
    ์ปจํ…์ŠคํŠธ ์ „๋‹ฌ

    ํ•ธ๋“œ์˜คํ”„ ๋ฉ”์‹œ์ง€ยท์› taskยท์ž‘์—… ์ด๋ ฅยทshared_context๋ฅผ ์กฐ๋ฆฝํ•ด ๋‹ค์Œ ์—์ด์ „ํŠธ์— ์ „๋‹ฌ

  4. 4
    ์ƒˆ ์—์ด์ „ํŠธ ํ™œ์„ฑ

    ์ „ํ™˜๋œ ์—์ด์ „ํŠธ๊ฐ€ ์ปจํ…์ŠคํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ์‘๋‹ต ๊ณ„์†

takeaway

ํ•ธ๋“œ์˜คํ”„์˜ ํ•ต์‹ฌ์€ ์ปจํ…์ŠคํŠธ ์ „๋‹ฌ์ž…๋‹ˆ๋‹ค โ€” ํ•ธ๋“œ์˜คํ”„ ๋ฉ”์‹œ์ง€ยท์› taskยท์ž‘์—… ์ด๋ ฅยทshared_context๊ฐ€ ์กฐ๋ฆฝ๋˜์–ด ๋„˜์–ด๊ฐ€ ๋‹ค์Œ ์—์ด์ „ํŠธ๊ฐ€ ์ž‘์—…์„ ์ด์–ด๊ฐ‘๋‹ˆ๋‹ค (๋ฉ”์‹œ์ง€ ๋ฆฌ์ŠคํŠธ ์ž์ฒด๋Š” ๋ฏธ์ „๋‹ฌ).

PART 3 ยท Swarm

Swarm์˜ ์ƒํƒœ โ€” ๊ณต์œ  ์ปจํ…์ŠคํŠธ์˜ ์‹ค์ฒด

ํ•ธ๋“œ์˜คํ”„๋งˆ๋‹ค ํ•จ๊ป˜ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ๊ณผ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๊ฒƒ

ํ•จ๊ป˜ ๋„˜์–ด๊ฐ€๋Š” ๊ฒƒ

ํ•ธ๋“œ์˜คํ”„์˜ ์ˆ˜ํ•˜๋ฌผ

  • ํ•ธ๋“œ์˜คํ”„ ๋ฉ”์‹œ์ง€ + ์› task โ€” ์ด์–ด๋ฐ›์„ ์ž‘์—…๊ณผ ๋„˜๊ธด ์‚ฌ์œ 
  • ์ž‘์—… ์ด๋ ฅ โ€” ์ง€๊ธˆ๊นŒ์ง€ ๊ฑฐ์ณ์˜จ ์—์ด์ „ํŠธ ๋ชฉ๋ก
  • shared_context โ€” ์—์ด์ „ํŠธ๋“ค์ด ๊ธฐ๋กํ•œ ๊ณต์œ  ์ƒํƒœ

๋„ท์ด ์กฐ๋ฆฝ๋œ ํ…์ŠคํŠธ๊ฐ€ ๋‹ค์Œ ์—์ด์ „ํŠธ์˜ ์ž…๋ ฅ โ€” ์ด์ „ ์—์ด์ „ํŠธ์˜ ๋ฉ”์‹œ์ง€ ๋ฆฌ์ŠคํŠธ ์ž์ฒด๋Š” ๋„˜์–ด๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ

๊ณต์œ ์˜ ๋น„์šฉ

  • ์ปจํ…์ŠคํŠธ ํฌํ™”๊ฐ€ Swarm ์ „์ฒด๋กœ ์ „ํŒŒ โ€” ๊ธธ์–ด์งˆ์ˆ˜๋ก ๋ชจ๋‘๊ฐ€ ๋ฌด๊ฑฐ์›Œ์ง
  • max_handoffs ยท max_iterations โ€” ํญ์ฃผ์™€ ๋ฌดํ•œ ์ˆœํ™˜ ๋ฐฉ์ง€ ์ƒํ•œ
  • ์—์ด์ „ํŠธ ์ „๋ฌธํ™” โ€” ์—ญํ• ์„ ์ขํ˜€ ๊ฐ์ž์˜ ๋ฐœํ™”๋ฅผ ์งง๊ฒŒ

์ปจํ…์ŠคํŠธ ๊ณต์œ ๋Š” ํŽธ์˜์™€ ํฌํ™”๋ฅผ ๋งž๋ฐ”๊พธ๋Š” ์„ ํƒ โ€” ์ƒํ•œ ์„ค์ •์ด ์•ˆ์ „๋ฒจํŠธ์ž…๋‹ˆ๋‹ค.

Graph

DAGยท์ˆœํ™˜ยท์กฐ๊ฑด๋ถ€ ๋ถ„๊ธฐยท๋ณ‘๋ ฌ ์‹คํ–‰

PART 4 ยท Graph

Graph

๋…ธ๋“œ๋Š” ์—์ด์ „ํŠธ, ์—ฃ์ง€๋Š” ๊ด€๊ณ„ โ€” ๋ณต์žกํ•œ ์›Œํฌํ”Œ๋กœ์šฐ์˜ ๊ทธ๋ž˜ํ”„ ํ‘œํ˜„

Graph

DAG ๋˜๋Š” ์ˆœํ™˜ ๊ทธ๋ž˜ํ”„๋กœ ์—์ด์ „ํŠธ ๊ฐ„ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•˜๋Š” ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์ž…๋‹ˆ๋‹ค

  • GraphBuilder โ€” ๋…ธ๋“œยท์—ฃ์ง€๋กœ ๊ตฌ์„ฑ
  • ์กฐ๊ฑด๋ถ€ ๋ถ„๊ธฐ โ€” condition ํ•จ์ˆ˜
  • ๋ณ‘๋ ฌ ์‹คํ–‰ โ€” Fan-out/Fan-in
  • DAG ยท Cyclic ยท Conditional ํ† ํด๋กœ์ง€
takeaway

์กฐ๊ฑด๋ถ€ ๋ถ„๊ธฐ์™€ ๋ณ‘๋ ฌ ์‹คํ–‰๊นŒ์ง€ ํ•„์š”ํ•˜๋‹ค๋ฉด Graph์ž…๋‹ˆ๋‹ค โ€” ๊ด€๊ณ„๋ฅผ ์ฝ”๋“œ๋กœ ๋ช…์‹œํ•˜๋Š” ๋งŒํผ ๋ณต์žก๋„๋„ ๋†’์Šต๋‹ˆ๋‹ค.

PART 4 ยท Graph

Graph ๊ตฌ์กฐ๋„

๋…ธ๋“œ์™€ ์—ฃ์ง€๋กœ ์‚ฌ์ „ ์ •์˜ํ•˜๋Š” ์‹คํ–‰ ๊ทธ๋ž˜ํ”„ โ€” ๋ณ‘๋ ฌ ๋ถ„๊ธฐ์™€ ํ•ฉ๋ฅ˜๊ฐ€ ๊ตฌ์กฐ์— ๋‚ด์žฅ










์š”์ฒญ ์ ‘์ˆ˜
์ž…๋ ฅ์„ ์ฒซ ๋…ธ๋“œ๋กœ


๋ถ„์„ ๋…ธ๋“œ
์ž‘์—… ๋ถ„ํ•ด ยท ๋ถ„๊ธฐ ๊ฒฐ์ •


๊ฒ€์ƒ‰ ๋…ธ๋“œ
๋ณ‘๋ ฌ ์‹คํ–‰ A โ€” ์ž๋ฃŒ ์ˆ˜์ง‘


์ž‘์„ฑ ๋…ธ๋“œ
๋ณ‘๋ ฌ ์‹คํ–‰ B โ€” ์ดˆ์•ˆ ์ƒ์„ฑ


ํ†ตํ•ฉ ๋…ธ๋“œ
๋ณ‘๋ ฌ ๊ฒฐ๊ณผ ํ•ฉ๋ฅ˜ ยท ์ตœ์ข… ์ถœ๋ ฅ







๋ณ‘๋ ฌ ๋ถ„๊ธฐ
ํ•ฉ๋ฅ˜


ํ๋ฆ„์€ ๊ทธ๋ž˜ํ”„๊ฐ€ ๊ณ ์ •ํ•˜๊ณ , ๊ฐ ๋…ธ๋“œ ์•ˆ์—์„œ๋งŒ ์—์ด์ „ํŠธ๊ฐ€ ์ž์œจ โ€” ๊ตฌ์กฐ์™€ ์ž์œจ์˜ ์ ˆ์ถฉ
PART 4 ยท Graph

Graph ๊ตฌํ˜„

GraphBuilder๋กœ ๋…ธ๋“œ์™€ ์—ฃ์ง€๋ฅผ ์ •์˜ํ•˜๋Š” Graph ํŒจํ„ด

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

add_node(agent, node_id=)
์—์ด์ „ํŠธ๋ฅผ ๊ทธ๋ž˜ํ”„ ๋…ธ๋“œ๋กœ ๋“ฑ๋ก
add_edge(a, b, condition=)
์‹คํ–‰ ์ˆœ์„œ ์ •์˜ โ€” condition ํ•จ์ˆ˜๋กœ ์กฐ๊ฑด๋ถ€ ๋ถ„๊ธฐ
state.results
์กฐ๊ฑด ํ•จ์ˆ˜๊ฐ€ ๋ฐ›๋Š” GraphState โ€” ๋…ธ๋“œ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์‚ฌํ•ด bool ๋ฐ˜ํ™˜
set_entry_point / build()
์ง„์ž… ๋…ธ๋“œ ์ง€์ • ํ›„ ๊ทธ๋ž˜ํ”„ ์™„์„ฑยท์‹คํ–‰

์ฝ”๋“œ

python
from strands import Agent
from strands.multiagent.graph import GraphBuilder

builder = GraphBuilder()
extract = builder.add_node(Agent(system_prompt="Extract key entities."), node_id="extract")
analyze = builder.add_node(Agent(system_prompt="Analyze relationships."), node_id="analyze")
summarize = builder.add_node(Agent(system_prompt="Generate final summary."), node_id="summarize")

def is_confident(state):  # GraphState๋ฅผ ๋ฐ›์•„ bool ๋ฐ˜ํ™˜
    node = state.results.get("analyze")
    return node is not None and "confident" in str(node.result)

builder.add_edge(extract, analyze)
builder.add_edge(analyze, summarize, condition=is_confident)
builder.add_edge(analyze, extract, condition=lambda s: not is_confident(s))
builder.set_entry_point("extract")
result = builder.build()("๋ถ„๊ธฐ๋ณ„ ๋งค์ถœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•ด์ค˜")
PART 4 ยท Graph

Graph 3๊ฐ€์ง€ ํ† ํด๋กœ์ง€

DAGยท์ˆœํ™˜ยท์กฐ๊ฑด๋ถ€ โ€” ๊ทธ๋ž˜ํ”„ ํ† ํด๋กœ์ง€๋ณ„ ํŠน์„ฑ๊ณผ ์ ์šฉ ์˜์—ญ

DAG (๋น„์ˆœํ™˜)

๋‹จ๋ฐฉํ–ฅ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„

Cyclic (์ˆœํ™˜)

ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„ ํฌํ•จ ๊ทธ๋ž˜ํ”„

Conditional (์กฐ๊ฑด๋ถ€)

๋Ÿฐํƒ€์ž„ ๋ถ„๊ธฐ ๊ฒฐ์ •

takeaway

ํ•œ ๋ฐฉํ–ฅ์ด๋ฉด DAG, ๋˜๋Œ์•„๊ฐ€๋ฉด Cyclic โ€” ์–ด๋А ์ชฝ์ด๋“  ๋ถ„๊ธฐ ๊ฒฐ์ •์€ condition ํ•จ์ˆ˜๊ฐ€ ๋Ÿฐํƒ€์ž„์— ๋‚ด๋ฆฝ๋‹ˆ๋‹ค.

PART 4 ยท Graph

๋ณ‘๋ ฌ ์‹คํ–‰๊ณผ ํ•ฉ๋ฅ˜

๋…๋ฆฝ ๋…ธ๋“œ์˜ ๋™์‹œ ์‹คํ–‰๊ณผ ๊ฒฐ๊ณผ ํ•ฉ๋ฅ˜(Fan-out/Fan-in) ๋ฉ”์ปค๋‹ˆ์ฆ˜

  1. 1
    Fan-out

    ์ง„์ž… ๋…ธ๋“œ๊ฐ€ ๋…๋ฆฝ๋œ ๋ณต์ˆ˜ ๋…ธ๋“œ๋ฅผ ๋™์‹œ ํŠธ๋ฆฌ๊ฑฐ

  2. 2
    ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ

    ๊ฐ ๋…ธ๋“œ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰ โ€” ์„œ๋กœ ๋Œ€๊ธฐํ•˜์ง€ ์•Š์Œ

  3. 3
    Fan-in

    ๋ชจ๋“  ๋ณ‘๋ ฌ ๋…ธ๋“œ ์™„๋ฃŒ ํ›„ ํ•ฉ๋ฅ˜ ๋…ธ๋“œ์—์„œ ๊ฒฐ๊ณผ ์ง‘๊ณ„

  4. 4
    ํ›„์† ์ฒ˜๋ฆฌ

    ์ง‘๊ณ„๋œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์Œ ๋…ธ๋“œ๋กœ ์ „๋‹ฌํ•˜์—ฌ ์ตœ์ข… ์ถœ๋ ฅ ์ƒ์„ฑ

takeaway

๋ณ‘๋ ฌ ๋…ธ๋“œ๋Š” ์„œ๋กœ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์ง€๋งŒ, ํ•ฉ๋ฅ˜ ๋…ธ๋“œ๋Š” ์ „์› ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค โ€” Fan-in์ด ๊ณง ๋™๊ธฐํ™” ์ง€์ ์ž…๋‹ˆ๋‹ค.

PART 4 ยท Graph

Graph์˜ ์ƒํƒœ โ€” ์—ฃ์ง€๋กœ ํ๋ฅด๋Š” ๊ฒƒ๊ณผ ๋‚จ๋Š” ๊ฒƒ

๋…ธ๋“œ ์‚ฌ์ด์—๋Š” ์ถœ๋ ฅ๋งŒ ํ๋ฅด๊ณ , ์‹คํ–‰ ์ƒํƒœ๋Š” ๊ทธ๋ž˜ํ”„๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ

์—ฃ์ง€๋กœ ํ๋ฅด๋Š” ๊ฒƒ

๋…ธ๋“œ ๊ฐ„ ์ „๋‹ฌ

  • ์ด์ „ ๋…ธ๋“œ์˜ ์ถœ๋ ฅ โ€” ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ž…๋ ฅ์ด ๋จ
  • ๋ณ‘๋ ฌ ๋ธŒ๋žœ์น˜๋Š” ์„œ๋กœ ๋…๋ฆฝ โ€” ์ƒ๋Œ€ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ฆ„
  • ํ•ฉ๋ฅ˜ ๋…ธ๋“œ์—์„œ ๋ณ‘๋ ฌ ๊ฒฐ๊ณผ๋ฅผ ์ง‘๊ณ„

๋…ธ๋“œ ๋‚ด๋ถ€์˜ ๋Œ€ํ™” ์ด๋ ฅยท์ค‘๊ฐ„ ์ถ”๋ก ์€ ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค โ€” ํ•„์š”ํ•œ ์‚ฐ์ถœ๋ฌผ๋งŒ ์—ฃ์ง€์— ์‹ค๋ฆฝ๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”„๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ

์‹คํ–‰ ์ƒํƒœ

  • ์ง„ํ–‰ ์œ„์น˜ โ€” ์–ด๋А ๋…ธ๋“œ๊นŒ์ง€ ์‹คํ–‰๋๋Š”๊ฐ€
  • ์ˆœํ™˜ ์‹œ ๋ฐ˜๋ณต ํšŸ์ˆ˜ โ€” set_max_node_executions ์ƒํ•œ
  • ์กฐ๊ฑด ๋ถ„๊ธฐ ๊ฒฐ๊ณผ โ€” condition ํ•จ์ˆ˜์˜ ๋Ÿฐํƒ€์ž„ ํŒ์ •

์ƒํƒœ๊ฐ€ ๊ตฌ์กฐ์— ์žˆ์œผ๋ฏ€๋กœ ํ๋ฆ„์ด ์žฌํ˜„ ๊ฐ€๋Šฅ โ€” ๊ด€์ธก๊ณผ ๋””๋ฒ„๊น…์ด ์‰ฌ์šด ์ด์œ ์ž…๋‹ˆ๋‹ค.

Workflow

์˜์กด์„ฑ ํŒŒ์ดํ”„๋ผ์ธ ยท ์ƒํƒœ ์ €์žฅ ยท ์ถ”์ 

PART 5 ยท Workflow

Workflow

์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๊ณ  ์ƒํƒœ๋ฅผ ๋””์Šคํฌ์— ๋‚จ๊ธฐ๋Š” ํ”„๋กœ๋•์…˜ ์ง€ํ–ฅ ํŒจํ„ด

Workflow

์˜์กด์„ฑ ๊ธฐ๋ฐ˜ ํƒœ์Šคํฌ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๊ณ  ์ƒํƒœ๋ฅผ ๋””์Šคํฌ์— ๋‚จ๊น๋‹ˆ๋‹ค

  • workflow ๋„๊ตฌ โ€” strands-agents-tools ์ œ๊ณต
  • ์˜์กด์„ฑ ์ •์˜ โ€” ์‹คํ–‰ ์ˆœ์„œ ๋ณด์žฅ
  • ํƒœ์Šคํฌ ์ƒํƒœ๋ฅผ ๋””์Šคํฌ์— ์ €์žฅ
  • create ยท start ยท list ยท status ยท delete
takeaway

์ƒํƒœ๊ฐ€ ๋””์Šคํฌ์— ๋‚จ์œผ๋‹ˆ ์ง„ํ–‰ ์ถ”์ ๊ณผ ์žฅ์•  ์ง€์  ํŒŒ์•…์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค โ€” ํ”„๋กœ๋•์…˜ ์‹ ๋ขฐ์„ฑ์ด ํ•„์š”ํ•  ๋•Œ์˜ ์„ ํƒ์ž…๋‹ˆ๋‹ค.

PART 5 ยท Workflow

Workflow ๊ตฌ์กฐ๋„

๊ณ ์ • ์ˆœ์„œ์˜ ํŒŒ์ดํ”„๋ผ์ธ โ€” ๊ฐ ํƒœ์Šคํฌ ๊ฒฐ๊ณผ๊ฐ€ ์ €์žฅ๋˜์–ด ์‹คํŒจ ์ง€์ ์„ ์ •ํ™•ํžˆ ํŒŒ์•…

  1. 1
    ์ˆ˜์ง‘

    ํƒœ์Šคํฌ 1 โ€” ๊ฒฐ๊ณผ๋ฅผ ์ƒํƒœ ์ €์žฅ์†Œ์— ๊ธฐ๋ก

  2. 2
    ๋ถ„์„

    ํƒœ์Šคํฌ 2 โ€” ์ด์ „ ํƒœ์Šคํฌ ๊ฒฐ๊ณผ๋ฅผ ์ž…๋ ฅ์œผ๋กœ ์‚ฌ์šฉ

  3. 3
    ์ž‘์„ฑ

    ํƒœ์Šคํฌ 3 โ€” ์‹คํŒจํ•˜๋ฉด ์ด ์ง€์ ์ด ์ƒํƒœ์— ๊ธฐ๋ก

  4. 4
    ๋ฐœํ–‰

    ํƒœ์Šคํฌ 4 โ€” ์™„๋ฃŒ ์ƒํƒœ ๊ธฐ๋ก์œผ๋กœ ์ข…๋ฃŒ

takeaway

ํƒœ์Šคํฌ๋งˆ๋‹ค ๊ฒฐ๊ณผ๊ฐ€ ์ƒํƒœ ์ €์žฅ์†Œ์— ๋‚จ์œผ๋‹ˆ ์–ด๋””๊นŒ์ง€ ์„ฑ๊ณตํ–ˆ๊ณ  ์–ด๋””์„œ ์‹คํŒจํ–ˆ๋Š”์ง€๋ฅผ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PART 5 ยท Workflow

Workflow ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌํ˜„

strands-agents-tools์˜ workflow ๋„๊ตฌ๋กœ ์˜์กด์„ฑ ๊ธฐ๋ฐ˜ ํƒœ์Šคํฌ ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰

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

workflow
strands-agents-tools๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํƒœ์Šคํฌ ํŒŒ์ดํ”„๋ผ์ธ ๋„๊ตฌ
tools=[workflow]
์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ์— ์žฅ์ฐฉ โ€” ์ž์—ฐ์–ด ์š”์ฒญ์„ ๋„๊ตฌ ํ˜ธ์ถœ๋กœ ์ˆ˜ํ–‰
create / start / list / status / delete
workflow ๋„๊ตฌ๊ฐ€ ์ง€์›ํ•˜๋Š” 5๊ฐ€์ง€ ์•ก์…˜
workflow_id
status ์•ก์…˜์œผ๋กœ ํŒŒ์ดํ”„๋ผ์ธ๋ณ„ ์ง„ํ–‰ ์ƒํƒœ ํ™•์ธ

์ฝ”๋“œ

python
from strands import Agent
from strands_tools import workflow

orchestrator = Agent(
    system_prompt="""You manage data pipelines.
    Use the workflow tool to create and run task pipelines.
    Define tasks with dependencies for execution order.""",
    tools=[workflow],
)

# ์›Œํฌํ”Œ๋กœ์šฐ ์ƒ์„ฑยท์‹คํ–‰ โ€” ์—์ด์ „ํŠธ๊ฐ€ ๋„๊ตฌ ํ˜ธ์ถœ๋กœ ์ˆ˜ํ–‰
result = orchestrator("""
๋‹ค์Œ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ์‹คํ–‰ํ•ด์ค˜:
1. ingest โ†’ 2. validate โ†’ 3. transform โ†’ 4. load
๊ฐ ๋‹จ๊ณ„๋Š” ์ด์ „ ๋‹จ๊ณ„์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค.
""")
# ํƒœ์Šคํฌ ์ƒํƒœ๋Š” ๋””์Šคํฌ์— ์ €์žฅ โ€” status๋กœ workflow_id๋ณ„ ์ง„ํ–‰ ํ™•์ธ
PART 5 ยท Workflow

ํƒœ์Šคํฌ ์ƒํƒœ ์ €์žฅ๊ณผ ์ถ”์ 

ํƒœ์Šคํฌ ์ƒํƒœ๋ฅผ ๋””์Šคํฌ์— ๊ธฐ๋กํ•ด ์žฅ์•  ๋ฐœ์ƒ ์ง€์ ์„ ํŒŒ์•…ํ•˜๋Š” ๊ตฌ์กฐ

  1. 1
    ํƒœ์Šคํฌ ์‹คํ–‰

    ์˜์กด์„ฑ์ด ํ•ด์†Œ๋œ ํƒœ์Šคํฌ๋ถ€ํ„ฐ ์ˆœ์ฐจ ์‹คํ–‰

  2. 2
    ์ƒํƒœ ์ €์žฅ

    ํƒœ์Šคํฌ ์™„๋ฃŒ ์‹œ๋งˆ๋‹ค ์ƒํƒœ๋ฅผ ๋กœ์ปฌ ๋””์Šคํฌ์— ๊ธฐ๋ก

  3. 3
    ์žฅ์•  ๊ฐ์ง€

    ํƒ€์ž„์•„์›ƒยท์˜ˆ์™ธยท์™ธ๋ถ€ ์‹คํŒจ ์‹œ ์‹คํ–‰ ์ค‘๋‹จ

  4. 4
    ์ƒํƒœ ์กฐํšŒ

    status ์•ก์…˜์œผ๋กœ workflow_id๋ณ„ ์™„๋ฃŒยท์‹คํŒจ ํƒœ์Šคํฌ ํ™•์ธ ํ›„ ๋Œ€์‘

takeaway

์ƒํƒœ๊ฐ€ ๋””์Šคํฌ์— ๋‚จ์œผ๋ฏ€๋กœ ์–ด๋А ํƒœ์Šคํฌ์—์„œ ๋ฉˆ์ท„๋Š”์ง€ status ์กฐํšŒ ํ•œ ๋ฒˆ์œผ๋กœ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค.

PART 5 ยท Workflow

์ปจํ…์ŠคํŠธ๋Š” ์–ด๋–ป๊ฒŒ ๋„˜์–ด๊ฐ€๋Š”๊ฐ€ โ€” ํŒจํ„ด๋ณ„ ์ƒํƒœ ์ „๋‹ฌ

๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ ์„ค๊ณ„์˜ ํ•ต์‹ฌ ์งˆ๋ฌธ โ€” ๊ฐ ํŒจํ„ด์ด ์ปจํ…์ŠคํŠธ์™€ ์ƒํƒœ๋ฅผ ๋„˜๊ธฐ๋Š” ๋ฐฉ์‹










Agents-as-Tools

Supervisor


query๋งŒ
๊ฒฐ๊ณผ ํ…์ŠคํŠธ

ํ•˜์œ„ ์—์ด์ „ํŠธ
๊ฒฉ๋ฆฌ โ€” ์ธ์ž๋กœ๋งŒ ์ „๋‹ฌ
์ด๋ ฅ์€ ๊ฐ์ž ๋ณด๊ด€ ยท ๋งฅ๋ฝ์€ query์— ๋‹ด์•„



Swarm


๊ณต์œ  ์ปจํ…์ŠคํŠธ

A

B

C

๊ณต์œ  โ€” ์กฐ๋ฆฝ๋œ ๋งฅ๋ฝ ์ „๋‹ฌ
ํ•ธ๋“œ์˜คํ”„ ๋ฉ”์‹œ์ง€ยทtaskยท์ด๋ ฅ ์กฐ๋ฆฝ ์ „๋‹ฌ



Graph

A ๋…ธ๋“œ

์ถœ๋ ฅ๋งŒ ์ „๋‹ฌ

B ๋…ธ๋“œ
๊ตฌ์กฐ์  ์ „๋‹ฌ โ€” ์—ฃ์ง€ ๋”ฐ๋ผ
์ด์ „ ๋…ธ๋“œ์˜ ์ถœ๋ ฅ์ด ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ž…๋ ฅ



Workflow

ํƒœ์Šคํฌ 1


์ƒํƒœ ์ €์žฅ์†Œ (๋””์Šคํฌ)


ํƒœ์Šคํฌ 2
์ €์žฅ ํ›„ ์ „๋‹ฌ โ€” ์ƒํƒœ ์ถ”์ 
๊ฒฐ๊ณผ๊ฐ€ ๋””์Šคํฌ์— ๋‚จ์•„ ์‹คํŒจ ์ง€์  ํŒŒ์•…ยท๋Œ€์‘


ํŒจํ„ด ์„ ํƒ์€ ๊ณง ์ปจํ…์ŠคํŠธ ์ „๋‹ฌ ๋ฐฉ์‹์˜ ์„ ํƒ โ€” "๋ˆ„๊ฐ€ ๋ฌด์—‡์„ ์•„๋Š”๊ฐ€"๊ฐ€ ๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ ์„ค๊ณ„์˜ ์‹œ์ž‘์ž…๋‹ˆ๋‹ค
PART 5 ยท Workflow

์–ธ์ œ ๋ฉˆ์ถ”๋Š”๊ฐ€ โ€” ํŒจํ„ด๋ณ„ ์ข…๋ฃŒ์™€ ํญ์ฃผ ๋ฐฉ์ง€

์ƒํ•œ ์—†๋Š” ์ž์œจ์ด ๋ถ€๋ฅด๋Š” ๋น„์šฉ ์‚ฌ๊ณ  โ€” ํŒจํ„ด๋งˆ๋‹ค ๋‹ค๋ฅธ ์ข…๋ฃŒ ์กฐ๊ฑด๊ณผ ํญ์ฃผ ์ƒํ•œ

ํŒจํ„ด์ •์ƒ ์ข…๋ฃŒํญ์ฃผ ๋ฐฉ์ง€ ์ƒํ•œ
Agents-as-ToolsSupervisor๊ฐ€ ๋„๊ตฌ ํ˜ธ์ถœ ์—†์ด ์ตœ์ข… ์‘๋‹ตSupervisor์˜ ์—์ด์ „ํ‹ฑ ๋ฃจํ”„ ์ œ์–ด (Hooks)
Swarm์—์ด์ „ํŠธ๊ฐ€ ํ•ธ๋“œ์˜คํ”„ ์—†์ด ์ตœ์ข… ์‘๋‹ตmax_handoffs ยท max_iterations
Graph๋ชจ๋“  ๊ฒฝ๋กœ๊ฐ€ ์ข…๋‹จ ๋…ธ๋“œ์— ๋„๋‹ฌset_max_node_executions ยท set_execution_timeout
Workflow๋งˆ์ง€๋ง‰ ํƒœ์Šคํฌ ์™„๋ฃŒ ์ƒํƒœ ๊ธฐ๋กํƒ€์ž„์•„์›ƒ ยท ์˜ˆ์™ธ ์‹œ ์‹คํ–‰ ์ค‘๋‹จ โ€” status๋กœ ์ง€์  ํŒŒ์•…
takeaway

์ปจํ…์ŠคํŠธ ์ „๋‹ฌ์ด 1์ˆœ์œ„๋ผ๋ฉด ์ข…๋ฃŒ ์„ค๊ณ„๊ฐ€ 2์ˆœ์œ„ โ€” ๋ชจ๋“  ํŒจํ„ด์—์„œ ์ƒํ•œ์„ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ด ํ”„๋กœ๋•์…˜์˜ ์ตœ์†Œ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค.

PART 5 ยท Workflow

ํ”„๋กœ๋•์…˜ ์ค€๋น„๋„ ๋น„๊ต

์žฅ์•  ๋ณต์›๋ ฅยท๊ด€์ธก ๊ฐ€๋Šฅ์„ฑยท์žฌํ˜„์„ฑยท์ˆ˜ํ‰ ํ™•์žฅยท๋””๋ฒ„๊น… โ€” ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” Workflow๊ฐ€ ๋ณต์›๋ ฅยท์žฌํ˜„์„ฑ ์šฐ์œ„

ํ•ญ๋ชฉAgents-as-ToolsSwarmGraphWorkflow
์žฅ์•  ๋ณต์›๋ ฅ๋‚ฎ์Œ์ค‘๊ฐ„์ค‘๊ฐ„๋†’์Œ (์ƒํƒœ ์ €์žฅ)
๊ด€์ธก ๊ฐ€๋Šฅ์„ฑ์ค‘๊ฐ„๋‚ฎ์Œ๋†’์Œ (๋…ธ๋“œ๋ณ„)๋†’์Œ (Step๋ณ„)
์žฌํ˜„์„ฑ๋†’์Œ๋‚ฎ์Œ์ค‘๊ฐ„๋†’์Œ (๊ฒฐ์ •์ )
์ˆ˜ํ‰ ํ™•์žฅ์ œํ•œ์ ์šฐ์ˆ˜์šฐ์ˆ˜์šฐ์ˆ˜
๋””๋ฒ„๊น… ์šฉ์ด์„ฑ๋†’์Œ๋‚ฎ์Œ์ค‘๊ฐ„๋†’์Œ (๋กœ๊ทธ)
takeaway

๋ณต์›๋ ฅยท์žฌํ˜„์„ฑ์ด ์ตœ์šฐ์„ ์ด๋ฉด Workflow์ž…๋‹ˆ๋‹ค โ€” ํƒœ์Šคํฌ ์ƒํƒœ ์ €์žฅ์ด ํ”„๋กœ๋•์…˜ ์‹ ๋ขฐ์„ฑ์˜ ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค.

๋ณต์žกํ•œ ๋ฌธ์ œ๋Š” ์—ฌ๋Ÿฌ ์—์ด์ „ํŠธ๊ฐ€ ๋‚˜๋ˆ  ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

Agents-as-Tools ยท Swarm ยท Graph ยท Workflow โ€” ํ˜‘์—…์˜ 4๊ฐ€์ง€ ํŒจํ„ด