μ΄λ² νΈμ **βμ½λ μ€νν μμ΄μ νΈλ₯Ό μ΄μν λ μ μλλ°μ€κ° μ€μνκ°β**λ₯Ό μ΄λ³΄μ κ΄μ μμ λ€λ£¬λ€.
ν΅μ¬μ λ¨μνλ€.
μμ΄μ νΈ μ±λ₯λ³΄λ€ λ¨Όμ , μ€ν μμ μ±κ³Ό μ€ν¨ 볡ꡬ 루ν΄μ κ³ μ ν΄μΌ μ€λ¬΄μμ μ€λ μ΄λ€.
- μ΄μ νΈ: π€ 11. λ³ΈνΈ 05
ν μ€ κ²°λ‘
CodeAgentλ₯Ό βλ‘컬 μ§μ€νβμΌλ‘ λ°λ‘ μ°κΈ°λ³΄λ€, μλλ°μ€(격리 μ€ν) + μ€ν¨ νμ ν + μ¬μλ κ·μΉμ κ°μ΄ μ€κ³νλ©΄ μ΄μ μμ μ±μ΄ ν¬κ² μ¬λΌκ°λ€.
flowchart TD A[μ¬μ©μ μμ²] --> B[CodeAgent κ³ν] B --> C{λꡬ/μ½λ μ€ν νμ?} C -->|μ| D[μλλ°μ€ μ€ν] D --> E{μ±κ³΅ νμ } E -->|μ±κ³΅| F[κ·Όκ±° ν¬ν¨ μ΅μ’ μλ΅] E -->|μ€ν¨| G[μ€λ₯ λΆλ₯] G --> H[μ¬μλ or λ체 κ²½λ‘] H --> D C -->|μλμ€| F
μ€μ΅ λͺ©ν
- smolagents
CodeAgentλ₯Ό μ€ννλ€. - μλμ μΌλ‘ μ€ν¨ μΌμ΄μ€λ₯Ό λ§λ€μ΄ 볡ꡬ νλ¦μ κ²μ¦νλ€.
- μ€λ¬΄ν μ±κ³΅νμ (μ νμ±/μ¬νμ±/μμ μ±)μ 체ν¬νλ€.
μ€λΉλ¬Ό
- Python 3.10+
- Hugging Face ν ν°(κΆμ₯):
HF_TOKEN - μμ
κ²½λ‘:
/home/tw2/Documents/n8n/data/shared/syn/8.quartz/Agent/01-Series/03-νλ μμν¬-μ½μ€/HF-Agents-Course/downloads
1) νκ²½ μ€λΉ
- λꡬ: ν°λ―Έλ, pip
- μ λ ₯: κ°μνκ²½
- μ€νλͺ λ Ή:
cd "/home/tw2/Documents/n8n/data/shared/syn/8.quartz/Agent/01-Series/03-νλ μμν¬-μ½μ€/HF-Agents-Course/downloads"
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install "smolagents[toolkit]"- μ±κ³΅νμ :
python -c "import smolagents; print('smolagents ok')"smolagents okκ° μΆλ ₯λλ©΄ ν΅κ³Ό.
2) μ€μ΅ μ½λ μμ± (μ μ κ²½λ‘ + μ€ν¨ κ²½λ‘)
- λꡬ: νμΌ νΈμ§κΈ°
- μ λ ₯: μλ μ½λ
- μ€νλͺ λ Ή:
cat > day12_sandbox_recovery.py <<'PY'
from smolagents import CodeAgent, InferenceClientModel, tool
@tool
def divide(a: float, b: float) -> str:
"""λ μλ₯Ό λλ λ¬Έμμ΄λ‘ λ°ννλ€."""
if b == 0:
return "error: division_by_zero"
return f"result={a / b:.4f}"
@tool
def kpi_grade(score: float) -> str:
"""μ μλ₯Ό λ±κΈμΌλ‘ λ³ννλ€."""
if score >= 90:
return "A"
if score >= 80:
return "B"
if score >= 70:
return "C"
return "D"
model = InferenceClientModel()
agent = CodeAgent(
tools=[divide, kpi_grade],
model=model,
max_steps=6,
)
if __name__ == "__main__":
task_ok = "120μ 8λ‘ λλκ³ , κ²°κ³Όλ₯Ό μμμ 4μλ¦¬λ‘ λ³΄μ¬μ€ λ€ KPI μ μ 88μ λ±κΈμ κ°μ΄ μλ €μ€."
task_fail = "120μ 0μΌλ‘ λλκ³ , μ€ν¨ μμΈμ 1μ€λ‘ μ€λͺ
ν΄μ€."
print("\n=== CASE 1: μ μ ===")
print(agent.run(task_ok))
print("\n=== CASE 2: μ€ν¨ 볡ꡬ ===")
print(agent.run(task_fail))
PY- μ±κ³΅νμ :
day12_sandbox_recovery.pyνμΌμ΄ μμ±λλ€.
3) μ€ν
- λꡬ: Python μ€ν
- μ λ ₯: μ μ€ν¬λ¦½νΈ
- μ€νλͺ λ Ή:
export HF_TOKEN="<your_hf_token>"
python day12_sandbox_recovery.py- μ±κ³΅νμ :
- CASE 1μμ
result=15.0000μ λ±κΈBκ° ν¨κ» λμ¨λ€. - CASE 2μμ
division_by_zeroμμΈμ΄ λͺ μλλ€. - (κΆμ₯) μ΅μ 1ν μ΄μ tool νΈμΆ νμ (step λ‘κ·Έ) νμΈ.
- CASE 1μμ
4) μ€λ¬΄ν 체ν¬λ¦¬μ€νΈ (λ°λ‘ μ μ©)
A. μ νμ±
- μμΉ κ³μ° κ²°κ³Όκ° κΈ°λκ°κ³Ό μΌμΉνλκ°?
B. μ¬νμ±
- λμΌ λͺ λ Ήμ λ€μ μ€ννμ λ κ°μ κ²°κ³Όκ° λμ€λκ°?
C. μμ μ±
- μ€ν¨ μ μμΈ λ¬Έμμ΄(
division_by_zero)μ ꡬ쑰μ μΌλ‘ λ°ννλκ°?
D. μ΄μμ±
max_stepsλ‘ λ¬΄ν 루νλ₯Ό λ°©μ§νλκ°?
μ΄λ³΄μμ© μ¬μ΄ μ€λͺ
@toolμ **βμμ΄μ νΈκ° νΈμΆν μ μλ ν¨μ λ±λ‘β**μ΄λ€.CodeAgentλ λ΅μ λ°λ‘ μ°λ λμ , νμνλ©΄ μ½λλ₯Ό μ¨μ λꡬλ₯Ό μ€ννλ€.- μλλ°μ€ μ€νμ μ€μ μ½λκ° μμ€ν μ 체μ μν₯ μ£Όμ§ μλλ‘ κ²©λ¦¬νλ μ΄μ μ΅κ΄μ΄λ€.
μ€λ¬΄ μ μ© ν¬μΈνΈ
- μ€λ₯ λ¬Έμμ΄ νμ€ν
error: division_by_zeroμ²λΌ κ³ μ ν¬λ§·μ μ°λ©΄ λͺ¨λν°λ§/μλ¦Ό μ°λμ΄ μ¬μμ§λ€.
- μ±κ³΅νμ μλν
- CIμμ
result=15.0000κ°μ κΈ°λκ° μ²΄ν¬λ₯Ό μλμΌλ‘ λλ¦°λ€.
- CIμμ
- λ¨κ³ μ ν κΈ°λ³Έκ° κ³ μ
- μ΄λ° μ΄μμ
max_steps=4~8λ²μλ‘ μμνλ©΄ μμ μ μ΄λ€.
- μ΄λ° μ΄μμ
νΈλ¬λΈμν
401 Unauthorized- μμΈ:
HF_TOKENλ―Έμ€μ λλ κΆν λ¬Έμ - ν΄κ²°: ν ν° μ¬λ°κΈ ν
export HF_TOKEN=...
- μμΈ:
ModuleNotFoundError: smolagents- μμΈ: κ°μνκ²½ λΉνμ±ν
- ν΄κ²°:
source .venv/bin/activateν μ¬μ€μΉ
- κ²°κ³Όκ° λ€μλ μν¨
- μμΈ: ν둬ννΈ μ‘°κ±΄μ΄ λμ¨ν¨
- ν΄κ²°: μΆλ ₯ νμμ λ¬Έμ₯μΌλ‘ κ°μ (μ: βλ°λμ result=β¦ νμμΌλ‘ λ΅λ³β)
λ€μ νΈ μκ³
λ€μ λ³ΈνΈμμλ **ToolCallingAgentμ μ μ± κΈ°λ° νμ© λͺ©λ‘(Allowlist)**μ κ²°ν©ν΄, βμ λ¬΄λ³ λꡬ κΆν λΆλ¦¬β ν¨ν΄μ λ€λ£¬λ€.
μ°Έκ³ λ§ν¬ (μ°μ μμ)
- https://github.com/huggingface/agents-course
- https://huggingface.co/learn/agents-course
- https://huggingface.co/docs/smolagents
μμ±ν AI νμ© κ³ μ§
μ΄ λ¬Έμλ μμ±ν AIλ₯Ό νμ©ν΄ μ΄μμ μμ±νμΌλ©°, μ€μ΅ μ μ°¨/λͺ λ Ήμ΄/μ±κ³΅ νμ κΈ°μ€/λ§ν¬ 무결μ±μ μ¬λμ΄ κ²ν ν΄ νμ νλ€.