๋ชฉํ
Hugging Face Agents Course ํ๋ฆ์ ๋ฐ๋ผ, smolagents ๊ธฐ๋ฐ ๋ฏธ๋ ํ๋ก์ ํธ(๋๊ตฌํ ์์ด์ ํธ)๋ฅผ ๋ก์ปฌ์์ ์ฌํ ๊ฐ๋ฅํ๊ฒ ๋๊น์ง ์คํํฉ๋๋ค.
์ฐธ๊ณ (์ฐ์ ์์):
- https://github.com/huggingface/agents-course
- https://huggingface.co/learn/agents-course
- https://huggingface.co/docs/smolagents
์ค์ต ์๋๋ฆฌ์ค
์์ฒญ: โ์์ธ ์ค๋ ๋ ์จ๋ฅผ ํ์ธํ๊ณ , ์ฐ์ฐ ํ์ ์ฌ๋ถ๋ฅผ ํ ์ค๋ก ํ๋จํด์คโ
์์ด์ ํธ๋ ๋ค์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
get_weather(city): Open-Meteo API ํธ์ถsummarize(text): ํ๋จ ๋ฌธ์ฅ ์์ฑ
flowchart TD A[์ฌ์ฉ์ ์์ฒญ ์ ๋ ฅ] --> B[CodeAgent ์คํ] B --> C[get_weather ๋๊ตฌ ํธ์ถ] C --> D[๊ธฐ์จ/๊ฐ์ํ๋ฅ ํ์ฑ] D --> E[summarize ๋๊ตฌ ํธ์ถ] E --> F[์ต์ข ๋ต๋ณ ๋ฐํ]
1) ์ค๋น
๋๊ตฌ
- Python 3.10+
- pip
- (์ ํ)
.env๋ก๋ ๋๊ตฌ
์ ๋ ฅ
- ์์น:
Seoul - ๋ชจ๋ธ:
Qwen/Qwen2.5-Coder-32B-Instruct(Hugging Face Inference API ๊ธฐ์ค ์์)
์คํ ๋ช ๋ น
mkdir -p ~/lab/hf-agents-mini && cd ~/lab/hf-agents-mini
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install smolagents requests python-dotenv์ฑ๊ณต ํ์
pip show smolagents๊ฒฐ๊ณผ๊ฐ ์ถ๋ ฅ๋จ- ๊ฐ์ํ๊ฒฝ ํ๋กฌํํธ
(.venv)ํ์ธ
2) ์ฝ๋ ์์ฑ
mini_project.py
import os
import requests
from smolagents import CodeAgent, tool
from smolagents.models import InferenceClientModel
@tool
def get_weather(city: str) -> str:
"""๋์๋ช
์ผ๋ก ํ์ฌ ๊ธฐ์จ/๊ฐ์ํ๋ฅ ์ ์กฐํํ๋ค."""
geo = requests.get(
"https://geocoding-api.open-meteo.com/v1/search",
params={"name": city, "count": 1, "language": "en", "format": "json"},
timeout=15,
).json()
if not geo.get("results"):
return f"๋์๋ฅผ ์ฐพ์ง ๋ชปํ์ต๋๋ค: {city}"
lat = geo["results"][0]["latitude"]
lon = geo["results"][0]["longitude"]
weather = requests.get(
"https://api.open-meteo.com/v1/forecast",
params={
"latitude": lat,
"longitude": lon,
"current": "temperature_2m,precipitation_probability",
},
timeout=15,
).json()
current = weather.get("current", {})
t = current.get("temperature_2m", "N/A")
p = current.get("precipitation_probability", "N/A")
return f"{city} ํ์ฌ ๊ธฐ์จ {t}ยฐC, ๊ฐ์ํ๋ฅ {p}%"
@tool
def summarize(text: str) -> str:
"""๋ ์จ ๋ฌธ์ฅ์ ๋ฐํ์ผ๋ก ์ฐ์ฐ ํ์ ์ฌ๋ถ๋ฅผ ํ ์ค๋ก ์์ฝํ๋ค."""
return f"์์ฝ: {text}. ๊ฐ์ํ๋ฅ ์ด 50% ์ด์์ด๋ฉด ์ฐ์ฐ ๊ถ์ฅ."
model = InferenceClientModel(
model_id="Qwen/Qwen2.5-Coder-32B-Instruct",
token=os.getenv("HF_TOKEN"),
)
agent = CodeAgent(
model=model,
tools=[get_weather, summarize],
)
if __name__ == "__main__":
task = "์์ธ ์ค๋ ๋ ์จ๋ฅผ ํ์ธํ๊ณ ์ฐ์ฐ ํ์ ์ฌ๋ถ๋ฅผ ํ ์ค๋ก ์๋ ค์ค."
result = agent.run(task)
print(result)์ฑ๊ณต ํ์
- ํ์ผ ์ ์ฅ ์๋ฃ
- ๋ฌธ๋ฒ ์ค๋ฅ ์์ (
python -m py_compile mini_project.pyํต๊ณผ)
3) ์คํ
์คํ ๋ช ๋ น
export HF_TOKEN="hf_xxx"
python mini_project.py์ฑ๊ณต ํ์
- ์ต์ข
์ถ๋ ฅ์
์์ธ ํ์ฌ ๊ธฐ์จ๊ณผ์ฐ์ฐ๊ด๋ จ ๋ฌธ๊ตฌ ํฌํจ - ์์ธ ์ข ๋ฃ ์์ด ํ๋ก์ธ์ค ์ข ๋ฃ ์ฝ๋ 0
4) ๊ฒ์ฆ ์ฒดํฌ๋ฆฌ์คํธ
- ๋๊ตฌ ํธ์ถ 2๊ฐ(
get_weather,summarize)๊ฐ ์ค์ ์ฌ์ฉ๋จ - ์ ๋ ฅ ๋์๋ฅผ ๋ฐ๊ฟ๋ ๋์ํจ (์: Busan)
- ๊ฐ์ํ๋ฅ ์์น๊ฐ ์๋ต์ ํฌํจ๋จ
- ํ ์ค ์์ฝ ๊ฒฐ๊ณผ๊ฐ ์์ฑ๋จ
ํธ๋ฌ๋ธ์ํ (3+)
-
401 Unauthorized/ ๋ชจ๋ธ ํธ์ถ ์คํจ- ์์ธ:
HF_TOKEN๋๋ฝ/๋ง๋ฃ - ํด๊ฒฐ: ์ ํ ํฐ ์ฌ๋ฐ๊ธ ํ
export HF_TOKEN=...์ฌ์ค์
- ์์ธ:
-
ModuleNotFoundError: smolagents- ์์ธ: ๊ฐ์ํ๊ฒฝ ๋ฏธํ์ฑํ ๋๋ ์ค์น ๋๋ฝ
- ํด๊ฒฐ:
source .venv/bin/activate && pip install smolagents
-
Open-Meteo ํ์์์ (
ReadTimeout)- ์์ธ: ๋คํธ์ํฌ ์ง์ฐ
- ํด๊ฒฐ: timeout 15โ30 ์ฆ๊ฐ, ์ฌ์๋ ๋ก์ง ์ถ๊ฐ
-
๋์ ๊ฒ์ ์คํจ (
results์์)- ์์ธ: ์ ๋ ฅ ๋์๋ช ํ๊ธฐ ์ด์
- ํด๊ฒฐ: ์๋ฌธ ํ๊ธฐ ์ฌ์ฉ(์:
Seoul,Busan) ๋๋ ๊ตญ๊ฐ ์ฝ๋ ํ์ฅ
ํ์ฅ ๊ณผ์
- ๋์ ๋ชฉ๋ก(์์ธ/๋ถ์ฐ/๋๊ตฌ)์ ์์ฐจ ํ๊ฐํด ์ฐ์ฐ ํ์ ๋์๋ง ์ถ๋ ฅ
ToolCallingAgent๋ฒ์ ์ผ๋ก ํฌํ ํด ํธ์ถ ์ถ์ ๋ก๊ทธ ๋น๊ต- ๊ฒฐ๊ณผ๋ฅผ Markdown ๋ฆฌํฌํธ ํ์ผ๋ก ์ ์ฅ
์์ฑํ AI ํ์ฉ ๊ณ ์ง: ์ด ๋ฌธ์๋ ์์ฑํ AI๋ก ์ด์์ ๊ตฌ์ฑํ ๋ค, ์ค์ต ์ฌํ์ฑ(๋ช ๋ น/๊ฒ์ฆ/์ค๋ฅ ๋์)์ ๊ธฐ์ค์ผ๋ก ์ฌ๋์ด ๊ฒํ ยท์์ ํ์ต๋๋ค.