μ΄λ² νΈμ μμ΄μ νΈλ₯Ό βλμκ°κ²β λ§λλ κ²λ³΄λ€ ν λ¨κ³ λ λμκ°, μ€ν¨ν΄λ λ€μ μλνκ³ μ€ν νμ μ λ¨κΈ°λ μ΄μν ν¨ν΄μ λ€λ£¬λ€.
flowchart LR A[task.txt μ λ ₯] --> B[CodeAgent μ€ν] B --> C[tool νΈμΆ] C -->|μ±κ³΅| D[result.json μ μ₯] C -->|μ€ν¨| E[retry 1ν μ¬μλ] E -->|μ¬μ±κ³΅| D E -->|μ¬μ€ν¨| F[error λ‘κ·Έ μ μ₯] B --> G[run_log.jsonl λμ ]
μ€μ΅ λͺ©ν
CodeAgent+ 컀μ€ν λꡬλ₯Ό μ€ννλ€.- λꡬ μ€ν¨ μ 1ν μλ μ¬μλλ₯Ό λΆμΈλ€.
- μ€ν λ‘κ·Έ(
run_log.jsonl)λ₯Ό λ¨κΈ΄λ€. - κ²°κ³Ό νμΌ/λ‘κ·Έ νμΌ/μ±κ³΅ 쑰건μΌλ‘ μ¬νμ±μ κ²μ¦νλ€.
1) μ€λΉ
Step 1-1. μμ ν΄λ μμ±
- λꡬ: ν°λ―Έλ
- μ λ ₯: μμ
- μ€νλͺ λ Ή:
mkdir -p ~/hf-agents-day18 && cd ~/hf-agents-day18- μ±κ³΅νμ :
pwdκ°~/hf-agents-day18
Step 1-2. κ°μνκ²½ + ν¨ν€μ§ μ€μΉ
- λꡬ: Python 3.10+
- μ λ ₯: μμ
- μ€νλͺ λ Ή:
python3 -m venv .venv
source .venv/bin/activate
pip install -U smolagents- μ±κ³΅νμ :
python -c "import smolagents; print('OK')"μΆλ ₯ OK
Step 1-3. λͺ¨λΈ ν ν° μ€μ
- λꡬ: νκ²½λ³μ
- μ
λ ₯:
HF_TOKEN - μ€νλͺ λ Ή:
export HF_TOKEN="hf_xxx"- μ±κ³΅νμ :
echo ${HF_TOKEN:+set}μΆλ ₯ set
2) μ λ ₯ νμΌ λ§λ€κΈ°
Step 2-1. task.txt μμ±
- λꡬ: ν μ€νΈ νμΌ
- μ λ ₯: μλ ν μ€νΈ
- μ€νλͺ λ Ή:
cat <<'TXT' > task.txt
μ΄λ² μ£Ό κ³ κ°λ¬Έμ λ‘κ·Έλ₯Ό 3μ€ μμ½ν΄μ€.
- μ§μ° λ°°μ‘ λ¬Έμκ° λμλ€.
- κ²°μ μ€λ₯κ° κ°νμ μΌλ‘ λ°μνλ€.
- νλΆ λ¬Έμλ μ μ£Ό λλΉ κ°μνλ€.
TXT- μ±κ³΅νμ :
test -f task.txt && echo FILE_OK3) μμ΄μ νΈ μ½λ μμ±
Step 3-1. day18_observe_retry.py μ μ₯
- λꡬ: Python νμΌ
- μ λ ₯: μλ μ½λ
import json
import random
from datetime import datetime, timezone
from pathlib import Path
from smolagents import CodeAgent, HfApiModel, tool
def log_event(path: Path, payload: dict):
payload["ts"] = datetime.now(timezone.utc).isoformat()
with path.open("a", encoding="utf-8") as f:
f.write(json.dumps(payload, ensure_ascii=False) + "\n")
@tool
def unstable_save(path: str, content: str) -> str:
"""κ°λ μ€ν¨νλ μ μ₯ λꡬ(μ€μ΅μ©)."""
if random.random() < 0.4:
raise RuntimeError("temporary io error")
Path(path).write_text(content, encoding="utf-8")
return f"saved:{path}"
@tool
def save_with_retry(path: str, content: str) -> str:
"""μ€ν¨ μ 1ν μ¬μλ ν μ μ₯νλ€."""
try:
return unstable_save(path, content)
except Exception:
return unstable_save(path, content)
def build_agent() -> CodeAgent:
model = HfApiModel("Qwen/Qwen2.5-72B-Instruct")
return CodeAgent(
tools=[save_with_retry],
model=model,
max_steps=6,
)
if __name__ == "__main__":
random.seed(7) # μ¬ν κ°λ₯ν μ€μ΅μ μν κ³ μ μλ
run_log = Path("run_log.jsonl")
out_file = Path("result.json")
task_text = Path("task.txt").read_text(encoding="utf-8")
if run_log.exists():
run_log.unlink()
if out_file.exists():
out_file.unlink()
agent = build_agent()
prompt = f"""
μλ ν
μ€νΈλ₯Ό νκ΅μ΄ 3μ€λ‘ μμ½ν΄.
λ°λμ save_with_retry λꡬλ₯Ό μ¬μ©ν΄μ result.jsonμ μλ JSON ννλ‘ μ μ₯ν΄.
{{"summary": ["...", "...", "..."]}}
μ
λ ₯:
{task_text}
"""
log_event(run_log, {"event": "start"})
try:
result = agent.run(prompt)
log_event(run_log, {"event": "finish", "result": str(result)})
print("[FINISH] run completed")
except Exception as e:
log_event(run_log, {"event": "error", "message": str(e)})
print(f"[ERROR] {e}")- μ±κ³΅νμ :
python -m py_compile day18_observe_retry.pyμ€λ₯ μμ΄ μ’ λ£λλ©΄ ν΅κ³Ό.
4) μ€ν λ° κ²μ¦
Step 4-1. μ€ν
- λꡬ:
day18_observe_retry.py - μ
λ ₯:
task.txt - μ€νλͺ λ Ή:
python day18_observe_retry.py- μ±κ³΅νμ :
[FINISH] run completedμΆλ ₯
Step 4-2. κ²μ¦
- λꡬ: ν°λ―Έλ
- μ
λ ₯:
result.json,run_log.jsonl - μ€νλͺ λ Ή:
test -f result.json && echo RESULT_OK
test -f run_log.jsonl && echo LOG_OK
grep -E '"summary"' result.json >/dev/null && echo FIELD_OK- μ±κ³΅νμ :
RESULT_OK,LOG_OK,FIELD_OK3κ° λͺ¨λ μΆλ ₯
5) μ΄λ³΄μμ© μ¬μ΄ μ€λͺ
- μμ΄μ νΈλ μ λμν λ보λ€, κ°λ μ€ν¨ν λ μ΄μ λλκ° κΈκ²©ν μ¬λΌκ°λ€.
- μ΄λ² ν¨ν΄μ μμ£Ό λ¨μνλ€.
- μ€ν¨ κ°λ₯ λꡬλ₯Ό κ°μΌλ€.
- 1ν μ¬μλνλ€.
- μμ/μ’ λ£/μ€λ₯λ₯Ό λ‘κ·Έλ‘ λ¨κΈ΄λ€.
- μ΄ 3κ°μ§λ§ ν΄λ βμ μ€ν¨νλμ§ λͺ¨λ₯΄λ μνβλ₯Ό ν¬κ² μ€μΌ μ μλ€.
6) μ€λ¬΄ μ μ© ν¬μΈνΈ
- μΌκ° λ°°μΉ μμ ν: μΌμ μ€λ₯(λ€νΈμν¬/νμΌλ½)λ‘ μ 체 μ€ν¨νλ λΉμ¨ κ°μ.
- μ₯μ λΆμ μκ° λ¨μΆ:
run_log.jsonlλ‘ μ€ν¨ μ§μ μΆμ μ΄ μ¬μμ§. - μ΄μ νμ€ν: λͺ¨λ λꡬμ λμΌν retry/log λνΌλ₯Ό μ μ© κ°λ₯.
- νμ₯ λ°©ν₯: λ€μ λ¨κ³μμ μ¬μλ νμ, λ°±μ€ν, μλ¦Ό(μ¬λ/μ΄λ©μΌ) μΆκ°.
체ν¬λ¦¬μ€νΈ
-
smolagentsμ€μΉ μλ£ -
task.txtμμ± μλ£ -
day18_observe_retry.pyλ¬Έλ² κ²μ¬ ν΅κ³Ό - μ€ν ν
result.jsonμμ± - μ€ν ν
run_log.jsonlμμ± -
summaryνλ μ‘΄μ¬ νμΈ
μ°Έκ³ λ§ν¬ (μ°μ μμ)
- https://github.com/huggingface/agents-course
- https://huggingface.co/learn/agents-course
- https://huggingface.co/docs/smolagents
μμ±ν AI νμ© κ³ μ§
μ΄ λ¬Έμλ μμ±ν AIλ₯Ό νμ©ν΄ μ΄μμ μμ±νκ³ , μμ μ½λ/μ μ°¨/ννμ μ¬λ κ²ν ν νμ νλ€.