|
1 | | -# โจProject Conventionโจ |
2 | | ---- |
| 1 | +# ๐ค ์๋ฐํ๋ฌํ
AI |
3 | 2 |
|
4 | | -<br> |
5 | | - |
6 | | -## โ๏ธ Commit Convention |
| 3 | +FastAPI ๊ธฐ๋ฐ์ **AI ์ถ์ฒ ์๋ฒ**๋ก, ์์ฝ์ฒ ์์์ฑ๋ถํ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก |
| 4 | +**๋ง์ถคํ ๋ฐ์ฐฌ ์ถ์ฒ**๊ณผ **์ญ์ทจ ํ ์ ๊ณต**์ ๋ด๋นํฉ๋๋ค. |
7 | 5 |
|
8 | | -์ปค๋ฐ ๋ฉ์์ง๋ **Udacity ์คํ์ผ**์ ์ฌ์ฉํ๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก ์์ฑ |
| 6 | +### ๐น AI ๊ธฐ๋ฅ |
9 | 7 |
|
10 | | -``` |
11 | | -type: Subject (์ ๋ชฉ) |
| 8 | +* **๋ฉ๋ด ์ถ์ฒ** |
12 | 9 |
|
13 | | -body (๋ณธ๋ฌธ) (๊ธด ์ค๋ช
์ด ํ์ํ ๊ฒฝ์ฐ์ ์์ฑ) |
| 10 | + * 5๊ฐ์ง ์ฝ์
ํธ ๊ธฐ๋ฐ: |
| 11 | + `diet(๋ค์ด์ดํธ)`, `keto(์ ํ๊ณ ์ง)`, `low_sodium(์ ์ผ)`, `glycemic(ํ๋น)`, `bulking(๋ฒํฌ์
)` |
| 12 | + * ์
๋ ฅ ๋ฉ๋ด๋ช
-> ์ ์ฌ๋ ๋งค์นญ -> ์์ ์ฑ๋ถ ํผ์ฒํ -> ์ฝ์
ํธ๋ณ ์ ์ํ(0\~100) |
14 | 13 |
|
15 | | -footer (๊ผฌ๋ฆฌ๋ง) (issue tracker ID๋ฅผ ๋ช
์ํ๊ณ ์ถ์ ๊ฒฝ์ฐ์ ์์ฑ) |
16 | | -``` |
17 | | -<br> |
| 14 | +* **Tip ์์ฑ** |
| 15 | + |
| 16 | + * OpenAI API ์ฐ๋์ ํตํ **์์ต๊ด ๊ฐ์ด๋ / ๋ ์ํผ ์ ์** |
| 17 | + |
| 18 | +--- |
18 | 19 |
|
| 20 | +## ๐ Tech Stack |
| 21 | +<img width="1045" height="844" alt="struct-be" src="https://github.com/user-attachments/assets/a10dd991-3e69-46dc-8eb0-152d27e3c1e4" /> |
19 | 22 |
|
20 | | -### ๐ **type**: ์ปค๋ฐ์ ์ ํ |
| 23 | +### ๐น Framework & Language |
| 24 | +- **Python 3.11** |
| 25 | +- **FastAPI : ๊ฒฝ๋ ์น ํ๋ ์์ํฌ** |
| 26 | +- **Uvicorn : ASGI ์๋ฒ** |
21 | 27 |
|
22 | | -| ํ์
| ์ค๋ช
| |
23 | | -|------------|------------------------------------------------| |
24 | | -| `feat` | โจ ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ | |
25 | | -| `fix` | ๐ ๋ฒ๊ทธ ์์ | |
26 | | -| `docs` | ๐ ๋ฌธ์ ์์ (README, ์ฃผ์ ๋ฑ) | |
27 | | -| `style` | ๐ ์ฝ๋ ํฌ๋งทํ
, ์ธ๋ฏธ์ฝ๋ก ๋๋ฝ ๋ฑ ๊ธฐ๋ฅ ์ํฅ ์๋ ๋ณ๊ฒฝ | |
28 | | -| `refactor` | โป๏ธ ์ฝ๋ ๋ฆฌํฉํ ๋ง (๊ธฐ๋ฅ ๋ณํ ์์) | |
29 | | -| `test` | โ
ํ
์คํธ ์ฝ๋ ์ถ๊ฐ ๋๋ ์์ | |
30 | | -| `chore` | ๐ง ๋น๋ ์ค์ , ํจํค์ง ๋งค๋์ ์ค์ ๋ฑ ๊ธฐํ ์์
| |
31 | | -| `perf` | โก ์ฑ๋ฅ ๊ฐ์ | |
32 | | -| `ci` | ๐ CI ๊ด๋ จ ์ค์ ๋ฐ ์คํฌ๋ฆฝํธ ์์ | |
33 | | -| `revert` | โ๏ธ ์ด์ ์ปค๋ฐ ๋๋๋ฆฌ๊ธฐ | |
| 28 | +<img src="https://img.shields.io/badge/Python%203.11-3776AB?style=flat-square&logo=python&logoColor=white"/> <img src="https://img.shields.io/badge/FastAPI-009688?style=flat-square&logo=fastapi&logoColor=white"/> <img src="https://img.shields.io/badge/Uvicorn-499848?style=flat-square&logo=python&logoColor=white"/> |
34 | 29 |
|
35 | | -<br> |
36 | 30 |
|
37 | | -### ๐๏ธ **Subject**: ์ ๋ชฉ |
38 | 31 |
|
39 | | -- 50์ ์ด๋ด๋ก ๊ฐ๊ฒฐํ๊ฒ ์์ฑ |
40 | | -- ๋ง์นจํ(`.`) ๊ธ์ง |
41 | | -- ๊ณผ๊ฑฐ ์์ X, ๋ช
๋ น์ด ์ฌ์ฉ |
| 32 | +### ๐น Data / ML |
| 33 | +- **scikit-learn : ๋ฒกํฐํ, ์ฐจ์ ์ถ์, ์ค์ผ์ผ๋ง, ๊ฒฐ์ธก์น ๋ณด์ ** |
| 34 | +- **hnswlib : ๊ทผ์ ํ์ (๋ฉ๋ด๋ช
์ ์ฌ๋ ๋งค์นญ)** |
| 35 | +- **numpy / joblib : ์์น ์ฐ์ฐ ๋ฐ ๋ชจ๋ธ ์ง๋ ฌํ** |
| 36 | +-**์์ฝ์ฒ ์์์ฑ๋ถํ ๋ฐ์ดํฐ (Excel/CSV) : ์์ ์ ๋ณด ๊ธฐ๋ฐ ํ์ต/์ถ์ฒ** |
| 37 | + |
| 38 | +<img src="https://img.shields.io/badge/scikit--learn-F7931E?style=flat-square&logo=scikitlearn&logoColor=white"/> <img src="https://img.shields.io/badge/hnswlib-333333?style=flat-square&logo=python&logoColor=white"/> <img src="https://img.shields.io/badge/numpy-013243?style=flat-square&logo=numpy&logoColor=white"/> <img src="https://img.shields.io/badge/joblib-333333?style=flat-square&logo=python&logoColor=white"/> <img src="https://img.shields.io/badge/%EC%8B%9D%EC%95%BD%EC%B2%98%20%EC%98%81%EC%96%91%EC%84%B1%EB%B6%84%ED%91%9C-0052CC?style=flat-square&logo=google-spreadsheet&logoColor=white"/> |
42 | 39 |
|
43 | | -<br> |
44 | 40 |
|
45 | | -### ๐ **Body**: ๋ณธ๋ฌธ |
| 41 | +--- |
46 | 42 |
|
47 | | -- **์ ํ ์ฌํญ** |
48 | | -- ์ ๋ชฉ์์ ์ค๋ช
ํ ์ ์๋ ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ ๊ณต |
49 | | -- "๋ฌด์์"๊ณผ "์"๋ฅผ ์ค์ฌ์ผ๋ก ์์ธํ ๊ธฐ์ |
50 | | -- ํ ์ค๋น 72์ ์ด๋ด๋ก ์์ฑ |
51 | | -- ํ์์ Markdown ์ฌ์ฉ ๊ฐ๋ฅ |
| 43 | +## ๐ Project Structure |
52 | 44 |
|
| 45 | +```text |
| 46 | +๐ฆ menu-ai |
| 47 | +โโโ Dockerfile |
| 48 | +โโโ main.py # FastAPI ์คํ ์ํธ๋ฆฌํฌ์ธํธ |
| 49 | +โโโ requirements.txt |
| 50 | +โโโ leftovers |
| 51 | +โ โโโ core # ์ค์ , ์๋ฌ ํธ๋ค๋ฌ, ๊ณตํต ์๋ต, ์ธ๋ถ ํด๋ผ์ด์ธํธ |
| 52 | +โ โโโ domain |
| 53 | +โ โโโ recommend # ๋ฉ๋ด ์ถ์ฒ ๋๋ฉ์ธ |
| 54 | +โ โ โโโ api/ # ์ถ์ฒ API |
| 55 | +โ โ โโโ data/ # ์๋ณธ ์์ ๋ฐ์ดํฐ (์์ฝ์ฒ ์์
) |
| 56 | +โ โ โโโ model_store # ํ์ต๋ ๋ชจ๋ธ ๋ฐ ์ ์ฒ๋ฆฌ ์ํฐํฉํธ |
| 57 | +โ โ โโโ schemas/ # ์์ฒญ/์๋ต ์คํค๋ง |
| 58 | +โ โ โโโ service/ # ์ถ์ฒ ๋ก์ง (๋งค์นญ, ์ค์ฝ์ด๋ง, ์ ์ฒ๋ฆฌ, ํ์ต) |
| 59 | +โ โโโ tip # ํ/๋ ์ํผ ๋๋ฉ์ธ |
| 60 | +โ โโโ api/ # Tip API |
| 61 | +โ โโโ schemas/ # ์์ฒญ/์๋ต ์คํค๋ง |
| 62 | +โ โโโ service/ # ํ๋กฌํํธ/LLM ํธ์ถ |
| 63 | +``` |
53 | 64 |
|
54 | 65 | --- |
55 | | -<br> |
56 | 66 |
|
| 67 | +## ๐ฌ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ & ์๊ณ ๋ฆฌ์ฆ |
57 | 68 |
|
58 | | -## ๐ฟ Git Flow ๋ธ๋์น ์ ๋ต (with `main`) ๐ฟ |
| 69 | +1. **๋ฐ์ดํฐ ๋ก๋ฉ** |
59 | 70 |
|
| 71 | + * ์์ฝ์ฒ ์์ ๋ฐ์ดํฐ(`.xlsx`) ๋ก๋ -> ๊ฒฐ์ธก์น ๋ณด์ (Imputer) -> ์ ๊ทํ(Scaler) |
60 | 72 |
|
61 | | -### ๐ด ๊ธฐ๋ณธ ๋ธ๋์น |
62 | | -| ๋ธ๋์น | ์ญํ | |
63 | | -|--------|------| |
64 | | -| `main` | ์ต์ข
๋ฐฐํฌ์ฉ ๋ธ๋์น (stable) | |
65 | | -| `develop` | ๋ค์ ๋ฐฐํฌ๋ฅผ ์ํ ํตํฉ ๊ฐ๋ฐ ๋ธ๋์น | |
| 73 | +2. **๋ฉ๋ด๋ช
๋งค์นญ** |
66 | 74 |
|
67 | | -<br> |
| 75 | + * TF-IDF ๋ฒกํฐํ -> TruncatedSVD ์ฐจ์ ์ถ์ -> hnswlib ๊ทผ์ ํ์์ผ๋ก ์ ์ฌ ๋ฉ๋ด ๊ฒ์ |
68 | 76 |
|
69 | | -### ๐ฑ **์์
๋ธ๋์น ๋ค์ด๋ฐ ๊ท์น** |
| 77 | +3. **์์ ํผ์ฒํ** |
70 | 78 |
|
71 | | -``` |
72 | | -type/#issue๋ฒํธ (์์
๋จ์๋ ๊ธฐ๋ฅ/์์ /๋ฆฌํฉํ ๋ง ๋ฑ์ผ๋ก ๊ตฌ๋ถ) |
73 | | -``` |
| 79 | + * `kcal, protein, fat, carbs, sugar, sodium` ๋ฑ ์ฃผ์ ์์์๋ฅผ ๋ฒกํฐํ |
74 | 80 |
|
| 81 | +4. **์ค์ฝ์ด๋ง (Concept Scoring)** |
75 | 82 |
|
76 | | -| prefix | ์ค๋ช
| ์์ | |
77 | | -|--------------|------------------------------|-----------------------------------| |
78 | | -| `feature/` | โจ ์๋ก์ด ๊ธฐ๋ฅ ๊ฐ๋ฐ | `feature/#15` | |
79 | | -| `fix/` | ๐ ๋ฒ๊ทธ ์์ | `fix/#42` | |
80 | | -| `refactor/` | โป๏ธ ์ฝ๋ ๋ฆฌํฉํ ๋ง | `refactor/#23` | |
81 | | -| `chore/` | ๐ง ์ค์ ๋ณ๊ฒฝ, ์ก์ผ | `chore/#25` | |
82 | | -| `perf/` | โก ์ฑ๋ฅ ๊ฐ์ | `perf/#94` | |
83 | | -| `hotfix/` | ๐ ๊ธํ ์์ (main์์ ๋ฐ๋ก ๋ถ๊ธฐ) | `hotfix/#102` | |
84 | | -| `test/` | ๐งช ํ
์คํธ ์ฝ๋ ์ถ๊ฐ/์์ | `test/#55` | |
| 83 | + * ๋ค์ด์ดํธ: ์ด๋ยท๋น๋ฅยทํ์ํ๋ฌผ ์ ํ |
| 84 | + * ์ ์ผ: ๋ํธ๋ฅจ ์๊ฒฉ ์ ํ |
| 85 | + * ํ๋น: ๋น๋ฅยทํ์ํ๋ฌผ ๋์ ์ ํ |
| 86 | + * ์ ํ๊ณ ์ง/๋ฒํฌ์
: ๊ธฐ์กด ๋น์จ ์ ์ง |
85 | 87 |
|
86 | | -<br> |
| 88 | +5. **์ถ์ฒ ๊ฒฐ๊ณผ ๋ฐํ** |
87 | 89 |
|
88 | | -### ๐ ๋ธ๋์น ํ๋ฆ ์์ฝ |
| 90 | + * ์ ์(0\~100) ๊ธฐ๋ฐ ๋ญํน -> ์์ N๊ฐ ๋ฐํ |
| 91 | + * ์๋ต ๊ตฌ์กฐ: `isSuccess`, `httpStatus`, `data`, `timeStamp` |
89 | 92 |
|
90 | | -```text |
91 | | -1. main โ ๋ฐฐํฌ |
92 | | -2. develop โ ํตํฉ ๊ฐ๋ฐ (PR ๋์) |
93 | | -3. develop์์ feature/fix/... ๋ธ๋์น ๋ถ๊ธฐ |
94 | | -4. ๊ธฐ๋ฅ ์๋ฃ ํ develop์ผ๋ก PR & ๋จธ์ง |
95 | | -5. ๋ฐฐํฌ ์ develop โ main ๋จธ์ง |
96 | | -6. ๊ธํ ์์ ์ hotfix์์ main โ develop ๋ณํฉ |
| 93 | +--- |
| 94 | + |
| 95 | +## โ๏ธ ์คํ ๋ฐฉ๋ฒ |
| 96 | + |
| 97 | +### 1. ์์กด์ฑ ์ค์น |
| 98 | + |
| 99 | +```bash |
| 100 | +python3.11 -m venv .venv |
| 101 | +source .venv/bin/activate |
| 102 | +pip install --no-cache-dir -r requirements.txt |
97 | 103 | ``` |
98 | 104 |
|
99 | | ---- |
| 105 | +### 2. ํ์ต (๋ชจ๋ธ ์์ฑ) |
| 106 | + |
| 107 | +์ต์ด ์คํ ์, `model_store/`๊ฐ ๋น์ด ์๋ค๋ฉด ํ์ต ๊ณผ์ ์ด ํ์ํฉ๋๋ค. |
| 108 | + |
| 109 | +```bash |
| 110 | +python -m leftovers.domain.recommend.service.train |
| 111 | +``` |
| 112 | + |
| 113 | +โ `nutrition_imputer.joblib`, `nutrition_scaler.joblib`, `concept_model_*.joblib` ๋ฑ์ด ์์ฑ๋ฉ๋๋ค. |
| 114 | + |
| 115 | +### 3. ์๋ฒ ์คํ |
| 116 | + |
| 117 | +```bash |
| 118 | +uvicorn main:app --host 0.0.0.0 --port 8000 |
| 119 | +``` |
0 commit comments