์ด๋ฒˆ ํŽธ์€ โ€œCSV ์›๋ณธ โ†’ ์—์ด์ „ํŠธ ๋ถ„์„ โ†’ Markdown ๋ณด๊ณ ์„œ ์ €์žฅโ€ ํ๋ฆ„์„ ํ•œ ๋ฒˆ์— ์žฌํ˜„ํ•œ๋‹ค.
ํ•ต์‹ฌ์€ ํ™”๋ คํ•œ ๋ฐ๋ชจ๊ฐ€ ์•„๋‹ˆ๋ผ, ํŒ€์—์„œ ๋งค์ผ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ์ž๋™ํ™” ํŒจํ„ด์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

flowchart LR
  A[orders.csv ์ž…๋ ฅ] --> B[CodeAgent]
  B --> C[load_orders ๋„๊ตฌ]
  B --> D[top_products ๋„๊ตฌ]
  B --> E[write_report ๋„๊ตฌ]
  E --> F[daily_report.md ์ƒ์„ฑ]
  F --> G[์‚ฌ๋žŒ ๊ฒ€ํ†  ํ›„ ๊ณต์œ ]

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

  1. smolagents CodeAgent๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  2. CSV๋ฅผ ์ฝ๋Š” ์ปค์Šคํ…€ ๋„๊ตฌ๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค.
  3. ์—์ด์ „ํŠธ๊ฐ€ ๋ถ„์„ ํ›„ daily_report.md๋ฅผ ์ €์žฅํ•˜๊ฒŒ ํ•œ๋‹ค.
  4. ์„ฑ๊ณต ํŒ์ • ๊ธฐ์ค€(ํŒŒ์ผ ์ƒ์„ฑ/ํ•ต์‹ฌ ์ˆ˜์น˜ ํฌํ•จ)์œผ๋กœ ์žฌํ˜„์„ฑ์„ ํ™•์ธํ•œ๋‹ค.

1) ์ค€๋น„

Step 1-1. ์ž‘์—… ํด๋” ์ƒ์„ฑ

  • ๋„๊ตฌ: ํ„ฐ๋ฏธ๋„
  • ์ž…๋ ฅ: ์—†์Œ
  • ์‹คํ–‰๋ช…๋ น:
mkdir -p ~/hf-agents-day16 && cd ~/hf-agents-day16
  • ์„ฑ๊ณตํŒ์ •: pwd๊ฐ€ ~/hf-agents-day16

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. CSV ์ƒ์„ฑ

  • ๋„๊ตฌ: ํ…์ŠคํŠธ ํŒŒ์ผ
  • ์ž…๋ ฅ: ์•„๋ž˜ ๋‚ด์šฉ
  • ์‹คํ–‰๋ช…๋ น:
cat <<'CSV' > orders.csv
order_id,product,qty,unit_price,channel
1001,Keyboard,2,45000,smartstore
1002,Mouse,1,25000,coupang
1003,Keyboard,1,45000,smartstore
1004,Monitor,1,220000,11st
1005,Mouse,3,25000,coupang
CSV
  • ์„ฑ๊ณตํŒ์ •:
wc -l orders.csv

6 orders.csv์ด๋ฉด ์ •์ƒ(ํ—ค๋” 1 + ๋ฐ์ดํ„ฐ 5)


3) ์—์ด์ „ํŠธ ์ฝ”๋“œ ์ž‘์„ฑ

Step 3-1. day16_csv_report.py ์ €์žฅ

  • ๋„๊ตฌ: Python ํŒŒ์ผ
  • ์ž…๋ ฅ: ์•„๋ž˜ ์ฝ”๋“œ
  • ์‹คํ–‰๋ช…๋ น: ํŒŒ์ผ ์ƒ์„ฑ ํ›„ ์ €์žฅ
import csv
import json
from collections import Counter
from pathlib import Path
 
from smolagents import CodeAgent, HfApiModel, tool
 
 
@tool
def load_orders(csv_path: str) -> str:
    """์ฃผ๋ฌธ CSV๋ฅผ ์ฝ์–ด ์ด๋งค์ถœ/์ด์ˆ˜๋Ÿ‰/์ฃผ๋ฌธ๊ฑด์ˆ˜๋ฅผ JSON ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค."""
    rows = []
    with open(csv_path, "r", encoding="utf-8") as f:
        reader = csv.DictReader(f)
        rows = list(reader)
 
    total_qty = 0
    total_revenue = 0
    for r in rows:
        qty = int(r["qty"])
        unit_price = int(r["unit_price"])
        total_qty += qty
        total_revenue += qty * unit_price
 
    return json.dumps(
        {
            "orders": len(rows),
            "total_qty": total_qty,
            "total_revenue": total_revenue,
        },
        ensure_ascii=False,
    )
 
 
@tool
def top_products(csv_path: str, top_n: int = 3) -> str:
    """ํŒ๋งค์ˆ˜๋Ÿ‰ ๊ธฐ์ค€ ์ƒ์œ„ ์ƒํ’ˆ์„ JSON ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค."""
    counter = Counter()
    with open(csv_path, "r", encoding="utf-8") as f:
        reader = csv.DictReader(f)
        for r in reader:
            counter[r["product"]] += int(r["qty"])
 
    top = counter.most_common(top_n)
    return json.dumps(
        [{"product": p, "qty": q} for p, q in top],
        ensure_ascii=False,
    )
 
 
@tool
def write_report(path: str, content: str) -> str:
    """๋งˆํฌ๋‹ค์šด ๋ฆฌํฌํŠธ๋ฅผ ํŒŒ์ผ๋กœ ์ €์žฅํ•œ๋‹ค."""
    Path(path).write_text(content, encoding="utf-8")
    return f"saved:{path}"
 
 
def build_agent() -> CodeAgent:
    model = HfApiModel("Qwen/Qwen2.5-72B-Instruct")
    return CodeAgent(
        tools=[load_orders, top_products, write_report],
        model=model,
        max_steps=6,
    )
 
 
if __name__ == "__main__":
    agent = build_agent()
    prompt = """
๋‹ค์Œ ์ž‘์—…์„ ์ˆœ์„œ๋Œ€๋กœ ์ˆ˜ํ–‰ํ•ด์ค˜.
1) orders.csv๋ฅผ ์ฝ์–ด์„œ ์ด์ฃผ๋ฌธ๊ฑด์ˆ˜, ์ด์ˆ˜๋Ÿ‰, ์ด๋งค์ถœ์„ ๊ณ„์‚ฐ
2) ํŒ๋งค์ˆ˜๋Ÿ‰ ๊ธฐ์ค€ ์ƒ์œ„ 2๊ฐœ ์ƒํ’ˆ ์ถ”์ถœ
3) ์•„๋ž˜ ํ˜•์‹์˜ Markdown์„ ๋งŒ๋“ค์–ด daily_report.md๋กœ ์ €์žฅ
 
ํ˜•์‹:
# Daily Sales Report
- orders: <์ˆซ์ž>
- total_qty: <์ˆซ์ž>
- total_revenue: <์ˆซ์ž>
- top_products: <์ƒํ’ˆ๋ช…(์ˆ˜๋Ÿ‰), ์ƒํ’ˆ๋ช…(์ˆ˜๋Ÿ‰)>
- note: ์ž๋™ ์ƒ์„ฑ ๋ฆฌํฌํŠธ (human review required)
 
๋ฐ˜๋“œ์‹œ write_report ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœํ•ด ํŒŒ์ผ์„ ์ €์žฅํ•ด.
"""
 
    result = agent.run(prompt)
    print("[AGENT_RESULT]", result)
  • ์„ฑ๊ณตํŒ์ •:
python -m py_compile day16_csv_report.py

์˜ค๋ฅ˜ ์—†์ด ์ข…๋ฃŒ๋˜๋ฉด ํ†ต๊ณผ.


4) ์‹คํ–‰ ๋ฐ ๊ฒ€์ฆ

Step 4-1. ์—์ด์ „ํŠธ ์‹คํ–‰

  • ๋„๊ตฌ: day16_csv_report.py
  • ์ž…๋ ฅ: orders.csv
  • ์‹คํ–‰๋ช…๋ น:
python day16_csv_report.py
  • ์„ฑ๊ณตํŒ์ •: ์ถœ๋ ฅ์— saved:daily_report.md ๋˜๋Š” daily_report.md ์ €์žฅ ๋ฉ”์‹œ์ง€ ํฌํ•จ

Step 4-2. ๊ฒฐ๊ณผ ํŒŒ์ผ ๊ฒ€์ฆ

  • ๋„๊ตฌ: ํ„ฐ๋ฏธ๋„
  • ์ž…๋ ฅ: ์ƒ์„ฑ๋œ daily_report.md
  • ์‹คํ–‰๋ช…๋ น:
test -f daily_report.md && echo "FILE_OK"
grep -E "^# Daily Sales Report" daily_report.md && echo "TITLE_OK"
grep -E "total_revenue" daily_report.md && echo "METRIC_OK"
  • ์„ฑ๊ณตํŒ์ •: FILE_OK, TITLE_OK, METRIC_OK 3๊ฐœ ๋ชจ๋‘ ์ถœ๋ ฅ

5) ์ดˆ๋ณด์ž์šฉ ์‰ฌ์šด ์„ค๋ช…

  • @tool ํ•จ์ˆ˜๋Š” ์—์ด์ „ํŠธ๊ฐ€ ์‚ฌ์šฉํ•  ์—…๋ฌด ๋ฒ„ํŠผ์ด๋‹ค.
  • ์ด๋ฒˆ ์‹ค์Šต์€ ๋ฒ„ํŠผ 3๊ฐœ๋งŒ ๋งŒ๋“ ๋‹ค.
    • load_orders: ์š”์•ฝ ์ˆ˜์น˜ ๊ณ„์‚ฐ
    • top_products: ์ƒ์œ„ ์ƒํ’ˆ ์ง‘๊ณ„
    • write_report: ํŒŒ์ผ ์ €์žฅ
  • ์—์ด์ „ํŠธ๋Š” โ€œ๋ฌด์Šจ ๋ฒ„ํŠผ์„ ์–ด๋–ค ์ˆœ์„œ๋กœ ๋ˆ„๋ฅผ์ง€โ€๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ , ์šฐ๋ฆฌ๋Š” ์„ฑ๊ณตํŒ์ • ์ฒดํฌ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ฆํ•œ๋‹ค.

์ฆ‰, LLM์˜ ๋ฌธ์žฅ ํ’ˆ์งˆ์—๋งŒ ๊ธฐ๋Œ€์ง€ ์•Š๊ณ , ๋„๊ตฌ ์ค‘์‹ฌ์œผ๋กœ ๊ฒฐ๊ณผ๋ฌผ์„ ๊ณ ์ •ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.


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

  1. ์ผ์ผ ๋ฆฌํฌํŠธ ์ž๋™ํ™”: ์‡ผํ•‘๋ชฐ/๊ด‘๊ณ /CS CSV๋ฅผ ๊ฐ™์€ ํŒจํ„ด์œผ๋กœ ๋ณด๊ณ ์„œํ™”.
  2. ๊ฒ€์ฆ ๊ธฐ์ค€ ์‚ฌ์ „ํ•ฉ์˜: ํŒŒ์ผ ์ƒ์„ฑ + ํ•ต์‹ฌ ์ง€ํ‘œ ํฌํ•จ ๊ฐ™์€ ๊ธฐ์ค€์„ ํŒ€ ๋ฃฐ๋กœ ๊ณ ์ •.
  3. ํœด๋จผ ๋ฆฌ๋ทฐ ๊ฒŒ์ดํŠธ: ๋ณด๊ณ ์„œ ํ•˜๋‹จ์— human review required๋ฅผ ๋„ฃ์–ด ๋ฌด๊ฒ€ํ†  ๋ฐฐํฌ ๋ฐฉ์ง€.
  4. ํ™•์žฅ ๊ฒฝ๋กœ: ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ Slack/Notion ์—…๋กœ๋“œ ๋„๊ตฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์šด์˜ ์ž๋™ํ™”๋กœ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ.

์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ ๋ฐ smolagents ์„ค์น˜ ์™„๋ฃŒ
  • orders.csv ์ƒ์„ฑ ํ™•์ธ(6์ค„)
  • day16_csv_report.py ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ ํ†ต๊ณผ
  • ์‹คํ–‰ ํ›„ daily_report.md ์ƒ์„ฑ
  • total_revenue ํฌํ•จ ์—ฌ๋ถ€ ํ™•์ธ
  • ์‚ฌ๋žŒ์ด ๊ฒฐ๊ณผ ์ˆ˜์น˜ 1ํšŒ ๊ฒ€ํ† 

์ฐธ๊ณ  ๋งํฌ (์šฐ์„ ์ˆœ์œ„)

  1. https://github.com/huggingface/agents-course
  2. https://huggingface.co/learn/agents-course
  3. https://huggingface.co/docs/smolagents

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

์ด ๋ฌธ์„œ๋Š” ์ƒ์„ฑํ˜• AI๋ฅผ ํ™œ์šฉํ•ด ์ดˆ์•ˆ์„ ์ž‘์„ฑํ–ˆ๊ณ , ์˜ˆ์‹œ ์ฝ”๋“œ/์ ˆ์ฐจ/ํ‘œํ˜„์€ ์‚ฌ๋žŒ ๊ฒ€ํ†  ํ›„ ํ™•์ •ํ–ˆ๋‹ค.