์ด๋ฒˆ ํŽธ์€ **โ€œ์ฝ”๋“œ ์‹คํ–‰ํ˜• ์—์ด์ „ํŠธ๋ฅผ ์šด์˜ํ•  ๋•Œ ์™œ ์ƒŒ๋“œ๋ฐ•์Šค๊ฐ€ ์ค‘์š”ํ•œ๊ฐ€โ€**๋ฅผ ์ดˆ๋ณด์ž ๊ด€์ ์—์„œ ๋‹ค๋ฃฌ๋‹ค.
ํ•ต์‹ฌ์€ ๋‹จ์ˆœํ•˜๋‹ค.

์—์ด์ „ํŠธ ์„ฑ๋Šฅ๋ณด๋‹ค ๋จผ์ €, ์‹คํ–‰ ์•ˆ์ „์„ฑ๊ณผ ์‹คํŒจ ๋ณต๊ตฌ ๋ฃจํ‹ด์„ ๊ณ ์ •ํ•ด์•ผ ์‹ค๋ฌด์—์„œ ์˜ค๋ž˜ ์“ด๋‹ค.

ํ•œ ์ค„ ๊ฒฐ๋ก 

CodeAgent๋ฅผ โ€œ๋กœ์ปฌ ์ง์‹คํ–‰โ€์œผ๋กœ ๋ฐ”๋กœ ์“ฐ๊ธฐ๋ณด๋‹ค, ์ƒŒ๋“œ๋ฐ•์Šค(๊ฒฉ๋ฆฌ ์‹คํ–‰) + ์‹คํŒจ ํŒ์ •ํ‘œ + ์žฌ์‹œ๋„ ๊ทœ์น™์„ ๊ฐ™์ด ์„ค๊ณ„ํ•˜๋ฉด ์šด์˜ ์•ˆ์ •์„ฑ์ด ํฌ๊ฒŒ ์˜ฌ๋ผ๊ฐ„๋‹ค.

flowchart TD
  A[์‚ฌ์šฉ์ž ์š”์ฒญ] --> B[CodeAgent ๊ณ„ํš]
  B --> C{๋„๊ตฌ/์ฝ”๋“œ ์‹คํ–‰ ํ•„์š”?}
  C -->|์˜ˆ| D[์ƒŒ๋“œ๋ฐ•์Šค ์‹คํ–‰]
  D --> E{์„ฑ๊ณต ํŒ์ •}
  E -->|์„ฑ๊ณต| F[๊ทผ๊ฑฐ ํฌํ•จ ์ตœ์ข… ์‘๋‹ต]
  E -->|์‹คํŒจ| G[์˜ค๋ฅ˜ ๋ถ„๋ฅ˜]
  G --> H[์žฌ์‹œ๋„ or ๋Œ€์ฒด ๊ฒฝ๋กœ]
  H --> D
  C -->|์•„๋‹ˆ์˜ค| F

์‹ค์Šต ๋ชฉํ‘œ

  1. smolagents CodeAgent๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  2. ์˜๋„์ ์œผ๋กœ ์‹คํŒจ ์ผ€์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋ณต๊ตฌ ํ๋ฆ„์„ ๊ฒ€์ฆํ•œ๋‹ค.
  3. ์‹ค๋ฌดํ˜• ์„ฑ๊ณตํŒ์ •(์ •ํ™•์„ฑ/์žฌํ˜„์„ฑ/์•ˆ์ „์„ฑ)์„ ์ฒดํฌํ•œ๋‹ค.

์ค€๋น„๋ฌผ

  • Python 3.10+
  • Hugging Face ํ† ํฐ(๊ถŒ์žฅ): HF_TOKEN
  • ์ž‘์—… ๊ฒฝ๋กœ: /home/tw2/Documents/n8n/data/shared/syn/8.quartz/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[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 ๋กœ๊ทธ) ํ™•์ธ.

4) ์‹ค๋ฌดํ˜• ์ฒดํฌ๋ฆฌ์ŠคํŠธ (๋ฐ”๋กœ ์ ์šฉ)

A. ์ •ํ™•์„ฑ

  • ์ˆ˜์น˜ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ๊ธฐ๋Œ€๊ฐ’๊ณผ ์ผ์น˜ํ•˜๋Š”๊ฐ€?

B. ์žฌํ˜„์„ฑ

  • ๋™์ผ ๋ช…๋ น์„ ๋‹ค์‹œ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š”๊ฐ€?

C. ์•ˆ์ „์„ฑ

  • ์‹คํŒจ ์‹œ ์›์ธ ๋ฌธ์ž์—ด(division_by_zero)์„ ๊ตฌ์กฐ์ ์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š”๊ฐ€?

D. ์šด์˜์„ฑ

  • max_steps๋กœ ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ๋ฐฉ์ง€ํ–ˆ๋Š”๊ฐ€?

์ดˆ๋ณด์ž์šฉ ์‰ฌ์šด ์„ค๋ช…

  • @tool์€ **โ€œ์—์ด์ „ํŠธ๊ฐ€ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜ ๋“ฑ๋กโ€**์ด๋‹ค.
  • CodeAgent๋Š” ๋‹ต์„ ๋ฐ”๋กœ ์ฐ๋Š” ๋Œ€์‹ , ํ•„์š”ํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์จ์„œ ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  • ์ƒŒ๋“œ๋ฐ•์Šค ์‹คํ–‰์€ ์‹ค์ˆ˜ ์ฝ”๋“œ๊ฐ€ ์‹œ์Šคํ…œ ์ „์ฒด์— ์˜ํ–ฅ ์ฃผ์ง€ ์•Š๋„๋ก ๊ฒฉ๋ฆฌํ•˜๋Š” ์šด์˜ ์Šต๊ด€์ด๋‹ค.

์‹ค๋ฌด ์ ์šฉ ํฌ์ธํŠธ

  1. ์˜ค๋ฅ˜ ๋ฌธ์ž์—ด ํ‘œ์ค€ํ™”
    • error: division_by_zero์ฒ˜๋Ÿผ ๊ณ ์ • ํฌ๋งท์„ ์“ฐ๋ฉด ๋ชจ๋‹ˆํ„ฐ๋ง/์•Œ๋ฆผ ์—ฐ๋™์ด ์‰ฌ์›Œ์ง„๋‹ค.
  2. ์„ฑ๊ณตํŒ์ • ์ž๋™ํ™”
    • CI์—์„œ result=15.0000 ๊ฐ™์€ ๊ธฐ๋Œ€๊ฐ’ ์ฒดํฌ๋ฅผ ์ž๋™์œผ๋กœ ๋Œ๋ฆฐ๋‹ค.
  3. ๋‹จ๊ณ„ ์ œํ•œ ๊ธฐ๋ณธ๊ฐ’ ๊ณ ์ •
    • ์ดˆ๋ฐ˜ ์šด์˜์€ max_steps=4~8 ๋ฒ”์œ„๋กœ ์‹œ์ž‘ํ•˜๋ฉด ์•ˆ์ •์ ์ด๋‹ค.

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

  1. 401 Unauthorized
    • ์›์ธ: HF_TOKEN ๋ฏธ์„ค์ • ๋˜๋Š” ๊ถŒํ•œ ๋ฌธ์ œ
    • ํ•ด๊ฒฐ: ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ ํ›„ export HF_TOKEN=...
  2. ModuleNotFoundError: smolagents
    • ์›์ธ: ๊ฐ€์ƒํ™˜๊ฒฝ ๋น„ํ™œ์„ฑํ™”
    • ํ•ด๊ฒฐ: source .venv/bin/activate ํ›„ ์žฌ์„ค์น˜
  3. ๊ฒฐ๊ณผ๊ฐ€ ๋“ค์ญ‰๋‚ ์ญ‰ํ•จ
    • ์›์ธ: ํ”„๋กฌํ”„ํŠธ ์กฐ๊ฑด์ด ๋А์Šจํ•จ
    • ํ•ด๊ฒฐ: ์ถœ๋ ฅ ํ˜•์‹์„ ๋ฌธ์žฅ์œผ๋กœ ๊ฐ•์ œ(์˜ˆ: โ€œ๋ฐ˜๋“œ์‹œ result=โ€ฆ ํ˜•์‹์œผ๋กœ ๋‹ต๋ณ€โ€)

๋‹ค์Œ ํŽธ ์˜ˆ๊ณ 

๋‹ค์Œ ๋ณธํŽธ์—์„œ๋Š” **ToolCallingAgent์™€ ์ •์ฑ… ๊ธฐ๋ฐ˜ ํ—ˆ์šฉ ๋ชฉ๋ก(Allowlist)**์„ ๊ฒฐํ•ฉํ•ด, โ€œ์—…๋ฌด๋ณ„ ๋„๊ตฌ ๊ถŒํ•œ ๋ถ„๋ฆฌโ€ ํŒจํ„ด์„ ๋‹ค๋ฃฌ๋‹ค.

์ฐธ๊ณ  ๋งํฌ (์šฐ์„ ์ˆœ์œ„)

  1. https://github.com/huggingface/agents-course
  2. https://huggingface.co/learn/agents-course
  3. https://huggingface.co/docs/smolagents

์ƒ์„ฑํ˜• AI ํ™œ์šฉ ๊ณ ์ง€

์ด ๋ฌธ์„œ๋Š” ์ƒ์„ฑํ˜• AI๋ฅผ ํ™œ์šฉํ•ด ์ดˆ์•ˆ์„ ์ž‘์„ฑํ–ˆ์œผ๋ฉฐ, ์‹ค์Šต ์ ˆ์ฐจ/๋ช…๋ น์–ด/์„ฑ๊ณต ํŒ์ • ๊ธฐ์ค€/๋งํฌ ๋ฌด๊ฒฐ์„ฑ์€ ์‚ฌ๋žŒ์ด ๊ฒ€ํ† ํ•ด ํ™•์ •ํ–ˆ๋‹ค.