Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

31 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

NH AI Challenge Backend

๋†์—… ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ฐ AI ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ FastAPI ๋ฐฑ์—”๋“œ ์„œ๋ฒ„

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

backend/
โ”œโ”€โ”€ app/                    # ๋ฉ”์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
โ”‚   โ”œโ”€โ”€ __init__.py
โ”‚   โ”œโ”€โ”€ main.py            # FastAPI ์•ฑ ์ง„์ž…์ 
โ”‚   โ”œโ”€โ”€ api/               # API ์—”๋“œํฌ์ธํŠธ
โ”‚   โ”‚   โ”œโ”€โ”€ __init__.py
โ”‚   โ”‚   โ””โ”€โ”€ v1/            # API ๋ฒ„์ „ 1
โ”‚   โ”‚       โ””โ”€โ”€ __init__.py
โ”‚   โ”œโ”€โ”€ core/              # ํ•ต์‹ฌ ์„ค์ • ๋ฐ ์œ ํ‹ธ๋ฆฌํ‹ฐ
โ”‚   โ”‚   โ”œโ”€โ”€ __init__.py
โ”‚   โ”‚   โ”œโ”€โ”€ config.py      # ํ™˜๊ฒฝ ์„ค์ •
โ”‚   โ”‚   โ””โ”€โ”€ database.py    # ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ
โ”‚   โ”œโ”€โ”€ models/            # SQLAlchemy ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ
โ”‚   โ”‚   โ””โ”€โ”€ __init__.py
โ”‚   โ”œโ”€โ”€ schemas/           # Pydantic ์Šคํ‚ค๋งˆ (์š”์ฒญ/์‘๋‹ต ๋ชจ๋ธ)
โ”‚   โ”‚   โ””โ”€โ”€ __init__.py
โ”‚   โ”œโ”€โ”€ services/          # ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง
โ”‚   โ”‚   โ””โ”€โ”€ __init__.py
โ”‚   โ””โ”€โ”€ utils/             # ๊ณตํ†ต ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜
โ”‚       โ””โ”€โ”€ __init__.py
โ”œโ”€โ”€ alembic/               # ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
โ”œโ”€โ”€ tests/                 # ํ…Œ์ŠคํŠธ ์ฝ”๋“œ
โ”‚   โ””โ”€โ”€ __init__.py
โ”œโ”€โ”€ scripts/               # ์œ ํ‹ธ๋ฆฌํ‹ฐ ์Šคํฌ๋ฆฝํŠธ
โ”œโ”€โ”€ sentinel_farm_analysis/ # Sentinel ์œ„์„ฑ ๋ฐ์ดํ„ฐ ๋ถ„์„ (๊ธฐ์กด)
โ”‚   โ”œโ”€โ”€ test_response.py
โ”‚   โ””โ”€โ”€ test_2024_data.json
โ”œโ”€โ”€ requirements.txt       # ํ”„๋กœ์ ํŠธ ์˜์กด์„ฑ
โ”œโ”€โ”€ .env                  # ํ™˜๊ฒฝ ๋ณ€์ˆ˜ (Git์—์„œ ์ œ์™ธ)
โ”œโ”€โ”€ .gitignore           # Git ์ œ์™ธ ํŒŒ์ผ
โ”œโ”€โ”€ main.py              # PyCharm ํ…œํ”Œ๋ฆฟ (์ œ๊ฑฐ ์˜ˆ์ •)
โ”œโ”€โ”€ test_farm_api.py     # ํŒœ๋งต API ํ…Œ์ŠคํŠธ (๊ธฐ์กด)
โ””โ”€โ”€ test_farmmap_api.py  # ํŒœ๋งต API ํ…Œ์ŠคํŠธ (๊ธฐ์กด)

๊ธฐ์ˆ  ์Šคํƒ

  • Framework: FastAPI
  • Database: PostgreSQL
  • ORM: SQLAlchemy
  • Migration: Alembic
  • ASGI Server: Uvicorn
  • Testing: Pytest
  • AI/ML: Sentence-Transformers, Google Gemini API
  • Embeddings: Korean SBERT (jhgan/ko-sroberta-multitask)

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

1. PostgreSQL ์„ค์น˜ ๋ฐ ์„ค์ •

macOS

# PostgreSQL ์„ค์น˜
brew install postgresql@16
brew services start postgresql@16

# ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ์‚ฌ์šฉ์ž ์ƒ์„ฑ
psql -d postgres
CREATE USER postgres WITH PASSWORD 'nh-challenge' CREATEDB;
CREATE DATABASE nh_challenge OWNER postgres;
\q

Ubuntu/Debian

# PostgreSQL ์„ค์น˜
sudo apt update
sudo apt install postgresql postgresql-contrib

# ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ์‚ฌ์šฉ์ž ์ƒ์„ฑ
sudo -u postgres psql
CREATE USER postgres WITH PASSWORD 'nh-challenge' CREATEDB;
CREATE DATABASE nh_challenge OWNER postgres;
\q

2. ํ”„๋กœ์ ํŠธ ํด๋ก  ๋ฐ ์ด๋™

git clone https://github.com/nh-ai-challenge/backend.git
cd backend

3. ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ ๋ฐ ํ™œ์„ฑํ™”

python3 -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

4. ์˜์กด์„ฑ ์„ค์น˜

pip install --upgrade pip
pip install -r backend/requirements.txt

# PyTorch ์„ค์น˜ (CPU ๋ฒ„์ „)
pip install torch --index-url https://download.pytorch.org/whl/cpu

# ๋˜๋Š” GPU ๋ฒ„์ „ (CUDA 11.8)
pip install torch --index-url https://download.pytorch.org/whl/cu118

5. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— .env ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค (backend ํด๋”๊ฐ€ ์•„๋‹Œ ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ):

# .env.example ๋ณต์‚ฌ
cp .env.example .env

# ๋˜๋Š” ์ง์ ‘ ์ƒ์„ฑ
cat > .env << EOF
# Database Configuration
DATABASE_URL=postgresql+asyncpg://postgres:nh-challenge@localhost:5432/nh_challenge

# Gemini API (AI ๋งค์นญ ์„ค๋ช… ์ƒ์„ฑ)
GEMINI_API_KEY=your_gemini_api_key_here

# External APIs (Optional)
FARMMAP_SERVICE_KEY=your_farmmap_key
FARMMAP_ENCODED_KEY=your_farmmap_encoded_key
SENTINEL_CLIENT_ID=your_sentinel_client_id
SENTINEL_CLIENT_SECRET=your_client_secret
EOF

6. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™”

cd backend

# ๋ฐฉ๋ฒ• 1: ์ˆ˜๋™ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์Šคํฌ๋ฆฝํŠธ (๊ถŒ์žฅ)
python init_migration.py

# ๋ฐฉ๋ฒ• 2: Alembic ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
alembic upgrade head

# ํ…Œ์ด๋ธ” ์ƒ์„ฑ ํ™•์ธ
psql -U postgres -d nh_challenge -c "\dt"

์˜ˆ์ƒ๋˜๋Š” ํ…Œ์ด๋ธ” ๋ชฉ๋ก:

  • users (์‚ฌ์šฉ์ž ์ •๋ณด)
  • senior_profiles_v2 (์‹œ๋‹ˆ์–ด ํ”„๋กœํ•„ + AI ์ž„๋ฒ ๋”ฉ)
  • youth_profiles_v2 (์ฒญ๋…„ ํ”„๋กœํ•„ + AI ์ž„๋ฒ ๋”ฉ)
  • matches (๋งค์นญ ๊ฒฐ๊ณผ)
  • match_requests (๋งค์นญ ์š”์ฒญ)
  • matching_scores (๋งค์นญ ์ ์ˆ˜)

7. ์„œ๋ฒ„ ์‹คํ–‰

# ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰ (์ž๋™ ๋ฆฌ๋กœ๋“œ)
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000

# ๋˜๋Š” Python ๋ชจ๋“ˆ๋กœ ์‹คํ–‰
python -m uvicorn app.main:app --reload

์„œ๋ฒ„๋Š” http://localhost:8000 ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. API ๋ฌธ์„œ๋Š” http://localhost:8000/docs ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

8. API ์—”๋“œํฌ์ธํŠธ ํ™•์ธ

9. ์ฃผ์š” API ์—”๋“œํฌ์ธํŠธ

์ธ์ฆ

  • POST /api/v1/auth/register - ํšŒ์›๊ฐ€์ž…
  • POST /api/v1/auth/login - ๋กœ๊ทธ์ธ
  • GET /api/v1/auth/me - ํ˜„์žฌ ์‚ฌ์šฉ์ž ์ •๋ณด

ํ”„๋กœํ•„ (AI ์ž„๋ฒ ๋”ฉ)

  • GET /api/v1/profiles/me - ๋‚ด ํ”„๋กœํ•„ ์กฐํšŒ
  • PUT /api/v1/profiles/me/profile-text - ํ”„๋กœํ•„ ํ…์ŠคํŠธ ์—…๋ฐ์ดํŠธ (์ž๋™ ์ž„๋ฒ ๋”ฉ ์ƒ์„ฑ)

์„ค๋ฌธ

  • POST /api/v1/surveys/senior - ์‹œ๋‹ˆ์–ด ์„ค๋ฌธ ์ œ์ถœ
  • POST /api/v1/surveys/youth - ์ฒญ๋…„ ์„ค๋ฌธ ์ œ์ถœ
  • GET /api/v1/surveys/senior/profile - ์‹œ๋‹ˆ์–ด ํ”„๋กœํ•„ ์กฐํšŒ
  • GET /api/v1/surveys/youth/profile - ์ฒญ๋…„ ํ”„๋กœํ•„ ์กฐํšŒ

AI ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋งค์นญ

  • GET /api/v1/matches/recommendations/hybrid - AI ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋งค์นญ ์ถ”์ฒœ
  • GET /api/v1/matches/{id}?generate_explanation=true - ๋งค์นญ ์ƒ์„ธ + AI ์„ค๋ช…
  • POST /api/v1/matches/calculate - ๋งค์นญ ์ ์ˆ˜ ๊ณ„์‚ฐ

AI ๋งค์นญ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜

ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋งค์นญ ์—”์ง„

  1. ํ…์ŠคํŠธ ์ž„๋ฒ ๋”ฉ (30%)

    • ํ•œ๊ตญ์–ด SBERT ๋ชจ๋ธ ์‚ฌ์šฉ (jhgan/ko-sroberta-multitask)
    • 768์ฐจ์› ๋ฒกํ„ฐ๋กœ ํ”„๋กœํ•„ ํ…์ŠคํŠธ ์ธ์ฝ”๋”ฉ
    • ์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„๋กœ ์˜๋ฏธ์  ๋งค์นญ
  2. SCI ์ ์ˆ˜ (70%)

    • ๋†์—… ์ฒ ํ•™ (40%)
    • ์‚ฌ์—… ์šด์˜ (20%)
    • ๋ฉ˜ํ† ์‹ญ (20%)
    • ์žฌ๋ฌด ์กฐ๊ฑด (20%)
  3. 2๋‹จ๊ณ„ ํ•„ํ„ฐ๋ง

    • 1์ฐจ: ์ž„๋ฒ ๋”ฉ ์œ ์‚ฌ๋„ ํ•„ํ„ฐ (์ƒ์œ„ ํ›„๋ณด ์„ ๋ณ„)
    • 2์ฐจ: ์ƒ์„ธ SCI ์ ์ˆ˜ ๊ณ„์‚ฐ (์ตœ์ข… ์ˆœ์œ„)

Gemini AI ํ†ตํ•ฉ

  • ๋งค์นญ ์ด์œ ๋ฅผ ํ•œ๊ตญ์–ด ์ž์—ฐ์–ด๋กœ ์„ค๋ช…
  • ํ”„๋กœํ•„ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐํ™”๋œ ๋ถ„์„
  • ๋งค์นญ ๊ฐ•์ , ์ฃผ์˜์‚ฌํ•ญ, ์„ฑ๊ณต ๊ฐ€๋Šฅ์„ฑ ์ œ์‹œ

ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ

cd backend
python scripts/generate_test_data.py --seniors 100 --youths 100

์ด ์Šคํฌ๋ฆฝํŠธ๋Š”:

  • ๋‹ค์–‘ํ•œ ํŽ˜๋ฅด์†Œ๋‚˜์˜ ์‹œ๋‹ˆ์–ด/์ฒญ๋…„ ์‚ฌ์šฉ์ž ์ƒ์„ฑ
  • ํ”„๋กœํ•„ ํ…์ŠคํŠธ ์ž๋™ ์ƒ์„ฑ ๋ฐ ์ž„๋ฒ ๋”ฉ ๊ณ„์‚ฐ
  • ์‹ค์ œ ๊ฐ™์€ ์„ค๋ฌธ ์‘๋‹ต ์‹œ๋ฎฌ๋ ˆ์ด์…˜

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

Python 3.13 ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ

Python 3.13 ์‚ฌ์šฉ์‹œ SQLAlchemy ๋น„๋™๊ธฐ ๊ธฐ๋Šฅ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

pip install greenlet==3.1.1

์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ ๋‹ค์šด๋กœ๋“œ ์˜ค๋ฅ˜

# ๋ชจ๋ธ ์ˆ˜๋™ ๋‹ค์šด๋กœ๋“œ
python -c "from sentence_transformers import SentenceTransformer; SentenceTransformer('jhgan/ko-sroberta-multitask')"

Gemini API ์˜ค๋ฅ˜

  • API ํ‚ค ํ™•์ธ: https://makersuite.google.com/app/apikey
  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํ™•์ธ: echo $GEMINI_API_KEY
  • Rate limit ํ™•์ธ (๋ฌด๋ฃŒ tier: 60 requests/minute)

PostgreSQL ์—ฐ๊ฒฐ ์˜ค๋ฅ˜

# PostgreSQL ์„œ๋น„์Šค ์ƒํƒœ ํ™•์ธ
brew services list | grep postgresql  # macOS
sudo systemctl status postgresql      # Linux

# ์„œ๋น„์Šค ์žฌ์‹œ์ž‘
brew services restart postgresql@16   # macOS
sudo systemctl restart postgresql     # Linux

๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ์˜ค๋ฅ˜ (์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ)

# CPU ์ „์šฉ PyTorch ์„ค์น˜๋กœ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๊ฐ์†Œ
pip uninstall torch torchvision torchaudio
pip install torch --index-url https://download.pytorch.org/whl/cpu

์„ฑ๋Šฅ ์ตœ์ ํ™” ํŒ

  1. ์ž„๋ฒ ๋”ฉ ์บ์‹ฑ: ํ”„๋กœํ•„ ํ…์ŠคํŠธ ๋ณ€๊ฒฝ ์‹œ์—๋งŒ ์žฌ๊ณ„์‚ฐ
  2. ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ: ์—ฌ๋Ÿฌ ํ…์ŠคํŠธ ๋™์‹œ ์ž„๋ฒ ๋”ฉ ์ƒ์„ฑ
  3. ์ธ๋ฑ์‹ฑ: embedding_updated_at ํ•„๋“œ์— ์ธ๋ฑ์Šค ์ถ”๊ฐ€
  4. ์—ฐ๊ฒฐ ํ’€: PostgreSQL ์—ฐ๊ฒฐ ํ’€ ํฌ๊ธฐ ์กฐ์ •

๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ถŒ์žฅ์‚ฌํ•ญ

  • Python 3.9 ์ด์ƒ (3.11 ๊ถŒ์žฅ)
  • PostgreSQL 14 ์ด์ƒ
  • RAM 8GB ์ด์ƒ (์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ์šฉ)
  • SSD ์Šคํ† ๋ฆฌ์ง€ (๋ชจ๋ธ ๋กœ๋”ฉ ์†๋„)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages