์ด๋ฒ ํธ์ ๊ฐ์ ์ ํ์ ์์ฒญ์ด ๋ฐ๋ณต๋ ๋, ์์ด์ ํธ๊ฐ ์ด์ ๊ฒฐ๊ณผ๋ฅผ ์ฌํ์ฉํด ๋ ๋น ๋ฅด๊ณ ์ผ๊ด๋๊ฒ ์ฒ๋ฆฌํ๋๋ก ๋ง๋๋ ๊ธฐ๋ณธ ํจํด์ ๋ค๋ฃฌ๋ค.
- ์ด์ ํธ: ๐ค 31. ์ค์ตํธ 09
flowchart LR A[์์ฒญ ์ ๋ ฅ] --> B[CodeAgent] B --> C{state.json์ ์ด์ ์์ฝ ์์?} C -- ์์ --> D[๊ธฐ์กด ์์ฝ ๋ณด๊ฐ] C -- ์์ --> E[์ ๊ท ์์ฝ ์์ฑ] D --> F[save_state ๋๊ตฌ๋ก ์ ์ฅ] E --> F F --> G[result.json ์ถ๋ ฅ]
์ค์ต ๋ชฉํ
state.json์ ์ด์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ค.- ๋ค์ ์คํ ๋
state.json์ ์ฝ์ด ๋ต๋ณ ํ์ง์ ๋์ธ๋ค. - ๊ฒฐ๊ณผ๋ฅผ
result.json์ผ๋ก ๋จ๊ฒจ ์ฌํ ๊ฐ๋ฅํ๊ฒ ๊ฒ์ฆํ๋ค.
1) ์ค๋น
Step 1-1. ์์ ํด๋ ์์ฑ
- ๋๊ตฌ: ํฐ๋ฏธ๋
- ์ ๋ ฅ: ์์
- ์คํ๋ช ๋ น:
mkdir -p ~/hf-agents-day19 && cd ~/hf-agents-day19- ์ฑ๊ณตํ์ :
pwd์ถ๋ ฅ์ด ~/hf-agents-day19
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. ์ฒซ ์์ฒญ ์์ฑ
- ๋๊ตฌ: ํ ์คํธ ํ์ผ
- ์ ๋ ฅ: ์๋ ๋ด์ฉ
- ์คํ๋ช ๋ น:
cat <<'TXT' > task.txt
๊ณ ๊ฐ์ง์ ์์ฝ:
- ๋ฐฐ์ก ์ง์ฐ ๋ฌธ์ ์ฆ๊ฐ
- ๊ฒฐ์ ์คํจ ์ด์ ๊ฐํ ๋ฐ์
- ํ๋ถ ๋ฌธ์ ๊ฐ์
TXT- ์ฑ๊ณตํ์ :
test -f task.txt && echo FILE_OK3) ์์ด์ ํธ ์ฝ๋ ์์ฑ
Step 3-1. day19_stateful_agent.py ์ ์ฅ
- ๋๊ตฌ: Python ํ์ผ
- ์ ๋ ฅ: ์๋ ์ฝ๋
import json
from pathlib import Path
from smolagents import CodeAgent, HfApiModel, tool
STATE_PATH = Path("state.json")
RESULT_PATH = Path("result.json")
TASK_PATH = Path("task.txt")
@tool
def load_state() -> str:
"""์ ์ฅ๋ ์ํ(JSON ๋ฌธ์์ด)๋ฅผ ์ฝ๋๋ค. ์์ผ๋ฉด ๋น ์ํ๋ฅผ ๋ฐํํ๋ค."""
if not STATE_PATH.exists():
return json.dumps({"history": []}, ensure_ascii=False)
return STATE_PATH.read_text(encoding="utf-8")
@tool
def save_state(payload: str) -> str:
"""์ํ(JSON ๋ฌธ์์ด)๋ฅผ ์ ์ฅํ๋ค."""
obj = json.loads(payload)
STATE_PATH.write_text(json.dumps(obj, ensure_ascii=False, indent=2), encoding="utf-8")
return f"saved:{STATE_PATH}"
def build_agent() -> CodeAgent:
model = HfApiModel("Qwen/Qwen2.5-72B-Instruct")
return CodeAgent(
tools=[load_state, save_state],
model=model,
max_steps=6,
additional_authorized_imports=["json"],
)
if __name__ == "__main__":
task_text = TASK_PATH.read_text(encoding="utf-8")
prompt = f"""
๋๋ ๊ณ ๊ฐ์ง์ ์์ฝ ์ด์์คํดํธ๋ค.
๋ฐ๋์ ๋ค์ ์์๋ก ์งํํด:
1) load_state ํธ์ถ
2) ์
๋ ฅ ํ
์คํธ๋ฅผ 3์ค๋ก ์์ฝ
3) ๊ธฐ์กด history์ ์ด๋ฒ ์์ฝ์ ์ถ๊ฐํ JSON์ ๋ง๋ค๊ณ save_state ํธ์ถ
4) ์ต์ข
์ผ๋ก ์๋ JSON๋ง ๋ฐํ
์ถ๋ ฅ ์คํค๋ง:
{{
"summary": ["...", "...", "..."],
"history_count": 0,
"applied_memory": true
}}
์
๋ ฅ:
{task_text}
"""
agent = build_agent()
result = agent.run(prompt)
# ๋ชจ๋ธ ์ถ๋ ฅ์ด ๋ฌธ์์ด์ผ ์ ์์ด, JSON ํ์ฑ ํ ํ์ผ ์ ์ฅ
if isinstance(result, str):
cleaned = result.strip().removeprefix("```json").removesuffix("```").strip()
obj = json.loads(cleaned)
else:
obj = result
RESULT_PATH.write_text(json.dumps(obj, ensure_ascii=False, indent=2), encoding="utf-8")
print("saved: result.json")- ์ฑ๊ณตํ์ :
python -m py_compile day19_stateful_agent.py์ค๋ฅ ์์ด ์ข ๋ฃ๋๋ฉด ํต๊ณผ
4) ์คํ ๋ฐ ๊ฒ์ฆ
Step 4-1. 1์ฐจ ์คํ
- ๋๊ตฌ: Python
- ์
๋ ฅ:
task.txt - ์คํ๋ช ๋ น:
python day19_stateful_agent.py
cat result.json
cat state.json- ์ฑ๊ณตํ์ :
saved: result.json์ถ๋ ฅstate.json์history๊ธธ์ด 1
Step 4-2. 2์ฐจ ์คํ(๋ฉ๋ชจ๋ฆฌ ์ ์ฉ ํ์ธ)
- ๋๊ตฌ: ํ ์คํธ ํ์ผ + Python
- ์ ๋ ฅ: ๋ค๋ฅธ ์์ฒญ
- ์คํ๋ช ๋ น:
cat <<'TXT' > task.txt
๊ณ ๊ฐ์ง์ ์์ฝ:
- ๋ฐฐ์ก ์ง์ฐ ๋ฌธ์๋ ๋น์ทํ ์์ค
- ๊ฒฐ์ ์คํจ ์ด์ ๊ฐ์
- ๋ฐํ ๋ฌธ์ ์ํญ ์ฆ๊ฐ
TXT
python day19_stateful_agent.py
python - <<'PY'
import json
state = json.load(open('state.json', encoding='utf-8'))
res = json.load(open('result.json', encoding='utf-8'))
print('history_len =', len(state.get('history', [])))
print('has_summary =', isinstance(res.get('summary'), list) and len(res['summary']) == 3)
PY- ์ฑ๊ณตํ์ :
history_len = 2has_summary = True
์ด๋ณด์์ฉ ์ฌ์ด ์ค๋ช
- ๋งค๋ฒ ์ฒ์๋ถํฐ ๋ตํ๋ฉด, ๋ฌธ๋งฅ์ด ๋๊ฒจ ํ์ง์ด ํ๋ค๋ฆด ์ ์๋ค.
- ๊ทธ๋์ ์ด์ ๊ฒฐ๊ณผ๋ฅผ
state.json์ ๋์ ํด ๋ค์ ์คํ์ ์ฐธ๊ณ ํ๊ฒ ๋ง๋ ๋ค. - ์ฆ, โ๊ธฐ์ต(์ํ)โ๋ฅผ ํ์ผ๋ก ๋ถ๋ฆฌํด ๋๋ฉด, ์์ ์๋ํ๋ ์ด์ ํ์ง์ด ์ฌ๋ผ๊ฐ๋ค.
์ค๋ฌด ์ ์ฉ ํฌ์ธํธ
- ๋ฐ๋ณต ๋ฆฌํฌํธ ์๋ํ: ์ผ/์ฃผ๊ฐ ์์ฝ์์ ์ง์ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ๊ณ ํด ์ผ๊ด์ฑ ์ ์ง.
- ์ ๋ฌด ์ธ์์ธ๊ณ ์์ ํ: ๋ด๋น์ ๊ต์ฒด ์์๋ ํ์ผ ์ํ๋ก ํ์คํ ๋ฆฌ ์ ์ง.
- ํ์ฅ ์ฌ์: ๋ค์ ๋จ๊ณ์์ ์ํ์
score,owner,retry_count๋ฅผ ์ถ๊ฐํด ์ด์ ์งํํ ๊ฐ๋ฅ.
์ฒดํฌ๋ฆฌ์คํธ
-
smolagents์ค์น ์๋ฃ -
day19_stateful_agent.py๋ฌธ๋ฒ ๊ฒ์ฌ ํต๊ณผ - 1์ฐจ ์คํ ํ
state.json์์ฑ - 2์ฐจ ์คํ ํ
history๊ธธ์ด 2 ํ์ธ -
result.json์summary/history_count/applied_memory์กด์ฌ
์ฐธ๊ณ ๋งํฌ (์ฐ์ ์์)
- https://github.com/huggingface/agents-course
- https://huggingface.co/learn/agents-course
- https://huggingface.co/docs/smolagents
์์ฑํ AI ํ์ฉ ๊ณ ์ง
์ด ๋ฌธ์๋ ์์ฑํ AI๋ฅผ ํ์ฉํด ์ด์์ ์์ฑํ๊ณ , ์ค์ต ์ ์ฐจ(๋๊ตฌ/์ ๋ ฅ/์คํ๋ช ๋ น/์ฑ๊ณตํ์ )์ ์์ ์ฝ๋๋ ์ฌ๋์ด ๊ฒํ ํด ํ์ ํ๋ค.