이번 νŽΈμ€ **β€œμ½”λ“œ μ‹€ν–‰ν˜• μ—μ΄μ „νŠΈλ₯Ό μš΄μ˜ν•  λ•Œ μ™œ μƒŒλ“œλ°•μŠ€κ°€ μ€‘μš”ν•œκ°€β€**λ₯Ό 초보자 κ΄€μ μ—μ„œ 닀룬닀.
핡심은 λ‹¨μˆœν•˜λ‹€.

μ—μ΄μ „νŠΈ μ„±λŠ₯보닀 λ¨Όμ €, μ‹€ν–‰ μ•ˆμ „μ„±κ³Ό μ‹€νŒ¨ 볡ꡬ 루틴을 κ³ μ •ν•΄μ•Ό μ‹€λ¬΄μ—μ„œ 였래 μ“΄λ‹€.

ν•œ 쀄 κ²°λ‘ 

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/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 둜그) 확인.

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λ₯Ό ν™œμš©ν•΄ μ΄ˆμ•ˆμ„ μž‘μ„±ν–ˆμœΌλ©°, μ‹€μŠ΅ 절차/λͺ…λ Ήμ–΄/성곡 νŒμ • κΈ°μ€€/링크 무결성은 μ‚¬λžŒμ΄ κ²€ν† ν•΄ ν™•μ •ν–ˆλ‹€.