์ด๋ฒ ํธ์ **โ์ง๋ฌธ์ ๋ฐ์ ์น ๊ฒ์ โ ํต์ฌ 3์ค ์์ฝโ**๊น์ง ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ ์ต์ ์์ด์ ํธ๋ฅผ ๋ง๋ ๋ค.
ํต์ฌ์ ๋ณต์กํ ํ๋ ์์ํฌ๊ฐ ์๋๋ผ, ์ฌํ ๊ฐ๋ฅํ ์คํ ๋จ๊ณ์ ์ฑ๊ณต ํ์ ๊ธฐ์ค์ ๋จผ์ ๊ณ ์ ํ๋ ๊ฒ์ด๋ค.
- ์ด์ ํธ: HF-Agents-14-๋ณธํธ-07-ManagedAgent-์์-ํจํด๊ณผ-ํ-์ค์ผ์คํธ๋ ์ด์
- ๋ค์ ์ค์ต ํ์ฅ ํฌ์ธํธ: ๊ฒ์ ํ์ง ํ๊ฐ์
์ ๋ถ์ฌ
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- ์ฑ๊ณตํ์ :
- ๋๋ฝ ํจํค์ง/ํ๊ฒฝ๋ณ์๋ฅผ ์ฆ์ ์๋ณ ๊ฐ๋ฅ
์ค๋ฌด ์ ์ฉ ํฌ์ธํธ
- ์ถ๋ ฅ ๊ณ์ฝ(FINAL ๋ธ๋ก) ๊ณ ์
โ n8n/์คํฌ๋ฆฝํธ์์ ์์ ์ ์ผ๋ก ํ์ฑ ๊ฐ๋ฅ - ๋๊ตฌ 1๊ฐ๋ก ์์ ํ ํ์ฅ
โ ๊ฒ์ 1๊ฐ ์์ ํ ๋ค ๊ณ์ฐ/๋ฌธ์์์ฑ ํด ์ถ๊ฐ๊ฐ ์์ - ์ฑ๊ณตํ์ ๊ธฐ์ค์ ์ฝ๋ ์์ ๋ฌธ์ํ
โ ํ์ ๊ฐ โ์๋ํ๋คโ์ ๊ธฐ์ค์ ํต์ผ - ์ค๋ฅ ์ง๋จ ๋ช
๋ น์ ํจ๊ป ์ ๊ณต
โ ์ด๋ณด์ ์ง์ ๋น์ฉ์ ํฌ๊ฒ ์ค์
์์ฃผ ๋งํ๋ ๋ฌธ์ ์ ํด๊ฒฐ
-
AuthenticationError๋๋ ํค ๊ด๋ จ ์ค๋ฅ- ์์ธ: ํ๊ฒฝ๋ณ์ ๋ฏธ์ค์ /์คํ
- ํด๊ฒฐ:
export OPENAI_API_KEY=...์ฌ์ค์ ํ ๋์ผ ์ ธ์์ ์ฌ์คํ
-
๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ๋น์ด ์์
- ์์ธ: ๋คํธ์ํฌ ์ ํ ๋๋ ์ผ์์ ๊ฒ์ ์คํจ
- ํด๊ฒฐ: ์ง๋ฌธ์ ๋ ๊ตฌ์ฒดํ(๊ธฐ๊ฐ/ํค์๋ ์ถ๊ฐ), ์ ์ ํ ์ฌ์๋
-
์ถ๋ ฅ ํ์์ด FINAL ๊ณ์ฝ๊ณผ ๋ค๋ฆ
- ์์ธ: ์์คํ ํ๋กฌํํธ๊ฐ ์ฝํจ
- ํด๊ฒฐ: ํ์ ๊ฐ์ ๋ฌธ๊ตฌ(ํ๋๋ช /๊ฐ์) ๋ ๋ช ์
์ฒดํฌ๋ฆฌ์คํธ
- ๊ฐ์ํ๊ฒฝ ์์ฑ ๋ฐ ํจํค์ง ์ค์น ์๋ฃ
- API ํค/๋ชจ๋ธ ํ๊ฒฝ๋ณ์ ํ์ธ
-
python lesson15_web_summary_agent.py์ ์ ์ถ๋ ฅ -
FINAL๋ธ๋ก + ์ถ์ฒ URL 2๊ฐ ์ด์ ํ์ธ - ์คํจ ๋ณต๊ตฌ ๋ช ๋ น์ผ๋ก ์์ธ ์ฌํ ๊ฐ๋ฅ
์ฐธ๊ณ ๋งํฌ (์ฐ์ ์์)
- https://github.com/huggingface/agents-course
- https://huggingface.co/learn/agents-course
- https://huggingface.co/docs/smolagents
์์ฑํ AI ํ์ฉ ๊ณ ์ง
์ด ๋ฌธ์๋ ์์ฑํ AI๋ฅผ ํ์ฉํด ์ด์ ์์ฑ, ์ค์ต ์ ์ฐจ ๊ตฌ์กฐํ, ์์ ์ฝ๋ ์ ๋ฆฌ๋ฅผ ์ํํ์ผ๋ฉฐ, ์ต์ข ๋ฐํ ์ ์ฌ๋์ด ๋ช ๋ น ์ฌํ์ฑ๊ณผ ๋งํฌ ์ ํจ์ฑ์ ์ ๊ฒํ๋ค.