๐Ÿค— 35. HF Agents Course ๋ณธํŽธ 21 - smolagents ๋ฉ”๋ชจ๋ฆฌ๋กœ ์žฅ๊ธฐ ์ž‘์—… ์ปจํ…์ŠคํŠธ ์œ ์ง€ํ•˜๊ธฐ

์ด๋ฒˆ ํŽธ์—์„œ๋Š” smolagents ์—์ด์ „ํŠธ๊ฐ€ ์ด์ „ ์‹คํ–‰ ๋งฅ๋ฝ์„ ๊ธฐ์–ตํ•ด ๋‹ค์Œ ์ž‘์—… ์ •ํ™•๋„๋ฅผ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ์ฐธ๊ณ :

1) ์™œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ๊ฐ€

์ดˆ๋ณด์ž๊ฐ€ ๊ฐ€์žฅ ์ž์ฃผ ๊ฒช๋Š” ๋ฌธ์ œ๋Š” ๋‹ค์Œ์ž…๋‹ˆ๋‹ค.

  • ๊ฐ™์€ ์ง€์‹œ๋ฅผ ๋งค๋ฒˆ ๋‹ค์‹œ ์„ค๋ช…ํ•ด์•ผ ํ•จ
  • ์ด์ „ ์ถœ๋ ฅ ํ˜•์‹(JSON/ํ‘œ)์„ ๋‹ค์Œ ์‹คํ–‰์—์„œ ์žŠ์–ด๋ฒ„๋ฆผ
  • ์žฅ๊ธฐ ์—…๋ฌด(์ฃผ๊ฐ„ ๋ณด๊ณ , ํ‹ฐ์ผ“ ์ถ”์ )์—์„œ ๋งฅ๋ฝ ์†์‹ค

๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์„ค๊ณ„ํ•˜๋ฉด, ์—์ด์ „ํŠธ๊ฐ€ โ€œ์ด์ „ ๊ฒฐ๋ก /๊ทœ์น™/์ถœ๋ ฅ ๊ณ„์•ฝโ€์„ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

2) ์‹ค์Šต ๋ชฉํ‘œ

  • ๋ชฉํ‘œ: ๊ณ ๊ฐ๋ฌธ์˜ ์š”์•ฝ ์—์ด์ „ํŠธ๊ฐ€ priority_rule๊ณผ output_schema๋ฅผ ๊ธฐ์–ตํ•ด ์žฌ์‹คํ–‰ ์‹œ ์ผ๊ด€๋œ ๊ฒฐ๊ณผ ์ƒ์„ฑ
  • ์„ฑ๊ณต ํŒ์ •:
    1. 1์ฐจ ์‹คํ–‰์—์„œ ๊ทœ์น™ ์ €์žฅ
    2. 2์ฐจ ์‹คํ–‰์—์„œ ๊ทœ์น™ ์žฌ์„ค๋ช… ์—†์ด ๋™์ผ ์Šคํ‚ค๋งˆ ์ถœ๋ ฅ
    3. ๋กœ๊ทธ์— ๋ฉ”๋ชจ๋ฆฌ ๋กœ๋“œ/์ ์šฉ ํ”์  ํ™•์ธ

3) ์ค€๋น„๋ฌผ

  • ๋„๊ตฌ: Python 3.10+, venv, pip
  • ์ž…๋ ฅ ํŒŒ์ผ:
    • tickets_day1.txt
    • tickets_day2.txt
  • ์‹คํ–‰ ๋ช…๋ น:
python -m venv .venv
source .venv/bin/activate
pip install -U smolagents

4) ์žฌํ˜„ ๋‹จ๊ณ„

Step A. ์ž…๋ ฅ ์ค€๋น„

tickets_day1.txt

๊ฒฐ์ œ ์‹คํŒจ ๋ฌธ์˜ 3๊ฑด, ๋กœ๊ทธ์ธ ์˜ค๋ฅ˜ 1๊ฑด, ๊ธฐ๋Šฅ ์š”์ฒญ 1๊ฑด

tickets_day2.txt

๊ฒฐ์ œ ์‹คํŒจ ๋ฌธ์˜ 1๊ฑด, ํ™˜๋ถˆ ์š”์ฒญ 2๊ฑด, ๋กœ๊ทธ์ธ ์˜ค๋ฅ˜ 2๊ฑด

Step B. ์—์ด์ „ํŠธ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ

memory_agent.py

from smolagents import CodeAgent
from pathlib import Path
import json
 
MEMORY_FILE = Path("agent_memory.json")
 
def load_memory():
    if MEMORY_FILE.exists():
        return json.loads(MEMORY_FILE.read_text(encoding="utf-8"))
    return {
        "priority_rule": "๊ฒฐ์ œ/ํ™˜๋ถˆ > ๋กœ๊ทธ์ธ > ๊ธฐ๋Šฅ์š”์ฒญ",
        "output_schema": ["date", "top_issue", "action"]
    }
 
def save_memory(mem):
    MEMORY_FILE.write_text(json.dumps(mem, ensure_ascii=False, indent=2), encoding="utf-8")
 
memory = load_memory()
agent = CodeAgent(tools=[])
 
def run(ticket_text, date):
    prompt = f"""
๊ทœ์น™:
- ์šฐ์„ ์ˆœ์œ„: {memory['priority_rule']}
- ์ถœ๋ ฅํ‚ค: {memory['output_schema']}
 
์ž…๋ ฅ: {ticket_text}
์š”์ฒญ: ์œ„ ๊ทœ์น™์— ๋”ฐ๋ผ JSON 1๊ฐœ๋งŒ ์ถœ๋ ฅ
date๋Š” {date}๋กœ ์ฑ„์›Œ๋ผ.
"""
    result = agent.run(prompt)
    return result
 
print(run(Path("tickets_day1.txt").read_text(encoding="utf-8"), "2026-05-26"))
save_memory(memory)

Step C. ์‹คํ–‰

python memory_agent.py

Step D. 2์ฐจ ์‹คํ–‰(์ž…๋ ฅ๋งŒ ๊ต์ฒด)

memory_agent.py ๋งˆ์ง€๋ง‰ ์ค„ ์ž…๋ ฅ ํŒŒ์ผ๋งŒ tickets_day2.txt๋กœ ๋ฐ”๊ฟ” ์žฌ์‹คํ–‰:

python memory_agent.py

5) ์„ฑ๊ณต ํŒ์ • ์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ๋‘ ์‹คํ–‰ ๋ชจ๋‘ JSON ๋‹จ์ผ ๊ฐ์ฒด ์ถœ๋ ฅ
  • ํ‚ค๊ฐ€ date/top_issue/action ์ˆœ์„œ๋กœ ์œ ์ง€
  • day2 ์‹คํ–‰์—์„œ๋„ ์šฐ์„ ์ˆœ์œ„ ๊ทœ์น™(๊ฒฐ์ œ/ํ™˜๋ถˆ ์šฐ์„ )์ด ๋ฐ˜์˜
  • agent_memory.json ํŒŒ์ผ ์กด์žฌ

6) ๋™์ž‘ ๊ตฌ์กฐ

flowchart TD
    A[ํ‹ฐ์ผ“ ์ž…๋ ฅ ํŒŒ์ผ] --> B[๋ฉ”๋ชจ๋ฆฌ ๋กœ๋“œ agent_memory.json]
    B --> C[CodeAgent ํ”„๋กฌํ”„ํŠธ ๊ตฌ์„ฑ]
    C --> D[๋ชจ๋ธ ์ถ”๋ก ]
    D --> E[JSON ์ถœ๋ ฅ]
    E --> F[๋ฉ”๋ชจ๋ฆฌ ์œ ์ง€/์—…๋ฐ์ดํŠธ]

7) ์‹ค๋ฌด ์ ์šฉ ํฌ์ธํŠธ

  1. ์ถœ๋ ฅ ๊ณ„์•ฝ ๊ณ ์ •: ์ž๋™ํ™” ์—ฐ๋™(n8n, ETL)์—์„œ๋Š” ํ‚ค ์ด๋ฆ„/์ˆœ์„œ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๊ณ ์ •.
  2. ์šฐ์„ ์ˆœ์œ„ ๊ทœ์น™ ๋ถ„๋ฆฌ: ์ •์ฑ… ๋ณ€๊ฒฝ ์‹œ ์ฝ”๋“œ ์ˆ˜์ • ๋Œ€์‹  ๋ฉ”๋ชจ๋ฆฌ ๊ฐ’๋งŒ ๊ฐฑ์‹ .
  3. ํšŒ๊ท€ ํ…Œ์ŠคํŠธ: ์ƒ˜ํ”Œ ์ž…๋ ฅ 3~5๊ฐœ๋กœ ์žฌ์‹คํ–‰ํ•ด ํฌ๋งท ์ผ๊ด€์„ฑ ์ ๊ฒ€.

8) ์ž์ฃผ ๋‚˜๋Š” ์‹ค์ˆ˜

  • ๋ฉ”๋ชจ๋ฆฌ ํŒŒ์ผ์„ ํ”„๋กฌํ”„ํŠธ์— ๋ฐ˜์˜ํ•˜์ง€ ์•Š์Œ โ†’ ๋‹จ์ˆœ ์ €์žฅ๋งŒ ํ•˜๊ณ  ๋ฏธ์‚ฌ์šฉ
  • ์„ฑ๊ณต ํŒ์ • ์—†์ด โ€œ๋Œ€์ถฉ ์ข‹์•„ ๋ณด์ž„โ€์œผ๋กœ ์ข…๋ฃŒ โ†’ ์šด์˜ ์‹œ ํ’ˆ์งˆ ํ”๋“ค๋ฆผ
  • ์ž…๋ ฅ ํฌ๋งท์ด ๋ฐ”๋€Œ์—ˆ๋Š”๋ฐ ์Šคํ‚ค๋งˆ ๊ณ ์ •๋งŒ ์œ ์ง€ โ†’ ํŒŒ์„œ ์˜ค๋ฅ˜

์ƒ์„ฑํ˜• AI ํ™œ์šฉ ๊ณ ์ง€

์ด ๋ฌธ์„œ๋Š” ์ƒ์„ฑํ˜• AI๋ฅผ ํ™œ์šฉํ•ด ์ดˆ์•ˆ์„ ๋งŒ๋“ค๊ณ , ์‹ค์Šต ์žฌํ˜„์„ฑ(๋ช…๋ น/์ž…๋ ฅ/์„ฑ๊ณตํŒ์ •)๊ณผ ๋งํฌ๋ฅผ ์‚ฌ๋žŒ์ด ๊ฒ€์ˆ˜ํ•ด ๋ณด์™„ํ–ˆ์Šต๋‹ˆ๋‹ค.