์ด๋ฒ ํธ์ ToolCallingAgent๋ก ๊ณ ๊ฐ๋ฌธ์๋ฅผ ์๋ ๋ถ๋ฅํ๋ ๊ฐ์ฅ ์ค๋ฌด์ ์ธ ์
๋ฌธ ํจํด์ ๋ค๋ฃฌ๋ค.
ํต์ฌ์ โ์์๊ฒ ๋ตํ๊ธฐโ๊ฐ ์๋๋ผ, ์นดํ
๊ณ ๋ฆฌ/์ฐ์ ์์๋ฅผ ์์ ์ ์ผ๋ก ๋ฝ์ ํ์ ์๋ํ์ ์ฐ๊ฒฐํ๋ ๊ฒ์ด๋ค.
flowchart LR A[inquiries.jsonl ์ ๋ ฅ] --> B[ToolCallingAgent] B --> C[classify_inquiry ๋๊ตฌ] C --> D[์นดํ ๊ณ ๋ฆฌ/์ฐ์ ์์ JSON] D --> E[save_result ๋๊ตฌ] E --> F[triage_results.jsonl ์ ์ฅ] F --> G[์ฌ๋ ๊ฒํ ํ ํฐ์ผ ์์คํ ๋ฐ์]
์ค์ต ๋ชฉํ
ToolCallingAgent๋ฅผ ์คํํ๋ค.- ๋ฌธ์ ํ ์คํธ๋ฅผ ๋ถ๋ฅํ๋ ์ปค์คํ ๋๊ตฌ๋ฅผ ์ฐ๊ฒฐํ๋ค.
- ๊ฒฐ๊ณผ๋ฅผ
triage_results.jsonl๋ก ์ ์ฅํ๋ค. - ์ฑ๊ณต ํ์ (ํ์ผ ์์ฑ, ๋ผ์ธ ์ ์ผ์น, ํ์ ํ๋ ์กด์ฌ)์ผ๋ก ์ฌํ์ฑ์ ํ์ธํ๋ค.
1) ์ค๋น
Step 1-1. ์์ ํด๋ ์์ฑ
- ๋๊ตฌ: ํฐ๋ฏธ๋
- ์ ๋ ฅ: ์์
- ์คํ๋ช ๋ น:
mkdir -p ~/hf-agents-day17 && cd ~/hf-agents-day17- ์ฑ๊ณตํ์ :
pwd๊ฐ~/hf-agents-day17
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. inquiries.jsonl ๋ง๋ค๊ธฐ
- ๋๊ตฌ: ํ ์คํธ ํ์ผ
- ์ ๋ ฅ: ์๋ ์ํ
- ์คํ๋ช ๋ น:
cat <<'JSONL' > inquiries.jsonl
{"id":"q1","text":"๊ฒฐ์ ๋ ๋๋๋ฐ ์ฃผ๋ฌธํ์ธ์ด ์ ๋ ์"}
{"id":"q2","text":"์ด์ ๋ฐ์ ํค๋ณด๋๊ฐ ์
๋ ฅ์ด ์ ๋ฉ๋๋ค"}
{"id":"q3","text":"์ธ๊ธ๊ณ์ฐ์ ๋ฐํ ๋ฐฉ๋ฒ ์๋ ค์ฃผ์ธ์"}
{"id":"q4","text":"๋ฐฐ์ก์ด 3์ผ์งธ ๋ฉ์ถฐ ์์ด์"}
JSONL- ์ฑ๊ณตํ์ :
wc -l inquiries.jsonl4 inquiries.jsonl์ด๋ฉด ์ ์.
3) ์์ด์ ํธ ์ฝ๋ ์์ฑ
Step 3-1. day17_triage.py ์ ์ฅ
- ๋๊ตฌ: Python ํ์ผ
- ์ ๋ ฅ: ์๋ ์ฝ๋
- ์คํ๋ช ๋ น: ํ์ผ ์์ฑ ํ ์ ์ฅ
import json
from pathlib import Path
from smolagents import ToolCallingAgent, HfApiModel, tool
@tool
def classify_inquiry(text: str) -> str:
"""๋ฌธ์ ํ
์คํธ๋ฅผ ์นดํ
๊ณ ๋ฆฌ์ ์ฐ์ ์์๋ก ๋ถ๋ฅํด JSON ๋ฌธ์์ด๋ก ๋ฐํํ๋ค."""
t = text.strip()
if any(k in t for k in ["์ ๋ผ", "๋ถ๋", "๊ณ ์ฅ", "์
๋ ฅ"]):
result = {"category": "์ ํ๋ฌธ์ ", "priority": "high"}
elif any(k in t for k in ["๊ฒฐ์ ", "์ฃผ๋ฌธํ์ธ", "ํ๋ถ"]):
result = {"category": "์ฃผ๋ฌธ/๊ฒฐ์ ", "priority": "high"}
elif any(k in t for k in ["๋ฐฐ์ก", "ํ๋ฐฐ", "๋์ฐฉ"]):
result = {"category": "๋ฐฐ์ก", "priority": "medium"}
else:
result = {"category": "์ผ๋ฐ๋ฌธ์", "priority": "low"}
return json.dumps(result, ensure_ascii=False)
@tool
def save_result(path: str, line: str) -> str:
"""JSONL ๋ผ์ธ์ ํ์ผ ๋์ ์ถ๊ฐ ์ ์ฅํ๋ค."""
with open(path, "a", encoding="utf-8") as f:
f.write(line + "\n")
return f"saved:{path}"
def build_agent() -> ToolCallingAgent:
model = HfApiModel("Qwen/Qwen2.5-72B-Instruct")
return ToolCallingAgent(
tools=[classify_inquiry, save_result],
model=model,
max_steps=6,
)
if __name__ == "__main__":
in_path = Path("inquiries.jsonl")
out_path = Path("triage_results.jsonl")
if out_path.exists():
out_path.unlink()
agent = build_agent()
for raw in in_path.read_text(encoding="utf-8").splitlines():
item = json.loads(raw)
prompt = f"""
๋ค์ ๊ณ ๊ฐ๋ฌธ์๋ฅผ ๋ถ๋ฅํด.
๋ฌธ์: {item['text']}
๊ท์น:
1) classify_inquiry ๋๊ตฌ๋ฅผ ๋ฐ๋์ ํธ์ถ
2) ๊ฒฐ๊ณผ๋ฅผ {{id, category, priority}} JSON ํ ์ค๋ก ๋ง๋ค ๊ฒ
3) save_result ๋๊ตฌ๋ก triage_results.jsonl์ ์ ์ฅ
"""
result = agent.run(prompt)
print(f"[DONE] {item['id']} -> {result}")
print("[FINISH] triage completed")- ์ฑ๊ณตํ์ :
python -m py_compile day17_triage.py์ค๋ฅ ์์ด ์ข ๋ฃ๋๋ฉด ํต๊ณผ.
4) ์คํ ๋ฐ ๊ฒ์ฆ
Step 4-1. ์์ด์ ํธ ์คํ
- ๋๊ตฌ:
day17_triage.py - ์
๋ ฅ:
inquiries.jsonl - ์คํ๋ช ๋ น:
python day17_triage.py- ์ฑ๊ณตํ์ : ์ถ๋ ฅ ๋ง์ง๋ง์
[FINISH] triage completedํ์
Step 4-2. ๊ฒฐ๊ณผ ๊ฒ์ฆ
- ๋๊ตฌ: ํฐ๋ฏธ๋
- ์
๋ ฅ:
triage_results.jsonl - ์คํ๋ช ๋ น:
test -f triage_results.jsonl && echo "FILE_OK"
[ "$(wc -l < triage_results.jsonl)" -eq 4 ] && echo "COUNT_OK"
grep -E '"category"' triage_results.jsonl >/dev/null && echo "FIELD_OK"- ์ฑ๊ณตํ์ :
FILE_OK,COUNT_OK,FIELD_OK3๊ฐ ๋ชจ๋ ์ถ๋ ฅ
5) ์ด๋ณด์์ฉ ์ฌ์ด ์ค๋ช
ToolCallingAgent๋ ๋๊ตฌ๋ฅผ ํธ์ถํด์ ์ ํด์ง ํ์ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค ๋ ํนํ ์ ๋ฆฌํ๋ค.- ์ด๋ฒ ์ค์ต์์ LLM์ โ์๊ฐโ์ ํ๊ณ , ์ค์ ๋ถ๋ฅ ๊ท์น์
classify_inquiry๊ฐ ๋ด๋นํ๋ค. - ๊ทธ๋์ ์ถ๋ ฅ ํ์ง์ด ํ๋ค๋ ค๋, **์ต์ข ์ ์ฅ ๊ตฌ์กฐ(id/category/priority)**๋ ์์ ์ ์ผ๋ก ์ ์ง๋๋ค.
6) ์ค๋ฌด ์ ์ฉ ํฌ์ธํธ
- CS ํฐ์ผ ์ ๋ถ๋ฅ ์๋ํ: ์นดํ ๊ณ ๋ฆฌ๋ณ ๋ด๋น์ ๋ผ์ฐํ ์ฐ๊ฒฐ.
- SLA ๋์:
priority=high๋ง ์ฆ์ ์๋ฆผ(์ฌ๋/๋ฌธ์)๋ก ๋ถ๊ธฐ. - ์ด์ ์์ ์ฑ: ๊ฒฐ๊ณผ๋ฅผ JSONL๋ก ๊ณ ์ ํด BI/๋์๋ณด๋ ์ฐ๋์ด ์ฝ๋ค.
- ํ์ฅ ๊ฒฝ๋ก: ๋ค์ ๋จ๊ณ์์ FAQ ๊ฒ์ ๋๊ตฌ๋ฅผ ์ถ๊ฐํด 1์ฐจ ์๋์๋ต๊น์ง ์ฐ๊ฒฐ ๊ฐ๋ฅ.
์ฒดํฌ๋ฆฌ์คํธ
- ๊ฐ์ํ๊ฒฝ ์์ฑ ๋ฐ
smolagents์ค์น ์๋ฃ -
inquiries.jsonl4์ค ์์ฑ ํ์ธ -
day17_triage.py๋ฌธ๋ฒ ๊ฒ์ฌ ํต๊ณผ - ์คํ ํ
triage_results.jsonl์์ฑ - ๋ผ์ธ ์ ์ผ์น(์ ๋ ฅ 4 = ์ถ๋ ฅ 4)
- ์ฌ๋์ด ์ํ 2๊ฑด ์ด์ ์๋ ๊ฒํ
์ฐธ๊ณ ๋งํฌ (์ฐ์ ์์)
- https://github.com/huggingface/agents-course
- https://huggingface.co/learn/agents-course
- https://huggingface.co/docs/smolagents
์์ฑํ AI ํ์ฉ ๊ณ ์ง
์ด ๋ฌธ์๋ ์์ฑํ AI๋ฅผ ํ์ฉํด ์ด์์ ์์ฑํ๊ณ , ์์ ์ฝ๋/์ ์ฐจ/ํํ์ ์ฌ๋ ๊ฒํ ํ ํ์ ํ๋ค.