cert-study-app / docs /02_architecture.md
Kentlo's picture
Sync from GitHub b098d17dbed1a6386c212d28b4bfa6138ad59d75
88c7275 verified
|
Raw
History Blame Contribute Delete
11.4 kB
# 02. ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜
## 1. ๊ฐœ์š”
์ด ํ”„๋กœ์ ํŠธ๋Š” ์ž๊ฒฉ์ฆ ์‹œํ—˜ ๋ฌธ์ œ PDF๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ , ๋ฌธ์ œ๋ฅผ ๊ตฌ์กฐํ™”ํ•˜์—ฌ ์›น์—์„œ ํ’€ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“œ๋Š” ํ•™์Šต์šฉ ๋ฌธ์ œํ’€์ด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค.
ํ˜„์žฌ ๋ชฉํ‘œ๋Š” ๋‹จ์ˆœํ•œ ๋ฌธ์ œํ’€์ด ์›น์„ ๋„˜์–ด์„œ, PDF ๊ธฐ๋ฐ˜ ๋น„์ •ํ˜• ์‹œํ—˜ ์ž๋ฃŒ๋ฅผ ์ •ํ˜• ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌธ์ œํ’€์ด, ์ •๋‹ต ํ™•์ธ, ์˜ค๋‹ต ๊ด€๋ฆฌ, ์œ ์‚ฌ ๋ฌธ์ œ ๊ฒ€์ƒ‰์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
## 2. ์ „์ฒด ์•„ํ‚คํ…์ฒ˜ ์š”์•ฝ
ํ˜„์žฌ ์‹œ์Šคํ…œ์€ ๋‹ค์Œ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
| ๊ตฌ์„ฑ ์š”์†Œ | ์—ญํ•  |
| --- | --- |
| Streamlit | ์‚ฌ์šฉ์ž ํ™”๋ฉด ์ œ๊ณต, PDF ์—…๋กœ๋“œ, ๋ฌธ์ œํ’€์ด UI |
| PostgreSQL | ๋ฌธ์ œ, ๋ณด๊ธฐ, ์ •๋‹ต, ํ•ด์„ค, ์‚ฌ์šฉ์ž ํ’€์ด ๊ธฐ๋ก ์ €์žฅ |
| Chroma | ๋ฌธ์ œ ์ž„๋ฒ ๋”ฉ ์ €์žฅ, ์œ ์‚ฌ ๋ฌธ์ œ ๊ฒ€์ƒ‰ |
| Learning Lab Service | Track, ๋กœ๋“œ๋งต, ์ด๋ก  ์นด๋“œ, ํ™•์ธ ํ€ด์ฆˆ, ์‹ค์Šต ์ƒ˜ํ”Œ ์ œ๊ณต |
| Learning Progress Service | ๋งˆ์ง€๋ง‰ ์„ ํƒ Track, ์ด์–ด์„œ ๊ณต๋ถ€ ์ง„ํ–‰๋ฅ , ๋ˆ„์  ํ•™์Šต ๋‹จ์œ„ ์ €์žฅ |
| Question Type Metadata | ๋‹ค์–‘ํ•œ ๋ฌธ์ œ ์œ ํ˜• ์ด๋ฆ„์„ ๋‚ด๋ถ€ ํ‘œ์ค€ ์œ ํ˜•์œผ๋กœ ์ •๋ฆฌ |
| Answer Normalizer | ๊ฐ๊ด€์‹, ๋ณต์ˆ˜ ์„ ํƒ, Yes/No, ์ˆœ์„œํ˜• ๋‹ต์•ˆ์„ ๋น„๊ต ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ์ •๊ทœํ™” |
| Airflow | PDF ์ฒ˜๋ฆฌ, ํŒŒ์‹ฑ, ์ž„๋ฒ ๋”ฉ, ์ €์žฅ ์ž‘์—…์˜ ํŒŒ์ดํ”„๋ผ์ธ ๊ด€๋ฆฌ |
| Docker / Docker Compose | ๊ฐœ๋ฐœ ๋ฐ ์‹คํ–‰ ํ™˜๊ฒฝ ํ‘œ์ค€ํ™” |
| Oracle Cloud Ubuntu | ํ–ฅํ›„ ์„œ๋น„์Šค ๋ฐฐํฌ ๋Œ€์ƒ ์„œ๋ฒ„ |
## 3. ์ฒจ๋ถ€ ๋‹ค์ด์–ด๊ทธ๋žจ ๊ฒ€ํ† 
์ฒจ๋ถ€ํ•œ ๋‹ค์ด์–ด๊ทธ๋žจ์˜ ํฐ ๋ฐฉํ–ฅ์€ ๋งž์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ Streamlit Web UI์— ์ ‘์†ํ•˜๊ณ , PDF ์—…๋กœ๋“œ์™€ ๋ฌธ์ œํ’€์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉฐ, PostgreSQL๊ณผ Chroma๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ๋Š” ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ๋ฐฉํ–ฅ๊ณผ ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค.
![์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜](assets/system-architecture.png)
๋‹ค๋งŒ ํ˜„์žฌ ์ฝ”๋“œ ๊ตฌ์กฐ ๊ธฐ์ค€์œผ๋กœ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ๋” ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.
- Airflow๋Š” Parser/OCR ๋’ค์— ๋ถ™๋Š” ๋ณ„๋„ ์ €์žฅ ๋‹จ๊ณ„๋ผ๊ธฐ๋ณด๋‹ค, ๊ธด PDF ์ฒ˜๋ฆฌ ์ž‘์—… ์ „์ฒด๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ํ•˜๊ณ  ์ถ”์ ํ•˜๋Š” ์—ญํ• ์ž…๋‹ˆ๋‹ค.
- PDF Parser/OCR, Quality Check, PostgreSQL ์ €์žฅ, ๋ฌธ์ œ ๋ถ„๋ฅ˜/๊ฒ€์ฆ์€ `PDF Ingestion Graph` ์•ˆ์˜ ๋‹จ๊ณ„๋กœ ๋ณด๋Š” ๊ฒƒ์ด ์ž์—ฐ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.
- Quiz Service๋Š” PostgreSQL์— ์ €์žฅ๋œ ๋ฌธ์ œ์™€ ํ’€์ด ๊ธฐ๋ก์„ ์ฝ๊ณ  ์”๋‹ˆ๋‹ค.
- Similar Question Search๋Š” Chroma์—์„œ ์œ ์‚ฌ ๋ฌธ์ œ๋ฅผ ์ฐพ๊ณ , ์‹ค์ œ ๋ฌธ์ œ ๋ฐ์ดํ„ฐ๋Š” PostgreSQL์˜ ๋ฌธ์ œ ID์™€ ์—ฐ๊ฒฐํ•ด์„œ ๋ณด์—ฌ์ฃผ๋Š” ๊ตฌ์กฐ๊ฐ€ ์ข‹์Šต๋‹ˆ๋‹ค.
- Chroma๋Š” ํ˜„์žฌ ๋ณ„๋„ ์„œ๋ฒ„ํ˜• DB๋ผ๊ธฐ๋ณด๋‹ค `chroma_db` ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋กœ์ปฌ ๋ฒกํ„ฐ ์ €์žฅ์†Œ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.
์ •๋ฆฌํ•˜๋ฉด ์ฒจ๋ถ€ ๋‹ค์ด์–ด๊ทธ๋žจ์€ ๊ฐœ๋…์ ์œผ๋กœ ๋งž์ง€๋งŒ, ๋ฌธ์„œ์—์„œ๋Š” Airflow๋ฅผ โ€œํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰ ๊ด€๋ฆฌ์žโ€๋กœ, PostgreSQL์„ โ€œ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œโ€๋กœ, Chroma๋ฅผ โ€œ๊ฒ€์ƒ‰์šฉ ๋ณด์กฐ ์ƒ‰์ธโ€์œผ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.
## 4. ์‚ฌ์šฉ์ž ๊ด€์  ํ๋ฆ„
์‚ฌ์šฉ์ž๋Š” ์›น ํ™”๋ฉด์— ์ ‘์†ํ•œ ๋’ค ์ด์–ด์„œ ๊ณต๋ถ€, ์ง‘์ค‘ ํ•™์Šต, ์‹œํ—˜ ๋Œ€๋น„, ๋Œ€์‹œ๋ณด๋“œ, ๋ฌธ์ œํ’€์ด, PDF ์—…๋กœ๋“œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์‚ฌ์šฉ์ž ๊ธฐ๋Šฅ ํ๋ฆ„์€ ์•„๋ž˜ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
![์‚ฌ์šฉ์ž ๊ธฐ๋Šฅ ํ๋ฆ„](assets/user-flow.png)
ํ˜„์žฌ ๊ตฌํ˜„์€ ํ™ˆ์„ ๋‹จ์ˆœ ์‹œ์ž‘ ํ™”๋ฉด์œผ๋กœ ๋‘๊ณ , ์ง„๋„์™€ ์ถ”์ฒœ ๋ณต์Šต์€ ๋ณ„๋„ ๋Œ€์‹œ๋ณด๋“œ์—์„œ ํ™•์ธํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œํ’€์ด, PDF ์—…๋กœ๋“œ, ์˜ค๋‹ต/๋ณต์Šต, ๊ฐœ๋… ์ •๋ฆฌ, ์ฒ˜๋ฆฌ ํ˜„ํ™ฉ, ์‹œํ—˜ ํ˜„ํ™ฉ, AI ์ƒ‰์ธ ํ๋ฆ„์€ ์œ ์ง€ํ•˜๋ฉฐ, ๊ทธ ์œ„์— Track ๊ธฐ๋ฐ˜ ์ด๋ก  ํ•™์Šต๊ณผ ํ™•์ธ ํ€ด์ฆˆ๋ฅผ ์–น๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ๋งˆํฌ๋Š” ํ–ฅํ›„ ๊ฐœ์„  ๊ธฐ๋Šฅ์œผ๋กœ ๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
## 5. ์ „์ฒด ์„œ๋น„์Šค ํ๋ฆ„
์ „์ฒด ์„œ๋น„์Šค ํ๋ฆ„์€ ์œ„ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ž๊ฐ€ Streamlit ํ™”๋ฉด์— ์ ‘์†ํ•˜๊ณ , PDF ์—…๋กœ๋“œ์™€ ๋ฌธ์ œํ’€์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค.
ํ˜„์žฌ ์ฝ”๋“œ ๊ธฐ์ค€์œผ๋กœ๋Š” Streamlit ํ™”๋ฉด์ด `QuizService`, `LearningLabService`, `LearningProgressService`, `IngestionJobService`, `QuestionVectorStore` ๊ฐ™์€ ์„œ๋น„์Šค ๊ณ„์ธต์„ ํ˜ธ์ถœํ•˜๊ณ , PDF ์ฒ˜๋ฆฌ์ฒ˜๋Ÿผ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์€ Airflow DAG์™€ PDF Ingestion Graph๋ฅผ ํ†ตํ•ด ๋‹จ๊ณ„๋ณ„๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
ํ•™์Šต ํ™”๋ฉด ์ชฝ์€ ๋‹ค์Œ์ฒ˜๋Ÿผ ๋‚˜๋ˆ•๋‹ˆ๋‹ค.
| ํ™”๋ฉด | ์—ญํ•  |
| --- | --- |
| ํ™ˆ | ์ด์–ด์„œ ๊ณต๋ถ€, ์ง‘์ค‘ ํ•™์Šต, ์‹œํ—˜ ๋Œ€๋น„, ๋Œ€์‹œ๋ณด๋“œ๋กœ ๋“ค์–ด๊ฐ€๋Š” ๊ฐ€๋ฒผ์šด ์‹œ์ž‘ ํ™”๋ฉด |
| ์ด์–ด์„œ ๊ณต๋ถ€ | ๋งˆ์ง€๋ง‰์œผ๋กœ ์„ ํƒํ•œ Track์„ ๊ธฐ์ค€์œผ๋กœ ์ด๋ก , ํ€ด์ฆˆ, ์˜ค๋‹ต ๋ณต์Šต์„ ๊ณ„์† ์ง„ํ–‰ |
| ์ง‘์ค‘ ํ•™์Šต | ์ด๋ก ๋งŒ ๋ณด๊ธฐ, ํ€ด์ฆˆ๋งŒ ํ’€๊ธฐ, ์‹ค์Šต ์ง‘์ค‘์ฒ˜๋Ÿผ ์›ํ•˜๋Š” ํ•™์Šต ๋ชจ๋“œ ์„ ํƒ |
| ์‹œํ—˜ ๋Œ€๋น„ | AZ-104 ๋ฌธ์ œํ’€์ด, ์„ธ๋ถ€๊ฐœ๋… ๋ฐ˜๋ณต, ์‹œํ—˜ ๋ชจ๋“œ ์ง„์ž… |
| ๋Œ€์‹œ๋ณด๋“œ | Track ์ง„ํ–‰๋ฅ , ์—ฐ์† ํ•™์Šต์ผ, ์˜ค๋Š˜/์ฃผ๊ฐ„ ๋ˆ„์  ํ•™์Šต ๋‹จ์œ„, ์ถ”์ฒœ ๋ณต์Šต ํ™•์ธ |
๋ฌธ์ œํ’€์ด ํ๋ฆ„์—์„œ๋Š” ๋ฌธ์ œ ์œ ํ˜•์ด ์—ฌ๋Ÿฌ ์ด๋ฆ„์œผ๋กœ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— `question_type_metadata_service.py`์—์„œ ๋จผ์ € ํ‘œ์ค€ ์œ ํ˜•์œผ๋กœ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด `Hotspot (True/False)`๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ Yes/No ์ง„์ˆ ํ˜•์œผ๋กœ, `Hotspot (Drag and Drop)`์€ ๋งค์นญํ˜•์œผ๋กœ ๋‹ค๋ฃน๋‹ˆ๋‹ค.
์ •๋‹ต ๋น„๊ต๋Š” `answer_normalizer.py`๋ฅผ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณ„์ธต์€ `Y,N,Y`, `์˜ˆ/์•„๋‹ˆ์˜ค`, ๋ณต์ˆ˜ ์„ ํƒ, ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•œ ๋‹ต์•ˆ์„ ๋น„๊ต ๊ฐ€๋Šฅํ•œ ๋ฌธ์ž์—ด๋กœ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ด ๋‘๋ฉด ํ™”๋ฉด UI์™€ ์ฑ„์  ๋กœ์ง์ด ์„œ๋กœ ๋‹ค๋ฅธ ๊ธฐ์ค€์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
## 6. PDF ์ฒ˜๋ฆฌ ํ๋ฆ„
PDF ์—…๋กœ๋“œ ์ดํ›„์—๋Š” ํŒŒ์‹ฑ ๊ณผ์ •์„ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ์ถ”์ถœํ•˜๊ณ , ๋ฌธ์ œ/๋ณด๊ธฐ/์ •๋‹ต/ํ•ด์„ค ํ˜•ํƒœ๋กœ ๊ตฌ์กฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
๊ตฌ์กฐํ™”๋œ ๋ฌธ์ œ ๋ฐ์ดํ„ฐ๋Š” PostgreSQL์— ์ €์žฅํ•˜๊ณ , ์œ ์‚ฌ ๋ฌธ์ œ ๊ฒ€์ƒ‰์— ํ•„์š”ํ•œ ํ…์ŠคํŠธ๋Š” ์ž„๋ฒ ๋”ฉํ•˜์—ฌ Chroma์— ์ €์žฅํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
![PDF ์ฒ˜๋ฆฌ ํ๋ฆ„](assets/pdf-processing-flow.png)
์‹ค์ œ ์ฝ”๋“œ์—์„œ๋Š” `cert_study_app/graphs/pdf_ingestion_graph.py`์˜ PDF ingestion graph๊ฐ€ ์ด ํ๋ฆ„์„ ๋‹จ๊ณ„๋ณ„๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
ํ˜„์žฌ ์ฃผ์š” ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
1. ์ฒ˜๋ฆฌ ์‹œ์ž‘
2. PDF ํŒŒ์‹ฑ
3. ํŒŒ์‹ฑ ํ’ˆ์งˆ ๊ฒ€์ฆ
4. ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ
5. ๋ฌธ์ œ ์ €์žฅ
6. ๋ฌธ์ œ ์œ ํ˜• ๋ถ„๋ฅ˜
7. ์ด๋ฏธ์ง€/์‹œ๊ฐ ์ •๋ณด ๋ถ„์„
8. ์ตœ์ข… ๊ฒ€์ฆ
9. ์ฒ˜๋ฆฌ ์™„๋ฃŒ
ํŒŒ์‹ฑ ํ’ˆ์งˆ ๊ฒ€์ฆ์—์„œ๋„ ๋ฌธ์ œ ์œ ํ˜• ํ‘œ์ค€ํ™” ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐํ˜• ๋ฌธ์ œ๋ฅผ ์ผ๋ฐ˜ ๊ฐ๊ด€์‹์œผ๋กœ ์ž˜๋ชป ๋ณด๊ณ  `๋ณด๊ธฐ๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค`๊ณ  ํŒ๋‹จํ•˜๋Š” ์ผ์„ ์ค„์ด๊ธฐ ์œ„ํ•œ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.
## 7. ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ตฌ์กฐ
์ด ์‹œ์Šคํ…œ์—์„œ๋Š” PostgreSQL๊ณผ Chroma๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
PostgreSQL์€ ๋ฌธ์ œ, ๋ณด๊ธฐ, ์ •๋‹ต, ํ•ด์„ค, ์‚ฌ์šฉ์ž ํ’€์ด ๊ธฐ๋ก์ฒ˜๋Ÿผ ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํŠน์ • ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ๋งžํ˜”๋Š”์ง€, ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์˜ค๋‹ต ๋ณต์Šต ๋Œ€์ƒ์ธ์ง€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
Chroma๋Š” ๋ฌธ์ œ ๋ณธ๋ฌธ์„ ๋ฒกํ„ฐ๋กœ ์ €์žฅํ•˜์—ฌ ์œ ์‚ฌ ๋ฌธ์ œ ๊ฒ€์ƒ‰์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ๋ฌธ์ œ๋ฅผ ํ‹€๋ ธ์„ ๋•Œ, ๋น„์Šทํ•œ ์œ ํ˜•์˜ ๋ฌธ์ œ๋ฅผ ์ฐพ์•„ ๋ณต์Šตํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
PostgreSQL์€ ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์ด๊ณ , Chroma๋Š” ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ๋ณด์กฐ ์ƒ‰์ธ์ž…๋‹ˆ๋‹ค. Chroma๊ฐ€ PostgreSQL์„ ๋Œ€์ฒดํ•˜๋Š” ๊ตฌ์กฐ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.
ํ•™์Šต ์ง„ํ–‰ ๋ฐ์ดํ„ฐ๋Š” ํ˜„์žฌ `data/learning_progress.json`์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋งˆ์ง€๋ง‰ ์„ ํƒ Track, ๋‚ ์งœ๋ณ„ ํ•™์Šต ๋‹จ๊ณ„, ์ด๋ก /ํ€ด์ฆˆ/์‹ค์Šต/๋ฌธ์ œํ’€์ด/๋ณต์Šต ํ™œ๋™ ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ ๊ฐœ์ธ ๋กœ์ปฌ ์ง„ํ–‰ ์ƒํƒœ์— ๊ฐ€๊น๊ธฐ ๋•Œ๋ฌธ์— Git์— ์˜ฌ๋ฆฌ๋Š” ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ๋กœ ๋ด…๋‹ˆ๋‹ค.
ํ˜„์žฌ ์ €์žฅ ์—ญํ• ์„ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
| ์ €์žฅ ์œ„์น˜ | ์„ฑ๊ฒฉ | ์˜ˆ์‹œ |
| --- | --- | --- |
| PostgreSQL | ๊ธฐ์ค€ ๋ฌธ์ œ/ํ’€์ด ๋ฐ์ดํ„ฐ | ๋ฌธ์ œ, ์ •๋‹ต, ํ•ด์„ค, ํ’€์ด ๊ธฐ๋ก |
| Chroma | ๊ฒ€์ƒ‰์šฉ ๋ณด์กฐ ์ƒ‰์ธ | ๋ฌธ์ œ ์ž„๋ฒ ๋”ฉ, ์œ ์‚ฌ ๋ฌธ์ œ ๊ฒ€์ƒ‰ |
| `data/learning_progress.json` | ๊ฐœ์ธ ํ•™์Šต ์ง„ํ–‰ ์ƒํƒœ | ์„ ํ˜ธ Track, ๋ˆ„์  ํ•™์Šต ๋‹จ์œ„ |
| `cert_study_app/demo_data/questions_seed.json` | ๋ฐฐํฌ์šฉ seed | Hugging Face ์ดˆ๊ธฐ ๋ฌธ์ œ ๋ฐ์ดํ„ฐ |
## 8. Airflow ์‚ฌ์šฉ ์ด์œ 
PDF ์ฒ˜๋ฆฌ ๊ณผ์ •์€ ํ•œ ๋ฒˆ์— ๋๋‚˜๋Š” ๋‹จ์ˆœ ์ž‘์—…์ด ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.
1. PDF ์—…๋กœ๋“œ
2. ํ…์ŠคํŠธ ์ถ”์ถœ ๋˜๋Š” OCR ๋ณด์ •
3. ๋ฌธ์ œ ๋‹จ์œ„ ํŒŒ์‹ฑ
4. ์ •๋‹ต/ํ•ด์„ค ๊ตฌ์กฐํ™”
5. ํŒŒ์‹ฑ ํ’ˆ์งˆ ๊ฒ€์ฆ
6. PostgreSQL ์ €์žฅ
7. ์ž„๋ฒ ๋”ฉ ์ƒ์„ฑ
8. Chroma ์ €์žฅ
์ด๋Ÿฐ ์ž‘์—…์€ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๊ณ , ์ค‘๊ฐ„์— ์‹คํŒจํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Airflow๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ดํ”„๋ผ์ธ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
ํ˜„์žฌ๋Š” ๊ฐœ๋ฐœ ๋‹จ๊ณ„์ด๋ฏ€๋กœ ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ์™„์ „ํžˆ ์ž๋™ํ™”๋˜์–ด ์žˆ์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ํ–ฅํ›„ ์•ˆ์ •์ ์ธ ๋ฌธ์ œ ์ฒ˜๋ฆฌ ๋ฐฐ์น˜๋ฅผ ์œ„ํ•ด Airflow๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์„ค๊ณ„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
ํ˜„์žฌ DAG ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
- `dags/cert_study_pdf_ingestion_dag.py`
- `dags/cert_study_visual_analysis_dag.py`
## 9. Docker ์‚ฌ์šฉ ์ด์œ 
Docker๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ ๋ฐฐํฌ ํ™˜๊ฒฝ์„ ์ตœ๋Œ€ํ•œ ๋™์ผํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๋Š” Streamlit, PostgreSQL, Chroma, Airflow์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋“ค์„ ๋กœ์ปฌ MacBook์ด๋‚˜ Oracle Cloud Ubuntu์—์„œ ๋™์ผํ•˜๊ฒŒ ์‹คํ–‰ํ•˜๋ ค๋ฉด ํ™˜๊ฒฝ ์ฐจ์ด๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
Docker Compose๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ์„œ๋น„์Šค๋ฅผ ํ•˜๋‚˜์˜ ์„ค์ • ํŒŒ์ผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ˜„์žฌ `docker-compose.yml`์˜ ์ฃผ์š” ์„œ๋น„์Šค ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
| ์„œ๋น„์Šค | ์—ญํ•  |
| --- | --- |
| `cert-study-app` | Streamlit ์‚ฌ์šฉ์ž ์›น ํ™”๋ฉด |
| `postgres` | ๋ฌธ์ œ ๋ฐ ํ’€์ด ๋ฐ์ดํ„ฐ ์ €์žฅ |
| `airflow-init` | Airflow ์ดˆ๊ธฐ ์„ค์ • |
| `airflow-webserver` | Airflow ๊ด€๋ฆฌ ํ™”๋ฉด |
| `airflow-scheduler` | ํŒŒ์ดํ”„๋ผ์ธ ์Šค์ผ€์ค„ ์‹คํ–‰ |
Chroma๋Š” ๋ณ„๋„ ์ปจํ…Œ์ด๋„ˆ๋ผ๊ธฐ๋ณด๋‹ค ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์˜ `chroma_db` ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ํ†ตํ•ด ์•ฑ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋กœ์ปฌ ๋ฒกํ„ฐ ์ €์žฅ์†Œ ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
## 10. ๋ฐฐํฌ ๊ตฌ์กฐ
ํ–ฅํ›„์—๋Š” Oracle Cloud Ubuntu ์„œ๋ฒ„์— Docker ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
์ดˆ๊ธฐ์—๋Š” ๊ฐœ์ธ ์‚ฌ์šฉ ๋ชฉ์ ์ด๋ฏ€๋กœ ๋ณต์žกํ•œ Kubernetes ๊ตฌ์กฐ๋ณด๋‹ค๋Š” Docker Compose ๊ธฐ๋ฐ˜ ๋ฐฐํฌ๋ฅผ ์šฐ์„  ๊ฒ€ํ† ํ•ฉ๋‹ˆ๋‹ค. ์šด์˜ ์š”๊ตฌ์‚ฌํ•ญ์ด ์ปค์ง€๋ฉด Nginx, HTTPS, ๋ฐฑ์—…, ๋ชจ๋‹ˆํ„ฐ๋ง ๋“ฑ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
## 11. ํ˜„์žฌ ๊ตฌํ˜„ ์ƒํƒœ
ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๋Š” ๊ฐœ๋ฐœ ์ค‘์ด๋ฉฐ, ๋‹ค์Œ ๊ธฐ๋Šฅ์„ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
- Streamlit ๊ธฐ๋ฐ˜ ๋ฌธ์ œํ’€์ด ํ™”๋ฉด
- ๋ฌธ์ œ ์œ ํ˜• ํ‘œ์ค€ํ™” ๋ฐ ์ •๋‹ต ์ •๊ทœํ™” ๊ตฌ์กฐ
- PDF ์—…๋กœ๋“œ ๋ฐ ํŒŒ์‹ฑ ๊ตฌ์กฐ
- PostgreSQL ๊ธฐ๋ฐ˜ ๋ฌธ์ œ ๋ฐ์ดํ„ฐ ์ €์žฅ
- Chroma ๊ธฐ๋ฐ˜ ์œ ์‚ฌ ๋ฌธ์ œ ๊ฒ€์ƒ‰ ๊ตฌ์กฐ
- Docker ๊ธฐ๋ฐ˜ ์‹คํ–‰ ํ™˜๊ฒฝ ๊ตฌ์„ฑ
- Airflow ๊ธฐ๋ฐ˜ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์กฐ
- Oracle Cloud Ubuntu ๋ฐฐํฌ ์ค€๋น„
- Track ๊ธฐ๋ฐ˜ ์ด์–ด์„œ ๊ณต๋ถ€, ์ง‘์ค‘ ํ•™์Šต, ์‹œํ—˜ ๋Œ€๋น„, ๋Œ€์‹œ๋ณด๋“œ ๊ธฐ๋ณธ ํ™”๋ฉด
- ๋งˆ์ง€๋ง‰ ์„ ํƒ Track ์ €์žฅ ๋ฐ ๋ˆ„์  ํ•™์Šต ๋‹จ์œ„ ๊ธฐ๋ก
## 12. ํ–ฅํ›„ ๊ฐœ์„  ๋ฐฉํ–ฅ
ํ–ฅํ›„ ๊ฐœ์„ ํ•  ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
- ๊ด€๋ฆฌ์ž ๋กœ๊ทธ์ธ
- ์‚ฌ์šฉ์ž๋ณ„ ํ•™์Šต ์ด๋ ฅ ๊ด€๋ฆฌ
- ์˜ค๋‹ต๋…ธํŠธ ์ž๋™ ์ƒ์„ฑ
- ๋ถ๋งˆํฌ ๊ธฐ๋Šฅ
- ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ๋ฌธ์ œ ๋ถ„๋ฅ˜
- ํ•™์Šต ์ง„ํ–‰ ๋ฐ์ดํ„ฐ๋ฅผ JSON์—์„œ DB ํ…Œ์ด๋ธ”๋กœ ์ด์ „
- ๋ฌธ์ œ ์œ ํ˜•๋ณ„ ํ…Œ์ŠคํŠธ ๋ฒ”์œ„ ํ™•๋Œ€
- LLM ๊ธฐ๋ฐ˜ ํ•ด์„ค ๋ณด์กฐ ์ƒ์„ฑ
- ์œ ์‚ฌ ๋ฌธ์ œ ์ถ”์ฒœ
- PDF ํŒŒ์‹ฑ ์‹คํŒจ ์ผ€์ด์Šค ๊ด€๋ฆฌ
- Oracle Cloud ๋ฐฐํฌ ์ž๋™ํ™”
- ์ •๊ธฐ ๋ฐฑ์—… ๋ฐ ๋กœ๊ทธ ๊ด€๋ฆฌ