Skip to content

Latest commit

Β 

History

History
117 lines (78 loc) Β· 4.04 KB

File metadata and controls

117 lines (78 loc) Β· 4.04 KB

πŸ€– μž”λ°˜ν”ŒλŸ¬νŒ… AI

FastAPI 기반의 AI μΆ”μ²œ μ„œλ²„λ‘œ, μ‹μ•½μ²˜ μ˜μ–‘μ„±λΆ„ν‘œ 데이터λ₯Ό 기반으둜 λ§žμΆ€ν˜• 반찬 μΆ”μ²œκ³Ό μ„­μ·¨ 팁 μ œκ³΅μ„ λ‹΄λ‹Ήν•©λ‹ˆλ‹€.

πŸ”Ή AI κΈ°λŠ₯

  • 메뉴 μΆ”μ²œ

    • 5κ°€μ§€ μ½˜μ…‰νŠΈ 기반: diet(λ‹€μ΄μ–΄νŠΈ), keto(저탄고지), low_sodium(μ €μ—Ό), glycemic(ν˜ˆλ‹Ή), bulking(λ²Œν¬μ—…)
    • μž…λ ₯ 메뉴λͺ… -> μœ μ‚¬λ„ λ§€μΉ­ -> μ˜μ–‘ μ„±λΆ„ ν”Όμ²˜ν™” -> μ½˜μ…‰νŠΈλ³„ μ μˆ˜ν™”(0~100)
  • Tip 생성

    • OpenAI API 연동을 ν†΅ν•œ μ‹μŠ΅κ΄€ κ°€μ΄λ“œ / λ ˆμ‹œν”Ό μ œμ•ˆ

πŸš€ Tech Stack

struct-be

πŸ”Ή Framework & Language

  • Python 3.11
  • FastAPI : κ²½λŸ‰ μ›Ή ν”„λ ˆμž„μ›Œν¬
  • Uvicorn : ASGI μ„œλ²„

πŸ”Ή Data / ML

  • scikit-learn : 벑터화, 차원 μΆ•μ†Œ, μŠ€μΌ€μΌλ§, 결츑치 보정
  • hnswlib : κ·Όμ ‘ 탐색 (메뉴λͺ… μœ μ‚¬λ„ λ§€μΉ­)
  • numpy / joblib : 수치 μ—°μ‚° 및 λͺ¨λΈ 직렬화


πŸ“‚ Project Structure

πŸ“¦ 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 호좜

πŸ”¬ 데이터 νŒŒμ΄ν”„λΌμΈ & μ•Œκ³ λ¦¬μ¦˜

  1. 데이터 λ‘œλ”©

    • μ‹μ•½μ²˜ μ˜μ–‘ 데이터(.xlsx) λ‘œλ“œ -> 결츑치 보정(Imputer) -> μ •κ·œν™”(Scaler)
  2. 메뉴λͺ… λ§€μΉ­

    • TF-IDF 벑터화 -> TruncatedSVD 차원 μΆ•μ†Œ -> hnswlib κ·Όμ ‘ νƒμƒ‰μœΌλ‘œ μœ μ‚¬ 메뉴 검색
  3. μ˜μ–‘ ν”Όμ²˜ν™”

    • kcal, protein, fat, carbs, sugar, sodium λ“± μ£Όμš” μ˜μ–‘μ†Œλ₯Ό 벑터화
  4. μŠ€μ½”μ–΄λ§ (Concept Scoring)

    • λ‹€μ΄μ–΄νŠΈ: μ—΄λŸ‰Β·λ‹Ήλ₯˜Β·νƒ„μˆ˜ν™”λ¬Ό μ œν•œ
    • μ €μ—Ό: λ‚˜νŠΈλ₯¨ 엄격 μ œν•œ
    • ν˜ˆλ‹Ή: λ‹Ήλ₯˜Β·νƒ„μˆ˜ν™”λ¬Ό λ™μ‹œ μ œν•œ
    • 저탄고지/λ²Œν¬μ—…: κΈ°μ‘΄ λΉ„μœ¨ μœ μ§€
  5. μΆ”μ²œ κ²°κ³Ό λ°˜ν™˜

    • 점수(0~100) 기반 λž­ν‚Ή -> μƒμœ„ N개 λ°˜ν™˜
    • 응닡 ꡬ쑰: isSuccess, httpStatus, data, timeStamp

βš™οΈ μ‹€ν–‰ 방법

1. μ˜μ‘΄μ„± μ„€μΉ˜

python3.11 -m venv .venv
source .venv/bin/activate
pip install --no-cache-dir -r requirements.txt

2. ν•™μŠ΅ (λͺ¨λΈ 생성)

졜초 μ‹€ν–‰ μ‹œ, model_store/κ°€ λΉ„μ–΄ μžˆλ‹€λ©΄ ν•™μŠ΅ 과정이 ν•„μš”ν•©λ‹ˆλ‹€.

python -m leftovers.domain.recommend.service.train

β†’ nutrition_imputer.joblib, nutrition_scaler.joblib, concept_model_*.joblib 등이 μƒμ„±λ©λ‹ˆλ‹€.

3. μ„œλ²„ μ‹€ν–‰

uvicorn main:app --host 0.0.0.0 --port 8000