์ด๋ฒ ํธ์ **โ์ด์ ๋ก๊ทธ ํ
์คํธ๋ฅผ ์
๋ ฅํ๋ฉด, ์์ด์ ํธ๊ฐ ์ฅ์ ์์ฝ + ์ฌ๊ฐ๋ + ์ฆ์ ์กฐ์น์์ JSON์ผ๋ก ๋ฐํํ๋ ํธ์ฆ์จโ**์ด๋ค.
HF Agents Course์ Hands-on ํ๋ฆ(์๊ฒ ๋ง๋ค๊ณ , ๊ฒ์ฆ ๊ฐ๋ฅํ๊ฒ ๋ฐ๋ณต)๊ณผ smolagents ์ค๋ฌด ํจํด(CodeAgent + ๊ตฌ์กฐํ ์ถ๋ ฅ)์ ๊ทธ๋๋ก ์ฌํํ๋ค.
- ์ด์ ํธ: ๐ค 27. ๋ณธํธ 16
- ๋ค์ ํธ ์๊ณ : ์ค์ตํธ 08-2 (๋ค์ค ์๋น์ค ๋ก๊ทธ ๋ฐฐ์น ์ฒ๋ฆฌ + ๋ฆฌํฌํธ ์๋ ์ ์ฅ)
flowchart TD A[raw_log.txt ์ ๋ ฅ] --> B[CodeAgent ์คํ] B --> C[๋ก๊ทธ ํต์ฌ ์ด๋ฒคํธ ์ถ์ถ] C --> D[์ฌ๊ฐ๋ ๋ถ๋ฅ sev0~sev3] D --> E[์กฐ์น์ + ๊ทผ๊ฑฐ JSON ์์ฑ] E --> F[incident_summary.json ์ ์ฅ] F --> G{ํ์ง ๊ฒ์ดํธ ํต๊ณผ?} G -- Yes --> H[์๋ฃ] G -- No --> I[ํ๋กฌํํธ/์ ๋ ฅ ์์ ํ ์ฌ์คํ] I --> B
0) ์ค์ต ๋ชฉํ
๋จ์ผ ๋ก๊ทธ ํ์ผ(raw_log.txt)์ ๋ฃ์ด incident_summary.json์ ์์ฑํ๊ณ , ๊ฒ์ฆ ์คํฌ๋ฆฝํธ๊น์ง PASSํ๋ค.
1) ํ๊ฒฝ ์ค๋น
- ๋๊ตฌ: ํฐ๋ฏธ๋
- ์ ๋ ฅ: Python 3.10+
- ์คํ๋ช ๋ น:
mkdir -p ~/hf-agents-lab28
cd ~/hf-agents-lab28
python3 -m venv .venv
source .venv/bin/activate
pip install -U "smolagents[toolkit]" litellm- ์ฑ๊ณตํ์ :
python -V
pip show smolagents | head -n 5
pip show litellm | head -n 5- Python ๋ฒ์ ์ถ๋ ฅ
smolagents,litellmํจํค์ง ์ ๋ณด ํ์ธ
2) ๋ชจ๋ธ/API ์ค์
- ๋๊ตฌ: ํฐ๋ฏธ๋
- ์ ๋ ฅ: API ํค, ๋ชจ๋ธ ID
- ์คํ๋ช ๋ น:
export OPENAI_API_KEY="YOUR_API_KEY"
export MODEL_ID="openai/gpt-4o-mini"- ์ฑ๊ณตํ์ :
python - <<'PY'
import os
print('MODEL_ID =', os.getenv('MODEL_ID'))
print('OPENAI_API_KEY set =', bool(os.getenv('OPENAI_API_KEY')))
PYOPENAI_API_KEY set = True
3) ์ค์ต ์ ๋ ฅ ๋ก๊ทธ ๋ง๋ค๊ธฐ
- ๋๊ตฌ: ํฐ๋ฏธ๋
- ์ ๋ ฅ: ์ํ ๋ก๊ทธ
- ์คํ๋ช ๋ น:
cat > raw_log.txt <<'LOG'
2026-04-18T08:55:11Z INFO api-gateway request_id=aa12 path=/checkout latency_ms=92 status=200
2026-04-18T08:55:12Z WARN payment-service request_id=aa12 retry=1 reason=upstream_timeout
2026-04-18T08:55:14Z ERROR payment-service request_id=aa12 error=DBConnectionRefused host=db-prod-1
2026-04-18T08:55:16Z ERROR payment-service request_id=aa13 error=DBConnectionRefused host=db-prod-1
2026-04-18T08:55:20Z WARN api-gateway request_id=aa14 path=/checkout latency_ms=3200 status=504
2026-04-18T08:55:25Z INFO alertmanager fired=true service=payment-service rule=high_error_rate
LOG- ์ฑ๊ณตํ์ :
wc -l raw_log.txt6 raw_log.txt์ถ๋ ฅ
4) ๋ฏธ๋ ํ๋ก์ ํธ ์ฝ๋ ์์ฑ
- ๋๊ตฌ: ์๋ํฐ/ํฐ๋ฏธ๋
- ์ ๋ ฅ: ์๋ ์ฝ๋
- ์คํ๋ช ๋ น:
cat > lab28_incident_agent.py <<'PY'
from __future__ import annotations
import json
import os
from pathlib import Path
from smolagents import CodeAgent, LiteLLMModel
INPUT_PATH = Path("raw_log.txt")
OUTPUT_PATH = Path("incident_summary.json")
def strip_code_fence(text: str) -> str:
t = text.strip()
if t.startswith("```"):
lines = t.splitlines()
if lines and lines[0].startswith("```"):
lines = lines[1:]
if lines and lines[-1].startswith("```"):
lines = lines[:-1]
t = "\n".join(lines).strip()
return t
def main() -> None:
raw_log = INPUT_PATH.read_text(encoding="utf-8")
model = LiteLLMModel(model_id=os.getenv("MODEL_ID", "openai/gpt-4o-mini"))
agent = CodeAgent(
model=model,
tools=[],
max_steps=6,
additional_authorized_imports=["json", "re"],
)
prompt = f"""
๋๋ SRE ๋ณด์กฐ ์์ด์ ํธ๋ค.
์๋ ์ด์ ๋ก๊ทธ๋ฅผ ๋ถ์ํด JSON๋ง ๋ฐํํ๋ผ.
[๋ก๊ทธ]
{raw_log}
์ถ๋ ฅ ์คํค๋ง(ํค ์ด๋ฆ ๊ณ ์ ):
{{
"service": "string",
"severity": "sev0|sev1|sev2|sev3",
"summary": ["๋ฌธ์ฅ", "๋ฌธ์ฅ", "๋ฌธ์ฅ"],
"probable_root_cause": "string",
"immediate_actions": ["๋ฌธ์ฅ", "๋ฌธ์ฅ", "๋ฌธ์ฅ"],
"evidence": [
{{"line": "์๋ฌธ ์ผ๋ถ", "reason": "ํ๋จ ๊ทผ๊ฑฐ"}}
]
}}
๊ท์น:
- summary๋ ์ ํํ 3๊ฐ
- immediate_actions๋ ์ ํํ 3๊ฐ
- evidence๋ ์ต์ 2๊ฐ
- JSON ์ธ ํ
์คํธ ๊ธ์ง
"""
result = agent.run(prompt)
obj = json.loads(strip_code_fence(str(result)))
OUTPUT_PATH.write_text(json.dumps(obj, ensure_ascii=False, indent=2), encoding="utf-8")
print(f"saved: {OUTPUT_PATH}")
print(json.dumps({
"service": obj.get("service"),
"severity": obj.get("severity"),
"evidence_count": len(obj.get("evidence", [])),
}, ensure_ascii=False))
if __name__ == "__main__":
main()
PY- ์ฑ๊ณตํ์ :
lab28_incident_agent.py์์ฑ- ์ฝ๋์
CodeAgent, JSON ์คํค๋ง,strip_code_fence()์กด์ฌ
5) ์คํ ๋ฐ ๊ฒฐ๊ณผ ์ ์ฅ
- ๋๊ตฌ: Python
- ์
๋ ฅ:
raw_log.txt - ์คํ๋ช ๋ น:
python lab28_incident_agent.py
cat incident_summary.json- ์ฑ๊ณตํ์ :
saved: incident_summary.json์ถ๋ ฅ- JSON์
severity,summary(3๊ฐ),immediate_actions(3๊ฐ)ํ์ธ
6) ํ์ง ๊ฒ์ดํธ(์ฌํ์ฑ ๊ฒ์ฆ)
- ๋๊ตฌ: Python
- ์
๋ ฅ:
incident_summary.json - ์คํ๋ช ๋ น:
python - <<'PY'
import json
obj = json.load(open('incident_summary.json', encoding='utf-8'))
assert obj.get('severity') in {'sev0','sev1','sev2','sev3'}, 'invalid severity'
assert isinstance(obj.get('summary'), list) and len(obj['summary']) == 3, 'summary must be 3'
assert isinstance(obj.get('immediate_actions'), list) and len(obj['immediate_actions']) == 3, 'immediate_actions must be 3'
assert isinstance(obj.get('evidence'), list) and len(obj['evidence']) >= 2, 'evidence must be >=2'
for ev in obj['evidence']:
assert 'line' in ev and 'reason' in ev, 'evidence item must include line/reason'
print('PASS: ํ์ง ๊ฒ์ดํธ ํต๊ณผ')
PY- ์ฑ๊ณตํ์ :
PASS: ํ์ง ๊ฒ์ดํธ ํต๊ณผ
ํธ๋ฌ๋ธ์ํ (์ค์ 5์ )
AuthenticationError/ ๋ชจ๋ธ ํธ์ถ ์คํจ
- ์์ธ: API ํค ๋ฏธ์ค์ , ๋ชจ๋ธ ID ์คํ
- ์ ๊ฒ:
python - <<'PY'
import os
print('OPENAI_API_KEY set =', bool(os.getenv('OPENAI_API_KEY')))
print('MODEL_ID =', os.getenv('MODEL_ID'))
PY- ์กฐ์น: ํ๊ฒฝ๋ณ์ ์ฌ์ค์ ํ ์ฌ์คํ
ModuleNotFoundError: smolagents
- ์์ธ: ๊ฐ์ํ๊ฒฝ ๋ฏธํ์ฑํ ๋๋ ์ค์น ๋๋ฝ
- ์กฐ์น:
source .venv/bin/activate
pip install -U "smolagents[toolkit]" litellmjson.loadsํ์ฑ ์คํจ
- ์์ธ: ๋ชจ๋ธ์ด JSON ์ธ ์ค๋ช ๋ฌธ์ฅ์ ์์ด ์ถ๋ ฅ
- ์กฐ์น:
- ํ๋กฌํํธ์
JSON ์ธ ํ ์คํธ ๊ธ์ง์ ์ง strip_code_fence()์ ์ง- ํ์ ์
max_steps๋ฅผ ์ค์ฌ ์ฐ๋งํ ์๋ต ๋ฐฉ์ง
- ํ๋กฌํํธ์
- ํ์ง ๊ฒ์ดํธ์์ summary/immediate_actions ๊ฐ์ ๋ถ์ผ์น
- ์์ธ: ์คํค๋ง ๊ฐ์ ๊ท์น์ด ์ฝํจ
- ์กฐ์น:
- ํ๋กฌํํธ ๊ท์น์
์ ํํ 3๊ฐ๋ฅผ ๋ช ์ - ์คํจ ์ ๋์ผ ์ ๋ ฅ์ผ๋ก ์ฌ์คํํ์ฌ ์ผ๊ด์ฑ ํ์ธ
- ํ๋กฌํํธ ๊ท์น์
- severity ๊ณผ๋/๊ณผ์ ๋ถ๋ฅ
- ์์ธ: ๋ก๊ทธ ์๊ฐ ์ ์ด ๋งฅ๋ฝ ๋ถ์กฑ
- ์กฐ์น:
- ๋ก๊ทธ 20~50์ค๋ก ํ์ฅํด ์ฌ์คํ
- ๊ฒฝ๊ณ /์ค๋ฅ/์ฅ์ ์๋ฆผ ๋ผ์ธ์ ๋ฐ๋์ ํฌํจ
์ฒดํฌ๋ฆฌ์คํธ
-
raw_log.txt์ค๋น -
lab28_incident_agent.py์คํ ์ฑ๊ณต -
incident_summary.json์ ์ฅ - ํ์ง ๊ฒ์ดํธ PASS
- ํธ๋ฌ๋ธ์ํ ํญ๋ชฉ ์ต์ 3๊ฐ ์ฌํ/์ ๊ฒ
์ฐธ๊ณ ๋งํฌ (์ฐ์ ์์)
- https://github.com/huggingface/agents-course
- https://huggingface.co/learn/agents-course
- https://huggingface.co/docs/smolagents
์์ฑํ AI ํ์ฉ ๊ณ ์ง
์ด ๋ฌธ์๋ ์์ฑํ AI๋ก ์ด์์ ์์ฑํ๊ณ , ์ฌ๋์ด ์ค์ต ์ฌํ์ฑ(๋๊ตฌ/์ ๋ ฅ/์คํ๋ช ๋ น/์ฑ๊ณตํ์ ), ํธ๋ฌ๋ธ์ํ , ๋งํฌ, ๋ด๋ถ ๋งํฌ๋ฅผ ๊ฒํ ยท์์ ํด ์ต์ข ํ์ ํ๋ค.