Spaces:
Running
Running
| # 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. ์ฌ์ฉ์๋ ์น์์ ์ ์ฅ๋ ๋ฌธ์ ๋ฅผ ํ ์ ์๋ค. | |
|  | |
| ## ๋จ๊ณ๋ณ ์ค๋ช | |
| ### 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์ ์ฌ์ฉํ๋ ๋ฐฉํฅ์ด ์ข์ต๋๋ค. | |