์ด ๊ฐ์ด๋๋ ๋ถ๋งํฌ ์ ์ฅ ์์คํ ์ ์ค์ ๋ก ํ ์คํธํด๋ณผ ์ ์๋ ๋ฐฉ๋ฒ๋ค์ ์ ๊ณตํฉ๋๋ค.
# ๊ฐ๋ฐ ํ๊ฒฝ ์๋ ์ค์
python scripts/setup_dev_environment.py
# ํ
์คํธ ์คํ
python scripts/manual_bookmark_test.py# ํ
์คํธ์ฉ Docker ์๋น์ค ์์
docker-compose -f docker-compose.test.yml up -d
# ์๋น์ค ์ํ ํ์ธ
docker-compose -f docker-compose.test.yml ps# ํ๊ฒฝ ํ์ผ ๋ณต์ฌ
cp env.example .env
# .env ํ์ผ ํธ์ง (ํ์ํ API ํค๋ค ์ค์ )
# - OPENAI_API_KEY (์๋ฒ ๋ฉ์ฉ)
# - AWS ์ค์ (S3 ์ฌ์ฉ์)# Python ์์กด์ฑ ์ค์น
pipenv install --dev
# ํ๊ฒฝ ํ์ฑํ
pipenv shell# ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ ์์ฑ
python scripts/init_database.py# ํฐ๋ฏธ๋ 1: Consumer ์์
pipenv run python -m app.consumers.bookmark_save_rmq
# ํฐ๋ฏธ๋ 2: Celery Worker ์์
pipenv run celery -A app.core.celery_worker worker --loglevel=info -Q embedding
# ํฐ๋ฏธ๋ 3: ํ
์คํธ ์คํ
pipenv run python scripts/manual_bookmark_test.pypython scripts/manual_bookmark_test.py์ ํ ์ต์ :
- RabbitMQ ๋ฉ์์ง ์ ์ก - ์ค์ ๋ฉ์์ง ํ๋ฅผ ํตํ ์ ์ฒด ํ๋ก์ฐ
- Consumer ๋จ๋ ํ ์คํธ - Consumer ๋ก์ง๋ง ํ ์คํธ
- Task ์ง์ ์คํ - Celery Task ์ง์ ํธ์ถ
- ๋ชจ๋ ๋ฐฉ๋ฒ ํ ์คํธ - ์ ๋ชจ๋ ๋ฐฉ๋ฒ ์์ฐจ ์คํ
import asyncio
from app.consumers.bookmark_save_rmq import on_bookmark_save
# ํ
์คํธ ๋ฉ์์ง ์์ฑ ๋ฐ ์ ์ก
# (scripts/manual_bookmark_test.py ์ฐธ๊ณ )from app.tasks.bookmark_save_task import save_bookmark_task
# ๋ถ๋งํฌ ๋ฐ์ดํฐ๋ก ์ง์ ํธ์ถ
bookmark_data = {"userId": 123, ...}
result = save_bookmark_task(bookmark_data)FastAPI ์๋ฒ๊ฐ ์คํ ์ค์ด๋ผ๋ฉด:
curl -X POST "http://localhost:8000/api/v1/bookmark/save" \
-H "Content-Type: application/json" \
-d '{
"userId": 123,
"starId": "api_test_001",
"title": "API ํ
์คํธ ๋ถ๋งํฌ",
"url": "https://example.com/api-test",
"keywords": ["API", "ํ
์คํธ"],
"memo": "API๋ฅผ ํตํ ํ
์คํธ",
"summary": "FastAPI๋ฅผ ํตํ ๋ถ๋งํฌ ์ ์ฅ ํ
์คํธ"
}'- URL: http://localhost:15672
- ๊ณ์ : guest/guest
- ํ ์ํ, ๋ฉ์์ง ์ ํ์ธ ๊ฐ๋ฅ
# Flower ์์
docker-compose -f docker-compose.test.yml --profile monitoring up -d flower
# ์นUI ์ ์
# URL: http://localhost:5555# Consumer ๋ก๊ทธ
pipenv run python -m app.consumers.bookmark_save_rmq
# Celery Worker ๋ก๊ทธ
pipenv run celery -A app.core.celery_worker worker --loglevel=debug
# Docker ์๋น์ค ๋ก๊ทธ
docker-compose -f docker-compose.test.yml logs -f [์๋น์ค๋ช
]# ์๋น์ค ์ํ ํ์ธ
docker-compose -f docker-compose.test.yml ps
# ๋ก๊ทธ ํ์ธ
docker-compose -f docker-compose.test.yml logs rabbitmq
# ์ฌ์์
docker-compose -f docker-compose.test.yml restart rabbitmq# PostgreSQL ์ํ ํ์ธ
docker-compose -f docker-compose.test.yml logs postgres
# ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ด๊ธฐํ
python scripts/init_database.py- AWS ์๊ฒฉ ์ฆ๋ช ํ์ธ
- S3 ๋ฒํท ์ ๊ทผ ๊ถํ ํ์ธ
- ๋ก์ปฌ ํ์ผ๋ก ํ ์คํธ (S3 ํค ๋์ ๋ก์ปฌ ํ์ผ ๊ฒฝ๋ก ์ฌ์ฉ)
- OpenAI API ํค ํ์ธ
- ๋คํธ์ํฌ ์ฐ๊ฒฐ ํ์ธ
- ๋ค๋ฅธ ๋ชจ๋ธ๋ก ๋ณ๊ฒฝ ์๋
# .env ํ์ผ์์
DEBUG=true
LOG_LEVEL=DEBUG# scripts/manual_bookmark_test.py๋ฅผ ์์ ํ์ฌ
# ์ฌ๋ฌ ๊ฐ์ ๋ถ๋งํฌ๋ฅผ ๋์์ ์ ์ก
for i in range(10):
bookmark_data = get_sample_bookmark_data()
bookmark_data['starId'] = f'batch_test_{i}'
await send_bookmark_message(bookmark_data)# ํฐ ํ
์คํธ๋ก ํ
์คํธ
# ๋ง์ ๊ธฐ์กด ๋ถ๋งํฌ๊ฐ ์๋ ์ํฉ์์ ํ
์คํธ- HTML ํ์ผ์ S3์ ์ ๋ก๋
- ๋ถ๋งํฌ ๋ฉ์์ง ์ ์ก
- ํ ์คํธ ์ถ์ถ ๋ฐ ์๋ฒ ๋ฉ ์์ฑ
- ์ ์ฌํ ๋ถ๋งํฌ ์ฐพ๊ธฐ
- ๊ด๊ณ ๋ฉ์์ง ๋ฐํ
- ๋ถ๋งํฌ + ์ฌ์ฉ์ ๋ฉ๋ชจ
- ๋ฉ๋ชจ๋ ํจ๊ป ๋ฒกํฐํ
- ๊ด๋ จ ๋ถ๋งํฌ ์ถ์ฒ
- ์ฌ์ ์ ์๋ ํค์๋
- ํค์๋ ๊ธฐ๋ฐ ๋ถ๋ฅ
- ์นดํ ๊ณ ๋ฆฌ๋ณ ๊ด๊ณ ์์ฑ
- ์ธํ๋ผ ์๋น์ค ์ ์ ์์
- Consumer ๋ฉ์์ง ์์ ํ์ธ
- Celery Task ์คํ ํ์ธ
- S3 ํ์ผ ๋ค์ด๋ก๋ ํ์ธ
- ํ ์คํธ ์ถ์ถ ํ์ธ
- ์๋ฒ ๋ฉ ์์ฑ ํ์ธ
- ์ ์ฌ๋ ๊ณ์ฐ ํ์ธ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฅ ํ์ธ
- ๊ด๊ณ ๋ฉ์์ง ๋ฐํ ํ์ธ
- ์ค๋ฅ ์ฒ๋ฆฌ ํ์ธ
# app/config.py์์
SIMILARITY_THRESHOLD = 0.8 # ๊ธฐ๋ณธ๊ฐ ์กฐ์ # Celery ์ค์ ์์
CELERY_TASK_ROUTES = {
'bookmark_save_task': {'queue': 'embedding', 'rate_limit': '10/m'}
}# ChromaDB ์ค์
CHROMA_COLLECTION_NAME = "bookmarks_test"
CHROMA_EMBEDDING_FUNCTION = "openai" # ๋๋ "huggingface"๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด GitHub Issues์ ๋ค์ ์ ๋ณด์ ํจ๊ป ๋ฌธ์ํด์ฃผ์ธ์:
- ์ค๋ฅ ๋ฉ์์ง
- ์คํ ํ๊ฒฝ (OS, Python ๋ฒ์ )
- ๋ก๊ทธ ํ์ผ
- ํ ์คํธ ์๋๋ฆฌ์ค