์ด๋ฒ ํธ์ Hugging Face Agents Course์ ํต์ฌ์ธ โ์๊ฐ(Reason) โ ๋๊ตฌ ์คํ(Act) โ ๊ด์ฐฐ(Observe)โ ๋ฃจํ๋ฅผ ์ด๋ณด์ ๊ด์ ์์ ์ ํํ ์ก๋ ๋ณธํธ์ด๋ค.
ํต์ฌ์ ์ด๋ ต์ง ์๋ค.
์์ด์ ํธ ํ์ง์ ๋ชจ๋ธ ํฌ๊ธฐ๋ณด๋ค
๋๊ตฌ ์ ์์์ฑ๊ณต ํ์ ๊ธฐ์ค์์ ๋จผ์ ์ฌ๋ผ๊ฐ๋ค.
- ์ด์ ํธ: ๐ค 10. ์ค์ตํธ 02
ํ ์ค ๊ฒฐ๋ก
ReAct ๋ฃจํ๋ฅผ ๋์ผ๋ก ํ์ธ ๊ฐ๋ฅํ ๋ก๊ทธ(step)์ ๋ช
ํํ ํด ์
์ถ๋ ฅ ๊ณ์ฝ์ผ๋ก ์ด์ํ๋ฉด, ์ด๋ณด์๋ โ์ ์ด ๋ต์ด ๋์๋์งโ ์ถ์ ๊ฐ๋ฅํ ์์ด์ ํธ๋ฅผ ๋ง๋ค ์ ์๋ค.
flowchart TD A[์ฌ์ฉ์ ์ง๋ฌธ] --> B[Agent Reason] B --> C{ํ์ ๋๊ตฌ ์ ํ} C -->|search_web| D[DuckDuckGo ๊ฒ์] C -->|calc_margin| E[๋ง์ง ๊ณ์ฐ] D --> F[Observation] E --> F F --> G[๋ค์ step ํ๋จ] G -->|์ถฉ๋ถ| H[์ต์ข ๋ต๋ณ] G -->|๋ถ์กฑ| B
์ค์ต ๋ชฉํ
- smolagents์์ ๋๊ตฌ 2๊ฐ(
search_web,calc_margin)๋ฅผ ๋ถ์ธ๋ค. - ์์ด์ ํธ๊ฐ ๋๊ตฌ๋ฅผ ์ ํํด ์คํํ๋ ReAct ํ๋ฆ์ ๋ก๊ทธ๋ก ํ์ธํ๋ค.
- ์ค๋ฌด ๊ธฐ์ค์ ์ฑ๊ณต ํ์ (์ ๋ต/๊ทผ๊ฑฐ/์ฌํ์ฑ)์ ์ฒดํฌํ๋ค.
์ค๋น๋ฌผ
- Python 3.10+
- Hugging Face Access Token (๊ถ์ฅ)
- ํ๊ฒฝ๋ณ์๋ช
:
HF_TOKEN
- ํ๊ฒฝ๋ณ์๋ช
:
- ๊ฒฝ๋ก:
.../Agent/๐ค HF-Agents-Course/downloads
1) ํ๊ฒฝ ์ค๋น
- ๋๊ตฌ: ํฐ๋ฏธ๋, pip
- ์ ๋ ฅ: ํ์ด์ฌ ๊ฐ์ํ๊ฒฝ
- ์คํ๋ช ๋ น:
cd "/home/tw2/Documents/n8n/data/shared/syn/8.quartz/Agent/๐ค HF-Agents-Course/downloads"
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install smolagents duckduckgo-search- ์ฑ๊ณตํ์ :
python -c "import smolagents; print('ok')"๊ฐok์ถ๋ ฅ
2) ์ค์ต ์ฝ๋ ์์ฑ
- ๋๊ตฌ: ํ์ผ ํธ์ง๊ธฐ
- ์ ๋ ฅ: ์๋ ์ฝ๋
- ์คํ๋ช ๋ น:
cat > day11_react_toolflow.py <<'PY'
from smolagents import CodeAgent, InferenceClientModel, tool
@tool
def calc_margin(revenue: float, cost: float) -> str:
"""๋งค์ถ๊ณผ ๋น์ฉ์ผ๋ก ๋ง์ง์จ(%)์ ๊ณ์ฐํ๋ค."""
if revenue <= 0:
return "error: revenue must be > 0"
margin = ((revenue - cost) / revenue) * 100
return f"margin={margin:.2f}%"
@tool
def search_web(query: str) -> str:
"""์น ๊ฒ์ ๊ฒฐ๊ณผ ์์ฝ ๋ฌธ์์ด์ ๋ฐํํ๋ค."""
from duckduckgo_search import DDGS
with DDGS() as ddgs:
results = list(ddgs.text(query, max_results=3))
if not results:
return "๊ฒ์ ๊ฒฐ๊ณผ ์์"
lines = []
for i, r in enumerate(results, 1):
title = r.get("title", "(no title)")
href = r.get("href", "")
body = (r.get("body", "") or "")[:120]
lines.append(f"{i}. {title} | {href} | {body}")
return "\n".join(lines)
model = InferenceClientModel() # HF_TOKEN ํ๊ฒฝ๋ณ์ ์ฌ์ฉ ๊ถ์ฅ
agent = CodeAgent(
tools=[search_web, calc_margin],
model=model,
max_steps=6,
)
if __name__ == "__main__":
task = (
"ํ๊ตญ SaaS ์คํํธ์
์ 2026๋
AI ์์ด์ ํธ ๋์
ํธ๋ ๋๋ฅผ 3์ค๋ก ์์ฝํ๊ณ , "
"์๋งค์ถ 12000000์/์๋น์ฉ 8400000์์ ๋ง์ง์จ๋ ํจ๊ป ๊ณ์ฐํด์ค."
)
result = agent.run(task)
print("\n=== FINAL ===")
print(result)
PY- ์ฑ๊ณตํ์ :
day11_react_toolflow.pyํ์ผ ์์ฑ ํ์ธ
3) ์์ด์ ํธ ์คํ + ReAct ๋จ๊ณ ํ์ธ
- ๋๊ตฌ:
day11_react_toolflow.py - ์ ๋ ฅ: ๊ธฐ๋ณธ task ๋ฌธ์์ด
- ์คํ๋ช ๋ น:
export HF_TOKEN="<your_hf_token>"
python day11_react_toolflow.py- ์ฑ๊ณตํ์ :
- ์ถ๋ ฅ์ ๊ฒ์ ๊ทผ๊ฑฐ(๋งํฌ/์์ฝ) +
margin=30.00%ํฌํจ - ์์ด์ ํธ๊ฐ 1ํ ์ด์ ๋๊ตฌ ํธ์ถํ ๋ก๊ทธ ํ์ธ
- ์ถ๋ ฅ์ ๊ฒ์ ๊ทผ๊ฑฐ(๋งํฌ/์์ฝ) +
4) ์ฑ๊ณต/์คํจ ํ์ ํ (์ค๋ฌดํ)
- ์ ์ ์ฑ๊ณต
- ๋ง์ง์จ์ด ์ ํํ
30.00% - ํธ๋ ๋ ์์ฝ์ด 3์ค ์ด๋ด
- ์ต์ 1๊ฐ ๊ทผ๊ฑฐ ๋งํฌ ํฌํจ
- ๋ง์ง์จ์ด ์ ํํ
- ๋ถ๋ถ ์ฑ๊ณต
- ๊ณ์ฐ์ ์ ํํ์ง๋ง ๊ทผ๊ฑฐ ๋งํฌ ๋๋ฝ
- ์คํจ
- ๋๊ตฌ ํธ์ถ ์์ด ์ผ๋ฐ๋ก ๋ต๋ณ๋ง ์ถ๋ ฅ
- ๊ณ์ฐ๊ฐ ์ค์ฐจ(ยฑ0.01% ์ด๊ณผ)
์ด๋ณด์ ๊ด์ ํต์ฌ ์ค๋ช
@tool๋ฐ์ฝ๋ ์ดํฐ: โ์ด ํจ์๋ ์์ด์ ํธ๊ฐ ํธ์ถ ๊ฐ๋ฅํ ์ธ๋ถ ๋ฅ๋ ฅโ์ด๋ผ๊ณ ๋ฑ๋กํ๋ ์ ์ธ์ด๋ค.CodeAgent: ์์ฐ์ด ๊ณํ + ์ฝ๋ ์คํ ๊ธฐ๋ฐ์ผ๋ก tool์ ๊ณ ๋ฅด๋ ์์ด์ ํธ.max_steps: ๋ฌดํ ๋ฃจํ ๋ฐฉ์ง ์์ ์ฅ์น. ์ด์์์ 4~8 ์ฌ์ด๋ฅผ ๋จผ์ ๊ถ์ฅ.
์ค๋ฌด ์ ์ฉ ํฌ์ธํธ
- ๋๊ตฌ ๊ณ์ฝ์ ์งง๊ณ ๋ช
ํํ๊ฒ
- ์ ๋ ฅ ํ์ /์ถ๋ ฅ ํฌ๋งท์ ๊ณ ์ ํ๋ฉด ์๋ฌ๊ฐ ๊ธ๊ฐํ๋ค.
- ์ฑ๊ณต ํ์ ์๋ํ
- ๊ณ์ฐํ ํ์คํฌ๋ ๊ธฐ๋๊ฐ ๋น๊ต(assert)๋ก ํ์ง ๊ฒ์ดํธ๋ฅผ ๋ง๋ ๋ค.
- ๊ทผ๊ฑฐ ๊ฐ์ ํ๋กฌํํธ
- โ์ต์ 1๊ฐ URL ํฌํจโ ๊ฐ์ ์ ์ฑ ์ ๋ฃ์ผ๋ฉด ๋ณด๊ณ ์ ์ ๋ขฐ๋๊ฐ ์ฌ๋ผ๊ฐ๋ค.
ํธ๋ฌ๋ธ์ํ
401 Unauthorized(HF ์ถ๋ก )- ์์ธ:
HF_TOKEN๋๋ฝ/๊ถํ ๋ฌธ์ - ํด๊ฒฐ: ํ ํฐ ์ฌ๋ฐ๊ธ ํ
export HF_TOKEN=...
- ์์ธ:
No module named duckduckgo_search- ์์ธ: ๊ฐ์ํ๊ฒฝ ๋ฏธํ์ฑํ
- ํด๊ฒฐ:
source .venv/bin/activateํ ์ฌ์ค์น
- ๊ฒ์์ ๋๋๋ฐ ๊ณ์ฐ์ด ํ๋ฆผ
- ์์ธ: revenue/cost ์์ ๋ฐ๋๋ก ์ ๋ฌ
- ํด๊ฒฐ: ํจ์ ์๊ทธ๋์ฒ์ ํธ์ถ๊ฐ ์์ ์ฌํ์ธ
๋ค์ ํธ ์๊ณ
๋ค์ ๋ณธํธ์์๋ ToolCallingAgent์ ์ ์ฑ ๊ฐ๋๋ ์ผ์ ๊ฒฐํฉํด, โ๋๊ตฌ๋ฅผ ์ธ ์๋ ์์ง๋ง ์๋ฌด๊ฑฐ๋ ๋ชป ์ฐ๊ฒ ์ ํํ๋โ ์ด์ํ ํจํด์ผ๋ก ํ์ฅํ๋ค.
์ฐธ๊ณ ๋งํฌ (์ฐ์ ์์)
- https://github.com/huggingface/agents-course
- https://huggingface.co/learn/agents-course
- https://huggingface.co/docs/smolagents
์์ฑํ AI ํ์ฉ ๊ณ ์ง
์ด ๋ฌธ์๋ ์์ฑํ AI๋ฅผ ํ์ฉํด ์ด์ ๊ตฌ์กฐ๋ฅผ ์์ฑํ์ผ๋ฉฐ, ์ค์ต ์ ์ฐจ/๋ช ๋ น์ด/์ฑ๊ณต ํ์ ๊ธฐ์ค์ ์ฌ๋์ด ์ฌ๊ฒํ ํด ๋ฐํํ๋ค.