Skip to content

209512/fastapi_pgvector

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

18 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

꿈 일기 (Dream Diary)

pgvectorλ₯Ό ν™œμš©ν•œ μ‹œλ§¨ν‹± 검색 기반 꿈 일기 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μž…λ‹ˆλ‹€. μ‚¬μš©μžμ˜ 꿈 λ‚΄μš©μ„ λ²‘ν„°λ‘œ λ³€ν™˜ν•˜μ—¬ μ €μž₯ν•˜κ³ , μœ μ‚¬ν•œ κΏˆμ„ 검색할 수 μžˆμŠ΅λ‹ˆλ‹€.


데λͺ¨

dreamdiary

μ£Όμš” κΈ°λŠ₯

  • 꿈 λ‚΄μš©κ³Ό 감정을 기둝
  • μ‹œλ§¨ν‹± 검색을 ν†΅ν•œ μœ μ‚¬ν•œ 꿈 μ°ΎκΈ°
  • μ‚¬μš©μžλ³„ 꿈 관리
  • 코사인 거리 기반 μœ μ‚¬λ„ μΈ‘μ •

기술 μŠ€νƒ

  • Backend: FastAPI, Python 3.13
  • Database: PostgreSQL 18 + pgvector
  • Vector Model: sentence-transformers (all-MiniLM-L6-v2, 384차원)
  • Container: Docker, Docker Compose
  • Package Manager: uv

μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  index.html │────▢│  FastAPI     │────▢│  PostgreSQL     β”‚
β”‚  (Frontend) β”‚     β”‚  (Backend)   β”‚     β”‚  + pgvector     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚
                           β–Ό
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚ Sentence     β”‚
                    β”‚ Transformers β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

ν”„λ‘œμ νŠΈ ꡬ쑰

.
β”œβ”€β”€ Dockerfile              # λ©€ν‹° μŠ€ν…Œμ΄μ§€ λΉŒλ“œ μ„€μ •
β”œβ”€β”€ docker-compose.yaml     # μ„œλΉ„μŠ€ μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜
β”œβ”€β”€ database.py             # DB μ—°κ²° 및 μ΄ˆκΈ°ν™”
β”œβ”€β”€ main.py                 # FastAPI μ—”λ“œν¬μΈνŠΈ
β”œβ”€β”€ vectorizer.py           # ν…μŠ€νŠΈβ†’λ²‘ν„° λ³€ν™˜
β”œβ”€β”€ index.html              # μ›Ή UI
β”œβ”€β”€ examples/               # μ‚¬μš© 예제
β”‚   └── vector_demo.py      # 벑터 생성 데λͺ¨
β”œβ”€β”€ tests/                  # ν…ŒμŠ€νŠΈ μ½”λ“œ
β”‚   └── test_main.py        # API μ—”λ“œν¬μΈνŠΈ ν…ŒμŠ€νŠΈ
β”œβ”€β”€ .github/                # CI/CD μ›Œν¬ν”Œλ‘œμš°
β”‚   └── workflows/
β”‚       β”œβ”€β”€ ci.yml          # 지속적 톡합
β”‚       └── cd.yml          # 지속적 배포 (μˆ˜λ™)
β”œβ”€β”€ pyproject.toml          # ν”„λ‘œμ νŠΈ μ˜μ‘΄μ„±
└── uv.lock                 # μ˜μ‘΄μ„± 락 파일

μ„€μΉ˜ 및 μ‹€ν–‰

사전 μš”κ΅¬μ‚¬ν•­

  • Docker & Docker Compose
  • Python 3.13+ (둜컬 개발 μ‹œ)

Docker둜 μ‹€ν–‰

# λΉŒλ“œ 및 μ‹€ν–‰
docker compose up -d

# 둜그 확인
docker compose logs -f app

# μ’…λ£Œ
docker compose down

μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ http://localhost:8000μ—μ„œ μ‹€ν–‰λ©λ‹ˆλ‹€.

μ°Έκ³ : PostgreSQL 18은 /var/lib/postgresql에 데이터λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. 이전 λ²„μ „μ—μ„œ μ—…κ·Έλ ˆμ΄λ“œν•˜λŠ” 경우 docker compose down -v둜 κΈ°μ‘΄ λ³Όλ₯¨μ„ μ‚­μ œν•΄μ•Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

둜컬 개발 ν™˜κ²½

# uv둜 μ˜μ‘΄μ„± μ„€μΉ˜
uv sync

# 개발 μ„œλ²„ μ‹€ν–‰
uv run uvicorn main:app --reload

예제 μ‹€ν–‰

벑터 생성 과정을 ν™•μΈν•˜λ €λ©΄:

python examples/vector_demo.py

이 μŠ€ν¬λ¦½νŠΈλŠ” sentence-transformers λͺ¨λΈμ„ μ‚¬μš©ν•˜μ—¬ ν…μŠ€νŠΈλ₯Ό 384차원 λ²‘ν„°λ‘œ λ³€ν™˜ν•˜λŠ” 과정을 λ³΄μ—¬μ€λ‹ˆλ‹€.


API λ¬Έμ„œ

꿈 기둝 μΆ”κ°€

POST /add_dream/
Content-Type: application/json

{
  "dream_text": "μΉœκ΅¬μ™€ ν•¨κ»˜ μ—¬ν–‰ν•˜λŠ” 꿈",
  "dream_feeling": "즐거웠닀",
  "user_id": 1
}

μœ μ‚¬ν•œ 꿈 검색

GET /search_dreams/?query=친ꡬ&user_id=1

응닡:

{
  "results": [
    {
      "dream_text": "μΉœκ΅¬μ™€ ν•¨κ»˜ μ—¬ν–‰ν•˜λŠ” 꿈",
      "distance": 0.123
    }
  ]
}

λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ

CREATE TABLE dream_records (
    id SERIAL PRIMARY KEY,
    dream_text TEXT NOT NULL,
    dream_vector vector(384),
    user_id INTEGER NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- HNSW 인덱슀 (코사인 거리)
CREATE INDEX dream_vector_idx 
ON dream_records 
USING hnsw (dream_vector vector_cosine_ops)
WITH (m = 16, ef_construction = 64);

μ„±λŠ₯ μ΅œμ ν™”

  • HNSW 인덱슀: λΉ λ₯Έ 근사 μ΅œκ·Όμ ‘ 이웃 검색
  • λ©€ν‹° μŠ€ν…Œμ΄μ§€ λΉŒλ“œ: μ΅œμ’… 이미지 크기 μ΅œμ†Œν™” (2.24GB)
  • λ ˆμ΄μ–΄ 캐싱: λΉ λ₯Έ μž¬λΉŒλ“œ (μ½”λ“œ λ³€κ²½ μ‹œ ~10초, 첫 λΉŒλ“œ μ‹œ ~50λΆ„)
  • uv νŒ¨ν‚€μ§€ λ§€λ‹ˆμ €: pip λŒ€λΉ„ 10λ°° 이상 λΉ λ₯Έ μ˜μ‘΄μ„± μ„€μΉ˜

배포

둜컬 λΉŒλ“œ 및 배포

이 ν”„λ‘œμ νŠΈλŠ” λŒ€μš©λŸ‰ ML μ˜μ‘΄μ„±(PyTorch, sentence-transformers)으둜 인해 GitHub Actionsμ—μ„œ μžλ™ 배포가 μ œν•œλ©λ‹ˆλ‹€. λ‘œμ»¬μ—μ„œ λΉŒλ“œν•˜κ³  λ°°ν¬ν•˜λŠ” 것을 ꢌμž₯ν•©λ‹ˆλ‹€.

# 1. λ‘œμ»¬μ—μ„œ λΉŒλ“œ
docker compose build

# 2. Docker Hub에 νƒœκ·Έ 및 ν‘Έμ‹œ
docker tag pgvector-app:latest your-username/dream-diary:latest
docker push your-username/dream-diary:latest

# 3. ν”„λ‘œλ•μ…˜ μ„œλ²„μ—μ„œ 배포
docker pull your-username/dream-diary:latest
docker compose up -d

CI/CD

  • CI (지속적 톡합): λͺ¨λ“  ν‘Έμ‹œμ™€ PR에 λŒ€ν•΄ μžλ™μœΌλ‘œ ν…ŒμŠ€νŠΈ 및 λΉŒλ“œ 검증 μ‹€ν–‰
  • CD (지속적 배포): μˆ˜λ™ 트리거 λ°©μ‹μœΌλ‘œ μ„€μ • (GitHub Actions의 λ””μŠ€ν¬ 곡간 μ œμ•½)

ν™˜κ²½ λ³€μˆ˜

λ³€μˆ˜ κΈ°λ³Έκ°’ μ„€λͺ…
DB_HOST localhost PostgreSQL 호슀트
DB_NAME dream_db λ°μ΄ν„°λ² μ΄μŠ€ 이름
DB_USER user λ°μ΄ν„°λ² μ΄μŠ€ μ‚¬μš©μž
DB_PASSWORD password λ°μ΄ν„°λ² μ΄μŠ€ λΉ„λ°€λ²ˆν˜Έ

개발 팁

λΉ λ₯Έ λΉŒλ“œλ₯Ό μœ„ν•œ μΊμ‹œ ν™œμš©

# --no-cache μ‚¬μš©ν•˜μ§€ 말 것
docker compose build

λ°μ΄ν„°λ² μ΄μŠ€ 확인

# ν™•μž₯ 확인
docker compose exec db psql -U user -d dream_db -c "\dx"

# ν…Œμ΄λΈ” 확인
docker compose exec db psql -U user -d dream_db -c "\d dream_records"

문제 ν•΄κ²°

PostgreSQL 18 λ³Όλ₯¨ 였λ₯˜

PostgreSQL 18 μ΄λ―Έμ§€λ‘œ μ—…κ·Έλ ˆμ΄λ“œ μ‹œ λ‹€μŒ 였λ₯˜κ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€:

Error: in 18+, these Docker images are configured to store database data...

ν•΄κ²° 방법:

# κΈ°μ‘΄ λ³Όλ₯¨ μ‚­μ œ ν›„ μž¬μ‹œμž‘
docker compose down -v
docker compose up -d

μ°Έκ³ : PostgreSQL 18은 /var/lib/postgresql에 데이터λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. 이전 λ²„μ „μ—μ„œ μ—…κ·Έλ ˆμ΄λ“œν•˜λŠ” 경우 λ³Όλ₯¨ 마운트 경둜λ₯Ό ν™•μΈν•˜μ„Έμš”.

λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° μ‹€νŒ¨

앱이 λ°μ΄ν„°λ² μ΄μŠ€μ— μ—°κ²°ν•˜μ§€ λͺ»ν•˜λŠ” 경우:

docker compose ps  # dbκ°€ "Healthy" μƒνƒœμΈμ§€ 확인
docker compose logs db  # λ°μ΄ν„°λ² μ΄μŠ€ 둜그 확인

ν—¬μŠ€μ²΄ν¬κ°€ μ„€μ •λ˜μ–΄ μžˆμ–΄ λ°μ΄ν„°λ² μ΄μŠ€κ°€ μ€€λΉ„λœ ν›„ 앱이 μ‹œμž‘λ©λ‹ˆλ‹€.


참고 자료

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors