์ด๋ฒ ํธ์ ํต์ฌ์ ๊ฐ๋จํ๋ค. CodeAgent(์ฝ๋ ์คํํ) ๋ค์ ๋จ๊ณ๋ก, ToolCallingAgent(JSON ํธ์ถํ)๋ฅผ ์จ์ ๋ผ์ฐํ ์์ ์ฑ์ ๋์ด๋ ๊ฒ์ด๋ค.
์ด์ ํธ(๋ณธํธ 01)์ด โ์ฒซ ์คํโ์ด์๋ค๋ฉด, ์ด๋ฒ ํธ์ โ์ค๋ฌดํ ์ด์ ํจํดโ์ด๋ค.
- ์ด์ ํธ: ๐ค 05. ๋ณธํธ 01
ํ ์ค ๊ฒฐ๋ก
๊ณ ๊ฐ ๋ฌธ์/์ ๋ฌด ์์ฒญ์ฒ๋ผ ์ ํด์ง ๋๊ตฌ๋ฅผ ์์ ํ๊ฒ ํธ์ถํด์ผ ํ๋ ์ํฉ์์๋ ToolCallingAgent๊ฐ ์ด๋ณด์์๊ฒ ๋ ์์ธก ๊ฐ๋ฅํ ์ถ๋ฐ์ ์ด๋ค.
๊ณต์ ๊ทผ๊ฑฐ ๋ฐ๋ก๋ณด๊ธฐ
- Agents Course(์ปค๋ฆฌํ๋ผ): https://huggingface.co/learn/agents-course
- Course ์ ์ฅ์(์ค์ต ์ฝ๋): https://github.com/huggingface/agents-course
- smolagents ๋ฌธ์(Agent ํ์ ๋น๊ต): https://huggingface.co/docs/smolagents
์ ์ด ์ฃผ์ ๊ฐ ์ค์ํ๊ฐ
Hugging Face Agents Course(Unit 2 smolagents)์ smolagents ๊ณต์ ๋ฌธ์์์ ๊ณตํต์ผ๋ก ๊ฐ์กฐํ๋ ์ง์ ์ ๋ค์์ด๋ค.
- CodeAgent: ์ ์ฐํ๊ณ ๊ฐ๋ ฅํ์ง๋ง, ์ฝ๋ ์คํ์ด ๊ฐ์ ๋จ
- ToolCallingAgent: JSON ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์กฐํ๋์ด ๊ฒ์ฆ/์ด์์ ์ ๋ฆฌ
์ฆ, โ๋ณต์กํ ์ถ๋ก โ๋ณด๋ค โ์ ํด์ง ์ ๋ฌด ๋ถ๊ธฐโ๊ฐ ์ค์ํ ํ์ด๋ผ๋ฉด ToolCallingAgent๊ฐ ๋น ๋ฅธ ์ค๋ฌด ์ ์ฉ์ ์ด ๋๋ค.
flowchart LR A[๊ณ ๊ฐ ๋ฌธ์ ์ ๋ ฅ] --> B[detect_category] B --> C[assign_priority] C --> D[suggest_action] D --> E[FINAL: category/priority/action] E --> F[ํฌํ๋ฐ์คํฌ ํ/์์ค์ปฌ๋ ์ด์ ]
์ฌ์ด ๋น์ ๋ก ์ดํดํ๊ธฐ
- CodeAgent: ์๋ จ ์ง์์ด ์ํฉ ๋ณด๊ณ ์ง์ ์คํฌ๋ฆฝํธ๊น์ง ์์ฑํด์ ์ฒ๋ฆฌ
- ToolCallingAgent: ์ฝ์ผํฐ ์๋ด์ฌ๊ฐ ์ ํด์ง ์ฒดํฌ๋ฆฌ์คํธ(๋๊ตฌ) ์์๋๋ก ์ฒ๋ฆฌ
์ฒ์ ์ด์ ์๋ํ๋ฅผ ๋ถ์ผ ๋๋ โ์์ ๋โ๋ณด๋ค โ์ผ๊ด์ฑโ์ด ๋จผ์ ๋ค.
์ค์ต: 20~30๋ถ ์ฌํ (๋๊ตฌ/์ ๋ ฅ/์คํ๋ช ๋ น/์ฑ๊ณตํ์ )
์ค์ต ํ์ผ ๊ฒฝ๋ก:
/home/tw2/Documents/n8n/data/shared/syn/8.quartz/Agent/๐ค HF-Agents-Course/downloads
Step 1) ํ๊ฒฝ ์ค๋น
- ๋๊ตฌ: Python 3.10+, ํฐ๋ฏธ๋
- ์
๋ ฅ:
requirements.txt - ์คํ๋ช ๋ น:
cd /home/tw2/Documents/n8n/data/shared/syn/8.quartz/Agent/๐ค\ HF-Agents-Course/downloads
python3 -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt- ์ฑ๊ณตํ์ : ์ค์น ์๋ฌ ์์ด ์ข
๋ฃ,
(.venv)ํ์ ํ์ธ
Step 2) ๋๊ตฌ ๋ก์ง ์ ํ์ฒดํฌ
- ๋๊ตฌ:
day6_toolcalling_triage.py - ์ ๋ ฅ: ๋ด์ฅ ํ ์คํธ(์นดํ ๊ณ ๋ฆฌ/์ฐ์ ์์/์ก์ ์ฝ๋)
- ์คํ๋ช ๋ น:
python day6_toolcalling_triage.py --mode selfcheck- ์ฑ๊ณตํ์ : ์ถ๋ ฅ JSON์
"tools_ok": true
Step 3) ๋จ์ผ ์์ฒญ ์คํ (ToolCallingAgent)
- ๋๊ตฌ:
day6_toolcalling_triage.py - ์
๋ ฅ:
- issue:
๊ฒฐ์ ๊ฐ ๋ ๋ฒ ์ฒญ๊ตฌ๋์ด์. ๋น ๋ฅด๊ฒ ํ์ธํด์ฃผ์ธ์. - tier:
vip - outage:
0
- issue:
- ์คํ๋ช ๋ น:
# .env์ OPENAI_API_KEY ๋๋ HF_TOKEN ํ์
python day6_toolcalling_triage.py \
--mode single \
--provider auto \
--issue "๊ฒฐ์ ๊ฐ ๋ ๋ฒ ์ฒญ๊ตฌ๋์ด์. ๋น ๋ฅด๊ฒ ํ์ธํด์ฃผ์ธ์." \
--tier vip \
--outage 0- ์ฑ๊ณตํ์ :
parsed.parse_ok = trueparsed.priority๊ฐP1์ ๊ทผ์ ํ ๊ฒฐ๊ณผ
Step 4) ๋ฐฐ์น ํ๊ฐ
- ๋๊ตฌ:
day6_toolcalling_triage.py,sample_tasks_day6.json - ์ ๋ ฅ: ์ํ ๋ฌธ์ 3๊ฑด(๊ธฐ๋ category/priority/action ํฌํจ)
- ์คํ๋ช ๋ น:
python day6_toolcalling_triage.py \
--mode eval \
--provider auto \
--input sample_tasks_day6.json- ์ฑ๊ณตํ์ :
"pass": true๋๋"score" >= 0.66
์ด๋ณด์ ์ค์ ๋ฐฉ์ง ์ฒดํฌํฌ์ธํธ
.envํค ์์ดsingle/eval๋จผ์ ์คํํด์ ์คํจ- ํ๋กฌํํธ์ ์ต์ข ์ถ๋ ฅ ํ์(FINAL ๋ผ์ธ)์ ์ ๋ฐ์์ ํ์ฑ ์คํจ
- ๊ธฐ๋๊ฐ JSON(
sample_tasks_day6.json) ๊ตฌ์กฐ๋ฅผ ์์ ๋ณ๊ฒฝํด์ ํ๊ฐ ์ค๋ฅ
์ค๋ฌด ์ ์ฉ ํฌ์ธํธ
- ๊ณ ๊ฐ์ง์(CS) ํฐ์ผ triage: billing/technical/account ์๋ ๋ถ๋ฅ
- ์จ์ฝ ์ด์: P1/P2/P3 ๊ธฐ์ค์ผ๋ก ์์ค์ปฌ๋ ์ด์ ์๋ํ
- SLA ๋ฆฌํฌํธ:
score๋ฅผ ์ฃผ๊ฐ ์งํ๋ก ์ถ์ ํด ํ์ง ๊ฐ์
ํ์ฅํ ๋ฏธ๋ ์ฌ๋ก
์ฌ๋ก A) VIP ๊ฒฐ์ ์ด์ ์ฐ์ ์์ ๋๋ฝ
์ด๊ธฐ ๊ท์น์์ tier=vip ๋ฐ์์ด ์ฝํด ๊ธด๊ธ๋๊ฐ ๊ณผ์ํ๊ฐ๋๋ค. assign_priority์ ๊ณ ๊ฐ๋ฑ๊ธ ๊ฐ์ค์น๋ฅผ ๋ฃ์ P1 ๋ผ์ฐํ
์ด ์์ ํ๋๋ค.
์ฌ๋ก B) FINAL ํ์ฑ ์คํจ๋ก ์๋ํ ์ค๋จ
๋ชจ๋ธ ์๋ต ๋ง์ง๋ง ์ค ํ์์ด ํ๋ค๋ ค ํ์ฑ ์คํจ๊ฐ ๋ฐ์ํ๋ค. ์ถ๋ ฅ ๊ณ์ฝ(FINAL: category|priority|action)์ ๊ฐ์ ํ๊ณ ์ ๊ท์ ๊ฒ์ฆ์ ๋ฃ์ ๋ค ์คํจ์จ์ด ์ค์๋ค.
25๋ถ ๋ณด๊ฐ ๋ฃจํด
- 5๋ถ: ์ง๋์ฃผ ์ค๋ถ๋ฅ 3๊ฑด ์ถ์ถ
- 5๋ถ: ์นดํ ๊ณ ๋ฆฌ/์ฐ์ ์์ ๊ท์น ๋ณด์
- 5๋ถ:
sample_tasks_day6.json์ ์ค์ ๋ฌธ์ 3๊ฑด ์ถ๊ฐ - 5๋ถ:
--mode eval์ฌ์คํ ํ ์ ์ ๊ธฐ๋ก - 5๋ถ: ์คํจ ์ผ์ด์ค๋ฅผ ํ ์ด์ ๋ฃฐ ๋ฌธ์์ ๋ฐ์
์ ์ฉ ์ฒดํฌ๋ฆฌ์คํธ
-
selfcheck์ฑ๊ณต - ๋จ์ผ ์์ฒญ์์
FINALํ์ ํ์ฑ ์ฑ๊ณต - ๋ฐฐ์น ํ๊ฐ ์ ์ ๊ธฐ๋ก(
score) - ์ค์ ํ ๋ถ๋ฅ ๊ธฐ์ค(์นดํ ๊ณ ๋ฆฌ/์ฐ์ ์์)์ ๋๊ตฌ ํจ์์ ๋ฐ์
์ฐธ๊ณ ๋งํฌ (์ฐ์ ์์)
- https://github.com/huggingface/agents-course
- https://huggingface.co/learn/agents-course
- https://huggingface.co/docs/smolagents
์ค์ต ํ์ผ ๋ค์ด๋ก๋
- Day6 ์ค์ต ๊ฐ์ด๋ README
- day6_toolcalling_triage.py
- sample_tasks_day6.json
- hf-agents-day6-toolcalling-triage.zip
๋ณด๊ฐ ์ถ๊ฐ: FINAL ํ์ฑ ์คํจ ์ฌํ/๋ณต๊ตฌ
FINAL ๊ณ์ฝ์ด ํ๋ค๋ฆฌ๋ฉด ์๋ํ๊ฐ ๊ฐ์ฅ ๋จผ์ ๋ฉ์ถ๋ค. ์๋์ฒ๋ผ ์คํจ ์ผ์ด์ค๋ฅผ ์ฌํํด ๋ณด๋ฉด ๋ณต๊ตฌ ๊ธฐ์ค์ด ๋ช
ํํด์ง๋ค.
์คํจ ์ถ๋ ฅ ์์
๊ฒฐ๋ก ์ billing ์ด๊ณ ์ฐ์ ์์๋ P1๋ก ๋ณด์
๋๋ค.
๋ค์ ์กฐ์น๋ refund_team์ผ๋ก ์ ๋ฌํ์ธ์.- ๋ฌธ์ :
FINAL:์ ๋/๊ตฌ๋ถ์ ๊ณ์ฝ์ด ์์ด ํ์ฑ ๋ถ๊ฐ
์ ์ ์ถ๋ ฅ ์์
FINAL: billing|P1|handoff_refund_team์ ๊ท์ ์ ๊ฒ ์์
import re
line = "FINAL: billing|P1|handoff_refund_team"
ok = bool(re.match(r"^FINAL:\s*[^|]+\|P[123]\|.+$", line))
print(ok) # True์ด์์์๋ ๋จ์ํ ๋ชจ๋ธ ๋ต๋ณ ํ์ง๋ณด๋ค, ์ด๋ฐ ๊ณ์ฝ ์ ์ง ์ฌ๋ถ๊ฐ ์ฅ์ ๋ฅผ ์ค์ด๋ ํต์ฌ์ด๋ค.
ํ์ง ์ ๊ฒํ (2026-02-28)
- ์ฌํ์ฑ: 9.0/10
- ๊ณต์ ๊ทผ๊ฑฐ ์ฐ๊ฒฐ: 9.0/10
- ์ด์ ์ ์ฉ์ฑ: 9.0/10
- ๋ฌธ์ ๊ฐ๋ ์ฑ: 8.5/10
์ฆ์ ๋ณด๊ฐ ํฌ์ธํธ 1๊ฐ
FINAL๊ณ์ฝ ์๋ฐ ์ ์๋ ์ฌ์ง์(re-ask) ํ๋กฌํํธ ํ ํ๋ฆฟ์ ์ถ๊ฐํด ์ด์ ์ค๋จ ์๊ฐ์ ๋ ์ค์ธ๋ค.
์์ฑํ AI ํ์ฉ ๊ณ ์ง
์ด ๋ฌธ์๋ ์์ฑํ AI๋ฅผ ํ์ฉํด ์ด์์ ์์ฑํ๊ณ ๊ตฌ์กฐํํ์ผ๋ฉฐ, ์ต์ข ๋ฐํ ์ ์ฌ๋์ด ์ฌ์ค๊ด๊ณ/์ฌํ ์ ์ฐจ๋ฅผ ์ ๊ฒํ๋ค.