์ด๋ฒ ํธ์์๋ ToolCallingAgent๋ฅผ ์ฌ์ฉํด โ์ ๋ ฅ โ ๋๊ตฌ ์คํ โ ๊ฒฐ๊ณผ ๊ฒ์ฆโ ํ๋ฆ์ ์์ ์ ์ผ๋ก ๋ง๋๋ ๋ฒ์ ๋ค๋ฃน๋๋ค. ๋ชฉํ๋ ์ด๋ณด์๋ ์ฌํ ๊ฐ๋ฅํ ์ต์ ์์ ๋ฅผ ๋ง๋ ๋ค, ์ค๋ฌดํ ์ฒดํฌํฌ์ธํธ(๋ก๊ทธ/์ค๋ฅ/์ฑ๊ณตํ์ )๋ฅผ ๋ถ์ด๋ ๊ฒ์ ๋๋ค.
1) ์ ToolCallingAgent๋ฅผ ์ฐ๋?
- LLM์ด ์ง์ ๋ต๋ง ์์ฑํ๋ฉด, ์ธ๋ถ ๋ฐ์ดํฐ ์ ๊ทผ/๊ณ์ฐ/๊ฒ์ฆ์ด ์ฝํฉ๋๋ค.
- ToolCallingAgent๋ ํ์ํ ์๊ฐ ํด์ ํธ์ถํด ํ๋ ๊ฐ๋ฅํ ๋ต์ ๋ง๋ญ๋๋ค.
- ํต์ฌ์ โ์ข์ ํ๋กฌํํธโ๋ณด๋ค ์ข์ ์คํ ๋ฃจํ(๋ก๊ทธ, ํ์ , ์คํจ ๋ณต๊ตฌ) ์ ๋๋ค.
2) ์ ์ฒด ํ๋ฆ
flowchart TD A[์ฌ์ฉ์ ์ง์] --> B[ToolCallingAgent ๊ณํ] B --> C[๋๊ตฌ ํธ์ถ: search_weather] C --> D[๋๊ตฌ ๊ฒฐ๊ณผ ์์ ] D --> E[๊ฒฐ๊ณผ ๊ฒ์ฆ: ํ์ ํ๋/๋จ์] E --> F[์ต์ข ๋ต๋ณ ์์ฑ] E -->|๊ฒ์ฆ ์คํจ| G[์ฌ์๋ ๋๋ ์ค๋ฅ ๋ฉ์์ง]
3) ์ค์ต: ์์ธ ๋ ์จ ์์ฝ ์์ด์ ํธ
์ค๋น ๋๊ตฌ
- Python 3.10+
- ํจํค์ง:
smolagents,python-dotenv - ๋ชจ๋ธ ํค(์: Hugging Face Inference ๋๋ OpenAI ํธํ ํค)
ํด๋/ํ์ผ
mkdir -p hf-agent-lesson4 && cd hf-agent-lesson4
python3 -m venv .venv
source .venv/bin/activate
pip install -U smolagents python-dotenv.env
HF_TOKEN=your_hf_tokenapp.py
from dotenv import load_dotenv
from smolagents import ToolCallingAgent, InferenceClientModel, tool
import requests
load_dotenv()
@tool
def search_weather(city: str) -> str:
"""๋์ ์ด๋ฆ์ ๋ฐ์ ํ์ฌ ๊ธฐ์จ/๋ ์จ๋ฅผ ์งง๊ฒ ๋ฐํ"""
# ๋ฐ๋ชจ์ฉ ๊ณต๊ฐ ์๋ํฌ์ธํธ (์์)
url = f"https://wttr.in/{city}?format=j1"
r = requests.get(url, timeout=10)
r.raise_for_status()
data = r.json()
current = data["current_condition"][0]
temp_c = current.get("temp_C", "N/A")
desc = current.get("weatherDesc", [{"value": "N/A"}])[0]["value"]
return f"{city} ํ์ฌ {temp_c}ยฐC, {desc}"
model = InferenceClientModel()
agent = ToolCallingAgent(
tools=[search_weather],
model=model,
max_steps=4,
)
query = "์์ธ ์ค๋ ๋ ์จ๋ฅผ ํ ์ค๋ก ์์ฝํด์ค"
result = agent.run(query)
print(result)์คํ ๋ช ๋ น
python app.py์ฑ๊ณต ํ์
์๋ 3๊ฐ๋ฅผ ๋ง์กฑํ๋ฉด ์ฑ๊ณต์ ๋๋ค.
- ์คํ ์ค ๋๊ตฌ ํธ์ถ ํ์ ์ด ๋ก๊ทธ์ ๋ณด์ธ๋ค. (
search_weather) - ์ถ๋ ฅ์ ๋์๋ช
/๊ธฐ์จ/์ํ๊ฐ ํฌํจ๋๋ค. (์:
์์ธ ํ์ฌ 22ยฐC, Partly cloudy) - ์์ธ ์์ด ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋๋ค. (exit code 0)
4) ์ด๋ณด์ ์ค์์ ๋น ๋ฅธ ๋ณต๊ตฌ
- API/ํ ํฐ ๋๋ฝ:
.env์ ์ ํ๊ฒฝ๋ณ์ ์ค๋ณต ํ์ธ - ๋๊ตฌ ํ์์์:
requests.get(..., timeout=10)์ ์ง - ์ถ๋ ฅ ํฌ๋งท ํ๋ค๋ฆผ: ๋๊ตฌ ๋ฐํ ๋ฌธ์์ด์ ๊ณ ์ ํ ํ๋ฆฟ์ผ๋ก ์ ํ
5) ์ค๋ฌด ์ ์ฉ ํฌ์ธํธ
- ํด ํจ์๋ โ์งง๊ณ ๊ฒฐ์ ์ (deterministic)โ์ผ๋ก ์ค๊ณ
- ์์ด์ ํธ ์๋ต ์ ๋ขฐ์ฑ์ ๋ชจ๋ธ๋ณด๋ค ๋๊ตฌ ์คํค๋ง + ๊ฒ์ฆ ๊ท์น์ด ์ข์ฐ
- ์ด์ ์ ์ต์ 3๊ฐ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ์ธ์: ์ ๋ ฅ, ํด ๊ฒฐ๊ณผ, ์ต์ข ์๋ต
6) ๋ค์ ํธ ์๊ณ
๋ค์ ๋ณธํธ์์๋ ToolCallingAgent์ ๋ค์ค ๋๊ตฌ ๋ผ์ฐํ (๊ฒ์+๊ณ์ฐ+ํฌ๋งทํฐ) ์ ๋ถ์ฌ ์ ๋ฌด ์๋ํ ํ ํ๋ฆฟ์ผ๋ก ํ์ฅํฉ๋๋ค.
์์ฑํ AI ํ์ฉ ๊ณ ์ง
์ด ๋ฌธ์๋ ์์ฑํ AI๋ก ์ด์์ ๋ง๋ค๊ณ , Hugging Face ๊ณต์ ์๋ฃ(์ฝ์ค/๋ฌธ์) ๊ธฐ์ค์ผ๋ก ์ฌ์ค๊ด๊ณ์ ์ค์ต ๋จ๊ณ๋ฅผ ๊ฒํ ยท๋ณด์ ํ์ต๋๋ค.