File size: 3,561 Bytes
21bdc64
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
---
title: IntentFinder API
emoji: ๐Ÿ”Ž
colorFrom: blue
colorTo: indigo
sdk: docker
app_port: 7860
pinned: false
---

> **HuggingFace Space ๋ฐฐํฌ ๋ฉ”๋ชจ**
> - SDK: Docker (์œ„ ๋ฉ”ํƒ€). ์ง„์ž…์  `api:app`, ํฌํŠธ 7860.
> - **Space Settings โ†’ Secrets ์— ์ž…๋ ฅ**(์ฝ”๋“œ/๋ ˆํฌ์—” ๋‘์ง€ ์•Š์Œ):
>   `NAVER_CLIENT_ID`, `NAVER_CLIENT_SECRET`, `NAVER_API_KEY`, `NAVER_SECRET_KEY`, `NAVER_CUSTOMER_ID`,
>   `ANTHROPIC_API_KEY`, `SUPABASE_URL`, `SUPABASE_SERVICE_KEY`
> - **๋ฐฐํฌ ๋ณดํ˜ธ ์‹œํฌ๋ฆฟ**(๊ถŒ์žฅ): `ALLOWED_ORIGINS`(๋Œ€์‹œ๋ณด๋“œ ๋„๋ฉ”์ธ), `DT_API_KEY`(๋Œ€์‹œ๋ณด๋“œ์™€ ๊ณต์œ ), `RATE_MAX_PER_MIN`
> - ํ—ฌ์Šค์ฒดํฌ: `GET /health` ยท ๋ถ„์„: `GET /analyze?keyword=...` (`DT_API_KEY` ์„ค์ • ์‹œ `X-DT-Key` ํ—ค๋” ํ•„์š”)

# IntentFinder โ€” ๊ฒ€์ƒ‰ ์ธํ…ํŠธ ๋ถ„์„ ๋Œ€์‹œ๋ณด๋“œ

ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋„ค์ด๋ฒ„ ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰ ๋ฐ์ดํ„ฐ + AI ํด๋Ÿฌ์Šคํ„ฐ๋ง์œผ๋กœ ๊ฒ€์ƒ‰ ์˜๋„ยทํƒ€๊นƒยท์—ฐ๊ด€ ๊ฒฝ๋กœ๋ฅผ ๋ถ„์„ํ•˜๋Š” SMB์šฉ ๋Œ€์‹œ๋ณด๋“œ.

## ๊ตฌ์„ฑ

```
[dashboard.html]  React ๋‹จ์ผ ํŒŒ์ผ ํ”„๋ก ํŠธ (๋นŒ๋“œ ๋ถˆํ•„์š”)
      โ”‚  fetch /analyze?keyword=
      โ–ผ
[api.py]  FastAPI ๋ฐฑ์—”๋“œ (ํฌํŠธ 8000)
      โ”œโ”€ naver_collector.py   ๋„ค์ด๋ฒ„ ๊ฒ€์ƒ‰๊ด‘๊ณ  ํ‚ค์›Œ๋“œ๋„๊ตฌ (๊ฒ€์ƒ‰๋Ÿ‰ยท๊ฒฝ์Ÿ)
      โ”œโ”€ clusterer.py         ๊ด€๋ จ์„ฑ ํ•„ํ„ฐ + S-BERTโ†’UMAPโ†’HDBSCAN ํด๋Ÿฌ์Šคํ„ฐ๋ง
      โ”œโ”€ analyzer.py          Overview ์นด๋“œ ์ง‘๊ณ„
      โ”œโ”€ intent_classifier.py Claude Haiku ์˜๋„๋ถ„๋ฅ˜ยทํ…Œ๋งˆ๋ช…ยท๋งˆ์ผ€ํŒ… ์ œ์•ˆ
      โ”œโ”€ autocomplete.py      ๋„ค์ด๋ฒ„ ์ž๋™์™„์„ฑ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ
      โ”œโ”€ search_path.py       ์ž„๋ฒ ๋”ฉ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ(ํด๋ฐฑ)
      โ”œโ”€ datalab.py           ๋ฐ์ดํ„ฐ๋žฉ ์„ฑ๋ณ„ร—์—ฐ๋ น ์ถ”์ • ๋น„์ค‘
      โ”œโ”€ cache.py             SQLite ๋น ๋ฅธ ์žฌ์กฐํšŒ ์บ์‹œ
      โ””โ”€ supabase_store.py    Supabase ์ ์žฌ(ํ†ตํ•ฉ BI ์ €์žฅ์†Œ)
```

## ์„ค์น˜ ๋ฐ ์‹คํ–‰

```bash
# 1. ์˜์กด์„ฑ ์„ค์น˜ (torch ํฌํ•จ, ์ˆ˜๋ฐฑ MB)
pip install -r requirements.txt

# 2. ์ž๊ฒฉ์ฆ๋ช… ์„ค์ •: .env.example์„ .env๋กœ ๋ณต์‚ฌ ํ›„ ๊ฐ’ ์ฑ„์šฐ๊ธฐ
#    - ๋„ค์ด๋ฒ„ ๊ฒ€์ƒ‰๊ด‘๊ณ  (searchad.naver.com > ๋„๊ตฌ > API)
#    - ANTHROPIC_API_KEY (platform.claude.com)
#    - ๋„ค์ด๋ฒ„ ๋ฐ์ดํ„ฐ๋žฉ (developers.naver.com)
#    - SUPABASE_URL / SUPABASE_SERVICE_KEY (Supabase > Settings > API)

# 3. Supabase ํ…Œ์ด๋ธ” ์ƒ์„ฑ: supabase_schema.sql์„ SQL Editor์— ๋ถ™์—ฌ Run

# 4. ์‹คํ–‰
python -m uvicorn api:app --port 8000      # ๋ฐฑ์—”๋“œ
python -m http.server 5500                 # ํ”„๋ก ํŠธ
#  โ†’ http://127.0.0.1:5500/dashboard.html
```

## ์ž๊ฒฉ์ฆ๋ช… ํ‚ค (.env)

| ๋ณ€์ˆ˜ | ๋ฐœ๊ธ‰์ฒ˜ | ์šฉ๋„ |
|---|---|---|
| `NAVER_API_KEY` / `NAVER_SECRET_KEY` / `NAVER_CUSTOMER_ID` | searchad.naver.com | ๊ฒ€์ƒ‰๋Ÿ‰ยท๊ฒฝ์Ÿ |
| `ANTHROPIC_API_KEY` | platform.claude.com | ์˜๋„๋ถ„๋ฅ˜ยท๋งˆ์ผ€ํŒ… ์ œ์•ˆ |
| `NAVER_CLIENT_ID` / `NAVER_CLIENT_SECRET` | developers.naver.com | ์ธ๊ตฌํ†ต๊ณ„ |
| `SUPABASE_URL` / `SUPABASE_SERVICE_KEY` | Supabase | ํ†ตํ•ฉ ์ €์žฅ์†Œ ์ ์žฌ |

ํ‚ค๊ฐ€ ์—†๋Š” ๊ธฐ๋Šฅ์€ ์ž๋™์œผ๋กœ ๋น„ํ™œ์„ฑ(placeholder)๋˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ์ •์ƒ ๋™์ž‘ํ•œ๋‹ค.

## ์ฃผ์˜

- `.env`(์‹ค์ œ ํ‚ค)๋Š” **์ ˆ๋Œ€ ๊ณต์œ ยท์ปค๋ฐ‹ ๊ธˆ์ง€**. ๊ณต์œ ๋Š” `.env.example`๋งŒ.
- `service_role` ํ‚ค๋Š” RLS ์šฐํšŒ ํ‚ค โ†’ ์„œ๋ฒ„์—์„œ๋งŒ ์‚ฌ์šฉ, ํ”„๋ก ํŠธ ๋…ธ์ถœ ๊ธˆ์ง€.
- ๋„ค์ด๋ฒ„ ์ž๋™์™„์„ฑยท๋ฐ์ดํ„ฐ๋žฉ์€ ๋น„๊ณต์‹/์ƒ๋Œ€์ง€์ˆ˜ ๊ธฐ๋ฐ˜ โ†’ "์ถ”์ •" ๋ผ๋ฒจ ์œ ์ง€.
- CDN(BabelยทTailwind)์€ ๋ฐ๋ชจ์šฉ โ†’ ์‹ค์„œ๋น„์Šค๋Š” Vite ๋นŒ๋“œ ๊ถŒ์žฅ.

## ์ง„ํ–‰ ๊ธฐ๋ก

- `checklist.md` โ€” ๋‹จ๊ณ„๋ณ„ ์™„๋ฃŒ ํ˜„ํ™ฉ
- `context-notes.md` โ€” ์„ค๊ณ„ ๊ฒฐ์ •๊ณผ ๊ทผ๊ฑฐ
- `data-requirements.md` โ€” ๋ฐ์ดํ„ฐ ์†Œ์Šคยทํ•œ๊ณ„ ๋ถ„์„