cert-study-app / docs /devlog /2026-06-07.md
Kentlo's picture
Sync from GitHub f8e98d3f03952efd3d7c1b217df60c77c3992aec
87b5875 verified
|
Raw
History Blame Contribute Delete
6.59 kB

๊ฐœ๋ฐœ์ผ์ง€: 2026-06-07

์˜ค๋Š˜์˜ ๋ชฉํ‘œ

์ž๊ฒฉ์ฆ ๋ฌธ์ œํ’€์ด ์›น ํ”„๋กœ์ ํŠธ๋ฅผ GitHub ํฌํŠธํด๋ฆฌ์˜ค์ฒ˜๋Ÿผ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ๋„๋ก README์™€ docs ๋ฌธ์„œ๋ฅผ ์ •๋ฆฌํ•œ๋‹ค.

๋‹จ์ˆœํžˆ ๊ธฐ๋Šฅ ๋ชฉ๋ก๋งŒ ์ ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์™œ ์ด ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ–ˆ๋Š”์ง€์™€ ํ˜„์žฌ ๊ฐœ๋ฐœ ์ค‘์ธ ์ƒํƒœ๋ฅผ ์ดˆ๋ณด์ž๋„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์˜€๋‹ค.

์˜ค๋Š˜ ์ •๋ฆฌํ•œ ๋ฌธ์„œ

  • README.md
  • docs/01_overview.md
  • docs/02_architecture.md
  • docs/03_data_pipeline.md
  • docs/04_database.md
  • docs/05_deployment.md
  • docs/06_decision_log.md
  • docs/07_troubleshooting.md
  • docs/devlog/2026-06-07.md

ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ์ดํ•ด

์ด ํ”„๋กœ์ ํŠธ๋Š” ์ž๊ฒฉ์ฆ ์‹œํ—˜ ๋ฌธ์ œ PDF๋ฅผ ์—…๋กœ๋“œํ•˜๊ณ , ๋ฌธ์ œ๋ฅผ ๊ตฌ์กฐํ™”ํ•œ ๋’ค ์›น์—์„œ ํ’€ ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ์•ฑ์ด๋‹ค.

ํ˜„์žฌ ๊ตฌ์กฐ๋Š” Streamlit ์›น ์•ฑ์„ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ๋ฌธ์ œ์™€ ํ’€์ด ๊ธฐ๋ก์€ PostgreSQL์— ์ €์žฅํ•˜๊ณ , ์œ ์‚ฌ ๋ฌธ์ œ ๊ฒ€์ƒ‰์„ ์œ„ํ•ด Chroma๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. PDF ์ฒ˜๋ฆฌ์ฒ˜๋Ÿผ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์€ Airflow๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉํ–ฅ์ด๋‹ค.

์˜ค๋Š˜ ํ™•์ธํ•œ ์‹ค์ œ ์ฝ”๋“œ ๊ตฌ์กฐ

ํ™•์ธํ•œ ์ฃผ์š” ํŒŒ์ผ:

  • streamlit_app.py
  • cert_study_app/models.py
  • cert_study_app/graphs/pdf_ingestion_graph.py
  • cert_study_app/services
  • dags/cert_study_pdf_ingestion_dag.py
  • docker-compose.yml

์‹ค์ œ ์•ฑ์—๋Š” ๋ฌธ์ œ ํ’€์ด, PDF ์—…๋กœ๋“œ, ์˜ค๋‹ต/๋ณต์Šต, ๊ฐœ๋… ์ •๋ฆฌ, ์ฒ˜๋ฆฌ ํ˜„ํ™ฉ, ์‹œํ—˜ ํ˜„ํ™ฉ, AI ์ƒ‰์ธ ํ๋ฆ„์ด ์žˆ์—ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๋ชจ๋ธ์—๋Š” ๋ฌธ์ œ, ํ’€์ด ๊ธฐ๋ก, ๊ฐœ๋… ๋…ธํŠธ, PDF ์ฒ˜๋ฆฌ ์ž‘์—…, ๋ฌธ์„œ ์ƒ‰์ธ ์ž‘์—…์ด ์ •์˜๋˜์–ด ์žˆ์—ˆ๋‹ค.

์˜ค๋Š˜ ๋ฌธ์„œํ™”ํ•œ ํ•ต์‹ฌ ๋‚ด์šฉ

1. ํ”„๋กœ์ ํŠธ ๋ชฉ์ 

PDF ๋ฌธ์ œ๋ฅผ ์‚ฌ๋žŒ์ด ์ง์ ‘ ์ •๋ฆฌํ•˜๋Š” ๋ถ€๋‹ด์„ ์ค„์ด๊ณ , ๋ฌธ์ œ ํ’€์ด์™€ ๋ณต์Šต๊นŒ์ง€ ์ด์–ด์ง€๋Š” ํ•™์Šต ์›น์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋‹ค.

2. ์ „์ฒด ์•„ํ‚คํ…์ฒ˜

Streamlit, PostgreSQL, Chroma, Airflow, Docker Compose๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์ •๋ฆฌํ–ˆ๋‹ค.

docs/02_architecture.md์—๋Š” Mermaid ๋‹ค์ด์–ด๊ทธ๋žจ๋„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

3. ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ

PDF ์—…๋กœ๋“œ๋ถ€ํ„ฐ ๋ฌธ์ œ ์ €์žฅ๊นŒ์ง€์˜ ํ๋ฆ„์„ ๋‹จ๊ณ„๋ณ„๋กœ ์ •๋ฆฌํ–ˆ๋‹ค.

์ฃผ์š” ํ๋ฆ„:

  1. PDF ์—…๋กœ๋“œ
  2. IngestionJob ์ƒ์„ฑ
  3. Airflow DAG ์‹คํ–‰
  4. PDF ํŒŒ์‹ฑ
  5. ํŒŒ์‹ฑ ํ’ˆ์งˆ ๊ฒ€์ฆ
  6. Quality Gate
  7. PostgreSQL ์ €์žฅ
  8. Chroma ์ƒ‰์ธ

4. PostgreSQL๊ณผ Chroma์˜ ์—ญํ•  ๋ถ„๋ฆฌ

PostgreSQL์€ ์›๋ณธ ๋ฌธ์ œ์™€ ํ’€์ด ๊ธฐ๋ก์„ ์ •ํ™•ํ•˜๊ฒŒ ์ €์žฅํ•˜๋Š” ๊ธฐ์ค€ ์ €์žฅ์†Œ๋กœ ์„ค๋ช…ํ–ˆ๋‹ค.

Chroma๋Š” ์œ ์‚ฌ ๋ฌธ์ œ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ๋ณด์กฐ ์ƒ‰์ธ์œผ๋กœ ์„ค๋ช…ํ–ˆ๋‹ค.

5. ๊ธฐ์ˆ  ์„ ํƒ ์ด์œ 

์˜์‚ฌ๊ฒฐ์ • ๊ธฐ๋ก ๋ฌธ์„œ์— ๋‹ค์Œ ๋‚ด์šฉ์„ ADR ํ˜•ํƒœ๋กœ ์ •๋ฆฌํ–ˆ๋‹ค.

  • Streamlit ์„ ํƒ ์ด์œ 
  • PostgreSQL ์„ ํƒ ์ด์œ 
  • Chroma ์„ ํƒ ์ด์œ 
  • Airflow ์„ ํƒ ์ด์œ 
  • Docker Compose ์„ ํƒ ์ด์œ 
  • Oracle Cloud Ubuntu ๋ฐฐํฌ ๊ณ„ํš
  • ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ๋ฅผ ๋‘๋Š” ์ด์œ 

ํ˜„์žฌ ๊ฐœ๋ฐœ ์ค‘์ธ ๋ถ€๋ถ„

์ด ํ”„๋กœ์ ํŠธ๋Š” ์•„์ง ์™„์„ฑ๋œ ์šด์˜ ์„œ๋น„์Šค๊ฐ€ ์•„๋‹ˆ๋‹ค. ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋กœ ๊ธฐ๋Šฅ๊ณผ ๊ตฌ์กฐ๋ฅผ ๊ณ„์† ๋‹ค๋“ฌ๋Š” ์ค‘์ด๋‹ค.

ํ˜„์žฌ ์ค‘์š”ํ•˜๊ฒŒ ๋ณด๊ณ  ์žˆ๋Š” ๊ฐœ์„ ์ :

  • PDF ํŒŒ์‹ฑ ์ •ํ™•๋„ ๊ฐœ์„ 
  • ๋ฌธ์ œ ์ฒญํ‚น ํ’ˆ์งˆ ๊ฒ€์ฆ
  • ํ’ˆ์งˆ ๋ฆฌํฌํŠธ UI ๊ฐœ์„ 
  • ๋ถ๋งˆํฌ ๊ธฐ๋Šฅ
  • ์‹œํ—˜๋ณ„ ์ง„๋„์œจ๊ณผ ์ •๋‹ต๋ฅ 
  • ์ค‘๋ณต ๋ฌธ์ œ ๊ฐ์ง€
  • Oracle Cloud Ubuntu ๋ฐฐํฌ
  • ํ…Œ์ŠคํŠธ ์ž๋™ํ™”

์˜ค๋Š˜์˜ ๊ฒฐ์ •

๋ฌธ์„œ๋Š” ๊ณผ์žฅ๋œ ์™„์„ฑํ˜• ์„œ๋น„์Šค ์†Œ๊ฐœ๊ฐ€ ์•„๋‹ˆ๋ผ, ํ˜„์žฌ ๊ฐœ๋ฐœ ์ค‘์ธ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋ผ๋Š” ์ ์„ ๋ถ„๋ช…ํžˆ ๋“œ๋Ÿฌ๋‚ด๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ž‘์„ฑํ–ˆ๋‹ค.

๋˜ํ•œ README๋Š” ์งง๊ฒŒ ์ „์ฒด๋ฅผ ์†Œ๊ฐœํ•˜๊ณ , ์ž์„ธํ•œ ๋‚ด์šฉ์€ docs/ ๋ฌธ์„œ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์ •๋ฆฌํ–ˆ๋‹ค.

๋‹ค์Œ ์ž‘์—… ํ›„๋ณด

  • .env.example ์ ๊ฒ€
  • GitHub ์—…๋กœ๋“œ ์ „ ๋ถˆํ•„์š”ํ•œ ๋Ÿฐํƒ€์ž„ ํŒŒ์ผ ์ œ์™ธ ํ™•์ธ
  • Oracle Cloud ๋ฐฐํฌ ์ ˆ์ฐจ ์‹ค์ œ ๊ฒ€์ฆ
  • PDF ํŒŒ์‹ฑ ํ’ˆ์งˆ ๋ฆฌํฌํŠธ ํ™”๋ฉด ๊ฐœ์„ 
  • ๋ถ๋งˆํฌ ๊ธฐ๋Šฅ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„
  • README์— ์Šคํฌ๋ฆฐ์ƒท ์ถ”๊ฐ€

์ถ”๊ฐ€ ์ง„ํ–‰ ๋‚ด์šฉ

GitHub์™€ Hugging Face Space ๋ฐฐํฌ ์ž๋™ํ™”๋ฅผ ์ •๋ฆฌํ–ˆ๋‹ค. Hugging Face์—๋Š” ๋กœ์ปฌ DB๋‚˜ PDF ์›๋ณธ์„ ์ง์ ‘ ์˜ฌ๋ฆฌ์ง€ ์•Š๊ณ , ๋ฐฐํฌ์šฉ seed์™€ ํ•„์š”ํ•œ ์ •์  ์ด๋ฏธ์ง€๋งŒ ์˜ฌ๋ฆฌ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑํ–ˆ๋‹ค.

๋ฐฐํฌ์šฉ seed๋Š” scripts/export_hf_seed.py๋กœ ์ƒ์„ฑํ•œ๋‹ค. ๊ธฐ์ค€ ๋ฌธ์ œ ๋ฐ์ดํ„ฐ๋Š” data/Json/questions.json์„ ์‚ฌ์šฉํ•˜๊ณ , ๊ณตํ†ต ์ง€๋ฌธ๊ณผ ๊ณตํ†ต ์ง€๋ฌธ ์›๋ฌธ ์ด๋ฏธ์ง€๋Š” data/parsed_json/reparsed_multipage_images_20260601_205501.json์—์„œ ๋ณด๊ฐ•ํ•œ๋‹ค.

ํ˜„์žฌ ๋ฐฐํฌ์šฉ seed์—๋Š” 321๋ฌธํ•ญ์ด ๋“ค์–ด ์žˆ๋‹ค. ๊ณตํ†ต ์ง€๋ฌธ์ด ์žˆ๋Š” ๋ฌธํ•ญ์€ parent_stem๊ณผ parent_image_paths๋ฅผ ํ•จ๊ป˜ ๊ฐ€์ง„๋‹ค.

๋ฌธ์ œํ’€์ด UI์—์„œ๋Š” Yes/No ์ง„์ˆ ํ˜• ๋ฌธ์ œ๋ฅผ ์ผ๋ฐ˜ ๊ฐ๊ด€์‹์ด ์•„๋‹ˆ๋ผ ์ง„์ˆ ๋ณ„ ์˜ˆ / ์•„๋‹ˆ์˜ค ๋งคํŠธ๋ฆญ์Šค๋กœ ํ‘œ์‹œํ•˜๋„๋ก ๊ฐœ์„ ํ–ˆ๋‹ค. 1-A / 1-B / 2-A / 2-B์ฒ˜๋Ÿผ ํ•ญ๋ชฉ๋ณ„ ์„ ํƒ์ด ํ•„์š”ํ•œ ๋ฌธ์ œ๋Š” ํ•ญ๋ชฉ๋ณ„ select๋กœ ํ‘œ์‹œํ•œ๋‹ค.

์ผ์ž๋ณ„ Git ๋ณ€๊ฒฝ ํ™•์ธ์„ ์‰ฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด scripts/git_daily_changes.sh๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

scripts/git_daily_changes.sh 2026-06-07

๋ฌธ์ œ ์œ ํ˜•/๋ชจ๋ฐ”์ผ UI ๊ฐœ์„ 

๋ฌธ์ œ ์œ ํ˜•์ด ์—ฌ๋Ÿฌ ํ˜•ํƒœ๋กœ ๋“ค์–ด์˜ค๋ฉด์„œ ํ™”๋ฉด ํ‘œ์‹œ์™€ ์ฑ„์  ๊ธฐ์ค€์ด ์–ด๊ธ‹๋‚  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Hotspot (True/False), True/False (In-Context), Hotspot (Drag and Drop)์ฒ˜๋Ÿผ ์›๋ฌธ์—์„œ ์˜จ ์œ ํ˜•๋ช…์ด ๋‚ด๋ถ€ ๋กœ์ง๊ณผ ์ •ํ™•ํžˆ ๋งž์ง€ ์•Š์œผ๋ฉด Yes/No ๋ฌธ์ œ๊ฐ€ ๊ฐ๊ด€์‹์ฒ˜๋Ÿผ ๋ณด์ด๊ฑฐ๋‚˜, ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•œ ๋‹ต์•ˆ์ด ์ผ๋ฐ˜ ๋ณต์ˆ˜ ์„ ํƒ์ฒ˜๋Ÿผ ๋น„๊ต๋  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ด๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๊ตฌ์กฐ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

  • answer_normalizer.py: Yes/No, ๊ฐ๊ด€์‹, ๋ณต์ˆ˜ ์„ ํƒ, ์ˆœ์„œํ˜• ๋‹ต์•ˆ์„ ๋น„๊ต ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ์ •๊ทœํ™”
  • question_type_metadata_service.py: ๋‹ค์–‘ํ•œ ๋ฌธ์ œ ์œ ํ˜•๋ช…์„ ๋‚ด๋ถ€ ํ‘œ์ค€ ์œ ํ˜•์œผ๋กœ ๋ณ€ํ™˜
  • tests/test_answer_normalizer.py: ์ •๋‹ต ์ •๊ทœํ™” ํ…Œ์ŠคํŠธ
  • tests/test_question_type_metadata_service.py: ๋ฌธ์ œ ์œ ํ˜• alias ํ…Œ์ŠคํŠธ

๋ชจ๋ฐ”์ผ ํ™”๋ฉด์€ ๋ฌธ์ œํ’€์ด๋ฅผ ์ฒซ ๋ฒˆ์งธ ๋™์„ ์œผ๋กœ ๋‘๊ณ , ์—…๋กœ๋“œ/์ฒ˜๋ฆฌ ํ˜„ํ™ฉ/AI ์ƒ‰์ธ์€ ๊ด€๋ฆฌ ์˜์—ญ์œผ๋กœ ๋ฌถ์—ˆ๋‹ค. ๋‹ต์•ˆ ์„ ํƒ UI๋Š” ํ„ฐ์น˜ํ•˜๊ธฐ ์‰ฝ๋„๋ก ๋ฒ„ํŠผ๊ณผ radio ์˜์—ญ์˜ ๋†’์ด์™€ ๊ฐ„๊ฒฉ์„ ์กฐ์ •ํ–ˆ๋‹ค.

๋ฐฐํฌ/ํ’ˆ์งˆ ๋ณด์™„

์ถ”๊ฐ€๋กœ ๋ฐฐํฌ ์ „์— ๋†“์น˜๊ธฐ ์‰ฌ์šด ๋ถ€๋ถ„์„ ์ •๋ฆฌํ–ˆ๋‹ค.

  • seed ๊ฐฑ์‹  ์‹œ ์‚ฌ๋žŒ์ด ๊ฒ€์ˆ˜ํ•œ ๋ฌธ์ œ๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฎ์–ด์“ฐ์ง€ ์•Š๋„๋ก ๋ณดํ˜ธ
  • seed export ๊ฒฐ๊ณผ๋ฅผ questions_seed.report.json์œผ๋กœ ์ €์žฅ
  • scripts/check_quality.py๋กœ ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ์™€ ํ•ต์‹ฌ ํ…Œ์ŠคํŠธ๋ฅผ ํ•œ ๋ฒˆ์— ์‹คํ–‰
  • GitHub Actions quality-check.yml ์ถ”๊ฐ€
  • .env.example ์ถ”๊ฐ€
  • Docker Compose์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๋ชจ๋ธ ์„ค์ •์„ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ๋ถ„๋ฆฌ
  • CHANGELOG.md ์ถ”๊ฐ€