๐ค 52. HF Agents Course ์ค์ตํธ 1 - Unit 1 ์์ฝ ํด์ฆ ์์ฑ ์์ด์ ํธ ๋ง๋ค๊ธฐ
๋ชฉํ: Hugging Face Agents Course์ ์ฝ์ค ๊ตฌ์กฐ, Unit 1์ Think โ Act โ Observe, smolagents์ CodeAgent/๋๊ตฌ ๊ฐ๋ ์ ๋ฐํ์ผ๋ก, ํ์ต์๊ฐ ๋ฐ๋ก ๋ณต์ตํ ์ ์๋ ์์ฝ + ํด์ฆ + ๋ค์ ์ก์ ์์ฑ๊ธฐ๋ฅผ ์ฌํํ๋ค.
๊ณต์ ์ ์ฅ์๋ ์ฝ์ค๋ฅผ ๊ธฐ์ด โ ํ๋ ์์ํฌ โ ์ ์ค์ผ์ด์ค โ ํ์ด๋ ๊ณผ์ ํ๋ฆ์ผ๋ก ์๊ฐํ๋ค. Unit 1 ์๊ฐ ํ์ด์ง๋ ์์ด์ ํธ์ ๊ธฐ๋ณธ๊ธฐ, LLM์ ์ญํ , ๋๊ตฌ์ ์ก์
, ๊ทธ๋ฆฌ๊ณ Think โ Act โ Observe ์ํฌํ๋ก๋ฅผ ๋จผ์ ์ตํ ๋ค ์ฒซ ์์ด์ ํธ๋ฅผ ๋ง๋ค๋๋ก ์ค๊ณ๋์ด ์๋ค. smolagents ๋ฌธ์๋ ์ด๋ฐ ์
๋ฌธ ์คํ์ ์งง์ ์ฝ๋์ ์ ์ ์ถ์ํ๋ก ๋น ๋ฅด๊ฒ ์์ํ ์ ์๊ฒ ํด ์ค๋ค.
์ด๋ฒ ์ค์ต์ ์ด ์ธ ๊ฐ์ง๋ฅผ ๋ฌถ์ด, ๊ณต์ ํ์ด์ง๋ฅผ ์ฝ๊ณ Unit 1 ๋ณต์ต์ฉ ์์ฝ๊ณผ ํด์ฆ๋ฅผ ์๋ ์์ฑํ๋ ๋ฏธ๋ ํ๋ก์ ํธ๋ฅผ ๋ง๋ ๋ค.
์ด๋ฒ์ ๋ง๋ค ๊ฒฐ๊ณผ๋ฌผ
์ ๋ ฅ ์์:
HF Agents Course Unit 1์ 20๋ถ ์์ ๋ณต์ตํ๊ณ ์ถ์ด.
ํต์ฌ ๊ฐ๋
4๊ฐ์ ๊ฐ๊ด์ ํด์ฆ 3๊ฐ, ๋ค์ ์ค์ต 1๊ฐ๋ฅผ ํ๊ตญ์ด๋ก ์ ๋ฆฌํด์ค.์ถ๋ ฅ ์์:
- Unit 1 ํต์ฌ ๊ฐ๋ 4๊ฐ
- ๊ฐ๊ด์ ํด์ฆ 3๊ฐ
- ์ ๋ต/ํด์ค
- ๋ค์ ์ค์ต 1๊ฐ
- ์คํ ๋ช ๋ น๊ณผ ์ฑ๊ณต ํ์
์ ์ด ์ค์ต์ด ์ฝ์ค ์ทจ์ง์ ๋ง๋๊ฐ
- ๊ณต์ ์ฝ์ค ์๊ฐ๋ ์ด๋ก + ํธ์ฆ์จ + ๊ณผ์ ์กฐํฉ์ผ๋ก ํ์ตํ๋๋ก ์๋ดํ๋ค.
- Unit 1์ ์์ด์ ํธ ๊ธฐ๋ณธ ๊ตฌ์กฐ์ ์ฒซ ์์ด์ ํธ ์ค์ต์ ํต์ฌ ์ฐ์ถ๋ฌผ๋ก ๋๋ค.
smolagents์ Unit 2 smolagents ์๊ฐ๋ CodeAgent, ToolCallingAgent, Tools๋ฅผ ์ค์ ๋ก ๋ค๋ค ๋ณด๋ฉฐ ์ดํดํ๋ผ๊ณ ๊ถํ๋ค.
์ฆ ์ด ๊ธ์ ํฌ์ธํธ๋ ๋จ์ ์์ฝ์ด ์๋๋ผ, ๊ณต์ ์๋ฃ๋ฅผ ๋๊ตฌ๋ก ์ฝ๊ณ ๊ฒฐ๊ณผ๋ฅผ ํ์ต ์ฐ์ถ๋ฌผ๋ก ์ฌ๊ตฌ์ฑํ๋ ์์ด์ ํธ ํ๋ฆ์ ์ง์ ๋ง๋๋ ๋ฐ ์๋ค.
์ ์ฒด ๊ตฌ์กฐ
flowchart TD U[์ฌ์ฉ์ ๋ณต์ต ์์ฒญ] --> A[CodeAgent] A --> T1[get_course_overview] A --> T2[get_unit1_intro] A --> T3[get_smolagents_docs] A --> T4[get_smolagents_unit] T1 --> S[๊ณต์ ๊ทผ๊ฑฐ ์์ง] T2 --> S T3 --> S T4 --> S S --> O[ํต์ฌ ์์ฝ + ํด์ฆ 3๊ฐ + ๋ค์ ์ค์ต 1๊ฐ]
์ค๋น๋ฌผ
- Python 3.10+
- ํฐ๋ฏธ๋
- ์ธํฐ๋ท ์ฐ๊ฒฐ
- Hugging Face ๊ณ์ ๊ถ์ฅ
- ์ ํ:
HF_TOKENํ๊ฒฝ๋ณ์
Step 1) ์์ ํด๋ ์ค๋น
์คํ ๋ช ๋ น
mkdir -p ~/hf-agents-quiz-agent
cd ~/hf-agents-quiz-agent์ฑ๊ณต ํ์
pwd
ls -la- ํ์ฌ ๊ฒฝ๋ก ๋์ด
hf-agents-quiz-agent์ด๋ฉด ํต๊ณผ. - ์์ ํด๋๊ฐ ์์ฑ๋๋ฉด ํต๊ณผ.
Step 2) ๊ฐ์ํ๊ฒฝ ๋ฐ ํจํค์ง ์ค์น
์คํ ๋ช ๋ น
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -U pip
pip install "smolagents[toolkit]" requests beautifulsoup4์ฑ๊ณต ํ์
python -c "import smolagents, requests, bs4; print('install-ok')"install-ok๊ฐ ์ถ๋ ฅ๋๋ฉด ํต๊ณผ.
Step 3) ์์ด์ ํธ ์ฝ๋ ์์ฑ
unit1_quiz_agent.py ํ์ผ์ ๋ง๋ค๊ณ ์๋ ์ฝ๋๋ฅผ ๋ฃ๋๋ค.
import requests
from bs4 import BeautifulSoup
from smolagents import CodeAgent, InferenceClientModel, tool
PAGES = {
"course": "https://huggingface.co/learn/agents-course",
"unit1": "https://huggingface.co/learn/agents-course/en/unit1/introduction",
"docs": "https://huggingface.co/docs/smolagents/index",
"smol_unit": "https://huggingface.co/learn/agents-course/unit2/smolagents/introduction",
}
def fetch_text(url: str) -> str:
response = requests.get(url, timeout=30)
response.raise_for_status()
soup = BeautifulSoup(response.text, "html.parser")
chunks = []
title = soup.title.get_text(" ", strip=True) if soup.title else url
chunks.append(f"TITLE: {title}")
for tag in soup.select("h1, h2, h3, p, li"):
text = tag.get_text(" ", strip=True)
if text and len(text) >= 24:
chunks.append(text)
if len(chunks) >= 40:
break
return "\n".join(chunks)
@tool
def get_course_overview() -> str:
"""Return a compact summary of the HF Agents Course overview page."""
return fetch_text(PAGES["course"])
@tool
def get_unit1_intro() -> str:
"""Return a compact summary of the official Unit 1 introduction page."""
return fetch_text(PAGES["unit1"])
@tool
def get_smolagents_docs() -> str:
"""Return a compact summary of the smolagents docs index."""
return fetch_text(PAGES["docs"])
@tool
def get_smolagents_unit() -> str:
"""Return a compact summary of the course module introducing smolagents."""
return fetch_text(PAGES["smol_unit"])
model = InferenceClientModel()
agent = CodeAgent(
tools=[
get_course_overview,
get_unit1_intro,
get_smolagents_docs,
get_smolagents_unit,
],
model=model,
max_steps=6,
)
prompt = """
๊ณต์ ํ์ด์ง ๋๊ตฌ ๊ฒฐ๊ณผ๋ง ์ฌ์ฉํด์ ํ๊ตญ์ด๋ก ๋ตํด์ค.
๋ชฉํ: HF Agents Course Unit 1 ๋ณต์ต์ฉ ์์ฝ๊ณผ ํด์ฆ๋ฅผ ๋ง๋ ๋ค.
๋ฐ๋์ ์๋ ํ์์ ์ง์ผ์ค.
1) ํต์ฌ ๊ฐ๋
4๊ฐ
2) ๊ฐ๊ด์ ํด์ฆ 3๊ฐ
3) ์ ๋ต๊ณผ ํ ์ค ํด์ค
4) ๋ค์ ์ค์ต 1๊ฐ
5) ์คํ ๋ช
๋ น
6) ์ฑ๊ณต ํ์ ๊ธฐ์ค
๊ณต์ ํ์ด์ง์์ ์ง์ ํ์ธ๋์ง ์๋ ๋ด์ฉ์ ๋ฐ๋์ '์ถ์ '์ด๋ผ๊ณ ํ์ํด์ค.
"""
result = agent.run(prompt)
print(result)์ฝ๋ ํ์ธ ํฌ์ธํธ
@tool๋ฐ์ฝ๋ ์ดํฐ๋ก ๊ณต์ ํ์ด์ง ์ฝ๊ธฐ ํจ์๋ฅผ ๋๊ตฌ๋ก ๋ ธ์ถํ๋ค.CodeAgent๊ฐ ํ์ํ ๊ทผ๊ฑฐ๋ฅผ ์ง์ ์์งํ๋ค.- ์ถ๋ ฅ ํ์์ ๊ฐํ๊ฒ ์ ํํด, ํ์ต ์ฐ์ถ๋ฌผ์ด ํ๋ค๋ฆฌ์ง ์๊ฒ ํ๋ค.
Step 4) ์ฒซ ์คํ
์คํ ๋ช ๋ น
source .venv/bin/activate
python unit1_quiz_agent.py์ฑ๊ณต ํ์
์๋ 6๊ฐ์ง๋ฅผ ๋ง์กฑํ๋ฉด ์ฑ๊ณต์ด๋ค.
- ์์ธ ์์ด ์คํ ์๋ฃ
ํต์ฌ ๊ฐ๋ 4๊ฐ์น์ ์กด์ฌ๊ฐ๊ด์ ํด์ฆ 3๊ฐ์กด์ฌ์ ๋ต๊ณผ ํ ์ค ํด์ค์กด์ฌ๋ค์ ์ค์ต 1๊ฐ์กด์ฌ- ํ์ธ ๋ถ๊ฐ ๋ด์ฉ์
์ถ์ ์ผ๋ก ํ๊ธฐ
Step 5) ์ ๋ ฅ ํ๋กฌํํธ๋ฅผ ์ค์ต ์ค์ฌ์ผ๋ก ๋ฐ๊ฟ ์ฌ์คํ
์ ๋ ฅ ๋ณ๊ฒฝ
prompt๋ฅผ ์๋์ฒ๋ผ ๋ฐ๊พผ๋ค.
๋๋ ๊ธด ์ค๋ช
๋ณด๋ค ๋ฐ๋ก ์์ ์์ง์ด๊ณ ์ถ๋ค.
Unit 1 ํต์ฌ์ 10๋ถ ๋ณต์ต์ฉ์ผ๋ก ์์ถํด์,
ํต์ฌ ๊ฐ๋
3๊ฐ์ ํด์ฆ 2๊ฐ, ๋ค์ ์คํ ๋ช
๋ น 1์ธํธ๋ฅผ ์ ๋ฆฌํด์ค.์คํ ๋ช ๋ น
python unit1_quiz_agent.py์ฑ๊ณต ํ์
Unit 1๊ด๋ จ ํต์ฌ ์์ฝ์ด ์์ถ๋์ด ๋์จ๋ค.- ํด์ฆ ๊ฐ์๊ฐ 2๊ฐ ๋๋ 3๊ฐ ์์ค์ผ๋ก ์ค์ด๋ ๋ค.
- ์คํ ๊ฐ๋ฅํ ๋ช ๋ น์ด ์ต์ 1์ธํธ ์ ์๋๋ค.
Step 6) ๊ฒฐ๊ณผ๋ฅผ Markdown ํ์ผ๋ก ์ ์ฅ
์คํ ๋ช ๋ น
python unit1_quiz_agent.py > latest-unit1-quiz.md
sed -n '1,120p' latest-unit1-quiz.md์ฑ๊ณต ํ์
latest-unit1-quiz.md๊ฐ ์์ฑ๋๋ค.- ์๋ถ๋ถ์ ์์ฝ, ํด์ฆ, ์ ๋ต, ๋ค์ ์ค์ต์ด ๋ณด์ธ๋ค.
์ด ์ค์ต์์ ์ดํดํด์ผ ํ ํต์ฌ
1) Unit 1์ ์์ด์ ํธ ์ฌ๊ณ ๋ฃจํ์ ์ ๊ตฌ๋ค
๊ณต์ Unit 1 ์๊ฐ๋ ์์ด์ ํธ์ ์ ์, LLM์ ์ญํ , ๋๊ตฌ, ์ก์ , Think โ Act โ Observe๋ฅผ ๋จผ์ ๋ค๋ฃฌ๋ค. ๋ฐ๋ผ์ ์ฒซ ํธ์ฆ์จ์ ๋ณต์กํ ์ ํํ ์์ด์ ํธ๋ณด๋ค ์๊ณ ๊ฒ์ฆ ๊ฐ๋ฅํ ํ์ต ๋์ฐ๋ฏธ๊ฐ ๋ ์ ํฉํ๋ค.
2) smolagents๋ ์ ๋ฌธ ์คํ ์๋๊ฐ ๋น ๋ฅด๋ค
๊ณต์ ๋ฌธ์๋ CodeAgent๋ฅผ ์ค์ฌ์ผ๋ก, ์ ์ ์ฝ๋๋ก ์์ด์ ํธ ์คํ๊ณผ ๋๊ตฌ ์ฌ์ฉ์ ์์ํ ์ ์๋ค๊ณ ์ค๋ช
ํ๋ค. ์ด๋ฒ ํ๋ก์ ํธ๋ ๋๊ตฌ 4๊ฐ + ์์ด์ ํธ 1๊ฐ ๊ตฌ์กฐ๋ก ์ฌํ๋๋ค.
3) ๊ณต์ ์๋ฃ ๊ธฐ๋ฐ ๋๊ตฌํ๊ฐ ํ์ง์ ๋์ธ๋ค
๊ทธ๋ฅ LLM์๊ฒ โ์ฝ์ค๋ฅผ ์์ฝํด์คโ๋ผ๊ณ ๋ฌป๋ ๊ฒ๋ณด๋ค, ๊ณต์ ํ์ด์ง๋ฅผ ์ฝ๋ ๋๊ตฌ๋ฅผ ๋จผ์ ๋ง๋ค๋ฉด ๊ทผ๊ฑฐ๊ฐ ์๋ ์ถ๋ ฅ์ ์ป๊ธฐ ์ฝ๋ค. ์ดํ ํด์ฆ, ํ๋๋, ๋ณต์ต ์ฝ์น ๋ฑ์ผ๋ก ํ์ฅํ๊ธฐ๋ ์ข๋ค.
์ค์ ์ฒดํฌ๋ฆฌ์คํธ
- ์์ ํด๋ ์์ฑ ์๋ฃ
- ๊ฐ์ํ๊ฒฝ ์์ฑ ๋ฐ ํ์ฑํ ์๋ฃ
-
smolagents,requests,beautifulsoup4์ค์น ์๋ฃ -
unit1_quiz_agent.py์ ์ฅ ์๋ฃ - ์ฒซ ์คํ ์ฑ๊ณต
- ํ๋กฌํํธ ๋ณ๊ฒฝ ํ ์ฌ์คํ ์ฑ๊ณต
- Markdown ์ ์ฅ ์ฑ๊ณต
ํธ๋ฌ๋ธ์ํ
1) ModuleNotFoundError: No module named 'smolagents'
์์ธ:
- ๊ฐ์ํ๊ฒฝ ๋นํ์ฑ ์ํ
- ๋ค๋ฅธ Python ์ธํฐํ๋ฆฌํฐ ์ฌ์ฉ
ํด๊ฒฐ:
source .venv/bin/activate
which python
python -m pip install "smolagents[toolkit]"2) 401 Unauthorized ๋๋ Inference ์ธ์ฆ ์ค๋ฅ
์์ธ:
- ์คํ ํ๊ฒฝ์์ Hugging Face ์ธ์ฆ ํ์
ํด๊ฒฐ:
export HF_TOKEN=hf_your_token
python unit1_quiz_agent.py- ํ ํฐ ์ค์ ํ ์ฌ์คํํ๋ค.
- ์กฐ์ง ๋คํธ์ํฌ ํ๊ฒฝ์ด๋ฉด ๋ณ๋ ์ ์ฑ ์ด ์์ ์ ์๋ค.
3) requests.exceptions.ReadTimeout
์์ธ:
- ๊ณต์ ํ์ด์ง ์๋ต ์ง์ฐ
- ๋คํธ์ํฌ ๋ถ์์
ํด๊ฒฐ:
response = requests.get(url, timeout=60)- ํ์์์์ 60์ด๋ก ๋๋ฆฐ๋ค.
- ๋ธ๋ผ์ฐ์ ์์ URL์ด ์ด๋ฆฌ๋์ง ๋จผ์ ํ์ธํ๋ค.
4) ์ถ๋ ฅ์ด ๋๋ฌด ์ผ๋ฐ์ ์ผ ๋
์์ธ:
- ํ๋กฌํํธ ์ ์ฝ์ด ์ฝํจ
- ๋๊ตฌ ์ค๋ช ์ด ์ถ์์ ์
ํด๊ฒฐ:
ํต์ฌ ๊ฐ๋ ,ํด์ฆ,์ ๋ต,๋ค์ ์ค์ต,์คํ ๋ช ๋ น,์ฑ๊ณต ํ์ ์ ๋ช ์ํ๋ค.๊ณต์ ํ์ด์ง ๋๊ตฌ ๊ฒฐ๊ณผ๋ง ์ฌ์ฉ๋ฌธ๊ตฌ๋ฅผ ์ ์งํ๋ค.- ํ์ธ ๋ถ๊ฐ ํญ๋ชฉ์
์ถ์ ์ผ๋ก ๊ฐ์ ํ๋ค.
5) HTML ์ถ์ถ ๊ฒฐ๊ณผ๊ฐ ๋ค์ญ๋ ์ญํ ๋
์์ธ:
- ํ์ด์ง๋ง๋ค ๋ณธ๋ฌธ DOM ๊ตฌ์กฐ ์ฐจ์ด
ํด๊ฒฐ:
for tag in soup.select("main h1, main h2, main h3, main p, main li, article p, article li"):- ์ ํ์๋ฅผ ๋ ๊ตฌ์ฒดํํ๋ค.
- ํ์ํ๋ฉด ์ถ์ถ ๊ฒฐ๊ณผ๋ฅผ ํ์ผ๋ก ์ ์ฅํด ๋น๊ตํ๋ค.
6) ํด์ฆ ๋์ด๋๊ฐ ์ง๋์น๊ฒ ๋๊ฑฐ๋ ๋ฎ์ ๋
์์ธ:
- ํ๋กฌํํธ์ ๋์ ๋ ์ ์์ค์ด ์์
ํด๊ฒฐ:
ํ๋กฌํํธ์ ์๋ ๋ฌธ๊ตฌ๋ฅผ ์ถ๊ฐํ๋ค.
๋์์ HF Agents Course๋ฅผ ์ฒ์ ๋ณด๋ ์
๋ฌธ์๋ค.
์ ๋ฌธ ์ฉ์ด๋ ํ ์ค ์ค๋ช
๊ณผ ํจ๊ป ์จ์ค.ํ์ฅ ์์ด๋์ด
- Unit 2์ฉ์ผ๋ก
CodeAgent์ToolCallingAgent๋น๊ต ํด์ฆ ์์ฑ๊ธฐ ๋ง๋ค๊ธฐ - ๊ฒฐ๊ณผ๋ฅผ JSON์ผ๋ก ์ ์ฅํด ์น UI๋ ๋ ธ์ ์ผ๋ก ๋๊ธฐ๊ธฐ
- ์ฌ์ฉ์์ ๊ณต๋ถ ์๊ฐ(10๋ถ/20๋ถ/45๋ถ)์ ๋ฐ๋ผ ๋ค๋ฅธ ํด์ฆ ๋์ด๋ ๋ด๊ธฐ
save_report๋๊ตฌ๋ฅผ ์ถ๊ฐํด ์๋ ์์นด์ด๋นํ๊ธฐ
๋ง๋ฌด๋ฆฌ
์ด๋ฒ ํธ์ฆ์จ์ โ์์ด์ ํธ๋ฅผ ๋ง๋ ๋คโ๋ณด๋ค ๋ ์ค์ํ ์ฐ์ต์ ๋ด๊ณ ์๋ค. ๊ณต์ ๊ทผ๊ฑฐ๋ฅผ ์ฝ๋ ๋๊ตฌ๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ๋๊ตฌ ์์์ ํ์ต ์ฐ์ถ๋ฌผ์ ์์ฑํ๊ฒ ํ๋ ๊ตฌ์กฐ๋ฅผ ์ตํ๋ ๊ฒ์ด๋ค. ์ด ํจํด์ ์ก์๋๋ฉด ์ดํ Unit 2 ํ๋ ์์ํฌ ๋น๊ต, Unit 3 ์ ์ค์ผ์ด์ค ์ ๋ฆฌ, ์ต์ข ํ๋ก์ ํธ ๋ฆฌ๋ทฐ์๋ ๊ทธ๋๋ก ํ์ฅํ ์ ์๋ค.
์์ฑํ AI ํ์ฉ ๊ณ ์ง
์ด ๋ฌธ์๋ ์์ฑํ AI๋ฅผ ํ์ฉํด ์ด์ ๊ตฌ์กฐ์ ์์ ์ฝ๋๋ฅผ ์์ฑํ์ต๋๋ค. ๋ค๋ง ๊ทผ๊ฑฐ๊ฐ ๋๋ ์ค๋ช ์ Hugging Face Agents Course ์ ์ฅ์, HF Agents Course ๊ณต์ ํ์ต ํ์ด์ง, Unit 1 ์๊ฐ ํ์ด์ง, smolagents ๊ณต์ ๋ฌธ์, smolagents ์ฝ์ค ์๊ฐ ํ์ด์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒํ ํ๊ณ , ์ฌํ ๋จ๊ณยท๋ช ๋ นยท์ฑ๊ณต ํ์ ยทํธ๋ฌ๋ธ์ํ ยท๋งํฌ ๋ฐ์์ ์ฌ๋์ด ํ์ธ ๊ฐ๋ฅํ ํํ๋ก ์ ๋ฆฌํ์ต๋๋ค.