์ด๋ฒˆ ํŽธ์—์„œ๋Š” smolagents์˜ CodeAgent๋ฅผ ์“ธ ๋•Œ ์ž์ฃผ ๋งŒ๋‚˜๋Š” ์งˆ๋ฌธ, **โ€œ๊ธฐ๋ณธ import ์ œํ•œ์„ ์–ด๋–ป๊ฒŒ ์•ˆ์ „ํ•˜๊ฒŒ ํ’€์–ด์„œ ์‹ค๋ฌด ์ž‘์—…์— ์—ฐ๊ฒฐํ• ๊นŒ?โ€**๋ฅผ ๋‹ค๋ฃฌ๋‹ค.

ํ•ต์‹ฌ์€ ๊ฐ„๋‹จํ•˜๋‹ค.

  • ๊ธฐ๋ณธ๊ฐ’์€ ์•ˆ์ „์„ ์œ„ํ•ด import๊ฐ€ ์ œํ•œ๋œ๋‹ค.

  • ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ๋ช…์‹œ์ ์œผ๋กœ ํ—ˆ์šฉํ•˜๋ฉด ์ž๋™ํ™” ๋ฒ”์œ„๋ฅผ ๋„“ํž ์ˆ˜ ์žˆ๋‹ค.

  • ํ—ˆ์šฉ ๋ชฉ๋ก์„ ๋„“ํž์ˆ˜๋ก ๋ฆฌ์Šคํฌ๋„ ์ปค์ง€๋ฏ€๋กœ, ์ตœ์†Œ ๊ถŒํ•œ ์›์น™์œผ๋กœ ์šด์˜ํ•ด์•ผ ํ•œ๋‹ค.

  • ์ด์ „ ํŽธ: ๐Ÿค— 20. ๋ณธํŽธ 11

  • ๋‹ค์Œ ํŽธ ์˜ˆ๊ณ : ํˆด ์‹คํŒจ ์‹œ ์žฌ์‹œ๋„ยท๋Œ€์ฒด๊ฒฝ๋กœ(fallback) ์ •์ฑ…์„ ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ

ํ•œ ์ค„ ๋ชฉํ‘œ

๋™์ผํ•œ ์ž‘์—…์„ โ€œimport ํ—ˆ์šฉ ์ „/ํ›„โ€๋กœ ์‹คํ–‰ํ•ด ์‹คํŒจโ†’์„ฑ๊ณต ์ „ํ™˜์„ ์žฌํ˜„ํ•˜๊ณ , ์šด์˜์šฉ ํ—ˆ์šฉ ์ •์ฑ… ํ…œํ”Œ๋ฆฟ์„ ๋งŒ๋“ ๋‹ค.

flowchart TD
  A[์‚ฌ์šฉ์ž ์ž‘์—… ์š”์ฒญ] --> B[CodeAgent ์‹คํ–‰]
  B --> C{ํ•„์š” ๋ชจ๋“ˆ import ๊ฐ€๋Šฅ?}
  C -- ์•„๋‹ˆ์˜ค --> D[ImportError/์‹คํŒจ ๋กœ๊ทธ]
  D --> E[ํ—ˆ์šฉ ๋ชฉ๋ก์— ์ตœ์†Œ ๋ชจ๋“ˆ ์ถ”๊ฐ€]
  E --> B
  C -- ์˜ˆ --> F[์ •์ƒ ์‹คํ–‰]
  F --> G[๊ฒฐ๊ณผ ์ €์žฅ + ์šด์˜ ์ •์ฑ… ๋ฐ˜์˜]

0) ์‹ค์Šต ๋ฒ”์œ„

  • ๋ฒ”์œ„ ํฌํ•จ
    • additional_authorized_imports ๋ฏธ์„ค์ •/์„ค์ • ๋น„๊ต
    • ๊ฐ™์€ ์ž…๋ ฅ์œผ๋กœ ์‹คํŒจ์™€ ์„ฑ๊ณต์„ ๊ฐ๊ฐ 1ํšŒ ์ด์ƒ ์žฌํ˜„
    • ์‹คํ–‰ ๋กœ๊ทธ(run_import_policy.json)๋กœ ๊ฒฐ๊ณผ ์ฆ๋น™
  • ๋ฒ”์œ„ ์ œ์™ธ
    • ์™ธ๋ถ€ API ๋Œ€๊ทœ๋ชจ ํ˜ธ์ถœ
    • ๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ ๊ตฌ์กฐ

1) ํ™˜๊ฒฝ ์ค€๋น„

  • ๋„๊ตฌ: ํ„ฐ๋ฏธ๋„
  • ์ž…๋ ฅ: Python 3.10+, ๊ฐ€์ƒํ™˜๊ฒฝ
  • ์‹คํ–‰๋ช…๋ น:
mkdir -p ~/hf-agents-lab21
cd ~/hf-agents-lab21
python3 -m venv .venv
source .venv/bin/activate
pip install -U smolagents litellm
  • ์„ฑ๊ณตํŒ์ •:
python -V
pip show smolagents | head -n 5
  • Python ๋ฒ„์ „ ์ถœ๋ ฅ
  • smolagents ํŒจํ‚ค์ง€ ์ •๋ณด๊ฐ€ ๋ณด์ด๋ฉด ์„ฑ๊ณต

2) ๋ชจ๋ธ ํ‚ค ์„ค์ •

  • ๋„๊ตฌ: ํ„ฐ๋ฏธ๋„
  • ์ž…๋ ฅ: API ํ‚ค, ๋ชจ๋ธ ID
  • ์‹คํ–‰๋ช…๋ น:
export OPENAI_API_KEY="YOUR_API_KEY"
export MODEL_ID="openai/gpt-4o-mini"
  • ์„ฑ๊ณตํŒ์ •:
python - <<'PY'
import os
print('MODEL_ID =', os.getenv('MODEL_ID'))
print('OPENAI_API_KEY set:', bool(os.getenv('OPENAI_API_KEY')))
PY
  • OPENAI_API_KEY set: True ํ™•์ธ

3) ๋น„๊ต ์‹คํ—˜ ์ฝ”๋“œ ์ž‘์„ฑ

์•„๋ž˜ ์ฝ”๋“œ๋Š” ๊ฐ™์€ ์ž‘์—…์„ 2๋ฒˆ ์‹คํ–‰ํ•œ๋‹ค.

  1. import ํ—ˆ์šฉ ์—†์Œ ([]) โ†’ ์‹คํŒจ ๊ธฐ๋Œ€
  2. datetime ํ—ˆ์šฉ (["datetime"]) โ†’ ์„ฑ๊ณต ๊ธฐ๋Œ€
  • ๋„๊ตฌ: ์—๋””ํ„ฐ/ํ„ฐ๋ฏธ๋„
  • ์ž…๋ ฅ: ์•„๋ž˜ ์ฝ”๋“œ
  • ์‹คํ–‰๋ช…๋ น:
cat > lab21_import_policy_compare.py <<'PY'
from __future__ import annotations
 
import json
import os
import time
from pathlib import Path
 
from smolagents import CodeAgent, LiteLLMModel
 
OUT = Path("run_import_policy.json")
TASK = (
    "ํŒŒ์ด์ฌ ์ฝ”๋“œ๋กœ datetime ๋ชจ๋“ˆ์„ importํ•ด ํ˜„์žฌ ์—ฐ-์›”-์ผ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค๊ณ , "
    "'์šด์˜ ๋ฆฌํฌํŠธ ๋‚ ์งœ: YYYY-MM-DD' ํ˜•์‹ ํ•œ ์ค„๋งŒ ์ถœ๋ ฅํ•ด๋ผ."
)
 
 
def run_once(allowed_imports: list[str]) -> dict:
    model = LiteLLMModel(model_id=os.getenv("MODEL_ID", "openai/gpt-4o-mini"))
    agent = CodeAgent(
        model=model,
        tools=[],
        max_steps=6,
        additional_authorized_imports=allowed_imports,
    )
 
    t0 = time.perf_counter()
    ok = True
    output_text = ""
    error = ""
 
    try:
        result = agent.run(TASK)
        output_text = str(result)
    except Exception as e:
        ok = False
        error = f"{type(e).__name__}: {e}"
 
    return {
        "allowed_imports": allowed_imports,
        "success": ok,
        "elapsed_sec": round(time.perf_counter() - t0, 3),
        "output_preview": output_text[:200],
        "error": error,
    }
 
 
def main() -> None:
    rows = [
        run_once([]),
        run_once(["datetime"]),
    ]
    OUT.write_text(json.dumps(rows, ensure_ascii=False, indent=2), encoding="utf-8")
    print(f"saved: {OUT}")
    for r in rows:
        print(r)
 
 
if __name__ == "__main__":
    main()
PY
  • ์„ฑ๊ณตํŒ์ •:
    • lab21_import_policy_compare.py ํŒŒ์ผ ์ƒ์„ฑ
    • ์ฝ”๋“œ์— additional_authorized_imports ํ‚ค์›Œ๋“œ ํ™•์ธ

4) ์‹คํ–‰

  • ๋„๊ตฌ: Python
  • ์ž…๋ ฅ: ๋™์ผ ํƒœ์Šคํฌ + import ํ—ˆ์šฉ ๋ชฉ๋ก 2์ข…
  • ์‹คํ–‰๋ช…๋ น:
python lab21_import_policy_compare.py
cat run_import_policy.json
  • ์„ฑ๊ณตํŒ์ •:
    • saved: run_import_policy.json ์ถœ๋ ฅ
    • JSON์— allowed_imports, success, error ํ‚ค ์กด์žฌ
    • ๋ณดํ†ต [] ์‹คํ–‰์€ ์‹คํŒจ, ["datetime"] ์‹คํ–‰์€ ์„ฑ๊ณต ํŒจํ„ด์ด ๊ด€์ฐฐ๋จ

5) ๊ฒฐ๊ณผ ํŒ๋…(์ดˆ๋ณด์ž์šฉ)

  • ๋„๊ตฌ: ํ„ฐ๋ฏธ๋„
  • ์ž…๋ ฅ: run_import_policy.json
  • ์‹คํ–‰๋ช…๋ น:
python - <<'PY'
import json
rows = json.load(open('run_import_policy.json', encoding='utf-8'))
for r in rows:
    print(f"imports={r['allowed_imports']} success={r['success']} sec={r['elapsed_sec']}")
    if not r['success']:
        print('  error=', r['error'][:140])
 
safe_policy = [r for r in rows if r['success']]
if safe_policy:
    print('RECOMMEND: ์„ฑ๊ณต์— ํ•„์š”ํ•œ ์ตœ์†Œ import๋งŒ ํ—ˆ์šฉ ๋ชฉ๋ก์— ์œ ์ง€')
else:
    print('RECOMMEND: ๋ชจ๋ธ/APIํ‚ค/๋ฒ„์ „ ๋ฐ ํƒœ์Šคํฌ ๋ฌธ๊ตฌ ์žฌ์ ๊ฒ€')
PY
  • ์„ฑ๊ณตํŒ์ •:
    • RECOMMEND: ๋ฌธ์žฅ 1์ค„ ์ด์ƒ ์ถœ๋ ฅ

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

  1. ์ตœ์†Œ ๊ถŒํ•œ ์›์น™

    • ์ฒ˜์Œ๋ถ€ํ„ฐ pandas, requests, os๋ฅผ ์ „๋ถ€ ์—ด์ง€ ๋ง๊ณ ,
    • ์‹คํŒจ ๋กœ๊ทธ๋ฅผ ๋ณด๊ณ  ํ•„์š”ํ•œ ๋ชจ๋“ˆ๋งŒ ์ˆœ์ฐจ ํ—ˆ์šฉํ•œ๋‹ค.
  2. ์ž‘์—…๋ณ„ ํ—ˆ์šฉ ํ…œํ”Œ๋ฆฟ ๋ถ„๋ฆฌ

    • ๋ฆฌํฌํŠธ ์ž‘์„ฑ ์ž‘์—…: datetime, json ์ค‘์‹ฌ
    • ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต ์ž‘์—…: math, statistics ๋“ฑ
    • ํ…œํ”Œ๋ฆฟ์„ ๋ถ„๋ฆฌํ•˜๋ฉด ์žฅ์•  ๋ถ„์„์ด ๋นจ๋ผ์ง„๋‹ค.
  3. ์šด์˜ ๋กœ๊ทธ๋ฅผ ๋ฐ˜๋“œ์‹œ ํŒŒ์ผ๋กœ ๋‚จ๊ธฐ๊ธฐ

    • ์ด๋ฒˆ ์‹ค์Šต์ฒ˜๋Ÿผ JSON ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ๋ฉด
    • โ€œ์–ธ์ œ ์–ด๋–ค ํ—ˆ์šฉ ์ •์ฑ…์ด ์‹คํŒจ/์„ฑ๊ณตํ–ˆ๋Š”์ง€โ€๋ฅผ ํšŒ๊ณ ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

  1. ๋‘˜ ๋‹ค ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ
  • ์›์ธ: API ํ‚ค/๋ชจ๋ธ ์„ค์ • ์˜ค๋ฅ˜ ๊ฐ€๋Šฅ์„ฑ
  • ์กฐ์น˜:
python - <<'PY'
import os
print(bool(os.getenv('OPENAI_API_KEY')), os.getenv('MODEL_ID'))
PY
  1. ํ—ˆ์šฉํ–ˆ๋Š”๋ฐ๋„ import ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ๊ฒฝ์šฐ
  • ์›์ธ: ๋ชจ๋“ˆ๋ช… ์˜คํƒ€ ๋˜๋Š” ํ™˜๊ฒฝ ๋ฏธ์„ค์น˜
  • ์กฐ์น˜: ๋ชจ๋“ˆ๋ช… ์ •ํ™•ํžˆ ํ™•์ธ, ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ์„ค์น˜ ํ›„ ์žฌ์‹œ๋„
  1. ๊ฒฐ๊ณผ ํ˜•์‹์ด ํ”๋“ค๋ฆฌ๋Š” ๊ฒฝ์šฐ
  • ์›์ธ: ํƒœ์Šคํฌ ์ง€์‹œ๊ฐ€ ๋А์Šจํ•จ
  • ์กฐ์น˜: ์ถœ๋ ฅ ํฌ๋งท ๋ฌธ๊ตฌ๋ฅผ ๋” ์—„๊ฒฉํžˆ ์ง€์ •
    • ์˜ˆ: ์ •ํ™•ํžˆ ํ•œ ์ค„, ์ ‘๋‘์–ด๋Š” '์šด์˜ ๋ฆฌํฌํŠธ ๋‚ ์งœ:'

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • import ํ—ˆ์šฉ ์ „/ํ›„ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋‘ ํ™•๋ณดํ–ˆ๋‹ค
  • run_import_policy.json ํŒŒ์ผ์„ ์ €์žฅํ–ˆ๋‹ค
  • ์—…๋ฌด๋ณ„ ์ตœ์†Œ ํ—ˆ์šฉ ๋ชฉ๋ก ์ดˆ์•ˆ์„ ๋งŒ๋“ค์—ˆ๋‹ค
  • ํŒ€ ์šด์˜ ๋ฌธ์„œ์— ํ—ˆ์šฉ ์ •์ฑ…๊ณผ ๊ทผ๊ฑฐ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ–ˆ๋‹ค

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

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

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

์ด ๋ฌธ์„œ๋Š” ์ƒ์„ฑํ˜• AI๋กœ ์ดˆ์•ˆ์„ ์ž‘์„ฑํ•˜๊ณ , ์‚ฌ๋žŒ์ด ์‹ค์Šต ์žฌํ˜„์„ฑ(๋„๊ตฌ/์ž…๋ ฅ/์‹คํ–‰๋ช…๋ น/์„ฑ๊ณตํŒ์ •), ๋งํฌ, ๋ฌธ์„œ ํ˜•์‹์„ ์ ๊ฒ€ํ•ด ํ™•์ •ํ–ˆ๋‹ค.