์ด๋ฒ ํธ์ **โ์์ด์ ํธ๊ฐ ์ด๋๊น์ง ์๋ ์ฒ๋ฆฌํ๊ณ , ์ด๋์ ์ฌ๋์๊ฒ ๋๊ธธ์งโ**๋ฅผ ๊ตฌํํ๋ ์ค์ต์ด๋ค.
์ค๋ฌด์์ ๊ฐ์ฅ ์ค์ํ ์์ ์ฅ์น์ธ ํด๋จผ ํธ๋์คํ(Human Handoff) + PII ๋ง์คํน ๊ฐ๋๋ ์ผ์ ๋ฏธ๋ ํ๋ก์ ํธ๋ก ์ฌํํ๋ค.
- ์ด์ ํธ: ๐ค 09. ๋ณธํธ 04
ํ ์ค ๊ฒฐ๋ก
๊ท์น ๊ธฐ๋ฐ ํธ๋์คํ ์ ์ฑ
์ ๋จผ์ ๊ณ ์ ํ๊ณ (selfcheck โ single โ eval), ๊ทธ๋ค์ ๋ชจ๋ธ ์์ด์ ํธ(smolagents)๋ก ํ์ฅํ๋ฉด ์ด๋ณด์๋ ์์ ํ ์๋ํ ํ์ดํ๋ผ์ธ์ ๋ง๋ค ์ ์๋ค.
flowchart LR A[๊ณ ๊ฐ ์์ฒญ ์ ๋ ฅ] --> B[๋ฆฌ์คํฌ/PII/๊ธ์ก ํ๋ณ] B --> C{ํธ๋์คํ ํ์?} C -- No --> D[AUTO_REPLY] C -- Yes --> E[HUMAN_HANDOFF] E --> F[ops-review ํ ์ ๋ฌ] B --> G[PII ๋ง์คํน ๊ท์น] G --> D G --> E
์ค์ต ๋ชฉํ
- ํด๋จผ ํธ๋์คํ ์ ์ฑ (๊ณ ์ํ/๋ถ์/PII)์ ์ฝ๋๋ก ๋ช ์ํ๋ค.
- ๊ฒฐ๊ณผ๋ฅผ
FINAL:๊ณ์ฝ ๋ฌธ์์ด๋ก ๊ณ ์ ํด ํ์ฑ ๊ฐ๋ฅํ๊ฒ ๋ง๋ ๋ค. - ๋ฐฐ์น ํ๊ฐ(
eval)๋ก ์ฌํ์ฑ์ ์ ๊ฒํ๋ค.
์ค์ต ํ์ผ
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
pip install -r requirements.txt- ์ฑ๊ณตํ์ :
(.venv)ํ๋กฌํํธ ํ์- ์ค์น ์๋ฌ ์์ด ์ข ๋ฃ
2) ์ ํ์ฒดํฌ ์คํ (์ ์ฑ ๊ธฐ๋ณธ ๊ฒ์ฆ)
- ๋๊ตฌ:
day10_handoff_guardrail_handson.py - ์ ๋ ฅ: ๋ด์ฅ 2๊ฐ ์ผ์ด์ค
- ์คํ๋ช ๋ น:
python3 day10_handoff_guardrail_handson.py --mode selfcheck- ์ฑ๊ณตํ์ :
- ์ถ๋ ฅ JSON์
"selfcheck_ok": true
- ์ถ๋ ฅ JSON์
3) ๋จ์ผ ์์ฒญ ํ ์คํธ (ํธ์ฆ์จ)
- ๋๊ตฌ:
day10_handoff_guardrail_handson.py - ์
๋ ฅ:
- text:
๊ณ ๊ฐ ์นด๋ ๊ฒฐ์ ๋ถ์์ผ๋ก ํ๋ถ ์์ฒญ - priority:
high - pii:
1 - amount:
1200000
- text:
- ์คํ๋ช ๋ น:
python3 day10_handoff_guardrail_handson.py \
--mode single \
--text "๊ณ ๊ฐ ์นด๋ ๊ฒฐ์ ๋ถ์์ผ๋ก ํ๋ถ ์์ฒญ" \
--priority high \
--pii 1 \
--amount 1200000- ์ฑ๊ณตํ์ :
result.action = "HUMAN_HANDOFF"result.masking = "REQUIRED"result.final์ดFINAL:ํ์ ์ ์ง
4) ๋ฐฐ์น ํ๊ฐ (์ฌํ์ฑ ํ์ธ)
- ๋๊ตฌ:
sample_tasks_day10.json - ์ ๋ ฅ: 3๊ฐ ์ํ ํ์คํฌ
- ์คํ๋ช ๋ น:
python3 day10_handoff_guardrail_handson.py --mode eval --input sample_tasks_day10.json- ์ฑ๊ณตํ์ :
pass = true๋๋score >= 0.66
์ฝ๋์์ ๊ผญ ๋ณผ ํฌ์ธํธ
classify()priority,pii,amount, ๋ถ์ ํค์๋ ๊ธฐ๋ฐ์ผ๋กAUTO_REPLY/HUMAN_HANDOFF๊ฒฐ์
masking- PII ์
๋ ฅ ์
REQUIRED๊ฐ์
- PII ์
๋ ฅ ์
finalFINAL: action=...๊ณ์ฝ ๋ฌธ์์ด ๊ณ ์ (ํ์ฒ๋ฆฌ ํ์ ์์ ํ)
smolagents ํ์ฅ ์์ด๋์ด (๋ค์ ๋จ๊ณ)
- ํ์ฌ ๊ท์น ํจ์๋ฅผ Tool๋ก ๋ํํด ToolCallingAgent์ ์ฐ๊ฒฐ
- ๊ฒํ ํ(
ops-review)๋ฅผ Jira/Slack/n8n ๋ ธ๋๋ก ์ฐ๋ - eval ์คํจ ์ผ์ด์ค๋ฅผ ์ฃผ๊ฐ ํ๊ณ ๋ฐ์ดํฐ๋ก ๋์
ํธ๋ฌ๋ธ์ํ (์์ฃผ ๋งํ๋ 5๊ฐ์ง)
-
No such file or directory(์ด๋ชจ์ง/๊ณต๋ฐฑ ๊ฒฝ๋ก)- ์์ธ:
๐ค HF-Agents-Course๊ฒฝ๋ก ์ธ์ฉ ๋๋ฝ - ํด๊ฒฐ: ๊ฒฝ๋ก ์ ์ฒด๋ฅผ ํฐ๋ฐ์ดํ๋ก ๊ฐ์ธ ์คํ
- ์์ธ:
-
invalid priority์๋ฌ- ์์ธ:
--priority urgent์ฒ๋ผ ํ์ฉ ์ธ ๊ฐ ์ฌ์ฉ - ํด๊ฒฐ:
low|medium|high|critical์ค ํ๋๋ก ์ ๋ ฅ
- ์์ธ:
-
eval์์
input JSON root must be list- ์์ธ:
sample_tasks_day10.json๋ฃจํธ๊ฐ ๊ฐ์ฒด({})๋ก ๋ณ๊ฒฝ๋จ - ํด๊ฒฐ: ๋ฃจํธ๋ฅผ ๋ฐฐ์ด(
[])๋ก ์ ์ง
- ์์ธ:
-
single ๊ฒฐ๊ณผ๊ฐ
AUTO_REPLY๋ก๋ง ๋์ด- ์์ธ:
--pii 1๋๋ ๊ณ ์ํ ํค์๋/๊ธ์ก ์กฐ๊ฑด์ด ๋น ์ง - ํด๊ฒฐ: ํ
์คํธ ์
๋ ฅ์
pii=1,priority=high, ๋ถ์ ํค์๋๋ฅผ ํฌํจ
- ์์ธ:
-
๊ฐ์ํ๊ฒฝ ํจํค์ง ์ค์น ์คํจ
- ์์ธ: ์์คํ pip/๊ถํ ํผ์ฉ
- ํด๊ฒฐ:
source .venv/bin/activateํpip install -r requirements.txt์ฌ์คํ
์ฒดํฌ๋ฆฌ์คํธ
-
selfcheck_ok=trueํ์ธ - single ๋ชจ๋์์
HUMAN_HANDOFF+masking=REQUIREDํ์ธ - eval ์ ์(
score) ๊ธฐ๋ก - ํ ์ ์ฑ ๊ธฐ์ค(๊ธ์ก/ํค์๋/์ฐ์ ์์) 1๊ฐ ์ด์ ์ปค์คํฐ๋ง์ด์ฆ
์ฐธ๊ณ ๋งํฌ (์ฐ์ ์์)
- https://github.com/huggingface/agents-course
- https://huggingface.co/learn/agents-course
- https://huggingface.co/docs/smolagents
์์ฑํ AI ํ์ฉ ๊ณ ์ง
์ด ๋ฌธ์๋ ์์ฑํ AI๋ฅผ ํ์ฉํด ์ด์ ์์ฑ๊ณผ ๊ตฌ์กฐํ๋ฅผ ์ํํ์ผ๋ฉฐ, ์ต์ข ๋ฐํ ์ ์ฌ๋์ด ์ฌ์ค๊ด๊ณ์ ์ฌํ ์ ์ฐจ๋ฅผ ์ ๊ฒํ๋ค.