๐ฏ Strands ๋ฉํฐ์์ด์ ํธ
Agents-as-Tools, Swarm, Graph, Workflow 4ํจํด
Strands ๋ฉํฐ์์ด์ ํธ
Agents-as-Tools ยท Swarm ยท Graph ยท Workflow
์์ด์ ํธ๊ฐ ์์ด์ ํธ๋ฅผ ๋ถ๋ฅธ๋ค
4๊ฐ์ง ๋ฉํฐ์์ด์ ํธ ํจํด โ ์์์์ ์ค์ผ์คํธ๋ ์ด์ ๊น์ง
๋ฉํฐ์์ด์ ํธ ํจํด
์ ๋๋๋๊ฐ ยท ํจํด ์งํ ยท Strands์ 4๊ฐ์ง ๊ตฌํ
์ ๋ฉํฐ์์ด์ ํธ์ธ๊ฐ
์์ด์ ํธ ํ๋์ ๋ชจ๋ ๊ฒ์ ๋งก๊ธธ ๋ ์๊ธฐ๋ ์ธ ๊ฐ์ง ๋ฌธ์
์ปจํ ์คํธ ํฌํ
๋๊ตฌ ์์ญ ๊ฐ + ๊ธด ์ด๋ ฅ์ด ํ ์ปจํ ์คํธ์ ๋ชฐ๋ฆผ โ ๋๊ตฌ ์ ํ ์ ํ๋์ ์๋ต ํ์ง์ด ํจ๊ป ํ๋ฝ
์ญํ ์ถฉ๋
๋ถ์ยท์คํยท๊ฒ์ฆ์ ํ๋์ system prompt์ ๋ด์ โ ํ๋ฅด์๋๊ฐ ์์ฌ ์ง์๊ฐ ๋ชจํธํด์ง
๋ณ๋ ฌ ๋ถ๊ฐ
๋ ๋ฆฝ์ ์ธ ํ์ ์์ ๋ ํ ์์ด์ ํธ๊ฐ ์์ฐจ ์ฒ๋ฆฌ โ ๋๊ธฐ ์๊ฐ์ด ์์ ์์ ๋น๋กํด ์ฆ๊ฐ
ํด๋ฒ์ ๋ถ์ โ ์ ๋ฌธ ์์ด์ ํธ๋ก ๋๋๊ณ , ํ์ ๋ฐฉ์์ ํจํด์ผ๋ก ์ค๊ณํฉ๋๋ค.
ํจํด ์งํ โ ์ ๊ณ ํ์ค๊ณผ Strands
๋ฉํฐ์์ด์ ํธ ํ์ ์ ๋ณดํธ ํจํด 4๊ฐ์ง โ Strands๋ ์ ๋ถ ๋ด์ฅ ๊ตฌํ์ผ๋ก ์ ๊ณต
๋ฉํฐ์์ด์ ํธ ํจํด
๋ณต์ก๋ยท์์จ์ฑยท์ ์ด๋ ฅ 3์ถ์ผ๋ก ๊ตฌ๋ถํ๋ 4๊ฐ์ง ํ์ ์ํคํ ์ฒ
๋ฉํฐ์์ด์ ํธ ํจํด
๋ณต์กํ ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ ์์ด์ ํธ๊ฐ ๋๋ ํด๊ฒฐํฉ๋๋ค โ ๋จ์ ์์๋ถํฐ ์์ ์ค์ผ์คํธ๋ ์ด์ ๊น์ง
- Agents-as-Tools โ Supervisor ์ค์ฌ ์์
- Swarm โ ๋์ ๋ํ ๋ผ์ฐํ
- Graph โ DAG/์ํ ๋ณตํฉ ํ์ดํ๋ผ์ธ
- Workflow โ ํ๋ก๋์ ์ค์ผ์คํธ๋ ์ด์
ํจํด์ ์ฐ์ด์ ์์ต๋๋ค โ ๋ฌธ์ ํน์ฑ์ ๋ง๋ ์ ํ์ด ํต์ฌ์ ๋๋ค.
๋ฉํฐ์์ด์ ํธ ํจํด ๋น๊ต
์์จ์ฑ์ด ๋์์๋ก ์ ์ด๋ ฅ์ด ๋ฎ์์ง๋ ํธ๋ ์ด๋์คํ โ Swarm๊ณผ Workflow๊ฐ ์๊ทน๋จ
| ํจํด | ๋ณต์ก๋ | ์์จ์ฑ | ์ ์ด๋ ฅ | ์ ํฉ ์๋๋ฆฌ์ค |
|---|---|---|---|---|
| Agents-as-Tools | ๋ฎ์ | ๋ฎ์ | ๋์ | Supervisor ์ค์ฌ ์์ |
| Swarm | ์ค๊ฐ | ๋์ | ๋ฎ์ | ๋์ ๋ํ ๋ผ์ฐํ |
| Graph | ๋์ | ์ค๊ฐ | ์ค๊ฐ | DAG/์ํ ๋ณตํฉ ํ์ดํ๋ผ์ธ |
| Workflow | ๋์ | ๋ฎ์ | ๋์ | ํ๋ก๋์ ์ค์ผ์คํธ๋ ์ด์ |
์์จ์ฑ๊ณผ ์ ์ด๋ ฅ์ ํธ๋ ์ด๋์คํ์ ๋๋ค โ Swarm์ ์์จ์ด ๋์ ๋์ ์ ์ด๊ฐ ๋ฎ๊ณ , Workflow๋ ๊ทธ ๋ฐ๋์ ๋๋ค.
์์จ์ฑ vs ๊ตฌ์กฐํ ๋งคํธ๋ฆญ์ค
๊ตฌ์กฐํ = ์คํ ํ๋ฆ์ ์ฌ์ ์ ๊ณ ์ ํ๋ ์ ๋ ยท ์์จ์ฑ = ๋ฐํ์์ ์์ด์ ํธ๊ฐ ๊ฒฐ์ ํ๋ ์ ๋
ํจํด ์ ํ ์์ฌ๊ฒฐ์
์ฒซ ์ง๋ฌธ์ ์ ์ด๋ฅผ ์ด๋์ ๋ ๊ฒ์ธ๊ฐ โ ์/์๋์ค๋ก ์ขํ๊ฐ๋ ํจํด ์ ํ
Agents-as-Tools
Supervisor ์์ ํจํด
Agents-as-Tools
๊ฐ์ฅ ๋จ์ํ ๋ฉํฐ์์ด์ ํธ โ Supervisor๊ฐ ํ์ ์์ด์ ํธ๋ฅผ ๋๊ตฌ์ฒ๋ผ ๋ถ๋ฆฌ๋ ๊ตฌ์กฐ
Agents-as-Tools
Supervisor Agent๊ฐ ํ์ ์์ด์ ํธ๋ฅผ tool๋ก ํธ์ถํ๋ ์์ ๋ชจ๋ธ์ ๋๋ค
- @tool โ ํ์ ์์ด์ ํธ๋ฅผ ๋๊ตฌ๋ก ์ ์
- Supervisor โ ํ์คํฌ ๋ถํด์ ์์
- ์ ์ด ํ๋ฆ ๋ช ํ โ ๋๋ฒ๊น ์ฉ์ด
- ๋จ์ผ ์ฑ ์ ์์ด์ ํธ ์กฐํฉ
ํ์ ์์ด์ ํธ๋ ์๋์ ๋๊ตฌ์ ๋๋ค โ ๊ฒฐ์ ์ ์ ๋ถ Supervisor์ ์ง์ค๋๊ณ , ํ๋ฆ์ ์์ธก ๊ฐ๋ฅํด์ง๋๋ค.
Agents-as-Tools ๊ตฌ์กฐ๋
ํ์ ์์ด์ ํธ๋ผ๋ฆฌ๋ ์๋ก๋ฅผ ๋ชจ๋ฅด๋ ๋ณํ ๊ตฌ์กฐ โ ์์๊ณผ ๊ฒฐ๊ณผ ๋ฐํ์ด ์ ๋ถ Supervisor๋ฅผ ๊ฒฝ์
Agents-as-Tools ๊ตฌํ
@tool๋ก ๊ฐ์ผ ํ์ ์์ด์ ํธ๋ฅผ Supervisor์ tools=์ ์ฅ์ฐฉ โ str(agent(query))๋ก ํ ์คํธ ๊ฒฐ๊ณผ๋ง ๋ฐํ
ํต์ฌ ํฌ์ธํธ
- @tool
- ํจ์๋ก ๊ฐ์ผ ํ์ ์์ด์ ํธ๋ฅผ Supervisor์ ๋๊ตฌ๋ก ๋ ธ์ถ
- system_prompt
- ํ์ ์์ด์ ํธ๋ง๋ค ์ ๋ฌธ ์ญํ ์ ๋ณ๋ ์ง์ โ ๋จ์ผ ์ฑ ์
- str(agent(query))
- AgentResult์์ ํ ์คํธ๋ง ์ถ์ถํด ๋๊ตฌ ๊ฒฐ๊ณผ๋ก ๋ฐํ
- tools=[...]
- Supervisor์ ํ์ ์์ด์ ํธ๋ค์ ๋๊ตฌ ๋ชฉ๋ก์ผ๋ก ์ฅ์ฐฉ
์ฝ๋
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 ํธ๋ ๋ ๋ฆฌํฌํธ๋ฅผ ์์ฑํด์ค")
Supervisor ์์ ํ๋ฆ
Supervisor๊ฐ ํ์คํฌ๋ฅผ ๋ถํดํ๊ณ ํ์ ์์ด์ ํธ์ ์์ฐจ ์์ํ๋ ๊ณผ์
-
1
ํ์คํฌ ์์
Supervisor๊ฐ ์ฌ์ฉ์ ์์ฒญ์ ๋ถ์
-
2
ํ์คํฌ ๋ถํด
ํ์ ์์ ์ผ๋ก ๋ถํ ํ ์ ํฉํ ์์ด์ ํธ ์ ํ
-
3
Tool ํธ์ถ
ํ์ ์์ด์ ํธ๋ฅผ tool()๋ก ์คํ
-
4
๊ฒฐ๊ณผ ํตํฉ
๊ฐ ์์ด์ ํธ ์๋ต์ ์ทจํฉํ์ฌ ์ต์ข ๋ต๋ณ ์์ฑ
๋ถํดยท์์ยทํตํฉ์ด ์ ๋ถ Supervisor ํ ๊ณณ์์ ์ผ์ด๋ฉ๋๋ค โ ํ๋ฆ์ด ๋ช ํํ ๋์ ๋ณ๋ชฉ๋ ์ฌ๊ธฐ์ ์๊น๋๋ค.
Supervisor์ ํ์ ์์ด์ ํธ โ ์ปจํ ์คํธยท์ํ ๊ฒฝ๊ณ
๋์ด๊ฐ๋ ๊ฒ์ ๋๊ตฌ ์ธ์์ ๊ฒฐ๊ณผ ํ ์คํธ๋ฟ โ ๊ฒฉ๋ฆฌ๊ฐ ์ด ํจํด์ ์ฅ์ ์ด์ ์ ์ฝ
๋์ด๊ฐ๋ ๊ฒ
๋๊ตฌ ํธ์ถ์ ์ ์ถ๋ ฅ
- ์ง์ โ Supervisor๊ฐ ์ฌ๊ตฌ์ฑํ query ์ธ์ ํ ์ค
- ๊ฒฐ๊ณผ โ str(AgentResult) ํ ์คํธ๋ง ๋ฐํ
- ๊ธฐ๋ก โ ์๋ณต์ด Supervisor์ messages[]์ toolUseยทtoolResult๋ก ๋จ์
ํ์ ์์ด์ ํธ์๊ฒ ๋งฅ๋ฝ์ ์ฃผ๋ ค๋ฉด query ๋ฌธ์์ด์ ๋ด์ ๋ณด๋ด์ผ ํฉ๋๋ค โ Supervisor์ ์ง์ ๊ตฌ์ฑ์ด ๊ณง ์ปจํ ์คํธ ์ค๊ณ์ ๋๋ค.
๋์ด๊ฐ์ง ์๋ ๊ฒ
๊ฐ์์ ๋ ๋ฆฝ ์ํ
- Supervisor์ ๋ํ ์ด๋ ฅ๊ณผ system prompt
- ํ์ ์์ด์ ํธ์ ์ค๊ฐ ์ถ๋ก ยท๋๊ตฌ ํธ์ถ ๋ด์ญ
- ํ์ messages[] โ ํธ์ถ๋ง๋ค ์๋ก ์์ฑ (๊ธฐ๋ณธ ๋ฌด์ํ)
์ปจํ ์คํธ ํฌํ๋ฅผ ๋ง๋ ๊ฒฉ๋ฆฌ โ ํ์๊ฐ ์ด๋ ฅ์ ์ ์งํด์ผ ํ๋ค๋ฉด ์ธ์ ๊ด๋ฆฌ(์ํ ๊ด๋ฆฌ ๋ชจ๋)๋ฅผ ๋ณ๋๋ก ์ค๊ณํฉ๋๋ค.
Agents-as-Tools ํ์ฉ ์ฌ๋ก
Supervisor ์์ ํจํด์ด ๋น๋๋ ์๋๋ฆฌ์ค
๋ฆฌ์์น ํ์ดํ๋ผ์ธ
๊ฒ์ โ ์์ฝ โ ๋ณด๊ณ ์
์ฝ๋ ๋ฆฌ๋ทฐ ๋ด
๋ถ์ โ ๋ณด์ ๊ฒ์ฌ โ ํผ๋๋ฐฑ
๊ณ ๊ฐ ์ง์ ๋ผ์ฐํฐ
๋ถ๋ฅ โ ์ ๋ฌธ๊ฐ ๋ฐฐ์ โ ์๋ต
์ธ ์ฌ๋ก์ ๊ณตํต ๊ตฌ์กฐ๋ ๋จ์ผ ์ฑ ์ ์์ด์ ํธ์ ์กฐํฉ์ ๋๋ค โ ๊ฐ์ ๋ ๋ฆฝ๋ system_prompt์ ๋๊ตฌ๋ฅผ ๊ฐ์ต๋๋ค.
Swarm
์์จ ํธ๋์คํ์ ๊ณต์ ์ปจํ ์คํธ
Swarm
Supervisor ์๋ ํ์ โ ์ค์ค๋ก ๋ํ๋ฅผ ๋๊ฒจ๋ฐ๋ ์์ด์ ํธ๋ค
Swarm
์์ด์ ํธ ๊ฐ ์์จ ํธ๋์คํ๋ก ๋ํ ํ๋ฆ์ด ์ด๋ํ๋ ๋ถ์ฐ ํ์ ๋ชจ๋ธ์ ๋๋ค
- ์์จ ํธ๋์คํ โ ์์ด์ ํธ๊ฐ ์ ํ ๊ฒฐ์
- ๊ณต์ ์ปจํ ์คํธ โ ์ํ ์ฐ์์ฑ ์ ์ง
- Supervisor ์๋ ๋์ ๋ผ์ฐํ
- max_handoffs ยท max_iterations ์ํ
์ค์ ๊ฒฐ์ ์๊ฐ ์์ด ๋จ์ผ ๋ณ๋ชฉ์ด ์ฌ๋ผ์ง๋๋ค โ ๋์ ๋ผ์ฐํ ์ด ๋์ ์ด๋ผ ํ๋ฆ ์์ธก์ ์ด๋ ค์์ง๋๋ค.
Swarm ๊ตฌ์กฐ๋
๋ฆฌ์์น โ ์ฝ๋ฉ โ ๋ฆฌ๋ทฐ๊ฐ ๊ณต์ ์ปจํ ์คํธ๋ฅผ ๊ฐ์ด๋ฐ ๋๊ณ ๋๋ ์์จ ํธ๋์คํ ์ํ
Swarm ํธ๋์คํ ๊ตฌํ
system_prompt๋ก ์ ํ ์์ ์ ์ง์ํ๊ณ entry_point์ max_handoffsยทmax_iterations๋ก ์์์ ๊ณผ ์ํ์ ์ง์
ํต์ฌ ํฌ์ธํธ
- name=
- ํธ๋์คํ ๋์์ ์๋ณํ๋ ์์ด์ ํธ ์ด๋ฆ
- system_prompt
- ์ธ์ ๋ค๋ฅธ ์์ด์ ํธ๋ก ๋๊ธธ์ง๋ฅผ ํ๋กฌํํธ๋ก ์ง์
- entry_point=
- ๋ํ๋ฅผ ์์ํ ์ง์ ์์ด์ ํธ ์ง์
- max_handoffs ยท max_iterations
- ์ ํยท๋ฐ๋ณต ํ์ ์ํ โ ํญ์ฃผ ๋ฐฉ์ง
์ฝ๋
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("์๋ฒ ์๋ฌ๊ฐ ๊ณ์ ๋ฐ์ํฉ๋๋ค")
Supervisor vs Swarm
์ค์์ง์ค ์์๊ณผ ์์จ ํธ๋์คํ์ ๊ตฌ์กฐ์ ์ฐจ์ด
Supervisor (Agents-as-Tools)
์ค์์ง์ค ์์
- ์ค์ Supervisor๊ฐ ๋ชจ๋ ๊ฒฐ์
- ํ์ ์์ด์ ํธ๋ ์๋์ ๋๊ตฌ
- ์ ์ด ํ๋ฆ ๋ช ํยท์์ธก ๊ฐ๋ฅ
- ๋ณ๋ชฉ: Supervisor ๊ณผ๋ถํ ๊ฐ๋ฅ
Swarm (์์จ ํธ๋์คํ)
๋ถ์ฐ ์์จ ์ ํ
- ๊ฐ ์์ด์ ํธ๊ฐ ์์จ์ ์ผ๋ก ์ ํ ๊ฒฐ์
- ๊ณต์ ์ปจํ ์คํธ๋ก ์ํ ์ฐ์์ฑ
- ๋์ ๋ผ์ฐํ โ ์์ธก ์ด๋ ค์
- ํ์ฅ์ฑ ์ฐ์, ๋จ์ผ ๋ณ๋ชฉ ์์
์์จ ํธ๋์คํ ํ๋ฆ
Swarm ๋ด ์์ด์ ํธ ๊ฐ ์ปจํ ์คํธ ์ ๋ฌ๊ณผ ์ ํ ๋ฉ์ปค๋์ฆ
-
1
์ด๊ธฐ ์์ด์ ํธ ์๋ต
entry_point ์์ด์ ํธ๊ฐ ์ฌ์ฉ์ ๋ฉ์์ง ์ฒ๋ฆฌ ์์
-
2
ํธ๋์คํ ํ๋จ
ํ์ฌ ์์ด์ ํธ๊ฐ ์ ํ ํ์์ฑ ์์จ ๊ฒฐ์
-
3
์ปจํ ์คํธ ์ ๋ฌ
ํธ๋์คํ ๋ฉ์์งยท์ taskยท์์ ์ด๋ ฅยทshared_context๋ฅผ ์กฐ๋ฆฝํด ๋ค์ ์์ด์ ํธ์ ์ ๋ฌ
-
4
์ ์์ด์ ํธ ํ์ฑ
์ ํ๋ ์์ด์ ํธ๊ฐ ์ปจํ ์คํธ ๊ธฐ๋ฐ์ผ๋ก ์๋ต ๊ณ์
ํธ๋์คํ์ ํต์ฌ์ ์ปจํ ์คํธ ์ ๋ฌ์ ๋๋ค โ ํธ๋์คํ ๋ฉ์์งยท์ taskยท์์ ์ด๋ ฅยทshared_context๊ฐ ์กฐ๋ฆฝ๋์ด ๋์ด๊ฐ ๋ค์ ์์ด์ ํธ๊ฐ ์์ ์ ์ด์ด๊ฐ๋๋ค (๋ฉ์์ง ๋ฆฌ์คํธ ์์ฒด๋ ๋ฏธ์ ๋ฌ).
Swarm์ ์ํ โ ๊ณต์ ์ปจํ ์คํธ์ ์ค์ฒด
ํธ๋์คํ๋ง๋ค ํจ๊ป ๋์ด๊ฐ๋ ๊ฒ๊ณผ ๊ด๋ฆฌํด์ผ ํ ๊ฒ
ํจ๊ป ๋์ด๊ฐ๋ ๊ฒ
ํธ๋์คํ์ ์ํ๋ฌผ
- ํธ๋์คํ ๋ฉ์์ง + ์ task โ ์ด์ด๋ฐ์ ์์ ๊ณผ ๋๊ธด ์ฌ์
- ์์ ์ด๋ ฅ โ ์ง๊ธ๊น์ง ๊ฑฐ์ณ์จ ์์ด์ ํธ ๋ชฉ๋ก
- shared_context โ ์์ด์ ํธ๋ค์ด ๊ธฐ๋กํ ๊ณต์ ์ํ
๋ท์ด ์กฐ๋ฆฝ๋ ํ ์คํธ๊ฐ ๋ค์ ์์ด์ ํธ์ ์ ๋ ฅ โ ์ด์ ์์ด์ ํธ์ ๋ฉ์์ง ๋ฆฌ์คํธ ์์ฒด๋ ๋์ด๊ฐ์ง ์์ต๋๋ค.
๊ด๋ฆฌํด์ผ ํ๋ ๊ฒ
๊ณต์ ์ ๋น์ฉ
- ์ปจํ ์คํธ ํฌํ๊ฐ Swarm ์ ์ฒด๋ก ์ ํ โ ๊ธธ์ด์ง์๋ก ๋ชจ๋๊ฐ ๋ฌด๊ฑฐ์์ง
- max_handoffs ยท max_iterations โ ํญ์ฃผ์ ๋ฌดํ ์ํ ๋ฐฉ์ง ์ํ
- ์์ด์ ํธ ์ ๋ฌธํ โ ์ญํ ์ ์ขํ ๊ฐ์์ ๋ฐํ๋ฅผ ์งง๊ฒ
์ปจํ ์คํธ ๊ณต์ ๋ ํธ์์ ํฌํ๋ฅผ ๋ง๋ฐ๊พธ๋ ์ ํ โ ์ํ ์ค์ ์ด ์์ ๋ฒจํธ์ ๋๋ค.
Graph
DAGยท์ํยท์กฐ๊ฑด๋ถ ๋ถ๊ธฐยท๋ณ๋ ฌ ์คํ
Graph
๋ ธ๋๋ ์์ด์ ํธ, ์ฃ์ง๋ ๊ด๊ณ โ ๋ณต์กํ ์ํฌํ๋ก์ฐ์ ๊ทธ๋ํ ํํ
Graph
DAG ๋๋ ์ํ ๊ทธ๋ํ๋ก ์์ด์ ํธ ๊ฐ ๊ด๊ณ๋ฅผ ์ ์ํ๋ ์ค์ผ์คํธ๋ ์ด์ ์ ๋๋ค
- GraphBuilder โ ๋ ธ๋ยท์ฃ์ง๋ก ๊ตฌ์ฑ
- ์กฐ๊ฑด๋ถ ๋ถ๊ธฐ โ condition ํจ์
- ๋ณ๋ ฌ ์คํ โ Fan-out/Fan-in
- DAG ยท Cyclic ยท Conditional ํ ํด๋ก์ง
์กฐ๊ฑด๋ถ ๋ถ๊ธฐ์ ๋ณ๋ ฌ ์คํ๊น์ง ํ์ํ๋ค๋ฉด Graph์ ๋๋ค โ ๊ด๊ณ๋ฅผ ์ฝ๋๋ก ๋ช ์ํ๋ ๋งํผ ๋ณต์ก๋๋ ๋์ต๋๋ค.
Graph ๊ตฌ์กฐ๋
๋ ธ๋์ ์ฃ์ง๋ก ์ฌ์ ์ ์ํ๋ ์คํ ๊ทธ๋ํ โ ๋ณ๋ ฌ ๋ถ๊ธฐ์ ํฉ๋ฅ๊ฐ ๊ตฌ์กฐ์ ๋ด์ฅ
Graph ๊ตฌํ
GraphBuilder๋ก ๋ ธ๋์ ์ฃ์ง๋ฅผ ์ ์ํ๋ Graph ํจํด
ํต์ฌ ํฌ์ธํธ
- add_node(agent, node_id=)
- ์์ด์ ํธ๋ฅผ ๊ทธ๋ํ ๋ ธ๋๋ก ๋ฑ๋ก
- add_edge(a, b, condition=)
- ์คํ ์์ ์ ์ โ condition ํจ์๋ก ์กฐ๊ฑด๋ถ ๋ถ๊ธฐ
- state.results
- ์กฐ๊ฑด ํจ์๊ฐ ๋ฐ๋ GraphState โ ๋ ธ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ฌํด bool ๋ฐํ
- set_entry_point / build()
- ์ง์ ๋ ธ๋ ์ง์ ํ ๊ทธ๋ํ ์์ฑยท์คํ
์ฝ๋
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()("๋ถ๊ธฐ๋ณ ๋งค์ถ ๋ฐ์ดํฐ๋ฅผ ๋ถ์ํด์ค")
Graph 3๊ฐ์ง ํ ํด๋ก์ง
DAGยท์ํยท์กฐ๊ฑด๋ถ โ ๊ทธ๋ํ ํ ํด๋ก์ง๋ณ ํน์ฑ๊ณผ ์ ์ฉ ์์ญ
DAG (๋น์ํ)
๋จ๋ฐฉํฅ ์์กด์ฑ ๊ทธ๋ํ
Cyclic (์ํ)
ํผ๋๋ฐฑ ๋ฃจํ ํฌํจ ๊ทธ๋ํ
Conditional (์กฐ๊ฑด๋ถ)
๋ฐํ์ ๋ถ๊ธฐ ๊ฒฐ์
ํ ๋ฐฉํฅ์ด๋ฉด DAG, ๋๋์๊ฐ๋ฉด Cyclic โ ์ด๋ ์ชฝ์ด๋ ๋ถ๊ธฐ ๊ฒฐ์ ์ condition ํจ์๊ฐ ๋ฐํ์์ ๋ด๋ฆฝ๋๋ค.
๋ณ๋ ฌ ์คํ๊ณผ ํฉ๋ฅ
๋ ๋ฆฝ ๋ ธ๋์ ๋์ ์คํ๊ณผ ๊ฒฐ๊ณผ ํฉ๋ฅ(Fan-out/Fan-in) ๋ฉ์ปค๋์ฆ
-
1
Fan-out
์ง์ ๋ ธ๋๊ฐ ๋ ๋ฆฝ๋ ๋ณต์ ๋ ธ๋๋ฅผ ๋์ ํธ๋ฆฌ๊ฑฐ
-
2
๋ณ๋ ฌ ์ฒ๋ฆฌ
๊ฐ ๋ ธ๋๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ โ ์๋ก ๋๊ธฐํ์ง ์์
-
3
Fan-in
๋ชจ๋ ๋ณ๋ ฌ ๋ ธ๋ ์๋ฃ ํ ํฉ๋ฅ ๋ ธ๋์์ ๊ฒฐ๊ณผ ์ง๊ณ
-
4
ํ์ ์ฒ๋ฆฌ
์ง๊ณ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๋ ธ๋๋ก ์ ๋ฌํ์ฌ ์ต์ข ์ถ๋ ฅ ์์ฑ
๋ณ๋ ฌ ๋ ธ๋๋ ์๋ก ๊ธฐ๋ค๋ฆฌ์ง ์์ง๋ง, ํฉ๋ฅ ๋ ธ๋๋ ์ ์ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค โ Fan-in์ด ๊ณง ๋๊ธฐํ ์ง์ ์ ๋๋ค.
Graph์ ์ํ โ ์ฃ์ง๋ก ํ๋ฅด๋ ๊ฒ๊ณผ ๋จ๋ ๊ฒ
๋ ธ๋ ์ฌ์ด์๋ ์ถ๋ ฅ๋ง ํ๋ฅด๊ณ , ์คํ ์ํ๋ ๊ทธ๋ํ๊ฐ ๊ด๋ฆฌํ๋ ๊ตฌ์กฐ
์ฃ์ง๋ก ํ๋ฅด๋ ๊ฒ
๋ ธ๋ ๊ฐ ์ ๋ฌ
- ์ด์ ๋ ธ๋์ ์ถ๋ ฅ โ ๋ค์ ๋ ธ๋์ ์ ๋ ฅ์ด ๋จ
- ๋ณ๋ ฌ ๋ธ๋์น๋ ์๋ก ๋ ๋ฆฝ โ ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ฆ
- ํฉ๋ฅ ๋ ธ๋์์ ๋ณ๋ ฌ ๊ฒฐ๊ณผ๋ฅผ ์ง๊ณ
๋ ธ๋ ๋ด๋ถ์ ๋ํ ์ด๋ ฅยท์ค๊ฐ ์ถ๋ก ์ ๋ฐ์ผ๋ก ๋๊ฐ์ง ์์ต๋๋ค โ ํ์ํ ์ฐ์ถ๋ฌผ๋ง ์ฃ์ง์ ์ค๋ฆฝ๋๋ค.
๊ทธ๋ํ๊ฐ ๊ด๋ฆฌํ๋ ๊ฒ
์คํ ์ํ
- ์งํ ์์น โ ์ด๋ ๋ ธ๋๊น์ง ์คํ๋๋๊ฐ
- ์ํ ์ ๋ฐ๋ณต ํ์ โ set_max_node_executions ์ํ
- ์กฐ๊ฑด ๋ถ๊ธฐ ๊ฒฐ๊ณผ โ condition ํจ์์ ๋ฐํ์ ํ์
์ํ๊ฐ ๊ตฌ์กฐ์ ์์ผ๋ฏ๋ก ํ๋ฆ์ด ์ฌํ ๊ฐ๋ฅ โ ๊ด์ธก๊ณผ ๋๋ฒ๊น ์ด ์ฌ์ด ์ด์ ์ ๋๋ค.
Workflow
์์กด์ฑ ํ์ดํ๋ผ์ธ ยท ์ํ ์ ์ฅ ยท ์ถ์
Workflow
์คํ ์์๋ฅผ ๋ณด์ฅํ๊ณ ์ํ๋ฅผ ๋์คํฌ์ ๋จ๊ธฐ๋ ํ๋ก๋์ ์งํฅ ํจํด
Workflow
์์กด์ฑ ๊ธฐ๋ฐ ํ์คํฌ ํ์ดํ๋ผ์ธ์ผ๋ก ์คํ ์์๋ฅผ ๋ณด์ฅํ๊ณ ์ํ๋ฅผ ๋์คํฌ์ ๋จ๊น๋๋ค
- workflow ๋๊ตฌ โ strands-agents-tools ์ ๊ณต
- ์์กด์ฑ ์ ์ โ ์คํ ์์ ๋ณด์ฅ
- ํ์คํฌ ์ํ๋ฅผ ๋์คํฌ์ ์ ์ฅ
- create ยท start ยท list ยท status ยท delete
์ํ๊ฐ ๋์คํฌ์ ๋จ์ผ๋ ์งํ ์ถ์ ๊ณผ ์ฅ์ ์ง์ ํ์ ์ด ๊ฐ๋ฅํฉ๋๋ค โ ํ๋ก๋์ ์ ๋ขฐ์ฑ์ด ํ์ํ ๋์ ์ ํ์ ๋๋ค.
Workflow ๊ตฌ์กฐ๋
๊ณ ์ ์์์ ํ์ดํ๋ผ์ธ โ ๊ฐ ํ์คํฌ ๊ฒฐ๊ณผ๊ฐ ์ ์ฅ๋์ด ์คํจ ์ง์ ์ ์ ํํ ํ์
-
1
์์ง
ํ์คํฌ 1 โ ๊ฒฐ๊ณผ๋ฅผ ์ํ ์ ์ฅ์์ ๊ธฐ๋ก
-
2
๋ถ์
ํ์คํฌ 2 โ ์ด์ ํ์คํฌ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉ
-
3
์์ฑ
ํ์คํฌ 3 โ ์คํจํ๋ฉด ์ด ์ง์ ์ด ์ํ์ ๊ธฐ๋ก
-
4
๋ฐํ
ํ์คํฌ 4 โ ์๋ฃ ์ํ ๊ธฐ๋ก์ผ๋ก ์ข ๋ฃ
ํ์คํฌ๋ง๋ค ๊ฒฐ๊ณผ๊ฐ ์ํ ์ ์ฅ์์ ๋จ์ผ๋ ์ด๋๊น์ง ์ฑ๊ณตํ๊ณ ์ด๋์ ์คํจํ๋์ง๋ฅผ ์ ํํ ํ์ ํ ์ ์์ต๋๋ค.
Workflow ํ์ดํ๋ผ์ธ ๊ตฌํ
strands-agents-tools์ workflow ๋๊ตฌ๋ก ์์กด์ฑ ๊ธฐ๋ฐ ํ์คํฌ ํ์ดํ๋ผ์ธ ์คํ
ํต์ฌ ํฌ์ธํธ
- workflow
- strands-agents-tools๊ฐ ์ ๊ณตํ๋ ํ์คํฌ ํ์ดํ๋ผ์ธ ๋๊ตฌ
- tools=[workflow]
- ์ค์ผ์คํธ๋ ์ดํฐ์ ์ฅ์ฐฉ โ ์์ฐ์ด ์์ฒญ์ ๋๊ตฌ ํธ์ถ๋ก ์ํ
- create / start / list / status / delete
- workflow ๋๊ตฌ๊ฐ ์ง์ํ๋ 5๊ฐ์ง ์ก์
- workflow_id
- status ์ก์ ์ผ๋ก ํ์ดํ๋ผ์ธ๋ณ ์งํ ์ํ ํ์ธ
์ฝ๋
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๋ณ ์งํ ํ์ธ
ํ์คํฌ ์ํ ์ ์ฅ๊ณผ ์ถ์
ํ์คํฌ ์ํ๋ฅผ ๋์คํฌ์ ๊ธฐ๋กํด ์ฅ์ ๋ฐ์ ์ง์ ์ ํ์ ํ๋ ๊ตฌ์กฐ
-
1
ํ์คํฌ ์คํ
์์กด์ฑ์ด ํด์๋ ํ์คํฌ๋ถํฐ ์์ฐจ ์คํ
-
2
์ํ ์ ์ฅ
ํ์คํฌ ์๋ฃ ์๋ง๋ค ์ํ๋ฅผ ๋ก์ปฌ ๋์คํฌ์ ๊ธฐ๋ก
-
3
์ฅ์ ๊ฐ์ง
ํ์์์ยท์์ธยท์ธ๋ถ ์คํจ ์ ์คํ ์ค๋จ
-
4
์ํ ์กฐํ
status ์ก์ ์ผ๋ก workflow_id๋ณ ์๋ฃยท์คํจ ํ์คํฌ ํ์ธ ํ ๋์
์ํ๊ฐ ๋์คํฌ์ ๋จ์ผ๋ฏ๋ก ์ด๋ ํ์คํฌ์์ ๋ฉ์ท๋์ง status ์กฐํ ํ ๋ฒ์ผ๋ก ํ์ ํฉ๋๋ค.
์ปจํ ์คํธ๋ ์ด๋ป๊ฒ ๋์ด๊ฐ๋๊ฐ โ ํจํด๋ณ ์ํ ์ ๋ฌ
๋ฉํฐ์์ด์ ํธ ์ค๊ณ์ ํต์ฌ ์ง๋ฌธ โ ๊ฐ ํจํด์ด ์ปจํ ์คํธ์ ์ํ๋ฅผ ๋๊ธฐ๋ ๋ฐฉ์
์ธ์ ๋ฉ์ถ๋๊ฐ โ ํจํด๋ณ ์ข ๋ฃ์ ํญ์ฃผ ๋ฐฉ์ง
์ํ ์๋ ์์จ์ด ๋ถ๋ฅด๋ ๋น์ฉ ์ฌ๊ณ โ ํจํด๋ง๋ค ๋ค๋ฅธ ์ข ๋ฃ ์กฐ๊ฑด๊ณผ ํญ์ฃผ ์ํ
| ํจํด | ์ ์ ์ข ๋ฃ | ํญ์ฃผ ๋ฐฉ์ง ์ํ |
|---|---|---|
| Agents-as-Tools | Supervisor๊ฐ ๋๊ตฌ ํธ์ถ ์์ด ์ต์ข ์๋ต | Supervisor์ ์์ด์ ํฑ ๋ฃจํ ์ ์ด (Hooks) |
| Swarm | ์์ด์ ํธ๊ฐ ํธ๋์คํ ์์ด ์ต์ข ์๋ต | max_handoffs ยท max_iterations |
| Graph | ๋ชจ๋ ๊ฒฝ๋ก๊ฐ ์ข ๋จ ๋ ธ๋์ ๋๋ฌ | set_max_node_executions ยท set_execution_timeout |
| Workflow | ๋ง์ง๋ง ํ์คํฌ ์๋ฃ ์ํ ๊ธฐ๋ก | ํ์์์ ยท ์์ธ ์ ์คํ ์ค๋จ โ status๋ก ์ง์ ํ์ |
์ปจํ ์คํธ ์ ๋ฌ์ด 1์์๋ผ๋ฉด ์ข ๋ฃ ์ค๊ณ๊ฐ 2์์ โ ๋ชจ๋ ํจํด์์ ์ํ์ ๋ช ์ํ๋ ๊ฒ์ด ํ๋ก๋์ ์ ์ต์ ์กฐ๊ฑด์ ๋๋ค.
ํ๋ก๋์ ์ค๋น๋ ๋น๊ต
์ฅ์ ๋ณต์๋ ฅยท๊ด์ธก ๊ฐ๋ฅ์ฑยท์ฌํ์ฑยท์ํ ํ์ฅยท๋๋ฒ๊น โ ์ํ๋ฅผ ์ ์ฅํ๋ Workflow๊ฐ ๋ณต์๋ ฅยท์ฌํ์ฑ ์ฐ์
| ํญ๋ชฉ | Agents-as-Tools | Swarm | Graph | Workflow |
|---|---|---|---|---|
| ์ฅ์ ๋ณต์๋ ฅ | ๋ฎ์ | ์ค๊ฐ | ์ค๊ฐ | ๋์ (์ํ ์ ์ฅ) |
| ๊ด์ธก ๊ฐ๋ฅ์ฑ | ์ค๊ฐ | ๋ฎ์ | ๋์ (๋ ธ๋๋ณ) | ๋์ (Step๋ณ) |
| ์ฌํ์ฑ | ๋์ | ๋ฎ์ | ์ค๊ฐ | ๋์ (๊ฒฐ์ ์ ) |
| ์ํ ํ์ฅ | ์ ํ์ | ์ฐ์ | ์ฐ์ | ์ฐ์ |
| ๋๋ฒ๊น ์ฉ์ด์ฑ | ๋์ | ๋ฎ์ | ์ค๊ฐ | ๋์ (๋ก๊ทธ) |
๋ณต์๋ ฅยท์ฌํ์ฑ์ด ์ต์ฐ์ ์ด๋ฉด Workflow์ ๋๋ค โ ํ์คํฌ ์ํ ์ ์ฅ์ด ํ๋ก๋์ ์ ๋ขฐ์ฑ์ ๊ธฐ๋ฐ์ ๋๋ค.
Agents-as-Tools ยท Swarm ยท Graph ยท Workflow โ ํ์ ์ 4๊ฐ์ง ํจํด