cert-study-app / docs /03_data_pipeline.md
Kentlo's picture
Sync from GitHub c6e463fa85688c6406b64ab1ad3a425506a9bacb
56a2bc0 verified
|
Raw
History Blame Contribute Delete
6.67 kB
# 03. ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ
## ๋ชฉํ‘œ
PDF ์—…๋กœ๋“œ๋ถ€ํ„ฐ ๋ฌธ์ œ ์ €์žฅ๊นŒ์ง€์˜ ํ๋ฆ„์„ ์ž๋™ํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ด ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž๋Š” PDF๋งŒ ์—…๋กœ๋“œํ•˜์ง€๋งŒ, ๋‚ด๋ถ€์—์„œ๋Š” ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ ๋ฌธ์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค.
## ์ „์ฒด ํ๋ฆ„
1. ์‚ฌ์šฉ์ž๊ฐ€ Streamlit์—์„œ PDF๋ฅผ ์—…๋กœ๋“œํ•œ๋‹ค.
2. ์—…๋กœ๋“œ ์ •๋ณด๋กœ `IngestionJob`์„ ๋งŒ๋“ ๋‹ค.
3. Airflow DAG๊ฐ€ ๊ธด PDF ์ฒ˜๋ฆฌ ์ž‘์—…์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•œ๋‹ค.
4. Airflow ์ž‘์—… ์•ˆ์—์„œ PDF Ingestion Graph๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
5. PDF๋ฅผ ํ…์ŠคํŠธ์™€ ๋ฌธ์ œ ๋‹จ์œ„๋กœ ํŒŒ์‹ฑํ•œ๋‹ค.
6. ํŒŒ์‹ฑ ๊ฒฐ๊ณผ์˜ ํ’ˆ์งˆ์„ ๊ฒ€์‚ฌํ•œ๋‹ค.
7. ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ PostgreSQL์— ์ €์žฅํ•œ๋‹ค.
8. ํ•„์š”ํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ Chroma์— ์ƒ‰์ธํ•œ๋‹ค.
9. ์‚ฌ์šฉ์ž๋Š” ์›น์—์„œ ์ €์žฅ๋œ ๋ฌธ์ œ๋ฅผ ํ’€ ์ˆ˜ ์žˆ๋‹ค.
![๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ํ๋ฆ„](assets/data-pipeline-flow.png)
## ๋‹จ๊ณ„๋ณ„ ์„ค๋ช…
### 1. PDF ์—…๋กœ๋“œ
์‚ฌ์šฉ์ž๋Š” Streamlit์˜ PDF ์—…๋กœ๋“œ ํ™”๋ฉด์—์„œ ์‹œํ—˜๋ช…๊ณผ PDF ํŒŒ์ผ์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
์ด๋•Œ PDF ์ž์ฒด๋Š” ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ์— ์ €์žฅ๋˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ์ฒ˜๋ฆฌ ์ž‘์—… ์ •๋ณด๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
### 2. IngestionJob ์ƒ์„ฑ
`ingestion_jobs` ํ…Œ์ด๋ธ”์—๋Š” PDF ์ฒ˜๋ฆฌ ์ž‘์—…์˜ ์ƒํƒœ๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์•„๋ž˜ ๊ฐ™์€ ์ •๋ณด๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
- ์‹œํ—˜๋ช…
- PDF ๊ฒฝ๋กœ
- ํ˜„์žฌ ์ƒํƒœ
- ํ˜„์žฌ ๋‹จ๊ณ„
- ์ง„ํ–‰๋ฅ 
- ์ €์žฅ๋œ ๋ฌธ์ œ ์ˆ˜
- ํ’ˆ์งˆ ์ ์ˆ˜
- ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€
์ด ํ…Œ์ด๋ธ”์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๋Š” PDF ์ฒ˜๋ฆฌ ์ค‘ ํ˜„์žฌ ์–ด๋””๊นŒ์ง€ ์ง„ํ–‰๋๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
### 3. Airflow DAG ์‹คํ–‰
PDF ์ฒ˜๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์›น ํ™”๋ฉด ์•ˆ์—์„œ ๋ชจ๋“  ์ฒ˜๋ฆฌ๋ฅผ ๋๋‚ด๊ธฐ๋ณด๋‹ค Airflow DAG๋กœ ๋„˜๊ธฐ๋Š” ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
ํ˜„์žฌ PDF ์ฒ˜๋ฆฌ DAG๋Š” `dags/cert_study_pdf_ingestion_dag.py`์— ์žˆ์Šต๋‹ˆ๋‹ค.
Airflow๋Š” `job_id`๋ฅผ ๋ฐ›์•„ ํ•ด๋‹น ์ž‘์—…์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
Airflow์˜ ํ•ต์‹ฌ ์—ญํ• ์€ ์ง์ ‘ ๋ฌธ์ œ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ธด ์ฒ˜๋ฆฌ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ณ  ์‹คํŒจ ์ง€์ ์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ํŒŒ์‹ฑ, ํ’ˆ์งˆ๊ฒ€์ฆ, ์ €์žฅ ํ๋ฆ„์€ ์•ฑ ์ฝ”๋“œ์˜ PDF Ingestion Graph์—์„œ ๋‹จ๊ณ„๋ณ„๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
### 4. PDF Ingestion Graph ์‹คํ–‰
์‹ค์ œ PDF ์ฒ˜๋ฆฌ ํ๋ฆ„์€ `cert_study_app/graphs/pdf_ingestion_graph.py`์— ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
ํ˜„์žฌ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
1. `coordinator_start`
2. `parse_pdf`
3. `parse_quality`
4. `quality_gate`
5. `ingest_questions`
6. `classify_questions`
7. `visual_questions`
8. `validate_questions`
9. `coordinator_finish`
์ด๋ ‡๊ฒŒ ๋‹จ๊ณ„๋ฅผ ๋‚˜๋ˆ„๋ฉด ์‹คํŒจ ์ง€์ ์„ ์ถ”์ ํ•˜๊ธฐ ์‰ฝ๊ณ , ๋‚˜์ค‘์— ํŠน์ • ๋‹จ๊ณ„๋งŒ ๊ฐœ์„ ํ•˜๊ธฐ๋„ ์‰ฝ์Šต๋‹ˆ๋‹ค.
### 5. PDF ํŒŒ์‹ฑ
PDF์—์„œ ํ…์ŠคํŠธ๋ฅผ ์ถ”์ถœํ•˜๊ณ  ๋ฌธ์ œ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค.
ํŒŒ์‹ฑ ๊ฒฐ๊ณผ์—๋Š” ๋ณดํ†ต ์•„๋ž˜ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
- ๋ฌธ์ œ ๋ณธ๋ฌธ
- ๋ณด๊ธฐ
- ์ •๋‹ต
- ํ•ด์„ค
- ๋ฌธ์ œ ๋ฒˆํ˜ธ
- ํŽ˜์ด์ง€
- ์›๋ณธ ํ…์ŠคํŠธ
- ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ
LLM์€ ๋ชจ๋“  ๋‹จ๊ณ„์—์„œ ๋ฌด์กฐ๊ฑด ์“ฐ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ตฌ์กฐํ™”๊ฐ€ ์–ด๋ ต๊ฑฐ๋‚˜ ๋ณด์ •์ด ํ•„์š”ํ•œ ๋‹จ๊ณ„์—์„œ ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉํ–ฅ์ž…๋‹ˆ๋‹ค.
### 6. ํŒŒ์‹ฑ ํ’ˆ์งˆ ๊ฒ€์ฆ
ํŒŒ์‹ฑ๋œ ๋ฌธ์ œ๊ฐ€ ๋ฐ”๋กœ ์ €์žฅ๋˜๋ฉด ์ž˜๋ชป ๋‚˜๋‰œ ๋ฌธ์ œ๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ €์žฅ ์ „์— ํ’ˆ์งˆ ๋ฆฌํฌํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
๊ฒ€์‚ฌ ์˜ˆ์‹œ:
- ๋ฌธ์ œ ๋ณธ๋ฌธ์ด ๋น„์–ด ์žˆ๋Š”๊ฐ€
- ๋ณด๊ธฐ ๊ฐœ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ์ ์€๊ฐ€
- ์ •๋‹ต์ด ๋น„์–ด ์žˆ๋Š”๊ฐ€
- ๋ฌธ์ œ ๋ฒˆํ˜ธ๊ฐ€ ์ด์ƒํ•œ๊ฐ€
- ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์ค‘๋ณต์œผ๋กœ ๋“ค์–ด์™”๋Š”๊ฐ€
- ์ฒญํ‚น ๊ฒฐ๊ณผ๊ฐ€ ๋„ˆ๋ฌด ์งง๊ฑฐ๋‚˜ ๊ธด๊ฐ€
### 7. Quality Gate
ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ๋Š” โ€œ์ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๋กœ ์ €์žฅํ•ด๋„ ๋˜๋Š”๊ฐ€โ€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.
ํ’ˆ์งˆ์ด ๋„ˆ๋ฌด ๋‚ฎ์œผ๋ฉด ์ €์žฅ์„ ๋ณด๋ฅ˜ํ•˜๊ณ , ์‚ฌ๋žŒ์ด ํ™•์ธํ•˜๊ฑฐ๋‚˜ ํŒŒ์„œ๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
์ด ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์‚ฌ๋žŒ์ด ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ์ง์ ‘ ๊ฒ€์ˆ˜ํ•˜๋Š” ๋ฐฉ์‹๋ณด๋‹ค, ๊ทœ์น™ ๊ธฐ๋ฐ˜ ๊ฒ€์ฆ๊ณผ ์ œํ•œ์ ์ธ LLM ํ™œ์šฉ์œผ๋กœ ์ž๋™ ๊ฒ€์ˆ˜ ๋น„์œจ์„ ๋†’์ด๋Š” ๋ฐฉํ–ฅ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•œ ๊ฒฐ๊ณผ๋Š” ๋ฐ”๋กœ PostgreSQL์— ๋„ฃ๊ธฐ๋ณด๋‹ค ๊ฒ€์ˆ˜ ํ•„์š” ์ƒํƒœ๋กœ ๋‚จ๊ธฐ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ด์•ผ ์ž˜๋ชป ์ฒญํ‚น๋œ ๋ฌธ์ œ๊ฐ€ ์‹ค์ œ ๋ฌธ์ œํ’€์ด ํ™”๋ฉด์— ์„ž์ด๋Š” ๊ฒƒ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
### 8. PostgreSQL ์ €์žฅ
ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ๋ฅผ ํ†ต๊ณผํ•œ ๋ฌธ์ œ๋Š” `questions` ํ…Œ์ด๋ธ”์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž๊ฐ€ ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด ํ’€์ด ๊ธฐ๋ก์€ `attempts` ํ…Œ์ด๋ธ”์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
๊ฐœ๋… ์ •๋ฆฌ ๋ฐ์ดํ„ฐ๋Š” `concept_notes` ํ…Œ์ด๋ธ”์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
### 9. Chroma ์ƒ‰์ธ
์œ ์‚ฌ ๋ฌธ์ œ ๊ฒ€์ƒ‰์„ ์œ„ํ•ด ๋ฌธ์ œ ๋‚ด์šฉ์„ ์ž„๋ฒ ๋”ฉ์œผ๋กœ ๋ณ€ํ™˜ํ•ด Chroma์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
์ด๋•Œ PostgreSQL์˜ ๋ฌธ์ œ ID์™€ Chroma์˜ ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์•ผ ์œ ์‚ฌ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ์‹ค์ œ ๋ฌธ์ œ ํ™”๋ฉด์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
## ๋ฐฐํฌ์šฉ Seed ์ƒ์„ฑ
Hugging Face Space์—์„œ๋Š” ๋กœ์ปฌ PostgreSQL DB, Chroma ์ธ๋ฑ์Šค, PDF ์›๋ณธ์„ ์ง์ ‘ ์˜ฌ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋ฐฐํฌ ์‹œ ๋ฐ”๋กœ ๋ฌธ์ œํ’€์ด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก seed ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
ํ˜„์žฌ ๋ฐฐํฌ์šฉ seed ์ƒ์„ฑ ๋ช…๋ น์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
```bash
python scripts/export_hf_seed.py
```
์ด ์Šคํฌ๋ฆฝํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์•„๋ž˜ ๋‘ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ฉ์ณ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
- `data/Json/questions.json`: ๋ฌธ์ œ, ๋ณด๊ธฐ, ์ •๋‹ต, ํ•ด์„ค์ด ์ •๋ฆฌ๋œ ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ
- `data/parsed_json/reparsed_multipage_images_20260601_205501.json`: ๊ณตํ†ต ์ง€๋ฌธ๊ณผ ๊ณตํ†ต ์ง€๋ฌธ ์›๋ฌธ ์ด๋ฏธ์ง€ ์ •๋ณด
์ƒ์„ฑ ๊ฒฐ๊ณผ:
- `cert_study_app/demo_data/questions_seed.json`
- `static/question_assets/`
ํ˜„์žฌ seed์—๋Š” 321๋ฌธํ•ญ์ด ๋“ค์–ด ์žˆ์œผ๋ฉฐ, ๊ณตํ†ต ์ง€๋ฌธ์ด ์žˆ๋Š” ๋ฌธํ•ญ์€ ๊ธด ์ง€๋ฌธ๊ณผ ์›๋ฌธ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ๊ฐ€ ํ•จ๊ป˜ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. Yes/No ์ง„์ˆ ํ˜• ๋ฌธ์ œ๋Š” ํ™”๋ฉด์—์„œ ์ง„์ˆ ๋ณ„ `์˜ˆ / ์•„๋‹ˆ์˜ค`๋กœ ํ’€ ์ˆ˜ ์žˆ๋„๋ก ์ •๋‹ต์ด `Y,N,Y` ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ •๊ทœํ™”๋ฉ๋‹ˆ๋‹ค.
## ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ค‘์š”ํ•œ ์ 
### ์ €์žฅ ์ „์— ํ’ˆ์งˆ์„ ํ™•์ธํ•œ๋‹ค
ํŒŒ์‹ฑ ๊ฒฐ๊ณผ๊ฐ€ ์ž˜๋ชป๋œ ์ƒํƒœ๋กœ ์ €์žฅ๋˜๋ฉด ๋‚˜์ค‘์— ์ˆ˜์ •ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €์žฅ ์ „ ํ’ˆ์งˆ ๊ฒ€์ฆ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
### ๊ธด ์ž‘์—…์€ Airflow๊ฐ€ ๋งก๋Š”๋‹ค
PDF ์ฒ˜๋ฆฌ, ์ด๋ฏธ์ง€ ๋ถ„์„, ์ƒ‰์ธ์€ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ž‘์—…์€ ์›น ์š”์ฒญ ์•ˆ์—์„œ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋ณด๋‹ค Airflow๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค.
### LLM ์‚ฌ์šฉ์€ ์ตœ์†Œํ™”ํ•œ๋‹ค
LLM์€ ๋А๋ฆฌ๊ณ  ๋น„์šฉ์ด ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์ธ ๊ฒ€์ฆ์€ ๊ทœ์น™๊ณผ ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ ๊ฒ€์‚ฌ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , ๊ผญ ํ•„์š”ํ•œ ๋ถ€๋ถ„์—์„œ๋งŒ LLM์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉํ–ฅ์ด ์ข‹์Šต๋‹ˆ๋‹ค.