์ด๋ฒ ํธ์์๋ smolagents์ ๊ณํ ์ฃผ๊ธฐ(planning interval) ๊ฐ๋
์ ์ค๋ฌด ๊ด์ ์์ ๋ค๋ฃฌ๋ค.
ํต์ฌ์ ๊ฐ๋จํ๋ค.
- ๊ณํ์ ๋๋ฌด ์์ฃผ ๋ค์ ์ธ์ฐ๋ฉด ๋๋ฆฌ๊ณ ๋น์ฉ์ด ๋์ด๋๋ค.
- ๊ณํ์ ๋๋ฌด ๋ฆ๊ฒ ๊ฐฑ์ ํ๋ฉด ์คํจ๋ฅผ ์ค๋ ๋๊ณ ๊ฐ๋ค.
์ฆ, โ๋ช ์คํ ๋ง๋ค ๊ณํ์ ์ฌ์๋ฆฝํ ์งโ๋ฅผ ์ ๋ฌด ์ฑ๊ฒฉ์ ๋ง๊ฒ ์กฐ์ ํด์ผ ํ๋ค.
- ์ด์ ํธ: ๐ค 19. ์ค์ตํธ 05
- ๋ค์ ํธ ์๊ณ : ์คํจ ๋ก๊ทธ๋ฅผ ๊ทผ๊ฑฐ๋ก ์๋ ์ฌ์๋ ์ ์ฑ (์ฌ๊ณํ + ๋๊ตฌ ํด๋ฐฑ) ์ค๊ณ
ํ ์ค ๋ชฉํ
๋์ผํ ์์ ์ planning_interval ๊ฐ๋ง ๋ฐ๊ฟ 2ํ ์คํํ๊ณ , ์คํ ์๊ฐยท์คํ ์ยท์ฑ๊ณต๋ฅ ๋ณํ๋ฅผ ๋น๊ตํด ์ด์ ๊ธฐ๋ณธ๊ฐ์ ์ ํ๋ค.
flowchart TD A[์ฌ์ฉ์ ์์ ์์ฒญ] --> B[CodeAgent ์คํ] B --> C{planning_interval ๋๋ฌ?} C -- ์๋์ค --> D[ํ์ฌ ๊ณํ ์ ์ง + ๋ค์ ๋๊ตฌ ์คํ] C -- ์ --> E[๊ณํ ์ฌ์๋ฆฝ] E --> D D --> F{์๋ฃ/์คํจ} F -- ์๋ฃ --> G[์ต์ข ๊ฒฐ๊ณผ + ์งํ ๊ธฐ๋ก] F -- ์คํจ --> H[์คํจ ์์ธ ๊ธฐ๋ก ํ ์ฌ์คํ ์ ์ฑ ๊ฒํ ]
0) ์ค์ต ๋ฒ์
- ๋ฒ์ ํฌํจ
- planning_interval=1 ๊ณผ planning_interval=3 ๋น๊ต ์คํ
- ๊ฐ์ ์ ๋ ฅ/๊ฐ์ ๋๊ตฌ/๊ฐ์ ๋ชจ๋ธ๋ก ๊ณต์ ๋น๊ต
- ์ฑ๊ณต ์ฌ๋ถ + ์ฒ๋ฆฌ ์๊ฐ + ๋ก๊ทธ ๊ฑด์ ์ ์ฅ
- ๋ฒ์ ์ ์ธ
- ์ธ๋ถ DB/๋ฒกํฐ์คํ ์ด
- ๋ณต์กํ ๋ฉํฐ์์ด์ ํธ ์ค์ผ์คํธ๋ ์ด์
1) ํ๊ฒฝ ์ค๋น
- ๋๊ตฌ: ํฐ๋ฏธ๋
- ์ ๋ ฅ: Python 3.10+, ๊ฐ์ํ๊ฒฝ
- ์คํ๋ช ๋ น:
mkdir -p ~/hf-agents-lab20
cd ~/hf-agents-lab20
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"- ์ฑ๊ณตํ์ :
echo "$MODEL_ID"
python - <<'PY'
import os
print("OPENAI_API_KEY set:", bool(os.getenv("OPENAI_API_KEY")))
PYOPENAI_API_KEY set: Trueํ์ธ
3) ์คํ ์ฝ๋ ์์ฑ (planning_interval ๋น๊ต)
- ๋๊ตฌ: ์๋ํฐ/ํฐ๋ฏธ๋
- ์ ๋ ฅ: ์๋ ์ฝ๋
- ์คํ๋ช ๋ น:
cat > lab20_planning_interval_compare.py <<'PY'
from __future__ import annotations
import json
import os
import time
from pathlib import Path
from smolagents import CodeAgent, LiteLLMModel, tool
OUT = Path("run_metrics.json")
@tool
def search_kb(topic: str) -> str:
"""topic ๊ด๋ จ ์ด์ ํ 3๊ฐ๋ฅผ ๋ฌธ์์ด๋ก ๋ฐํํ๋ค."""
kb = {
"incident": [
"1) ์ํฉ ์์ฝ์ ๋จผ์ ๊ณ ์ ํ๋ค",
"2) ๋ด๋น์/๊ธฐํ/๋ค์ ์ก์
์ ๋ถ๋ฆฌํ๋ค",
"3) ๊ณ ๊ฐ ์ํฅ๋๋ฅผ ์ซ์๋ก ๋ช
์ํ๋ค",
],
"release": [
"1) ๋ณ๊ฒฝ์ ์ ์ฌ์ฉ์ ์ํฅ ๊ธฐ์ค์ผ๋ก ์ ๋ฆฌ",
"2) ๋กค๋ฐฑ ์กฐ๊ฑด์ ๋ฐฐํฌ ์ ํ์ ",
"3) ๋ฐฐํฌ ์งํ 30๋ถ ๊ด์ฐฐ ์งํ ์ง์ ",
],
}
key = topic.lower().strip()
items = kb.get(key, ["๊ด๋ จ ํ ์์"])
return "\n".join(items)
def run_once(interval: int) -> dict:
model = LiteLLMModel(model_id=os.getenv("MODEL_ID", "openai/gpt-4o-mini"))
agent = CodeAgent(
model=model,
tools=[search_kb],
max_steps=8,
planning_interval=interval,
)
task = (
"incident ์ฃผ์ ์ ๋ํด search_kb ๋๊ตฌ๋ฅผ ํ์ฉํด "
"ํ ๊ณต์ง์ฉ 3์ค ์์ฝ์ ๋ง๋ค๊ณ , ๋ง์ง๋ง ์ค์ ์ฒดํฌ๋ฆฌ์คํธ 2๊ฐ๋ฅผ ๋ถ์ฌ๋ผ."
)
t0 = time.perf_counter()
ok = True
error = ""
output_text = ""
try:
result = agent.run(task)
output_text = str(result)
except Exception as e:
ok = False
error = f"{type(e).__name__}: {e}"
elapsed = round(time.perf_counter() - t0, 3)
return {
"planning_interval": interval,
"success": ok,
"elapsed_sec": elapsed,
"output_preview": output_text[:300],
"error": error,
}
def main() -> None:
runs = [run_once(1), run_once(3)]
OUT.write_text(json.dumps(runs, ensure_ascii=False, indent=2), encoding="utf-8")
print(f"saved: {OUT}")
for r in runs:
print(r)
if __name__ == "__main__":
main()
PY- ์ฑ๊ณตํ์ :
lab20_planning_interval_compare.pyํ์ผ ์์ฑ- ์ฝ๋ ๋ด
planning_interval=intervalํ์ธ
4) ์คํ ๋ฐ ์งํ ์ ์ฅ
- ๋๊ตฌ: Python
- ์ ๋ ฅ: ๋์ผ ์์ (task), interval 2์ข (1/3)
- ์คํ๋ช ๋ น:
python lab20_planning_interval_compare.py
cat run_metrics.json- ์ฑ๊ณตํ์ :
saved: run_metrics.json์ถ๋ ฅ- JSON์
planning_interval,success,elapsed_secํค ์กด์ฌ
5) ๊ฒฐ๊ณผ ํ๋ ๊ธฐ์ค(์ด๋ณด์์ฉ)
- ๋๊ตฌ: ๋์ผ๋ก ํ์ธ + ๊ฐ๋จ ๊ท์น
- ์
๋ ฅ:
run_metrics.json - ์คํ๋ช ๋ น:
python - <<'PY'
import json
rows = json.load(open('run_metrics.json', encoding='utf-8'))
for r in rows:
print(f"interval={r['planning_interval']} success={r['success']} sec={r['elapsed_sec']}")
# ๋จ์ ๊ถ์ฅ ๊ท์น
ok_rows = [r for r in rows if r['success']]
if len(ok_rows) == 2:
faster = min(ok_rows, key=lambda x: x['elapsed_sec'])
print(f"RECOMMEND: planning_interval={faster['planning_interval']} (์ฑ๊ณต + ๋ ๋น ๋ฆ)")
elif len(ok_rows) == 1:
print(f"RECOMMEND: planning_interval={ok_rows[0]['planning_interval']} (์ ์ผ ์ฑ๊ณต)")
else:
print("RECOMMEND: max_steps/๋๊ตฌ์ ์/ํ๋กฌํํธ ์ฌ์ ๊ฒ ํ์")
PY- ์ฑ๊ณตํ์ :
RECOMMEND: ...ํ ์ค์ด ์ถ๋ ฅ๋๋ฉด ํ๋ ๋ฃจํ ์ ์
์ ์ค๋ฌด์์ ์ค์ํ๊ฐ?
- ๋น์ฉ/์ง์ฐ ๊ด๋ฆฌ: ๊ณํ ์ฌ์๋ฆฝ์ ๋ชจ๋ธ ํธ์ถ ๋น์ฉ๊ณผ ์ง๊ฒฐ๋๋ค.
- ์์ ์ฑ ํ๋ณด: ๋๊ตฌ ์ค๋ฅ๊ฐ ๋๋ ํ๊ฒฝ์์๋ ๋๋ฌด ๊ธด ๊ฐ๊ฒฉ์ด ์คํจ ๋ณต๊ตฌ๋ฅผ ๋ฆ์ถ๋ค.
- ์ด์ ํ์คํ: ํ๋ณ ๊ธฐ๋ณธ๊ฐ(์: 2 ๋๋ 3)์ ์ ํ๋ฉด ๋๋ฒ๊น ์ด ์ฌ์์ง๋ค.
์ค๋ฌด ์ ์ฉ ํฌ์ธํธ
- ๊ณ ๊ฐ ์๋ตํ(์งง๊ณ ๋น ๋ฅธ ๋ต๋ณ):
planning_interval์ ํฌ๊ฒ(์: 3~4) ์์ - ์ ํ๋ ์ฐ์ ํ(๋ณต์กํ ๋๊ตฌ ์ฒด์ธ):
planning_interval์ ์๊ฒ(์: 1~2) ์์ - ๋ฐ๋์ **์์ ๋ณ ๋ฒค์น๋งํฌ ํ์ผ(run_metrics.json)**์ ๋จ๊ฒจ ํ๊ท๋ฅผ ๋น๊ต
ํธ๋ฌ๋ธ์ํ
- ์คํ์ด ์ง๋์น๊ฒ ๋๋ฆผ
- ์์ธ: planning ์ฌ์๋ฆฝ์ด ๋๋ฌด ์ฆ์
- ์กฐ์น:
planning_interval1โ3์ผ๋ก ์ฌ๋ ค ์ฌ์ธก์
- ์ ๋ต ํ์ง์ด ํ๋ค๋ฆผ
- ์์ธ: ์ฌ๊ณํ ์ฃผ๊ธฐ๊ฐ ๋๋ฌด ๊ธธ์ด ์ค๊ฐ ์ค๋ฅ๋ฅผ ๋ฐฉ์น
- ์กฐ์น:
planning_interval4โ2๋ก ๋ฎ์ถ๊ณmax_steps๋ฅผ ํจ๊ป ์กฐ์
- ๋ชจ๋ธ ์ธ์ฆ ์ค๋ฅ(401/429)
- ์์ธ: API ํค/์ฟผํฐ ๋ฌธ์
- ์กฐ์น:
echo ${OPENAI_API_KEY:+SET}
# ํ์ ์ ํค ์ฌ๋ฐ๊ธ ํ ์ฌ์ค์ ์ฒดํฌ๋ฆฌ์คํธ
- ๋์ผํ ์ ๋ ฅ์ผ๋ก interval 2์ข ๋น๊ต ์๋ฃ
-
run_metrics.json์ ์ฅ ํ์ธ - ์ฑ๊ณต๋ฅ /์๊ฐ ๊ธฐ์ค์ผ๋ก ๊ธฐ๋ณธ๊ฐ ๊ฒฐ์
- ํ ๊ณต์ฉ ๋ฌธ์์ ๊ธฐ๋ณธ๊ฐ๊ณผ ๊ทผ๊ฑฐ ๊ธฐ๋ก
์ฐธ๊ณ ๋งํฌ (์ฐ์ ์์)
- https://github.com/huggingface/agents-course
- https://huggingface.co/learn/agents-course
- https://huggingface.co/docs/smolagents
์์ฑํ AI ํ์ฉ ๊ณ ์ง
์ด ๋ฌธ์๋ ์์ฑํ AI๋ก ์ด์์ ์์ฑํ๊ณ , ์ฌ๋ ๊ฒํ ๋ฅผ ํตํด ์ค์ต ์ฌํ์ฑ(๋๊ตฌ/์ ๋ ฅ/๋ช ๋ น/์ฑ๊ณตํ์ ), ๋งํฌ, ๋ฌธ์ ํ์์ ํ์ธํด ํ์ ํ๋ค.