intentfinder-api / checklist.md
youngryong's picture
deploy: IntentFinder API (HF Docker Space)
21bdc64
|
Raw
History Blame Contribute Delete
4.09 kB

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

๋ชฉํ‘œ: ์‚ฌ์šฉ์ž๊ฐ€ ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฒ€์ƒ‰ ์ธํ…ํŠธ๋ฅผ ๋ถ„์„ํ•˜๋Š” React ์›น ์„œ๋น„์Šค. ๋ฐฉ์‹: ์˜จ๋””๋งจ๋“œ + ์บ์‹ฑ. ๋ฐฑ์—”๋“œ Python(FastAPI), ํ”„๋ก ํŠธ React.

1๋‹จ๊ณ„ โ€” ๋ฐฑ์—”๋“œ ๊ณจ๊ฒฉ + ๋„ค์ด๋ฒ„ ์‹ค์‹œ๊ฐ„ (์™„๋ฃŒ)

  • naver_collector.py โ†’ fetch_keywords() ์žฌ์‚ฌ์šฉ (์‹œ๋“œ ํ•˜๋“œ์ฝ”๋”ฉ ์ œ๊ฑฐ)
  • analyzer.py โ€” ์›์‹œ df โ†’ Overview ์ง‘๊ณ„ (์ด๊ฒ€์ƒ‰๋Ÿ‰ยท๊ฒฝ์Ÿ๋ถ„ํฌยท์ค‘์•™๊ฐ’ยท์ƒ์œ„ ํ‚ค์›Œ๋“œ)
  • cache.py โ€” SQLite ์บ์‹œ (ํ‚ค์›Œ๋“œ+๋‚ ์งœ ๋‹จ์œ„, ์žฌ์กฐํšŒ ์ฆ‰์‹œ ๋ฐ˜ํ™˜)
  • api.py โ€” FastAPI GET /analyze?keyword= ์—”๋“œํฌ์ธํŠธ
  • ๋กœ์ปฌ ์‹คํ–‰ + ์ž„์˜ ํ‚ค์›Œ๋“œ ๊ฒ€์ฆ (๊ณจํ”„ 0.36s, ๊ฐ•์•„์ง€์‚ฌ๋ฃŒ 0.22s, ์บ์‹œ ์žฌ์กฐํšŒ 0.00s)

2๋‹จ๊ณ„ โ€” ์˜๋ฏธ ํด๋Ÿฌ์Šคํ„ฐ๋ง (์™„๋ฃŒ)

  • sentence-transformers + umap-learn + hdbscan ์„ค์น˜
  • S-BERT โ†’ UMAP(5D) โ†’ HDBSCAN(leaf) ํŒŒ์ดํ”„๋ผ์ธ (clusterer.py)
  • ๋…ธ์ด์ฆˆ(-1) ํ•„ํ„ฐ๋ง, ๊ทธ๋ฃน๋ณ„ ๊ฒ€์ƒ‰๋Ÿ‰ ์ง‘๊ณ„, /analyze์— ์—ฐ๊ฒฐ
  • ๊ฒ€์ฆ: ์บ ํ•‘์šฉํ’ˆ 37๊ฐœ ํด๋Ÿฌ์Šคํ„ฐ(์˜์ž/์ง€๊ฐ‘/์บ ํ•‘ํ…Œ์ด๋ธ”/์•ผ์ „์นจ๋Œ€/๋‚œ๋กœ๋ฅ˜ ๋“ฑ ์˜๋ฏธ ๊ตฐ์ง‘ํ™” ํ™•์ธ)
  • 2.5 ์‹œ๋“œ ๊ด€๋ จ์„ฑ ํ•„ํ„ฐ (filter_by_relevance, ์ž„๊ณ„๊ฐ’ 0.35) โ€” ๊ณ„์‚ฐ๊ธฐ ๋“ฑ 197๊ฐœ ์ œ๊ฑฐ, ์ด ๊ฒ€์ƒ‰๋Ÿ‰ 4.13Mโ†’2.34M, ๋‹จ์ผ ๋…ธ์ด์ฆˆ ์ง€๋ฐฐ ํ•ด์†Œ. (์Šฌ๋ฆฌํผยท์ƒŒ๋“ค ๋“ฑ ๊ฒฝ๊ณ„์–ด๋Š” ์ž”์กด โ€” ํ›„์† ์ •์ œ ์—ฌ์ง€)

3๋‹จ๊ณ„ โ€” ์˜๋„ ๋ถ„๋ฅ˜ ๋ฌถ์Œ (Claude Haiku 4.5) โ€” ์™„๋ฃŒ

  • ํด๋Ÿฌ์Šคํ„ฐ ๋‹จ์œ„ ์˜๋„ ๋ถ„๋ฅ˜(์ •๋ณด/๊ฑฐ๋ž˜/๋‚ด๋น„/ํ˜ผํ•ฉ) โ€” 1ํšŒ ํ˜ธ์ถœ๋กœ ๋ฌถ์Œ
  • ๋„๋„› ๋น„์ค‘ + ์˜๋„ ๋ฐฐ์ง€
  • ํ…Œ๋งˆํ˜• ๊ทธ๋ฃน๋ช… ์ƒ์„ฑ("์บ ํ•‘ ํ…ํŠธ"ยท"์•ผ์ „์นจ๋Œ€ ๋ฐ ์นจ๋‚ญ" ๋“ฑ)
  • SMB ๋งˆ์ผ€ํŒ… ์•ก์…˜ ์ œ์•ˆ ์ƒ์„ฑ (์ฐจ๋ฐ• ๋ฒˆ๋“ค ์ „๋žต ๋“ฑ ์‹ค๋ฐ์ดํ„ฐ ์ธ์‚ฌ์ดํŠธ)
  • ๊ฒ€์ฆ: ์บ ํ•‘์šฉํ’ˆ โ€” ๋„๋„›ยทํ…Œ๋งˆยท์ œ์•ˆ ๋ชจ๋‘ ์ถœ๋ ฅ, ๋น„์šฉ ํ‚ค์›Œ๋“œ๋‹น 11.7์›
  • ํด๋Ÿฌ์Šคํ„ฐ ๋‹จ์œ„ ๊ด€๋ จ์„ฑ ํ•„ํ„ฐ(ํ‰๊ท  0.45 ์ปท) โ€” ๋ฐฑํŒฉยท์ƒŒ๋“คยท๊ฐ€๋””๊ฑด ๋“ฑ ํŒจ์…˜ ๊ตฐ์ง‘ ์ œ๊ฑฐ. ํšจ๊ณผ: ํด๋Ÿฌ์Šคํ„ฐ 27โ†’19, ๊ฑฐ๋ž˜ํ˜• ๋น„์ค‘ 1,021,575โ†’464,120, ์ƒ์œ„ ํ…Œ๋งˆ ์ „๋ถ€ ์บ ํ•‘ ์šฉํ’ˆ์œผ๋กœ ์ •ํ™”. (๊ฐ€๋ฐฉ๋ฅ˜ 0.518๋Š” ์บ ํ•‘ ์ธ์ ‘์–ด๋ผ ์ž”์กด โ€” ์ž„๋ฒ ๋”ฉ์ƒ ์™„์ „ ๋ถ„๋ฆฌ๋Š” ๋ถˆ๊ฐ€, ํ—ˆ์šฉ)

4๋‹จ๊ณ„ โ€” React ํ”„๋ก ํŠธ ์—ฐ๋™ (์™„๋ฃŒ)

  • ๋ชฉ์—… HTML โ†’ React ๋‹จ์ผ ํŒŒ์ผ ์•ฑ(dashboard.html, ๋นŒ๋“œ ๋„๊ตฌ ์—†์Œ)
  • /analyze ์—ฐ๋™, ๋ถ„์„ ์‹คํ–‰ ๋ฒ„ํŠผ ์‹ค๋™์ž‘ (๋ฏธ๋ฆฌ๋ณด๊ธฐ์—์„œ ๊ฒ€์ฆ: ์นด๋“œ 3๊ฐœยทํด๋Ÿฌ์Šคํ„ฐ 18ํ–‰)
  • ๋กœ๋”ฉ/์—๋Ÿฌ/์บ์‹œ ์ƒํƒœ ์ฒ˜๋ฆฌ, ๋„๋„›ยท์ธ๊ตฌํ†ต๊ณ„ ๋ฏธ์ถฉ์กฑ ์‹œ ์•ˆ๋‚ด ์ž๋ฆฌ ํ‘œ์‹œ
  • ๋น„๊ณ : Babel standalone ๊ธฐ๋ณธ์ด automatic JSX runtime์ด๋ผ import ๊ตฌ๋ฌธ์ด ๋ผ์–ด ๋ Œ๋”๊ฐ€ ์ฃฝ์Œ โ†’ classic runtime์„ ๋ช…์‹œ ์ง€์ •ํ•ด ์ปดํŒŒ์ผยท์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐ

์‹คํ–‰ ๋ฐฉ๋ฒ•

  1. ๋ฐฑ์—”๋“œ: cd keyword && python -m uvicorn api:app --port 8000
  2. ํ”„๋ก ํŠธ: cd keyword && python -m http.server 5500 โ†’ ๋ธŒ๋ผ์šฐ์ €์—์„œ http://127.0.0.1:5500/dashboard.html

5๋‹จ๊ณ„ โ€” ๋ณด์กฐ

  • ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ: ๋„ค์ด๋ฒ„ ์ž๋™์™„์„ฑ(์‹ค์ œ ๋™์‹œ๊ฒ€์ƒ‰) ์šฐ์„  + ์ž„๋ฒ ๋”ฉ ์ถ”์ • ํด๋ฐฑ (autocomplete.py + search_path.py) ๊ฒ€์ฆ: ์บ ํ•‘์šฉํ’ˆโ†’์ž๋™์™„์„ฑ 14๋…ธ๋“œ("๋„ค์ด๋ฒ„ ์ž๋™์™„์„ฑ" ๋ฐฐ์ง€), ๊ฐ•์•„์ง€์‚ฌ๋ฃŒโ†’์ž„๋ฒ ๋”ฉ ํด๋ฐฑ 13๋…ธ๋“œ("์ž„๋ฒ ๋”ฉ ์ถ”์ •" ๋ฐฐ์ง€). ์ž๋™์™„์„ฑ์€ ๋น„๊ณต์‹ ์—”๋“œํฌ์ธํŠธ(๋นˆ์•ฝ/์ฐจ๋‹จ ๊ฐ€๋Šฅ) โ†’ 5๋…ธ๋“œ ๋ฏธ๋งŒ์ด๋ฉด ์ž„๋ฒ ๋”ฉ์œผ๋กœ graceful ๋Œ€์ฒด.
  • ์ธ๊ตฌํ†ต๊ณ„: ๋ฐ์ดํ„ฐ๋žฉ ๊ฒ€์ƒ‰ํŠธ๋ Œ๋“œ + ์•ต์ปค("๋‚ ์”จ") ์ •๊ทœํ™”๋กœ ์„ฑ๋ณ„ร—์—ฐ๋ น ์ถ”์ • ๋น„์ค‘ (datalab.py + ํ”„๋ก ํŠธ ๋ง‰๋Œ€) ์‹ค๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ์™„๋ฃŒ โ€” ๊ฐ•์•„์ง€์‚ฌ๋ฃŒ: ์—ฌ์„ฑ>๋‚จ์„ฑยท๊ณ ์—ฐ๋ น>์ €์—ฐ๋ น ๋ถ„ํฌ๋กœ ์˜๋ฏธ ์žˆ๊ฒŒ ์ถœ๋ ฅ, ํ”„๋ก ํŠธ ๋ง‰๋Œ€ ๋ Œ๋” ํ™•์ธ.
  • Supabase ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ โ€” BI ํ”Œ๋žซ ํ…Œ์ด๋ธ” 3๊ฐœ(analysis_run/cluster/demographic)์— ์ ์žฌ (supabase_schema.sql + supabase_store.py). SQLite๋Š” ๋น ๋ฅธ ์บ์‹œ ์œ ์ง€, Supabase๋Š” ํ†ตํ•ฉ ๋ถ„์„ ์ €์žฅ์†Œ. ๊ฒ€์ฆ ์™„๋ฃŒ: ์บ ํ•‘์šฉํ’ˆ ๋ถ„์„ โ†’ run 1ํ–‰ยทcluster 19ํ–‰ยทdemographic 8ํ–‰ ์ ์žฌ ํ™•์ธ. Tableau/Looker ์กฐํšŒ ๊ฐ€๋Šฅ.