์ด๋ฒˆ ํŽธ์€ **โ€œ์งˆ๋ฌธ์„ ๋ฐ›์•„ ์›น ๊ฒ€์ƒ‰ โ†’ ํ•ต์‹ฌ 3์ค„ ์š”์•ฝโ€**๊นŒ์ง€ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์ตœ์†Œ ์—์ด์ „ํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค.
ํ•ต์‹ฌ์€ ๋ณต์žกํ•œ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์•„๋‹ˆ๋ผ, ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์‹คํ–‰ ๋‹จ๊ณ„์™€ ์„ฑ๊ณต ํŒ์ • ๊ธฐ์ค€์„ ๋จผ์ € ๊ณ ์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํ•œ ์ค„ ๊ฒฐ๋ก 

์ดˆ๋ณด์ž๋Š” โ€œ์ž‘๋™ํ•˜๋Š” 1๊ฐœ ์—์ด์ „ํŠธ + ๋ช…ํ™•ํ•œ ์„ฑ๊ณตํŒ์ •โ€๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฉด, ์ดํ›„ ๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ ํ™•์žฅ์ด ํ›จ์”ฌ ์‰ฌ์›Œ์ง„๋‹ค.

flowchart LR
  U[์‚ฌ์šฉ์ž ์งˆ๋ฌธ] --> A[CodeAgent]
  A --> T[WebSearchTool ํ˜ธ์ถœ]
  T --> R[๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ]
  R --> S[3์ค„ ์š”์•ฝ ์ƒ์„ฑ]
  S --> O[์ตœ์ข… ์‘๋‹ต + ์ถœ์ฒ˜]

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

  • smolagents ๊ธฐ๋ฐ˜ ์ตœ์†Œ ์›น๊ฒ€์ƒ‰ ์š”์•ฝ ์—์ด์ „ํŠธ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  • ์ž…๋ ฅ/์ถœ๋ ฅ ๊ณ„์•ฝ์„ ๊ณ ์ •ํ•ด ์‹คํŒจ ์›์ธ์„ ๋น ๋ฅด๊ฒŒ ์ง„๋‹จํ•œ๋‹ค.
  • ์‹คํ–‰ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ๋ˆˆ์œผ๋กœ ํ™•์ธ ๊ฐ€๋Šฅํ•œ ๊ธฐ์ค€์œผ๋กœ ํŒ์ •ํ•œ๋‹ค.

์ค€๋น„๋ฌผ

  • ๋„๊ตฌ: Python 3.10+, ํ„ฐ๋ฏธ๋„, ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ
  • ์ž…๋ ฅ: ๋ชจ๋ธ API ํ‚ค 1๊ฐœ (์˜ˆ: OpenAI ํ˜ธํ™˜ ํ‚ค)
  • ์ž‘์—… ํด๋” ์˜ˆ์‹œ: ~/hf-agents-lesson15

์‹ค๋ฌด ํŒ: ํŒ€ ์˜จ๋ณด๋”ฉ ๋ฌธ์„œ์—๋Š” โ€œ์ง€์› Python ๋ฒ„์ „โ€๊ณผ โ€œ๊ฒ€์ฆํ•œ ํŒจํ‚ค์ง€ ๋ฒ„์ „โ€์„ ๊ฐ™์ด ๋‚จ๊ธฐ๋ฉด ์žฌํ˜„๋ฅ ์ด ์˜ฌ๋ผ๊ฐ„๋‹ค.


1) ํ™˜๊ฒฝ ์ค€๋น„

  • ๋„๊ตฌ: ํ„ฐ๋ฏธ๋„
  • ์ž…๋ ฅ: ๊ฐ€์ƒํ™˜๊ฒฝ + ํŒจํ‚ค์ง€ ์„ค์น˜
  • ์‹คํ–‰๋ช…๋ น:
mkdir -p ~/hf-agents-lesson15
cd ~/hf-agents-lesson15
python3 -m venv .venv
source .venv/bin/activate
pip install -U smolagents litellm duckduckgo-search
  • ์„ฑ๊ณตํŒ์ •:
    • (.venv) ํ”„๋กฌํ”„ํŠธ ํ‘œ์‹œ
    • pip ์„ค์น˜ ์—๋Ÿฌ ์—†์Œ

2) ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •

  • ๋„๊ตฌ: ํ„ฐ๋ฏธ๋„
  • ์ž…๋ ฅ: API ํ‚ค
  • ์‹คํ–‰๋ช…๋ น:
export OPENAI_API_KEY="YOUR_API_KEY"
# ํ•„์š” ์‹œ ๋ชจ๋ธ๋ช…๋„ ๋ช…์‹œ
export MODEL_ID="openai/gpt-4o-mini"
  • ์„ฑ๊ณตํŒ์ •:
    • echo $OPENAI_API_KEY | wc -c ๊ฒฐ๊ณผ๊ฐ€ 1๋ณด๋‹ค ํผ

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

  • ๋„๊ตฌ: ์—๋””ํ„ฐ ๋˜๋Š” ํ„ฐ๋ฏธ๋„
  • ์ž…๋ ฅ: ์•„๋ž˜ ์ฝ”๋“œ
  • ์‹คํ–‰๋ช…๋ น:
cat > lesson15_web_summary_agent.py <<'PY'
from __future__ import annotations
 
import os
from smolagents import CodeAgent, DuckDuckGoSearchTool, LiteLLMModel
 
 
def build_agent() -> CodeAgent:
    model_id = os.getenv("MODEL_ID", "openai/gpt-4o-mini")
    model = LiteLLMModel(model_id=model_id)
    tools = [DuckDuckGoSearchTool()]
 
    system_prompt = """
๋„ˆ๋Š” ์‹ค๋ฌดํ˜• ๋ฆฌ์„œ์น˜ ๋ณด์กฐ ์—์ด์ „ํŠธ๋‹ค.
๋ฐ˜๋“œ์‹œ ์•„๋ž˜ ํ˜•์‹์œผ๋กœ ๋‹ตํ•ด๋ผ.
FINAL:
- summary_1: ...
- summary_2: ...
- summary_3: ...
- sources: [URL1, URL2]
""".strip()
 
    return CodeAgent(
        tools=tools,
        model=model,
        additional_authorized_imports=["json", "re"],
        system_prompt=system_prompt,
    )
 
 
def main() -> None:
    question = "2026๋…„ AI ์—์ด์ „ํŠธ ๋„์ž… ์‹œ ์ค‘์†ŒํŒ€์ด ๋จผ์ € ์–ป๋Š” ์šด์˜์ƒ ์ด์  3๊ฐ€์ง€๋ฅผ ์„ค๋ช…ํ•ด์ค˜"
    agent = build_agent()
    result = agent.run(question)
    print(result)
 
 
if __name__ == "__main__":
    main()
PY
  • ์„ฑ๊ณตํŒ์ •:
    • lesson15_web_summary_agent.py ํŒŒ์ผ ์ƒ์„ฑ
    • ์ฝ”๋“œ์— DuckDuckGoSearchTool, CodeAgent ํฌํ•จ

4) ์‹คํ–‰

  • ๋„๊ตฌ: Python
  • ์ž…๋ ฅ: ์‚ฌ์šฉ์ž ์งˆ๋ฌธ 1๊ฐœ(์ฝ”๋“œ ๋‚ด ๊ธฐ๋ณธ๊ฐ’)
  • ์‹คํ–‰๋ช…๋ น:
python lesson15_web_summary_agent.py
  • ์„ฑ๊ณตํŒ์ •:
    • ์ถœ๋ ฅ์— FINAL: ๋ฌธ์ž์—ด ํฌํ•จ
    • summary_1~3 ํ•ญ๋ชฉ ์กด์žฌ
    • sources์— URL 2๊ฐœ ์ด์ƒ ํฌํ•จ

5) ์‹คํŒจ ๋ณต๊ตฌ(์ดˆ๋ณด์ž ํ•„์ˆ˜)

  • ๋„๊ตฌ: ํ„ฐ๋ฏธ๋„
  • ์ž…๋ ฅ: ์—๋Ÿฌ ์œ ํ˜•๋ณ„ ์ ๊ฒ€
  • ์‹คํ–‰๋ช…๋ น:
# ํŒจํ‚ค์ง€ ํ™•์ธ
pip show smolagents litellm duckduckgo-search
 
# ํ‚ค ํ™•์ธ
python - <<'PY'
import os
print("OPENAI_API_KEY exists:", bool(os.getenv("OPENAI_API_KEY")))
print("MODEL_ID:", os.getenv("MODEL_ID", "openai/gpt-4o-mini"))
PY
  • ์„ฑ๊ณตํŒ์ •:
    • ๋ˆ„๋ฝ ํŒจํ‚ค์ง€/ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ฆ‰์‹œ ์‹๋ณ„ ๊ฐ€๋Šฅ

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

  1. ์ถœ๋ ฅ ๊ณ„์•ฝ(FINAL ๋ธ”๋ก) ๊ณ ์ •
    โ†’ n8n/์Šคํฌ๋ฆฝํŠธ์—์„œ ์•ˆ์ •์ ์œผ๋กœ ํŒŒ์‹ฑ ๊ฐ€๋Šฅ
  2. ๋„๊ตฌ 1๊ฐœ๋กœ ์‹œ์ž‘ ํ›„ ํ™•์žฅ
    โ†’ ๊ฒ€์ƒ‰ 1๊ฐœ ์•ˆ์ •ํ™” ๋’ค ๊ณ„์‚ฐ/๋ฌธ์„œ์ž‘์„ฑ ํˆด ์ถ”๊ฐ€๊ฐ€ ์•ˆ์ „
  3. ์„ฑ๊ณตํŒ์ • ๊ธฐ์ค€์„ ์ฝ”๋“œ ์˜†์— ๋ฌธ์„œํ™”
    โ†’ ํŒ€์› ๊ฐ„ โ€œ์ž‘๋™ํ•œ๋‹คโ€์˜ ๊ธฐ์ค€์„ ํ†ต์ผ
  4. ์˜ค๋ฅ˜ ์ง„๋‹จ ๋ช…๋ น์„ ํ•จ๊ป˜ ์ œ๊ณต
    โ†’ ์ดˆ๋ณด์ž ์ง€์› ๋น„์šฉ์„ ํฌ๊ฒŒ ์ค„์ž„

์ž์ฃผ ๋ง‰ํžˆ๋Š” ๋ฌธ์ œ์™€ ํ•ด๊ฒฐ

  1. AuthenticationError ๋˜๋Š” ํ‚ค ๊ด€๋ จ ์˜ค๋ฅ˜

    • ์›์ธ: ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋ฏธ์„ค์ •/์˜คํƒ€
    • ํ•ด๊ฒฐ: export OPENAI_API_KEY=... ์žฌ์„ค์ • ํ›„ ๋™์ผ ์…ธ์—์„œ ์žฌ์‹คํ–‰
  2. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ๋น„์–ด ์žˆ์Œ

    • ์›์ธ: ๋„คํŠธ์›Œํฌ ์ œํ•œ ๋˜๋Š” ์ผ์‹œ์  ๊ฒ€์ƒ‰ ์‹คํŒจ
    • ํ•ด๊ฒฐ: ์งˆ๋ฌธ์„ ๋” ๊ตฌ์ฒดํ™”(๊ธฐ๊ฐ„/ํ‚ค์›Œ๋“œ ์ถ”๊ฐ€), ์ž ์‹œ ํ›„ ์žฌ์‹œ๋„
  3. ์ถœ๋ ฅ ํ˜•์‹์ด FINAL ๊ณ„์•ฝ๊ณผ ๋‹ค๋ฆ„

    • ์›์ธ: ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ์•ฝํ•จ
    • ํ•ด๊ฒฐ: ํ˜•์‹ ๊ฐ•์ œ ๋ฌธ๊ตฌ(ํ•„๋“œ๋ช…/๊ฐœ์ˆ˜) ๋” ๋ช…์‹œ

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

  • ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ ๋ฐ ํŒจํ‚ค์ง€ ์„ค์น˜ ์™„๋ฃŒ
  • API ํ‚ค/๋ชจ๋ธ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํ™•์ธ
  • python lesson15_web_summary_agent.py ์ •์ƒ ์ถœ๋ ฅ
  • FINAL ๋ธ”๋ก + ์ถœ์ฒ˜ URL 2๊ฐœ ์ด์ƒ ํ™•์ธ
  • ์‹คํŒจ ๋ณต๊ตฌ ๋ช…๋ น์œผ๋กœ ์›์ธ ์žฌํ˜„ ๊ฐ€๋Šฅ

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

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

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

์ด ๋ฌธ์„œ๋Š” ์ƒ์„ฑํ˜• AI๋ฅผ ํ™œ์šฉํ•ด ์ดˆ์•ˆ ์ž‘์„ฑ, ์‹ค์Šต ์ ˆ์ฐจ ๊ตฌ์กฐํ™”, ์˜ˆ์ œ ์ฝ”๋“œ ์ •๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์œผ๋ฉฐ, ์ตœ์ข… ๋ฐœํ–‰ ์ „ ์‚ฌ๋žŒ์ด ๋ช…๋ น ์žฌํ˜„์„ฑ๊ณผ ๋งํฌ ์œ ํšจ์„ฑ์„ ์ ๊ฒ€ํ–ˆ๋‹ค.