์ด๋ฒ ํธ์ ์์ด์ ํธ๊ฐ ๋๊ตฌ๋ฅผ ํธ์ถํ ๋ค, ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ก ๋ฏฟ์ง ์๊ณ **๊ฒ์ฆ ๊ฒ์ดํธ(validate gate)**๋ฅผ ๊ฑฐ์ณ ์ ๋ขฐ๋๋ฅผ ๋์ด๋ ๋ฐฉ๋ฒ์ ๋ค๋ฃฌ๋ค.
- ์ด์ ํธ: ๐ค 32. ๋ณธํธ 19
flowchart LR A[์ฌ์ฉ์ ์์ฒญ] --> B[CodeAgent] B --> C[fetch_price ๋๊ตฌ ํธ์ถ] C --> D[์์ ๊ฒฐ๊ณผ] D --> E{๊ฒ์ฆ ๊ฒ์ดํธ\nํ์ ํ๋/ํ์ /๋ฒ์} E -- ํต๊ณผ --> F[result.json ์ ์ฅ] E -- ์คํจ --> G[์๋ฌ ์ฌ์ ๋ฐํ\n์ฌ์๋ ์ ๋]
์ค์ต ๋ชฉํ
- ๋๊ตฌ ๊ฒฐ๊ณผ๋ฅผ JSON ์คํค๋ง๋ก ๊ฒ์ฆํ๋ค.
- ๊ฒ์ฆ ์คํจ ์ ์ฆ์ ์คํจ ์ฒ๋ฆฌํ๊ณ ์์ธ์ ๋จ๊ธด๋ค.
- ์ฑ๊ณต ์
result.json์ผ๋ก ๋จ๊ฒจ ์๋ํ ํ์ดํ๋ผ์ธ์ ์ฐ๊ฒฐํ๋ค.
1) ์ค๋น
Step 1-1. ์์ ํด๋ ์์ฑ
- ๋๊ตฌ: ํฐ๋ฏธ๋
- ์ ๋ ฅ: ์์
- ์คํ๋ช ๋ น:
mkdir -p ~/hf-agents-day20 && cd ~/hf-agents-day20- ์ฑ๊ณตํ์ :
pwd์ถ๋ ฅ์ด ~/hf-agents-day20
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. day20_validation_gate.py ์ ์ฅ
- ๋๊ตฌ: Python ํ์ผ
- ์ ๋ ฅ: ์๋ ์ฝ๋
import json
from pathlib import Path
from datetime import datetime
from smolagents import CodeAgent, HfApiModel, tool
RESULT_PATH = Path("result.json")
@tool
def fetch_price(product: str) -> str:
"""์ํ ์ด๋ฆ์ ๋ฐ์ ๊ฐ๊ฒฉ ์ ๋ณด๋ฅผ JSON ๋ฌธ์์ด๋ก ๋ฐํํ๋ค."""
mock_db = {
"keyboard": {"product": "keyboard", "price": 59000, "currency": "KRW"},
"mouse": {"product": "mouse", "price": 32000, "currency": "KRW"},
}
data = mock_db.get(product.lower(), {"product": product, "price": -1, "currency": ""})
return json.dumps(data, ensure_ascii=False)
def validate_payload(payload: dict) -> tuple[bool, str]:
required = ["product", "price", "currency"]
for key in required:
if key not in payload:
return False, f"missing:{key}"
if not isinstance(payload["price"], int):
return False, "price_not_int"
if payload["price"] <= 0:
return False, "price_out_of_range"
if payload["currency"] not in ["KRW", "USD", "EUR"]:
return False, "currency_not_allowed"
return True, "ok"
def build_agent() -> CodeAgent:
model = HfApiModel("Qwen/Qwen2.5-72B-Instruct")
return CodeAgent(
tools=[fetch_price],
model=model,
max_steps=5,
additional_authorized_imports=["json"],
)
if __name__ == "__main__":
product = "keyboard"
prompt = f"""
๋๋ ๊ฐ๊ฒฉ์กฐํ ์ด์์คํดํธ๋ค.
๋ฐ๋์ fetch_price('{product}')๋ฅผ ํธ์ถํ๊ณ ,
๋๊ตฌ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋๋ก JSON์ผ๋ก ๋ฐํํด.
์ค๋ช
๋ฌธ์ฅ ์์ด JSON๋ง ์ถ๋ ฅ.
"""
agent = build_agent()
raw = agent.run(prompt)
if isinstance(raw, str):
cleaned = raw.strip().removeprefix("```json").removesuffix("```").strip()
payload = json.loads(cleaned)
else:
payload = raw
ok, reason = validate_payload(payload)
output = {
"ok": ok,
"reason": reason,
"checked_at": datetime.utcnow().isoformat() + "Z",
"data": payload,
}
RESULT_PATH.write_text(json.dumps(output, ensure_ascii=False, indent=2), encoding="utf-8")
print("saved: result.json")
if not ok:
raise SystemExit(f"validation_failed:{reason}")- ์ฑ๊ณตํ์ :
python -m py_compile day20_validation_gate.py์ค๋ฅ ์์ด ์ข ๋ฃ๋๋ฉด ํต๊ณผ
3) ์คํ ๋ฐ ๊ฒ์ฆ
Step 3-1. ์ ์ ์ผ์ด์ค ์คํ
- ๋๊ตฌ: Python
- ์
๋ ฅ: ๊ธฐ๋ณธ๊ฐ
product = "keyboard" - ์คํ๋ช ๋ น:
python day20_validation_gate.py
cat result.json- ์ฑ๊ณตํ์ :
saved: result.json์ถ๋ ฅresult.json์ok๊ฐtruereason์ดok
Step 3-2. ์คํจ ์ผ์ด์ค ํ์ธ(๊ฒ์ฆ ๊ฒ์ดํธ ๋์)
- ๋๊ตฌ: ํ์ผ ํธ์ง + Python
- ์
๋ ฅ:
product = "unknown_item"๋ก ๋ณ๊ฒฝ - ์คํ๋ช ๋ น:
# ์ฝ๋์์ product ๊ฐ์ unknown_item์ผ๋ก ๋ฐ๊พผ ๋ค
python day20_validation_gate.py- ์ฑ๊ณตํ์ :
- ํ๋ก์ธ์ค๊ฐ
validation_failed:price_out_of_range๋ก ์ข ๋ฃ result.json์ok: false๊ธฐ๋ก
- ํ๋ก์ธ์ค๊ฐ
์ด๋ณด์์ฉ ์ฌ์ด ์ค๋ช
- ์์ด์ ํธ๊ฐ ๋๊ตฌ๋ฅผ ์ ํธ์ถํด๋, ๊ฒฐ๊ณผ๊ฐ์ด ๋น์ ์์ผ ์ ์๋ค.
- ๊ทธ๋์ โ๋๊ตฌ ํธ์ถ ์ฑ๊ณตโ๊ณผ โ์ ๋ฌด์ ์ธ ์ ์๋ ๊ฐโ์ ๋ถ๋ฆฌํด์ ๋ณธ๋ค.
- ๊ฒ์ฆ ๊ฒ์ดํธ๋ ์ด ๋์ ๋ถ๋ฆฌํด ์๋ํ ์ฌ๊ณ ๋ฅผ ์ค์ฌ์ค๋ค.
์ค๋ฌด ์ ์ฉ ํฌ์ธํธ
- ์ ์ฐ/๊ฐ๊ฒฉ/์ฌ๊ณ ์๋ํ: ๋ฒ์ ๋ฐ ์ซ์๋ฅผ ์ฆ์ ์ฐจ๋จ.
- ํฐ์ผ ๋ผ์ฐํ : ํ์ ํ๋ ๋๋ฝ ์ ์ฌ๋ ๊ฒํ ํ๋ก ๋ณด๋.
- API ๋น์ฉ ์ ๊ฐ: ์๋ชป๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ ๋จ๊ณ๋ก ๋๊ธฐ์ง ์์ ์ฌ์ฒ๋ฆฌ ๋น์ฉ ๊ฐ์.
์ฒดํฌ๋ฆฌ์คํธ
-
smolagents์ค์น ์๋ฃ -
day20_validation_gate.py๋ฌธ๋ฒ ๊ฒ์ฌ ํต๊ณผ - ์ ์ ์ผ์ด์ค์์
ok=trueํ์ธ - ์คํจ ์ผ์ด์ค์์
validation_failed์ข ๋ฃ ํ์ธ -
result.json์ok/reason/data๊ตฌ์กฐ ํ์ธ
์ฐธ๊ณ ๋งํฌ (์ฐ์ ์์)
- https://github.com/huggingface/agents-course
- https://huggingface.co/learn/agents-course
- https://huggingface.co/docs/smolagents
์์ฑํ AI ํ์ฉ ๊ณ ์ง
์ด ๋ฌธ์๋ ์์ฑํ AI๋ฅผ ํ์ฉํด ์ด์์ ์์ฑํ๊ณ , ์ค์ต ์ ์ฐจ(๋๊ตฌ/์ ๋ ฅ/์คํ๋ช ๋ น/์ฑ๊ณตํ์ )์ ์์ ์ฝ๋๋ ์ฌ๋์ด ๊ฒํ ํด ํ์ ํ๋ค.