FastAPI κΈ°λ°μ AI μΆμ² μλ²λ‘, μμ½μ² μμμ±λΆν λ°μ΄ν°λ₯Ό κΈ°λ°μΌλ‘ λ§μΆ€ν λ°μ°¬ μΆμ²κ³Ό μμ·¨ ν μ 곡μ λ΄λΉν©λλ€.
-
λ©λ΄ μΆμ²
- 5κ°μ§ μ½μ
νΈ κΈ°λ°:
diet(λ€μ΄μ΄νΈ),keto(μ νκ³ μ§),low_sodium(μ μΌ),glycemic(νλΉ),bulking(λ²ν¬μ ) - μ λ ₯ λ©λ΄λͺ -> μ μ¬λ λ§€μΉ -> μμ μ±λΆ νΌμ²ν -> μ½μ νΈλ³ μ μν(0~100)
- 5κ°μ§ μ½μ
νΈ κΈ°λ°:
-
Tip μμ±
- OpenAI API μ°λμ ν΅ν μμ΅κ΄ κ°μ΄λ / λ μνΌ μ μ
- Python 3.11
- FastAPI : κ²½λ μΉ νλ μμν¬
- Uvicorn : ASGI μλ²
- scikit-learn : 벑ν°ν, μ°¨μ μΆμ, μ€μΌμΌλ§, κ²°μΈ‘μΉ λ³΄μ
- hnswlib : κ·Όμ νμ (λ©λ΄λͺ μ μ¬λ λ§€μΉ)
- numpy / joblib : μμΉ μ°μ° λ° λͺ¨λΈ μ§λ ¬ν
π¦ menu-ai
βββ Dockerfile
βββ main.py # FastAPI μ€ν μνΈλ¦¬ν¬μΈνΈ
βββ requirements.txt
βββ leftovers
β βββ core # μ€μ , μλ¬ νΈλ€λ¬, κ³΅ν΅ μλ΅, μΈλΆ ν΄λΌμ΄μΈνΈ
β βββ domain
β βββ recommend # λ©λ΄ μΆμ² λλ©μΈ
β β βββ api/ # μΆμ² API
β β βββ data/ # μλ³Έ μμ λ°μ΄ν° (μμ½μ² μμ
)
β β βββ model_store # νμ΅λ λͺ¨λΈ λ° μ μ²λ¦¬ μν°ν©νΈ
β β βββ schemas/ # μμ²/μλ΅ μ€ν€λ§
β β βββ service/ # μΆμ² λ‘μ§ (λ§€μΉ, μ€μ½μ΄λ§, μ μ²λ¦¬, νμ΅)
β βββ tip # ν/λ μνΌ λλ©μΈ
β βββ api/ # Tip API
β βββ schemas/ # μμ²/μλ΅ μ€ν€λ§
β βββ service/ # ν둬ννΈ/LLM νΈμΆ
-
λ°μ΄ν° λ‘λ©
- μμ½μ² μμ λ°μ΄ν°(
.xlsx) λ‘λ -> κ²°μΈ‘μΉ λ³΄μ (Imputer) -> μ κ·ν(Scaler)
- μμ½μ² μμ λ°μ΄ν°(
-
λ©λ΄λͺ λ§€μΉ
- TF-IDF 벑ν°ν -> TruncatedSVD μ°¨μ μΆμ -> hnswlib κ·Όμ νμμΌλ‘ μ μ¬ λ©λ΄ κ²μ
-
μμ νΌμ²ν
kcal, protein, fat, carbs, sugar, sodiumλ± μ£Όμ μμμλ₯Ό 벑ν°ν
-
μ€μ½μ΄λ§ (Concept Scoring)
- λ€μ΄μ΄νΈ: μ΄λΒ·λΉλ₯Β·νμνλ¬Ό μ ν
- μ μΌ: λνΈλ₯¨ μ격 μ ν
- νλΉ: λΉλ₯Β·νμνλ¬Ό λμ μ ν
- μ νκ³ μ§/λ²ν¬μ : κΈ°μ‘΄ λΉμ¨ μ μ§
-
μΆμ² κ²°κ³Ό λ°ν
- μ μ(0~100) κΈ°λ° λνΉ -> μμ Nκ° λ°ν
- μλ΅ κ΅¬μ‘°:
isSuccess,httpStatus,data,timeStamp
python3.11 -m venv .venv
source .venv/bin/activate
pip install --no-cache-dir -r requirements.txtμ΅μ΄ μ€ν μ, model_store/κ° λΉμ΄ μλ€λ©΄ νμ΅ κ³Όμ μ΄ νμν©λλ€.
python -m leftovers.domain.recommend.service.trainβ nutrition_imputer.joblib, nutrition_scaler.joblib, concept_model_*.joblib λ±μ΄ μμ±λ©λλ€.
uvicorn main:app --host 0.0.0.0 --port 8000