이번 νŽΈμ€ **β€œμ§ˆλ¬Έμ„ λ°›μ•„ μ›Ή 검색 β†’ 핡심 3쀄 μš”μ•½β€**κΉŒμ§€ μžλ™μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ” μ΅œμ†Œ μ—μ΄μ „νŠΈλ₯Ό λ§Œλ“ λ‹€.
핡심은 λ³΅μž‘ν•œ ν”„λ ˆμž„μ›Œν¬κ°€ μ•„λ‹ˆλΌ, μž¬ν˜„ κ°€λŠ₯ν•œ μ‹€ν–‰ 단계와 성곡 νŒμ • 기쀀을 λ¨Όμ € κ³ μ •ν•˜λŠ” 것이닀.

  • 이전 편: πŸ€— 14. 본편 07
  • λ‹€μŒ μ‹€μŠ΅ ν™•μž₯ 포인트: 검색 ν’ˆμ§ˆ 평가셋을 λΆ™μ—¬ eval μžλ™ν™”

ν•œ 쀄 κ²°λ‘ 

μ΄ˆλ³΄μžλŠ” β€œμž‘λ™ν•˜λŠ” 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λ₯Ό ν™œμš©ν•΄ μ΄ˆμ•ˆ μž‘μ„±, μ‹€μŠ΅ 절차 ꡬ쑰화, 예제 μ½”λ“œ 정리λ₯Ό μˆ˜ν–‰ν–ˆμœΌλ©°, μ΅œμ’… λ°œν–‰ μ „ μ‚¬λžŒμ΄ λͺ…λ Ή μž¬ν˜„μ„±κ³Ό 링크 μœ νš¨μ„±μ„ μ κ²€ν–ˆλ‹€.