๐ค 43. HF Agents Course ์ค์ตํธ 2 - ๊ณต์ ์ฝ์ค ํ์ Q&A ์์ด์ ํธ ๋ง๋ค๊ธฐ
๋ชฉํ: Hugging Face Agents Course ๊ณต์ ํ์ด์ง๋ฅผ ์ง์ ์ฝ๋
smolagents๊ธฐ๋ฐ Q&A ์์ด์ ํธ๋ฅผ ๋ง๋ค์ด, ์ฝ์ค ๊ตฌ์กฐ๋ฅผ ๋ฌป๊ณ ์์ฝํ๊ณ ๋ค์ ํ์ต ํ๋๊น์ง ์ ์ํ๋ ๋ฏธ๋ ํ๋ก์ ํธ๋ฅผ ์ฌํํ๋ค.
์ด๋ฒ ์ค์ต์ โ๊ณต์ ๋ฌธ์ ์ฝ๊ธฐ โ ํ์ํ ๊ตฌ๊ฐ๋ง ์ถ์ถ โ ํ๊ตญ์ด๋ก ์ฌ๊ตฌ์ฑโ ํ๋ฆ์ ์์ ์ตํ๋ ๋ฐ ์ด์ ์ ๋๋ค. Hugging Face Agents Course ์๊ฐ ํ์ด์ง๊ฐ ๋งํ๋ ํต์ฌ ์ถ์ ์ด๋ ๋ค.
- ๊ณผ์ ์ ๊ธฐ์ด ๊ฐ๋ , ํธ์ฆ์จ, ์ ์ค์ผ์ด์ค, ์ต์ข ๊ณผ์ ๋ก ์ด์ด์ง๋ค.
- Unit 2์์๋
smolagents, LangGraph, LlamaIndex ๊ฐ์ ํ๋ ์์ํฌ๋ฅผ ๋ค๋ฃฌ๋ค. - ๊ถ์ฅ ํ์ต ์๋๋ ์ฃผ๋น 3~4์๊ฐ, ๊ฐ ์ฑํฐ 1์ฃผ ์์ค์ด๋ค.
๋ฌด์์ ๋ง๋ค๊น
์ฌ์ฉ์ ์ ๋ ฅ ์์:
HF Agents Course๋ฅผ ์ฒ์ ์์ํ๋๋ฐ, Unit 0/1/2.1์ ์ด๋ค ์์๋ก ์ฝ์ด์ผ ํ๊ณ ๋ฐ๋ก ํด๋ณผ ์ค์ต์ ๋ญ์ผ?
์์ด์ ํธ ์ถ๋ ฅ ์์:
- ์ฝ์ค ๊ตฌ์กฐ 3์ค ์์ฝ
- ์ถ์ฒ ํ์ต ์์
- ๊ฐ Unit์์ ํ์ธํ ํต์ฌ ํฌ์ธํธ
- ๋ฐ๋ก ์คํํ ์ค์ต 1๊ฐ
- ์ฃผ์ํ ์ ์ ์กฐ๊ฑด
์ ์ด ์ค์ต์ด ์ข์๊ฐ
- ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋๋ฃจ๋ญ์ ํ๊ฒ ์์ง ์๊ณ ๊ณต์ ์ฝ์ค URL๋ง ์ฝ๋๋ก ์ ํํ๋ค.
CodeAgent์ ์ปค์คํ ํด์ ํจ๊ป ์จ์, โ๋๊ตฌ๋ฅผ ๊ฐ์ง ์์ด์ ํธโ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ฅ ์๊ฒ ๊ฒฝํํ ์ ์๋ค.- ๊ฒฐ๊ณผ๋ฌผ์ด ๋จ์ ์์ฝ์ด ์๋๋ผ ๋ค์ ํ๋์ด ๋ฐ๋ก ๋์ค๋ ํ์ต Q&A ๋์ฐ๋ฏธ๋ค.
์ ์ฒด ํ๋ฆ
flowchart TD U[์ฌ์ฉ์ ์ง๋ฌธ] --> A[CodeAgent] A --> T[get_course_section ํด ํธ์ถ] T --> P[๊ณต์ HF Agents Course ํ์ด์ง ์์ง/์ ๋ฆฌ] P --> S[์น์ ๋ณ ํต์ฌ ์ ๋ณด ์ถ์ถ] S --> R[ํ์ต ์์ + ์ค์ต ์ ์ ํ๊ตญ์ด ๋ต๋ณ]
์ค๋น๋ฌผ
- Python 3.10+
- ํฐ๋ฏธ๋
- ์ธํฐ๋ท ์ฐ๊ฒฐ
- ๊ฐ์ํ๊ฒฝ(
venv) - ์ ํ: Hugging Face ํ ํฐ (
HF_TOKEN)
Step 1) ์์ ํด๋ ๋ง๋ค๊ธฐ
์ ๋ ฅ
mkdir -p ~/hf-agents-course-lab02
cd ~/hf-agents-course-lab02์ฑ๊ณต ํ์
pwd๊ฒฐ๊ณผ๊ฐ~/hf-agents-course-lab02์ด๋ค.
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('ok')"ok๊ฐ ์ถ๋ ฅ๋๋ฉด ํต๊ณผ.
Step 3) ์ค์ต ์ฝ๋ ์์ฑ
app.py๋ฅผ ๋ง๋ค๊ณ ์๋ ์ฝ๋๋ฅผ ๋ฃ๋๋ค.
import requests
from bs4 import BeautifulSoup
from smolagents import CodeAgent, InferenceClientModel, tool
COURSE_PAGES = {
"unit0": "https://huggingface.co/learn/agents-course/en/unit0/introduction",
"unit1": "https://huggingface.co/learn/agents-course/en/unit1/introduction",
"unit2": "https://huggingface.co/learn/agents-course/en/unit2/introduction",
"smolagents": "https://huggingface.co/learn/agents-course/en/unit2/smolagents/introduction",
}
@tool
def get_course_section(section: str) -> str:
"""Return a compact summary of an official HF Agents Course section.
Args:
section: One of unit0, unit1, unit2, smolagents.
"""
section = section.strip().lower()
if section not in COURSE_PAGES:
return f"Unknown section: {section}. Choose from {', '.join(COURSE_PAGES)}"
response = requests.get(COURSE_PAGES[section], timeout=20)
response.raise_for_status()
soup = BeautifulSoup(response.text, "html.parser")
title = soup.title.get_text(" ", strip=True) if soup.title else section
headings = []
for tag in soup.select("h1, h2, h3"):
text = tag.get_text(" ", strip=True)
if text and text not in headings:
headings.append(text)
if len(headings) >= 8:
break
paragraphs = []
for tag in soup.select("p, li"):
text = tag.get_text(" ", strip=True)
if len(text) >= 40:
paragraphs.append(text)
if len(paragraphs) >= 8:
break
return (
f"SECTION: {section}\n"
f"URL: {COURSE_PAGES[section]}\n"
f"TITLE: {title}\n"
f"HEADINGS:\n- " + "\n- ".join(headings) + "\n\n"
f"KEY_TEXT:\n- " + "\n- ".join(paragraphs)
)
model = InferenceClientModel()
agent = CodeAgent(
tools=[get_course_section],
model=model,
max_steps=6,
)
prompt = """
๊ณต์ HF Agents Course ์ ๋ณด๋ง ์ฌ์ฉํด์ ํ๊ตญ์ด๋ก ๋ตํด์ค.
์ง๋ฌธ: HF Agents Course๋ฅผ ์ฒ์ ์์ํ๋๋ฐ, unit0 / unit1 / smolagents ์น์
์ ์ด๋ค ์์๋ก ์ฝ์ด์ผ ํ๊ณ ,
๊ฐ ์น์
์์ ๋ฌด์์ ์ป๋์ง ์ค๋ช
ํ ๋ค, ์ค๋ ๋ฐ๋ก ํด๋ณผ ์ค์ต 1๊ฐ๋ฅผ ์ ์ํด์ค.
์ถ๋ ฅ ํ์:
1) 3์ค ์์ฝ
2) ์ถ์ฒ ์์ (๋ฒํธ ๋ชฉ๋ก)
3) ์น์
๋ณ ํต์ฌ ํฌ์ธํธ
4) ์ค๋ ๋ฐ๋ก ํ ์ค์ต 1๊ฐ
5) ์์ ์ ์ฒดํฌ์ฌํญ 3๊ฐ
๊ณต์ ํ์ด์ง์์ ํ์ธ๋์ง ์๋ ๋ด์ฉ์ ์ถ์ ์ด๋ผ๊ณ ํ์ํด์ค.
"""
result = agent.run(prompt)
print(result)Step 4) ์คํ
์คํ ๋ช ๋ น
python app.py์ฑ๊ณต ํ์
์๋ 5๊ฐ๋ฅผ ๋ง์กฑํ๋ฉด ์ฑ๊ณต์ด๋ค.
- ์คํ์ด ์๋ฌ ์์ด ๋๋๋ค.
- ์ถ๋ ฅ ๋งจ ์์ 3์ค ์์ฝ์ด ์๋ค.
์ถ์ฒ ์์์ ์ต์ 3๊ฐ ํญ๋ชฉ์ด ์๋ค.์ค๋ ๋ฐ๋ก ํ ์ค์ต 1๊ฐ๊ฐ ๋ฐ๋ก ์ ์๋๋ค.- ๊ณต์ ํ์ด์ง์ ์๋ ์ ๋ณด๋ ์ถ์ ์ฌ๋ถ๊ฐ ํ์๋๋ค.
Step 5) ์ง๋ฌธ์ ๋ฐ๊ฟ ์ฌ๊ฒ์ฆ
๊ฐ์ ์ฝ๋์์ prompt๋ฅผ ์๋์ฒ๋ผ ๋ฐ๊ฟ ๋ค์ ์คํํ๋ค.
๊ฒ์ฆ ์ ๋ ฅ
๊ฐ์ฌ ๋ชฉ์ ์ด ์๋๋ผ ๋น ๋ฅธ ์ค์ต ๋ชฉ์ ์ด์ผ.
Unit 1 ์ด๋ก ์ ์ต์ํ์ผ๋ก ๋ณด๊ณ smolagents๋ก ๋ฐ๋ก ๋์ด๊ฐ๋ ค๋ ์ฌ๋ ๊ธฐ์ค์ผ๋ก,
์ง๊ธ ๊ผญ ์ฝ์ ํ์ด์ง 2๊ฐ์ ๋ฐ๋ก ์คํํ ์ฝ๋ 1๊ฐ๋ง ์ถ์ฒํด์ค.์ฑ๊ณต ํ์
- ํ์ด์ง ์ถ์ฒ ์๊ฐ ์ ํํ 2๊ฐ๋ก ์ค์ด๋ ๋ค.
smolagents์น์ ์ด ์ฐ์ ์์์ ๋ฐ์๋๋ค.- ์คํ ์ฝ๋ ๋๋ ๋ช ๋ น ์ ์์ด ํฌํจ๋๋ค.
์ถ๋ ฅ ์์ ํํ
3์ค ์์ฝ
- ์ด ๊ณผ์ ์ ์์ด์ ํธ ๊ฐ๋
, ํ๋ ์์ํฌ, ์ค์ ๊ณผ์ ๋ก ์ด์ด์ง๋ค.
- ์
๋ฌธ์๋ Unit 0์์ ์ฝ์ค ๊ตฌ์กฐ๋ฅผ ๋จผ์ ์ก๊ณ Unit 1์์ ์์ด์ ํธ ๊ธฐ๋ณธ ๊ฐ๋
์ ์ตํ๋ ํธ์ด ์์ ์ ์ด๋ค.
- ๋ฐ๋ก ์์ ์์ง์ด๋ ค๋ฉด smolagents ์น์
์์ ์ต์ ์์ ๋ฅผ ์คํํด๋ณด๋ ๊ฒ์ด ๊ฐ์ฅ ๋น ๋ฅด๋ค.
์ถ์ฒ ์์
1. unit0
2. unit1
3. smolagents
...์ด ์ค์ต์์ ํ์ธํ ๊ณต์ ํฌ์ธํธ
1) ์ฝ์ค ๊ตฌ์กฐ
๊ณต์ ์ ์ฅ์์ ์ฝ์ค ์๊ฐ ํ์ด์ง๋ ์ ์ฒด ๊ตฌ์ฑ์ 0~4 ์ ๋ + ๋ณด๋์ค ์ ๋์ผ๋ก ์ ๋ฆฌํ๋ค. ํนํ ์ฝ์ค๋ ๊ธฐ์ด ์ด๋ก , ํธ์ฆ์จ, ์ ์ค์ผ์ด์ค, ์ต์ข ๊ณผ์ ๋ก ์ด์ด์ง๋ค๊ณ ์ค๋ช ํ๋ค.
2) ๊ถ์ฅ ํ์ต ์๋
๊ณต์ ์๊ฐ ํ์ด์ง๋ ๊ฐ ์ฑํฐ๋ฅผ 1์ฃผ, ์ฃผ๋น 3~4์๊ฐ ์ ๋๋ก ์ก๋๋ก ๊ถ์ฅํ๋ค. ๋ฐ๋ผ์ ์งง์ ์ค์ต์ด๋ผ๋ โ์ค๋ ๋ณผ ํ์ด์งโ์ โ๋ค์ ํ๋โ์ ํจ๊ป ์ ์ํ๋ ํ๋ฆ์ด ์ ์ฉํ๋ค.
3) smolagents์ ์ญํ
smolagents ๋ฌธ์๋ CodeAgent, ํด ์ฐ๊ฒฐ, ๋ค์ํ ๋ชจ๋ธ ์ฐ๊ฒฐ์ ๋ช ์ค ์ฝ๋๋ก ๋น ๋ฅด๊ฒ ์์ํ ์ ์๊ฒ ์ค๊ณ๋๋ค๊ณ ์ค๋ช
ํ๋ค. ์ด๋ฒ ์ค์ต์ ๊ทธ ๋น ๋ฅธ ์์ ๊ฐ๊ฐ์ ๊ทธ๋๋ก ์ฎ๊ฒจ์จ๋ค.
ํธ๋ฌ๋ธ์ํ
1) ModuleNotFoundError: No module named 'smolagents'
์์ธ:
- ๊ฐ์ํ๊ฒฝ ๋ฏธํ์ฑํ
- ์ค์น๊ฐ ์ค๊ฐ ์คํจ
ํด๊ฒฐ:
source .venv/bin/activate
pip install "smolagents[toolkit]" requests beautifulsoup42) ImportError ๋๋ bs4 ๊ด๋ จ ์ค๋ฅ
์์ธ:
beautifulsoup4๊ฐ ๋น ์ก๊ฑฐ๋ ๋ค๋ฅธ ํ์ด์ฌ์ ์ค์น๋จ
ํด๊ฒฐ:
python -m pip install beautifulsoup4
python -c "from bs4 import BeautifulSoup; print('bs4 ok')"3) 401, 403, ๋๋ ๋ชจ๋ธ ํธ์ถ ์ธ์ฆ ์ค๋ฅ
์์ธ:
- ํ๊ฒฝ์ ๋ฐ๋ผ Hugging Face Inference ํธ์ถ ์ ์ธ์ฆ์ด ํ์ํ ์ ์์
ํด๊ฒฐ:
export HF_TOKEN=hf_your_token
python app.py4) ํ์ด์ง ์์ฒญ ํ์์์ ๋๋ ReadTimeout
์์ธ:
- ๋คํธ์ํฌ ์ง์ฐ
- ๊ณต์ ์ฌ์ดํธ ์๋ต์ด ๋๋ฆผ
ํด๊ฒฐ:
timeout=20๊ฐ์ 40์ผ๋ก ๋๋ฆฐ๋ค.- ๋จผ์ ๋ธ๋ผ์ฐ์ ์์ URL์ด ์ด๋ฆฌ๋์ง ํ์ธํ๋ค.
- ์ฌ๋ด๋ง/๋ฐฉํ๋ฒฝ ํ๊ฒฝ์ด๋ฉด ๋ชจ๋ฐ์ผ ํซ์คํ ๋ฑ ๋ค๋ฅธ ๋คํธ์ํฌ๋ก ์ฌ์๋ํ๋ค.
5) ๋ต๋ณ์ด ๊ณต์ ์ ๋ณด๋ณด๋ค ์ผ๋ฐ๋ก ์ผ๋ก ํ๋ฆ
์์ธ:
- ํ๋กฌํํธ์ โ๊ณต์ ์ ๋ณด๋ง ์ฌ์ฉโ ์ ์ฝ์ด ์ฝํจ
- ํ์ํ ์น์ ํธ์ถ ์๊ฐ ๋ถ์กฑํจ
ํด๊ฒฐ:
- ํ๋กฌํํธ์
๊ณต์ HF Agents Course ์ ๋ณด๋ง ์ฌ์ฉ๋ฌธ์ฅ์ ์ ์งํ๋ค. unit0,unit1,smolagents๋ฅผ ๋ช ์์ ์ผ๋ก ๋น๊ตํ๋๋ก ์ง๋ฌธํ๋ค.
6) HTML ๊ตฌ์กฐ ๋ณ๊ฒฝ์ผ๋ก ๋ณธ๋ฌธ ์ถ์ถ์ด ๋น์ฝํจ
์์ธ:
- ํ์ด์ง ๋งํฌ์
์ด ๋ฐ๋์ด
p,li,h2์ ํ ๊ฒฐ๊ณผ๊ฐ ์ค์ด๋ฆ
ํด๊ฒฐ:
soup.select("main p, main li, article p, article li")์ฒ๋ผ ์ ํ์๋ฅผ ๋ ๊ตฌ์ฒดํํ๋ค.- ์ต์
์ ๊ฒฝ์ฐ
response.text์ผ๋ถ๋ฅผ ์ ์ฅํด ์ง์ ์ด๋ค ํ๊ทธ ๊ตฌ์กฐ์ธ์ง ํ์ธํ๋ค.
์ค์ต ์ฒดํฌ๋ฆฌ์คํธ
- ์์ ํด๋ ์์ฑ ์๋ฃ
- ๊ฐ์ํ๊ฒฝ ํ์ฑํ ์๋ฃ
-
smolagents,requests,beautifulsoup4์ค์น ์๋ฃ - ๊ธฐ๋ณธ Q&A ์คํ ์ฑ๊ณต
- ์ง๋ฌธ ๋ณ๊ฒฝ ํ ์ฌ๊ฒ์ฆ ์ฑ๊ณต
- ํธ๋ฌ๋ธ์ํ 1๊ฐ ์ด์ ์ง์ ๋ณต๊ตฌ
๋ค์ ํ์ฅ ์์ด๋์ด
get_course_section()์ Unit 3, Unit 4๋ฅผ ์ถ๊ฐํด ์ง๋ ์ถ์ฒ ์์ด์ ํธ๋ก ํ์ฅํ๊ธฐ- ๋ต๋ณ์ Markdown ํ์ผ๋ก ์ ์ฅํ๋ ์ปค์คํ ํด์ ๋ถ์ด๊ธฐ
DuckDuckGoSearchTool()์ ์ถ๊ฐํด ๊ณต์ ์ ์ฅ์ ์ด์/ํ ๋ก ๊น์ง ๋น๊ตํ๊ฒ ๋ง๋ค๊ธฐ- ์ฌ๋ฌ ์น์ ์ ๋จผ์ ์ฝ๋ ๋ณด์กฐ ์์ด์ ํธ๋ฅผ ๋ถ์ฌ ๋ฉํฐ์์ด์ ํธ ์คํ์ผ๋ก ํ์ฅํ๊ธฐ
๋ง๋ฌด๋ฆฌ
์ด๋ฒ ์ค์ต์ ํต์ฌ์ โ์์ด์ ํธ๊ฐ ์๋ฌด ๋ง์ด๋ ํ๊ฒ ๋๋ ๊ฒโ์ด ์๋๋ผ, ์ฝ์ด๋ ๋๋ ๊ณต์ ์ ๋ณด์์ ์ขํ๊ณ ๊ทธ ์์์ ํ๋ํ๊ฒ ๋ง๋๋ ๊ฒ์ด๋ค. ์ด ์ต๊ด์ ์ก์๋๋ฉด ์ดํ Unit 2 ํ๋ ์์ํฌ ๋น๊ต๋ Unit 4 ์ต์ข ๊ณผ์ ์ค๋น์์๋ ๋ต๋ณ ํ์ง์ด ํจ์ฌ ์์ ์ ์ด๋ค.
์์ฑํ AI ํ์ฉ ๊ณ ์ง
์ด ๋ฌธ์๋ ์์ฑํ AI๋ฅผ ํ์ฉํด ์ด์ ๊ตฌ์กฐ์ ์์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ , ๊ณต๊ฐ๋ Hugging Face Agents Course ์ ์ฅ์/์ฝ์ค ์๊ฐ ํ์ด์ง/smolagents ๋ฌธ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฌ๋์ด ์ฌํ ๋จ๊ณ, ๋ช ๋ น, ์ฑ๊ณต ํ์ , ํธ๋ฌ๋ธ์ํ , ๋งํฌ ๊ตฌ์กฐ๋ฅผ ๊ฒํ ํด ํธ์งํ์ต๋๋ค.