μ΄λ² νΈμ β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[μ¬λ κ²ν ν 곡μ ]
μ€μ΅ λͺ©ν
- smolagents
CodeAgentλ₯Ό μ€ννλ€. - CSVλ₯Ό μ½λ 컀μ€ν λꡬλ₯Ό μ°κ²°νλ€.
- μμ΄μ νΈκ° λΆμ ν
daily_report.mdλ₯Ό μ μ₯νκ² νλ€. - μ±κ³΅ νμ κΈ°μ€(νμΌ μμ±/ν΅μ¬ μμΉ ν¬ν¨)μΌλ‘ μ¬νμ±μ νμΈνλ€.
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.csv6 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_OK3κ° λͺ¨λ μΆλ ₯
5) μ΄λ³΄μμ© μ¬μ΄ μ€λͺ
@toolν¨μλ μμ΄μ νΈκ° μ¬μ©ν μ 무 λ²νΌμ΄λ€.- μ΄λ² μ€μ΅μ λ²νΌ 3κ°λ§ λ§λ λ€.
load_orders: μμ½ μμΉ κ³μ°top_products: μμ μν μ§κ³write_report: νμΌ μ μ₯
- μμ΄μ νΈλ βλ¬΄μ¨ λ²νΌμ μ΄λ€ μμλ‘ λλ₯Όμ§βλ₯Ό κ²°μ νκ³ , μ°λ¦¬λ μ±κ³΅νμ 체ν¬λ‘ κ²°κ³Όλ₯Ό κ²μ¦νλ€.
μ¦, LLMμ λ¬Έμ₯ νμ§μλ§ κΈ°λμ§ μκ³ , λꡬ μ€μ¬μΌλ‘ κ²°κ³Όλ¬Όμ κ³ μ νλ λ°©μμ΄λ€.
6) μ€λ¬΄ μ μ© ν¬μΈνΈ
- μΌμΌ 리ν¬νΈ μλν: μΌνλͺ°/κ΄κ³ /CS CSVλ₯Ό κ°μ ν¨ν΄μΌλ‘ λ³΄κ³ μν.
- κ²μ¦ κΈ°μ€ μ¬μ ν©μ:
νμΌ μμ± + ν΅μ¬ μ§ν ν¬ν¨κ°μ κΈ°μ€μ ν λ£°λ‘ κ³ μ . - ν΄λ¨Ό 리뷰 κ²μ΄νΈ: λ³΄κ³ μ νλ¨μ
human review requiredλ₯Ό λ£μ΄ 무κ²ν λ°°ν¬ λ°©μ§. - νμ₯ κ²½λ‘: λ€μ λ¨κ³μμ Slack/Notion μ λ‘λ λꡬλ₯Ό μΆκ°νλ©΄ μ΄μ μλνλ‘ μ°κ²° κ°λ₯.
체ν¬λ¦¬μ€νΈ
- κ°μνκ²½ μμ± λ°
smolagentsμ€μΉ μλ£ -
orders.csvμμ± νμΈ(6μ€) -
day16_csv_report.pyλ¬Έλ² κ²μ¬ ν΅κ³Ό - μ€ν ν
daily_report.mdμμ± -
total_revenueν¬ν¨ μ¬λΆ νμΈ - μ¬λμ΄ κ²°κ³Ό μμΉ 1ν κ²ν
μ°Έκ³ λ§ν¬ (μ°μ μμ)
- https://github.com/huggingface/agents-course
- https://huggingface.co/learn/agents-course
- https://huggingface.co/docs/smolagents
μμ±ν AI νμ© κ³ μ§
μ΄ λ¬Έμλ μμ±ν AIλ₯Ό νμ©ν΄ μ΄μμ μμ±νκ³ , μμ μ½λ/μ μ°¨/ννμ μ¬λ κ²ν ν νμ νλ€.