μ΄ ν΄λλ devpick-ai μλ²μ μΌνμ± μ νΈλ¦¬ν° μ€ν¬λ¦½νΈλ₯Ό 보κ΄νλ€.
- μλ² μ ν리μΌμ΄μ μ½λμ ν¬ν¨λμ§ μλ μ΄μ/μ΄κΈ°ν μμ μ© μ€ν¬λ¦½νΈλ₯Ό λλ€
- λνμ μΈ μ©λ: DB μ΄κΈ°ν, λ°μ΄ν° λ§μ΄κ·Έλ μ΄μ , μλ λ°μ΄ν° μ½μ , μΈλ±μ€ μμ±
- κ° μ€ν¬λ¦½νΈλ λ¨λ μΌλ‘ μ€νν μ μμ΄μΌ νλ€
- μ± μλ²(
uvicorn)κ° μ€ν μ€μ΄μ§ μμλ λμν΄μΌ νλ€ - νμν νκ²½λ³μλ
.envμμpython-dotenvλ‘ μ§μ λ‘λνλ€
- λμΌ μ€ν¬λ¦½νΈλ₯Ό μ¬λ¬ λ² μ€νν΄λ κ²°κ³Όκ° λμΌν΄μΌ νλ€
- μ€λ³΅ μμ±, μ€λ³΅ μ½μ μ΄ λ°μνμ§ μλλ‘ upsert λλ μ‘΄μ¬ μ¬λΆ νμΈ ν μ²λ¦¬νλ€
- PostgreSQL μΈλ±μ€ μμ± μ
CREATE INDEX IF NOT EXISTSꡬ문μ μ¬μ©νλ€
- μ€ν¬λ¦½νΈ μ€ν¨ μ λͺ νν μλ¬ λ©μμ§λ₯Ό μΆλ ₯νκ³ non-zero exit codeλ‘ μ’ λ£νλ€
- λΆλΆ μ€ν¨κ° λ°μν μ μλ μμ μ νΈλμμ λλ λ‘€λ°± λ‘μ§μ κ³ λ €νλ€
| νμΌ | μ€λͺ |
|---|---|
run_backfill_batch.py |
1ν μμ§ μ€ν β PostgreSQL μ§μ μ μ₯ + AI μ²λ¦¬(μμ½Β·ν΄μ¦Β·μλ² λ©) |
run_scheduler.py |
6μκ° κ°κ²© μλ λ°λ³΅ μ€ν (APScheduler κΈ°λ°) |
run_collect_and_save.py |
μμ§ β λ‘컬 JSONL μ μ₯ μ μ© (AI μ²λ¦¬ μμ, κ°λ°Β·λλ²κ·Έμ©) |
run_trend_batch.py |
νΈλ λ λΆμ 1ν μ€ν CLI β --unit daily/weekly/monthly, --force (DP-386) |
run_trend_scheduler.py |
νΈλ λ λΆμ μλ μ€ν μ€μΌμ€λ¬ β daily/weekly/monthly cron (DP-386) |
init_postgres.py |
PostgreSQL UNIQUE μΈλ±μ€ μ΄κΈ°ν β λ°°ν¬ μ 1ν μ€ν (λ©±λ±μ± 보μ₯) |
init_vectors.py |
FAISS λ²‘ν° λλ ν°λ¦¬ μ΄κΈ°ν (Bedrock Titan v2 κΈ°λ°) |
reindex_vectors.py |
FAISS μΈλ±μ€ μ¬λΉλ β DynamoDB rag_documents κΈ°λ° (μΈλ±μ€ μ μ€ μ) |
inspect_preprocess.py |
URL κΈ°λ° μ μ²λ¦¬ μΆλ ₯ νμΈ (λλ²κ·Έμ©) |
1ν μμ§ μ€ν. μμ€λΉ μ΅λ 20κ° μμ§ β PostgreSQL μ§μ μ μ₯ β AI μ²λ¦¬(μμ½Β·ν΄μ¦Β·μλ² λ©) μλ μ€ν.
DATABASE_URL=postgresql://... python scripts/run_backfill_batch.pyBackfillCursor(data/raw/backfill_cursor)β μμ€λ³ μ§ν μν(phase/컀μ) νμΌ κ΄λ¦¬SentIdStore(data/raw/sent_ids)β cross-run dedup- 컀μ phase:
backfill(κ³Όκ±° κΈ μ λ) βincremental(μ΅μ κΈλ§) μλ μ ν - μμ€λ³ μ€ν¨λ κ°λ³ catch β μ 체 λ°°μΉκ° μ€λ¨λμ§ μλλ€
APScheduler κΈ°λ° λ°λ³΅ μ€νκΈ°. μ¦μ 1ν μ€ν ν 6μκ°λ§λ€ λ°λ³΅νλ€.
DATABASE_URL=postgresql://... python scripts/run_scheduler.py
# Ctrl+Cλ‘ μ€λ¨BlockingSchedulerμ¬μ© β νλ‘μΈμ€κ° μ΄μ μλ λμ κ³μ μ€ν- λ컀/μλ² νκ²½μμ μ₯κΈ° μ€ν νλ‘μΈμ€λ‘ μ¬μ©
μμ§ β λ‘컬 JSONL μ μ₯ μ μ©. AI μ²λ¦¬ μμ. κ°λ°Β·λλ²κ·Έ νκ²½μμ μ¬μ©.
python scripts/run_collect_and_save.py- μΆλ ₯:
data/raw/normalized/{source_name}.jsonl(append)
νΈλ λ λΆμ 1ν μ€ν CLI.
# period-start λ―Έμ
λ ₯ μ λ¨μλ³ μ§μ κΈ°κ° μλ κ³μ°
DATABASE_URL=postgresql://... python scripts/run_trend_batch.py --unit weekly
DATABASE_URL=postgresql://... python scripts/run_trend_batch.py --unit daily --period-start 2026-04-21
DATABASE_URL=postgresql://... python scripts/run_trend_batch.py --unit monthly --force--unit:daily/weekly/monthly--period-start: κΈ°κ° μμ (YYYY-MM-DD). λ―Έμ λ ₯ μ μλ κ³μ°--force: κΈ°μ‘΄ μ€λ μ·μ΄ μμ΄λ μ¬μμ±
νΈλ λ λΆμ μλ μ€ν μ€μΌμ€λ¬. KST κΈ°μ€ μμ μ§νμ μ€ννλ€.
DATABASE_URL=postgresql://... python scripts/run_trend_scheduler.py
# Ctrl+Cλ‘ μ€λ¨daily: λ§€μΌ 00:05 KSTweekly: λ§€μ£Ό μμμΌ 00:10 KST (μ§μ ν μ£Ό μ~μ)monthly: λ§€μ 1μΌ 00:15 KST (μ§μ λ¬)- κ° job λ 립 try/except β κ°λ³ μ€ν¨κ° μ€μΌμ€λ¬ μ 체λ₯Ό μ€λ¨νμ§ μλλ€
μ μ²λ¦¬ μΆλ ₯μ νμΈνλ λλ²κ·Έμ© μ€ν¬λ¦½νΈλ€.
python scripts/inspect_preprocess.py --url https://d2.naver.com/...seed_vectors.pyβ λ²‘ν° μλ² λ© μ΄κΈ° μλ λ°μ΄ν° μ½μbackfill_ai_summary.pyβ κΈ°μ‘΄ μ½ν μΈ μμ½ μΌκ΄ μμ±eval_runner.pyβ AI μΆλ ₯ νμ§ νκ° μ€ν
# κ°μνκ²½ νμ±ν ν μ€ν
source .venv/bin/activate # macOS/Linux
.venv\Scripts\activate # Windows
# νκ²½λ³μ λ‘λλ μ€ν¬λ¦½νΈ λ΄λΆμμ μ²λ¦¬
DATABASE_URL=postgresql://... python scripts/init_postgres.py- μ΄ ν΄λμ μ€ν¬λ¦½νΈλ CIμμ μλ μ€νλμ§ μλλ€. μλμΌλ‘ μ€ννλ€
- νλ‘λμ DBμ μ§μ μ κ·Όνλ μ€ν¬λ¦½νΈλ μ€ν μ λ°λμ νμ 곡μ νλ€
- μ€ν¬λ¦½νΈ κ²°κ³Όλ‘ λ°μ΄ν°κ° λ³κ²½λ κ²½μ° μ€ν μ λ°±μ μ¬λΆλ₯Ό νμΈνλ€
- μ€ν¬λ¦½νΈμ μν¬λ¦Ώ κ°μ νλμ½λ©νμ§ μλλ€. νμ νκ²½λ³μλ‘ μ£Όμ νλ€