๋ฉํฐ ์์ด์ ํธ ํ๋ก๊ทธ๋๋ฐ: โ์ฌ๋ฌ ๋ช ์ ์์ ๊ฐ๋ฐ์โ๊ฐ ํ์ ํ๋ ์์คํ ๋ง๋ค๊ธฐ
๋ฉํฐ ์์ด์ ํธ ํ๋ก๊ทธ๋๋ฐ: โ์ฌ๋ฌ ๋ช ์ ์์ ๊ฐ๋ฐ์โ๊ฐ ํ์ ํ๋ ์์คํ ๋ง๋ค๊ธฐ ์์ฆ ๊ฐ๋ฐ ํ์ฅ์์ โ์์ด์ ํธโ๋ผ๋ ๋จ์ด๋ฅผ ์์ฃผ ๋ฃ์ต๋๋ค....
๋ฉํฐ ์์ด์ ํธ ํ๋ก๊ทธ๋๋ฐ: โ์ฌ๋ฌ ๋ช ์ ์์ ๊ฐ๋ฐ์โ๊ฐ ํ์ ํ๋ ์์คํ ๋ง๋ค๊ธฐ
์์ฆ ๊ฐ๋ฐ ํ์ฅ์์ โ์์ด์ ํธโ๋ผ๋ ๋จ์ด๋ฅผ ์์ฃผ ๋ฃ์ต๋๋ค. ๋จ์ผ ๋ชจ๋ธ์ด ๋ชจ๋ ๊ฑธ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์์, ์ด์ ๋ ์ญํ ์ด ๋๋ ์ฌ๋ฌ ์์ด์ ํธ๊ฐ ๋ํํ๋ฉฐ ๋ฌธ์ ๋ฅผ ํธ๋ ๊ตฌ์กฐ๋ก ์ฎ๊ฒจ๊ฐ๋ ๋๋์ด์ฃ . ๋ฉํฐ ์์ด์ ํธ ํ๋ก๊ทธ๋๋ฐ์ ํ ๋ง๋๋ก, ์ฌ๋ฌ ๊ฐ์ ์์จ์ ์ธ ๊ตฌ์ฑ์์(์์ด์ ํธ)๊ฐ ๊ฐ์ ํ๋จํ๊ณ ํ๋ํ๋ฉด์ ๊ณต๋์ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๋ ์ํํธ์จ์ด ์ค๊ณ ๋ฐฉ์์ ๋๋ค. ํ ์ฌ๋์ด ํผ์ ๊ฐ๋ฐํ ๋๋ณด๋ค, ๊ธฐํยท๋ฐฑ์๋ยทํ๋ก ํธยทQA๊ฐ ๋๋ ์ ์ผํ๋ฉด ๋ ํํํด์ง๋ฏ์ด์.
๋ฉํฐ ์์ด์ ํธ๊ฐ ํ์ํ ์๊ฐ
1) ๋ณต์กํ ์ ๋ฌด๋ฅผ ์ญํ ๋ก ์ชผ๊ฐ์ผ ํ ๋
์๋ฅผ ๋ค์ด โ์๊ตฌ์ฌํญ ๋ถ์ โ ์ค๊ณ โ ์ฝ๋ ์์ฑ โ ํ ์คํธ โ ๋ฆฌํฉํฐ๋งโ์ ํ ํ๋ฆ์ผ๋ก ์ฒ๋ฆฌํ๋ฉด, ์ค๊ฐ์ ๋ ผ๋ฆฌ ์ค๋ฅ๊ฐ ์์ด๊ธฐ ์ฝ์ต๋๋ค. ์์ด์ ํธ๋ฅผ ๋ถ๋ฆฌํ๋ฉด ์๋ก์ ๊ฒฐ๊ณผ๋ฅผ ๊ฒํ ํ ์ ์์ด ํ์ง์ด ์ฌ๋ผ๊ฐ๋๋ค.
2) ๋์์ ์ฌ๋ฌ ์์ ์ ๊ตด๋ ค์ผ ํ ๋
๋ก๊ทธ ๋ถ์ํ๋ฉด์ ์ฅ์ ์์ธ์ ์ฐพ๊ณ , ๋์์ ์์ ํจ์น ๊ณํ์ ์ธ์ฐ๊ณ , ๋ ์ฌ์ฉ์ ๊ณต์ง๋ฅผ ์ค๋นํ๋ ์ํฉ์ฒ๋ผ์. ์์ด์ ํธ๊ฐ ๋ณ๋ ฌ๋ก ์์ง์ด๋ฉด ๋๊ธฐ ์๊ฐ์ ์ค์ด๊ณ ๋์์ด ๋นจ๋ผ์ง๋๋ค.
3) ์์ฌ๊ฒฐ์ ์ด ํ์ํ ๋ฌธ์ (ํ์/์กฐ์ )
์ถ์ฒ ์์คํ , ๊ฒ์ AI, ๋ก๋ด ๊ตฐ์ง ์ ์ด์ฒ๋ผ โ๋๊ฐ ๋ฌด์์ ํ ์งโ ๊ณ์ ์ ํด์ผ ํ๋ ๋ฌธ์ ์์ ๋ฉํฐ ์์ด์ ํธ๋ ํนํ ๊ฐํฉ๋๋ค.
๊ธฐ๋ณธ ๊ตฌ์ฑ: ์์ด์ ํธ, ๋ฉ๋ชจ๋ฆฌ, ๋๊ตฌ, ์กฐ์ ์
์์ด์ ํธ(Agent)
๊ฐ์ ๋ชฉํ์ ๊ท์น์ ๊ฐ์ง ์์ ์์ ๋๋ค. ์) โ์ค๊ณ ๋ฆฌ๋ทฐ์ดโ, โํ ์คํธ ๋ด๋นโ, โ์ฑ๋ฅ ์ต์ ํ ๋ด๋นโ.
๋ฉ๋ชจ๋ฆฌ(Shared/Local Memory)
- Local: ์์ด์ ํธ ๊ฐ์ธ ๋ฉ๋ชจ(์์ ๋ ธํธ)
- Shared: ํ ๊ณต์ฉ ๋ฉ๋ชจ(๊ฒฐ์ ์ฌํญ, API ๊ณ์ฝ)
๋๊ตฌ(Tools)
DB ์กฐํ, ์ฝ๋ ์คํ, ํ์ผ ์์ , ํ ์คํธ ์คํ ๋ฑ ์ค์ ํ๋ ์๋จ์ ๋๋ค.
์กฐ์ ์(Orchestrator)
๋๊ฐ ์ธ์ ๋ฌด์์ ํ ์ง ์ ํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์ ์ต์ข ๋ต์ ๋ง๋๋ ์ญํ ์ ๋๋ค. ์์ ํ๋ก์ ํธ์ผ์๋ก ์กฐ์ ์๊ฐ ๋ช ํํด์ผ ๋ํ๊ฐ ๊ธธ์ด์ง์ง ์์ต๋๋ค.
์ค์ ์์: โ๋ฒ๊ทธ ๋ฆฌํฌํธ โ ์์ PR ์ด์โ์ ๋ง๋๋ ๋ฉํฐ ์์ด์ ํธ ํ๋ฆ
์๋๋ ํ๋ ์์ํฌ ์์ด๋ ๊ฐ์ ์ก์ ์ ์๋ ๊ฐ๋จํ ์์์ ๋๋ค. ํต์ฌ์ ์ญํ ๋ถ๋ฆฌ + ๋ฉ์์ง ๊ธฐ๋ฐ ํ์ ์ ๋๋ค.
from dataclasses import dataclass
from typing import List, Dict, Callable
@dataclass
class Message:
sender: str
content: str
class Agent:
def __init__(self, name: str, handler: Callable[[List[Message]], Message]):
self.name = name
self.handler = handler
def act(self, history: List[Message]) -> Message:
return self.handler(history)
def triage_agent(history: List[Message]) -> Message:
report = history[-1].content
# ๋งค์ฐ ๋จ์ํ๋ ๋ถ๋ฅ ์์
label = "null-check" if "None" in report or "null" in report.lower() else "unknown"
return Message("Triage", f"์์ฌ ์์ธ ๋ผ๋ฒจ: {label}\nํต์ฌ ์ฌํ ๋จ์ ์์ฝ: {report[:80]}")
def fix_agent(history: [Message]) -> Message:
triage = history[-].content
patch = (
)
Message(, )
() -> Message:
Message(,
)
() -> [Message]:
history = [Message(, bug_report)]
agents = [
Agent(, triage_agent),
Agent(, fix_agent),
Agent(, test_agent),
]
a agents:
history.append(a.act(history))
history
__name__ == :
result = orchestrate()
m result:
()
์ด ๊ตฌ์กฐ๋ง์ผ๋ก๋ โ๋ถ๋ฅโ์์ ์โํ ์คํธ์โ์ด ์๋ก ์ด์ด์ง๋ ํ์ดํ๋ผ์ธ์ด ๋ฉ๋๋ค. ์ค์ ์๋น์ค์์๋ ์ฌ๊ธฐ์ ๋ ๋์๊ฐ:
- Fixer๊ฐ ์ ์ํ ๋ณ๊ฒฝ์ ์๋ ํจ์น๋ก ์ ์ฉ
- Tester๊ฐ ์ค์ ํ ์คํธ ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฌ
- Reviewer๊ฐ ์ฝ๋ ์คํ์ผ/์ฑ๋ฅ/๋ณด์ ๊ด์ ๋ฆฌ๋ทฐ ์ฒ๋ผ ์์ด์ ํธ๋ฅผ ๋๋ ค์ ์์ฑ๋๋ฅผ ๋์ด์ฌ๋ฆด ์ ์์ด์.
์ค๊ณ ํ: ๋ฉํฐ ์์ด์ ํธ๊ฐ ๋ง๊ฐ์ง์ง ์๊ฒ ํ๋ 4๊ฐ์ง
1) ์ญํ ์ โ์ฐ์ถ๋ฌผโ๋ก ์ ์ํ๊ธฐ
โํ ์คํฐโ๊ฐ ์๋๋ผ โ์คํ ๊ฐ๋ฅํ ํ ์คํธ ์๋๋ฆฌ์ค ๋ชฉ๋ก์ ๋ธ๋คโ์ฒ๋ผ ๊ฒฐ๊ณผ๋ฌผ์ ๊ณ ์ ํ๋ฉด ํ๋ค๋ฆฌ์ง ์์ต๋๋ค.
2) ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ต์ํํ๊ณ , ๊ณ์ฝ์ ๋ช ํํ
๊ณต์ฉ ๋ฉ๋ชจ๋ ๊ฒฐ์ ์ฌํญ๋ง, ๋๋จธ์ง๋ ๊ฐ์ ๋ฉ๋ชจ๋ก. ๊ทธ๋ฆฌ๊ณ API ๊ณ์ฝ/๋ฐ์ดํฐ ์คํค๋ง ๊ฐ์ ๋ณ๊ฒฝ ๋ฏผ๊ฐ ์ ๋ณด๋ ํ๋์ ๋ฌธ์๋ก ๊ด๋ฆฌํ์ธ์.
3) ์ถฉ๋ ํด๊ฒฐ ๊ท์น์ ๋ฏธ๋ฆฌ ๋๊ธฐ
์๋ก ๋ค๋ฅธ ๊ฒฐ๋ก ์ด ๋์ค๋ฉด โReviewer ์ฐ์ โ ๊ฐ์ ๊ท์น์ด ํ์ํฉ๋๋ค. ๊ท์น์ด ์์ผ๋ฉด ํ ๋ก ๋ง ๊ธธ์ด์ง๋๋ค.
4) ์ข ๋ฃ ์กฐ๊ฑด(Stop condition)์ ๋ช ํํ
โํ ์คํธ 3๊ฐ ์ ์ํ๋ฉด ์ข ๋ฃโ, โ์๋ฌ ์์ธ 2๊ฐ ์ด์์ด๋ฉด ์ฐ์ ์์ 1๊ฐ๋ง ์ ํโ ๊ฐ์ ์ ํ์ด ์์ด์ผ ์ด์์ด ์ฝ์ต๋๋ค.
๋ง๋ฌด๋ฆฌ: ๋ฉํฐ ์์ด์ ํธ๋ โ๊ธฐ์ โ์ด์ โํ ์ค๊ณโ์ ๋๋ค
๋ฉํฐ ์์ด์ ํธ ํ๋ก๊ทธ๋๋ฐ์ ๋ณธ์ง์ ์ฌ๋ฌ ์ง๋ฅ์ ์๊ฒ ๋๋ ์ถฉ๋ ์์ด ํ์ ์ํค๋ ๊ฐ๋ฐ ์ค๊ณ์ ๋๋ค. ์ฒ์์ ๋จ์ํ ํ์ดํ๋ผ์ธ(๋ถ๋ฅโ์์ โํ ์คํธ)๋ถํฐ ์์ํด ๋ณด์ธ์. ์๊ฒ ์ฑ๊ณตํ๋ฉด, ๊ทธ ๋ค์์ ์์ฐ์ค๋ฝ๊ฒ ํ์ฅ๋ฉ๋๋ค.
#๋ฉํฐ์์ด์ ํธ #์์ด์ ํธํ๋ก๊ทธ๋๋ฐ #๊ฐ๋ฐ #์ํํธ์จ์ด์ํคํ ์ฒ #์์คํ ์ค๊ณ #ํ์ด์ฌ #์๋ํ #๋ถ์ฐ์์คํ #ํ ์คํธ์๋ํ #์ฝ๋๋ฆฌ๋ทฐ
โฌ๏ธ ์ด ๊ธ์ด ๋์์ด ๋์ จ๋ค๋ฉด, ์๋ ๊ด๊ณ ๋ฅผ ํ ๋ฒ๋ง ํด๋ฆญํด์ฃผ์ธ์! ์ ์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค ๐โโ๏ธ โฌ๏ธ