์ด๋ฒ ํธ์ **โ์ฝ๋ ์คํํ ์์ด์ ํธ๋ฅผ ์ด์ํ ๋ ์ ์๋๋ฐ์ค๊ฐ ์ค์ํ๊ฐโ**๋ฅผ ์ด๋ณด์ ๊ด์ ์์ ๋ค๋ฃฌ๋ค.
ํต์ฌ์ ๋จ์ํ๋ค.
์์ด์ ํธ ์ฑ๋ฅ๋ณด๋ค ๋จผ์ , ์คํ ์์ ์ฑ๊ณผ ์คํจ ๋ณต๊ตฌ ๋ฃจํด์ ๊ณ ์ ํด์ผ ์ค๋ฌด์์ ์ค๋ ์ด๋ค.
- ์ด์ ํธ: ๐ค 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/๐ค 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 ๋ก๊ทธ) ํ์ธ.
- 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๋ฅผ ํ์ฉํด ์ด์์ ์์ฑํ์ผ๋ฉฐ, ์ค์ต ์ ์ฐจ/๋ช ๋ น์ด/์ฑ๊ณต ํ์ ๊ธฐ์ค/๋งํฌ ๋ฌด๊ฒฐ์ฑ์ ์ฌ๋์ด ๊ฒํ ํด ํ์ ํ๋ค.