File size: 2,901 Bytes
fe8a5d3
61b4ff5
 
fe8a5d3
61b4ff5
fe8a5d3
61b4ff5
 
fe8a5d3
 
 
 
 
61b4ff5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
---
title: HuggingFace Calorie Counter
emoji: ๐Ÿฑ
colorFrom: pink
colorTo: yellow
sdk: gradio
sdk_version: 5.9.1
python_version: "3.11"
app_file: app.py
pinned: false
license: apache-2.0
---

# 6์ฃผ์ฐจ: HuggingFace Space ์นผ๋กœ๋ฆฌ ์นด์šดํ„ฐ

์Œ์‹ ์‚ฌ์ง„์„ ์—…๋กœ๋“œํ•˜๋ฉด HuggingFace Inference API๋กœ ์Œ์‹์„ ์ธ์‹ํ•˜๊ณ ,
LLM์ด 1์ธ๋ถ„ ๊ธฐ์ค€ ์นผ๋กœ๋ฆฌ/ํƒ„๋‹จ์ง€๋ฅผ ์ถ”์ •ํ•˜๋Š” Gradio ์•ฑ์ด๋‹ค.
์™„์„ฑ๋œ ์•ฑ์€ ๊ทธ๋Œ€๋กœ **HuggingFace Space** ์— ์˜ฌ๋ ค ๊ณต๊ฐœ URL์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

> ์ด ์ž๋ฃŒ์˜ ๊ธฐ์ˆ  ์ •๋ณด๋Š” 2026-04 ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค.

## ํŒŒ์ผ ๊ตฌ์กฐ

```
week06/
โ”œโ”€โ”€ app.py              # Gradio ์•ฑ ๋ณธ์ฒด (TODO 4๊ณณ์„ ์ฑ„์›Œ ์™„์„ฑ)
โ”œโ”€โ”€ model_config.py     # HF ๋ชจ๋ธ ์ด๋ฆ„ ์ƒ์ˆ˜ + InferenceClient ํŒฉํ† ๋ฆฌ
โ”œโ”€โ”€ requirements.txt    # Space๊ฐ€ ์„ค์น˜ํ•  ์˜์กด์„ฑ
โ”œโ”€โ”€ .env.example        # HF_TOKEN ํ…œํ”Œ๋ฆฟ
โ””โ”€โ”€ README.md           # ์ด ํŒŒ์ผ (์•ž์˜ YAML์ด Space ์„ค์ •)
```

## ์‹คํ–‰ ๋ฐฉ๋ฒ• (๋กœ์ปฌ)

```bash
# 1) ํ† ํฐ ๋ฐœ๊ธ‰: https://huggingface.co/settings/tokens (Read ๊ถŒํ•œ)
cp .env.example .env
# .env ํŒŒ์ผ์„ ์—ด์–ด HF_TOKEN=hf_... ๋กœ ์ˆ˜์ •

# 2) ์˜์กด์„ฑ ์„ค์น˜
uv pip install -r requirements.txt

# 3) ์‹คํ–‰
uv run python app.py
# ๋ธŒ๋ผ์šฐ์ €: http://127.0.0.1:7860
```

## TODO (app.py ์•ˆ)

1. **`SYSTEM_PROMPT`** โ€” ์˜์–‘์‚ฌ ์—ญํ•  + JSON ์Šคํ‚ค๋งˆ ๊ฐ•์ œ (ChatPromptTemplate ์•ˆ์— ๋“ค์–ด๊ฐ€๋ฏ€๋กœ ์ค‘๊ด„ํ˜ธ๋Š” `{{ }}`๋กœ ์ด์Šค์ผ€์ดํ”„)
2. **`_chain_lazy()` ์•ˆ LCEL ์ฒด์ธ ์กฐ๋ฆฝ** (4๋‹จ๊ณ„)
   - 2-1. `HuggingFaceEndpoint` ์ƒ์„ฑ (`repo_id=LLM_MODEL`, `task="text-generation"`, ํ† ํฐ)
   - 2-2. `ChatHuggingFace(llm=endpoint)` ๋กœ ๊ฐ์‹ธ๊ธฐ
   - 2-3. `ChatPromptTemplate.from_messages([("system", SYSTEM_PROMPT), ("human", "...{labels_json}")])`
   - 2-4. `_chain = prompt | llm | JsonOutputParser()` ํŒŒ์ดํ”„ ์—ฐ๊ฒฐ
3. **`classify_food()`** โ€” `client.image_classification(tmp_path, model=VISION_MODEL)` ํ˜ธ์ถœ
4. **`estimate_calories()`** โ€” `chain.invoke({"labels_json": labels_json})` ํ˜ธ์ถœ

๋„ค ๊ณณ์„ ์ฑ„์šฐ๋ฉด ์•ฑ์ด ๋™์ž‘ํ•œ๋‹ค.

## HuggingFace Space ๋ฐฐํฌ ๋ฐฉ๋ฒ•

1. https://huggingface.co/new-space ์—์„œ **Gradio** SDK๋กœ Space ์ƒ์„ฑ
2. Space์˜ **Settings > Variables and secrets** ์— `HF_TOKEN` ๋“ฑ๋ก
3. ํŒŒ์ผ ์—…๋กœ๋“œ (์›น ๋“œ๋ž˜๊ทธ or `git push`)
   ```bash
   git clone https://huggingface.co/spaces/<๋ณธ์ธ>/<space-์ด๋ฆ„>
   cd <space-์ด๋ฆ„>
   cp ../week06/{app.py,model_config.py,requirements.txt,README.md} .
   git add .
   git commit -m "init"
   git push
   ```
4. ๋ช‡ ๋ถ„ ํ›„ `https://huggingface.co/spaces/<๋ณธ์ธ>/<space-์ด๋ฆ„>` ์ ‘์†ํ•˜์—ฌ ๋™์ž‘ ํ™•์ธ

## ๊ณผ์ œ

- [ ] Space URL ์ œ์ถœ
- [ ] title/emoji/ํ”„๋กฌํ”„ํŠธ ์ค‘ ํ•˜๋‚˜ ์ด์ƒ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆ
- [ ] ๊ฒฐ๊ณผ ์Šคํฌ๋ฆฐ์ƒท 1์žฅ + 2~3์ค„ ์„ค๋ช…

## ์‚ฌ์šฉ ๋ชจ๋ธ

| ์—ญํ•  | ๋ชจ๋ธ |
|------|------|
| ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜ | `nateraw/food` |
| ์นผ๋กœ๋ฆฌ ์ถ”์ • LLM | `meta-llama/Meta-Llama-3-8B-Instruct` |