Spaces:
Running
Running
Sync from GitHub c6e463fa85688c6406b64ab1ad3a425506a9bacb
Browse files- README.md +26 -0
- docs/01_overview.md +6 -0
- docs/03_data_pipeline.md +22 -0
- docs/05_deployment.md +24 -0
- docs/07_troubleshooting.md +53 -0
- docs/08_publish_automation.md +30 -1
- docs/devlog/2026-06-07.md +16 -0
- scripts/git_daily_changes.sh +15 -0
- streamlit_app.py +2 -31
README.md
CHANGED
|
@@ -25,6 +25,7 @@ pinned: false
|
|
| 25 |
- ํ์ฑ ํ์ง ๊ฒ์ฆ ๋ฐ ํ์ง ๊ฒ์ดํธ
|
| 26 |
- ๋ฌธ์ , ์ ๋ต, ํด์ค, ํ์ด ๊ธฐ๋ก ์ ์ฅ
|
| 27 |
- Streamlit ๊ธฐ๋ฐ ๋ฌธ์ ํ์ด ํ๋ฉด
|
|
|
|
| 28 |
- ์ค๋ต/๋ณต์ต ํ๋ฉด
|
| 29 |
- ๊ฐ๋
์ ๋ฆฌ ํ๋ฉด
|
| 30 |
- Chroma ๊ธฐ๋ฐ ์ ์ฌ ๋ฌธ์ ๊ฒ์ ๊ตฌ์กฐ
|
|
@@ -71,6 +72,31 @@ docker compose up --build
|
|
| 71 |
- Airflow ์น์๋ฒ: `http://localhost:8080`
|
| 72 |
- PostgreSQL: `localhost:5432`
|
| 73 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 74 |
## ํ๊ฒฝ ๋ณ์
|
| 75 |
|
| 76 |
๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ PostgreSQL์
๋๋ค.
|
|
|
|
| 25 |
- ํ์ฑ ํ์ง ๊ฒ์ฆ ๋ฐ ํ์ง ๊ฒ์ดํธ
|
| 26 |
- ๋ฌธ์ , ์ ๋ต, ํด์ค, ํ์ด ๊ธฐ๋ก ์ ์ฅ
|
| 27 |
- Streamlit ๊ธฐ๋ฐ ๋ฌธ์ ํ์ด ํ๋ฉด
|
| 28 |
+
- ๊ณตํต ์ง๋ฌธ, ์๋ฌธ ์ด๋ฏธ์ง, Yes/No ์ง์ ํ ๋ฌธ์ ํ์ด UI
|
| 29 |
- ์ค๋ต/๋ณต์ต ํ๋ฉด
|
| 30 |
- ๊ฐ๋
์ ๋ฆฌ ํ๋ฉด
|
| 31 |
- Chroma ๊ธฐ๋ฐ ์ ์ฌ ๋ฌธ์ ๊ฒ์ ๊ตฌ์กฐ
|
|
|
|
| 72 |
- Airflow ์น์๋ฒ: `http://localhost:8080`
|
| 73 |
- PostgreSQL: `localhost:5432`
|
| 74 |
|
| 75 |
+
๋ก์ปฌ์์ Streamlit๋ง ๋น ๋ฅด๊ฒ ํ์ธํ ๋๋ ์์ SQLite DB๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
|
| 76 |
+
|
| 77 |
+
```bash
|
| 78 |
+
DATABASE_URL=sqlite:////tmp/cert-study-local-check.db \
|
| 79 |
+
python -m streamlit run streamlit_app.py
|
| 80 |
+
```
|
| 81 |
+
|
| 82 |
+
## ๋ฐฐํฌ์ฉ ๋ฌธ์ ๋ฐ์ดํฐ
|
| 83 |
+
|
| 84 |
+
Hugging Face Space์๋ ๋ก์ปฌ DB๋ PDF ์๋ณธ์ ์ฌ๋ฆฌ์ง ์๊ณ , `cert_study_app/demo_data/questions_seed.json`๊ณผ `static/question_assets/`์ ์ฐธ์กฐ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํฉ๋๋ค.
|
| 85 |
+
|
| 86 |
+
ํ์ฌ ๋ฐฐํฌ์ฉ seed๋ 321๋ฌธํญ, ๊ณตํต ์ง๋ฌธ ํฌํจ ๋ฌธํญ, ์๋ฌธ ์ด๋ฏธ์ง, Yes/No ์ง์ ํ ๋ฌธ์ UI์ ํ์ํ ๊ตฌ์กฐ๋ฅผ ํฌํจํฉ๋๋ค. seed๋ ์๋ ๋ช
๋ น์ผ๋ก ๋ค์ ๋ง๋ค ์ ์์ต๋๋ค.
|
| 87 |
+
|
| 88 |
+
```bash
|
| 89 |
+
python scripts/export_hf_seed.py
|
| 90 |
+
```
|
| 91 |
+
|
| 92 |
+
## ๋ณ๊ฒฝ ์ด๋ ฅ ํ์ธ
|
| 93 |
+
|
| 94 |
+
Git ์ปค๋ฐ์ ๋ ์ง์ ํจ๊ป ๋จ๊ธฐ ๋๋ฌธ์ ์ผ์๋ณ ๋ณ๊ฒฝ ๋ด์ฉ์ ํ์ธํ ์ ์์ต๋๋ค.
|
| 95 |
+
|
| 96 |
+
```bash
|
| 97 |
+
scripts/git_daily_changes.sh 2026-06-07
|
| 98 |
+
```
|
| 99 |
+
|
| 100 |
## ํ๊ฒฝ ๋ณ์
|
| 101 |
|
| 102 |
๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ PostgreSQL์
๋๋ค.
|
docs/01_overview.md
CHANGED
|
@@ -50,6 +50,8 @@ PDF์์ ์ถ์ถํ ํ
์คํธ๋ฅผ ๋ฌธ์ ๋จ์๋ก ๋๋๊ณ , ๋ฌธ์ ๋ณธ๋ฌธ, ๋ณด
|
|
| 50 |
|
| 51 |
์ ์ฅ๋ ๋ฌธ์ ๋ฅผ ์ํ๋ณ๋ก ์ ํํด ํ ์ ์์ต๋๋ค. ์ฌ์ฉ์์ ์ ํ๊ณผ ์ ๋ต ์ฌ๋ถ๋ ํ์ด ๊ธฐ๋ก์ผ๋ก ์ ์ฅํ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
|
| 52 |
|
|
|
|
|
|
|
| 53 |
### ์ค๋ต/๋ณต์ต
|
| 54 |
|
| 55 |
ํ๋ฆฐ ๋ฌธ์ ๋ฅผ ๋ค์ ํ์ธํ๊ณ , ๋ณต์ต ํ๋ฆ์ผ๋ก ์ด์ด๊ฐ ์ ์๋๋ก ๊ตฌ์ฑํ๊ณ ์์ต๋๋ค.
|
|
@@ -70,10 +72,14 @@ Chroma์ ๋ฌธ์ ์๋ฒ ๋ฉ์ ์ ์ฅํด, ํ์ฌ ๋ฌธ์ ์ ๋น์ทํ ๋ฌธ์ ๋ฅผ
|
|
| 70 |
|
| 71 |
- PDF ํ์ฑ ๊ฒฐ๊ณผ๋ฅผ ๋ ์์ ์ ์ผ๋ก ๋ง๋ค๊ธฐ
|
| 72 |
- ํ์ฑ ํ์ง์ ์๋์ผ๋ก ๊ฒ์ฆํ๊ธฐ
|
|
|
|
|
|
|
| 73 |
- PostgreSQL๊ณผ Chroma์ ์ญํ ์ ๋ช
ํํ ๋๋๊ธฐ
|
| 74 |
- Airflow๋ก ๊ธด PDF ์ฒ๋ฆฌ ์์
์ ๊ด๋ฆฌํ๊ธฐ
|
| 75 |
- Streamlit ํ๋ฉด์ ์ค์ ๊ณต๋ถํ๊ธฐ ํธํ ํ๋ฆ์ผ๋ก ๋ค๋ฌ๊ธฐ
|
| 76 |
|
|
|
|
|
|
|
| 77 |
## ์์ผ๋ก ๊ฐ์ ํ ๊ธฐ๋ฅ
|
| 78 |
|
| 79 |
- ๋ถ๋งํฌ ๊ธฐ๋ฅ
|
|
|
|
| 50 |
|
| 51 |
์ ์ฅ๋ ๋ฌธ์ ๋ฅผ ์ํ๋ณ๋ก ์ ํํด ํ ์ ์์ต๋๋ค. ์ฌ์ฉ์์ ์ ํ๊ณผ ์ ๋ต ์ฌ๋ถ๋ ํ์ด ๊ธฐ๋ก์ผ๋ก ์ ์ฅํ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
|
| 52 |
|
| 53 |
+
ํ์ฌ ๋ฌธ์ ํ์ด ํ๋ฉด์ ์ผ๋ฐ ๊ฐ๊ด์๋ฟ ์๋๋ผ ๊ณตํต ์ง๋ฌธ ๋ฌธ์ , ์๋ฌธ ์ด๋ฏธ์ง ๋ณด๊ธฐ, Yes/No ์ง์ ํ ๋ฌธ์ , ํญ๋ชฉ๋ณ ์ ํ ๋ฌธ์ ๋ฅผ ๊ตฌ๋ถํด์ ํ์ํ๋ ๋ฐฉํฅ์ผ๋ก ๊ฐ์ ํ๊ณ ์์ต๋๋ค.
|
| 54 |
+
|
| 55 |
### ์ค๋ต/๋ณต์ต
|
| 56 |
|
| 57 |
ํ๋ฆฐ ๋ฌธ์ ๋ฅผ ๋ค์ ํ์ธํ๊ณ , ๋ณต์ต ํ๋ฆ์ผ๋ก ์ด์ด๊ฐ ์ ์๋๋ก ๊ตฌ์ฑํ๊ณ ์์ต๋๋ค.
|
|
|
|
| 72 |
|
| 73 |
- PDF ํ์ฑ ๊ฒฐ๊ณผ๋ฅผ ๋ ์์ ์ ์ผ๋ก ๋ง๋ค๊ธฐ
|
| 74 |
- ํ์ฑ ํ์ง์ ์๋์ผ๋ก ๊ฒ์ฆํ๊ธฐ
|
| 75 |
+
- ๊ณตํต ์ง๋ฌธ๊ณผ ์๋ฌธ ์ด๋ฏธ์ง๊ฐ ๋ฌธ์ ํ์ด ํ๋ฉด์์ ๋๋ฝ๋์ง ์๊ฒ ํ๊ธฐ
|
| 76 |
+
- Yes/No ์ง์ ํ ๋ฌธ์ ๋ฅผ ๊ฐ๊ด์์ด ์๋๋ผ ์ง์ ๋ณ ์ ํ UI๋ก ์ ๊ณตํ๊ธฐ
|
| 77 |
- PostgreSQL๊ณผ Chroma์ ์ญํ ์ ๋ช
ํํ ๋๋๊ธฐ
|
| 78 |
- Airflow๋ก ๊ธด PDF ์ฒ๋ฆฌ ์์
์ ๊ด๋ฆฌํ๊ธฐ
|
| 79 |
- Streamlit ํ๋ฉด์ ์ค์ ๊ณต๋ถํ๊ธฐ ํธํ ํ๋ฆ์ผ๋ก ๋ค๋ฌ๊ธฐ
|
| 80 |
|
| 81 |
+
Hugging Face Space ๋ฐฐํฌ์ฉ์ผ๋ก๋ ๋ก์ปฌ DB๋ PDF ์๋ณธ ๋์ `questions_seed.json`๊ณผ ํ์ํ ์ ์ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ์ฌ seed์๋ 321๋ฌธํญ์ด ํฌํจ๋์ด ์์ต๋๋ค.
|
| 82 |
+
|
| 83 |
## ์์ผ๋ก ๊ฐ์ ํ ๊ธฐ๋ฅ
|
| 84 |
|
| 85 |
- ๋ถ๋งํฌ ๊ธฐ๋ฅ
|
docs/03_data_pipeline.md
CHANGED
|
@@ -129,6 +129,28 @@ LLM์ ๋ชจ๋ ๋จ๊ณ์์ ๋ฌด์กฐ๊ฑด ์ฐ๋ ๊ฒ์ด ์๋๋ผ, ๊ตฌ์กฐํ๊ฐ ์ด
|
|
| 129 |
|
| 130 |
์ด๋ PostgreSQL์ ๋ฌธ์ ID์ Chroma์ ๋ฒกํฐ ๋ฐ์ดํฐ๊ฐ ์ฐ๊ฒฐ๋์ด ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋์ผ ์ ์ฌ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์ค์ ๋ฌธ์ ํ๋ฉด์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
|
| 131 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 132 |
## ํ์ดํ๋ผ์ธ์์ ์ค์ํ ์
|
| 133 |
|
| 134 |
### ์ ์ฅ ์ ์ ํ์ง์ ํ์ธํ๋ค
|
|
|
|
| 129 |
|
| 130 |
์ด๋ PostgreSQL์ ๋ฌธ์ ID์ Chroma์ ๋ฒกํฐ ๋ฐ์ดํฐ๊ฐ ์ฐ๊ฒฐ๋์ด ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋์ผ ์ ์ฌ ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ์ค์ ๋ฌธ์ ํ๋ฉด์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
|
| 131 |
|
| 132 |
+
## ๋ฐฐํฌ์ฉ Seed ์์ฑ
|
| 133 |
+
|
| 134 |
+
Hugging Face Space์์๋ ๋ก์ปฌ PostgreSQL DB, Chroma ์ธ๋ฑ์ค, PDF ์๋ณธ์ ์ง์ ์ฌ๋ฆฌ์ง ์์ต๋๋ค. ๋์ ๋ฐฐํฌ ์ ๋ฐ๋ก ๋ฌธ์ ํ์ด๋ฅผ ํ์ธํ ์ ์๋๋ก seed ๋ฐ์ดํฐ๋ฅผ ์์ฑํฉ๋๋ค.
|
| 135 |
+
|
| 136 |
+
ํ์ฌ ๋ฐฐํฌ์ฉ seed ์์ฑ ๋ช
๋ น์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
|
| 137 |
+
|
| 138 |
+
```bash
|
| 139 |
+
python scripts/export_hf_seed.py
|
| 140 |
+
```
|
| 141 |
+
|
| 142 |
+
์ด ์คํฌ๋ฆฝํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ ๋ ๋ฐ์ดํฐ๋ฅผ ํฉ์ณ ์ฌ์ฉํฉ๋๋ค.
|
| 143 |
+
|
| 144 |
+
- `data/Json/questions.json`: ๋ฌธ์ , ๋ณด๊ธฐ, ์ ๋ต, ํด์ค์ด ์ ๋ฆฌ๋ ๊ธฐ์ค ๋ฐ์ดํฐ
|
| 145 |
+
- `data/parsed_json/reparsed_multipage_images_20260601_205501.json`: ๊ณตํต ์ง๋ฌธ๊ณผ ๊ณตํต ์ง๋ฌธ ์๋ฌธ ์ด๋ฏธ์ง ์ ๋ณด
|
| 146 |
+
|
| 147 |
+
์์ฑ ๊ฒฐ๊ณผ:
|
| 148 |
+
|
| 149 |
+
- `cert_study_app/demo_data/questions_seed.json`
|
| 150 |
+
- `static/question_assets/`
|
| 151 |
+
|
| 152 |
+
ํ์ฌ seed์๋ 321๋ฌธํญ์ด ๋ค์ด ์์ผ๋ฉฐ, ๊ณตํต ์ง๋ฌธ์ด ์๋ ๋ฌธํญ์ ๊ธด ์ง๋ฌธ๊ณผ ์๋ฌธ ์ด๋ฏธ์ง ๊ฒฝ๋ก๊ฐ ํจ๊ป ์ ์ฅ๋ฉ๋๋ค. Yes/No ์ง์ ํ ๋ฌธ์ ๋ ํ๋ฉด์์ ์ง์ ๋ณ `์ / ์๋์ค`๋ก ํ ์ ์๋๋ก ์ ๋ต์ด `Y,N,Y` ๊ฐ์ ํํ๋ก ์ ๊ทํ๋ฉ๋๋ค.
|
| 153 |
+
|
| 154 |
## ํ์ดํ๋ผ์ธ์์ ์ค์ํ ์
|
| 155 |
|
| 156 |
### ์ ์ฅ ์ ์ ํ์ง์ ํ์ธํ๋ค
|
docs/05_deployment.md
CHANGED
|
@@ -24,6 +24,15 @@ docker compose up --build
|
|
| 24 |
- Airflow: `http://localhost:8080`
|
| 25 |
- PostgreSQL: `localhost:5432`
|
| 26 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
## Docker๋ฅผ ์ฐ๋ ์ด์
|
| 28 |
|
| 29 |
์ด ํ๋ก์ ํธ๋ Streamlit, PostgreSQL, Airflow, PDF ์ฒ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, Chroma ๋ฑ ์ฌ๋ฌ ๊ตฌ์ฑ ์์๋ฅผ ํจ๊ป ์ฌ์ฉํฉ๋๋ค.
|
|
@@ -51,6 +60,21 @@ Docker๋ฅผ ์ฐ๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
|
|
| 51 |
|
| 52 |
์ด๋ฐ ํ์ผ์ ์คํ ์ค ์์ฑ๋๋ ๋ฐ์ดํฐ์ด๋ฏ๋ก ๋ณดํต Git์ ์ฌ๋ฆฌ์ง ์์ต๋๋ค.
|
| 53 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 54 |
## ํ๊ฒฝ ๋ณ์
|
| 55 |
|
| 56 |
๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ PostgreSQL์ ์ฌ์ฉํฉ๋๋ค.
|
|
|
|
| 24 |
- Airflow: `http://localhost:8080`
|
| 25 |
- PostgreSQL: `localhost:5432`
|
| 26 |
|
| 27 |
+
Streamlit ํ๋ฉด๋ง ๋น ๋ฅด๊ฒ ํ์ธํ ๋๋ Docker ์์ด ์คํํ ์๋ ์์ต๋๋ค.
|
| 28 |
+
|
| 29 |
+
```bash
|
| 30 |
+
DATABASE_URL=sqlite:////tmp/cert-study-local-check.db \
|
| 31 |
+
python -m streamlit run streamlit_app.py
|
| 32 |
+
```
|
| 33 |
+
|
| 34 |
+
์ด ๋ฐฉ์์ ์์ SQLite DB๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๋ก์ปฌ ํ๋ฉด ํ์ธ์ ์ ํฉํฉ๋๋ค. ๊ธฐ์กด `data/questions.db` ํ์ผ ๊ถํ์ด ๊ผฌ์๊ฑฐ๋ ์ฝ๊ธฐ ์ ์ฉ ์ํ์ผ ๋๋ ์ DB๋ก ๋ฌธ์ seed ๋์์ ํ์ธํ ์ ์์ต๋๋ค.
|
| 35 |
+
|
| 36 |
## Docker๋ฅผ ์ฐ๋ ์ด์
|
| 37 |
|
| 38 |
์ด ํ๋ก์ ํธ๋ Streamlit, PostgreSQL, Airflow, PDF ์ฒ๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, Chroma ๋ฑ ์ฌ๋ฌ ๊ตฌ์ฑ ์์๋ฅผ ํจ๊ป ์ฌ์ฉํฉ๋๋ค.
|
|
|
|
| 60 |
|
| 61 |
์ด๋ฐ ํ์ผ์ ์คํ ์ค ์์ฑ๋๋ ๋ฐ์ดํฐ์ด๋ฏ๋ก ๋ณดํต Git์ ์ฌ๋ฆฌ์ง ์์ต๋๋ค.
|
| 62 |
|
| 63 |
+
## Hugging Face Space ๋ฐฐํฌ
|
| 64 |
+
|
| 65 |
+
Hugging Face Space๋ GitHub Actions๋ฅผ ํตํด ํ์ฌ ํ๋ก์ ํธ ์ค๋
์ท์ ๋๊ธฐํํฉ๋๋ค.
|
| 66 |
+
|
| 67 |
+
Space์๋ ์๋ ๋ฐํ์ ๋ฐ์ดํฐ๋ ์ฌ๋ฆฌ์ง ์์ต๋๋ค.
|
| 68 |
+
|
| 69 |
+
- ์
๋ก๋ PDF ์๋ณธ
|
| 70 |
+
- ๋ก์ปฌ PostgreSQL/SQLite DB
|
| 71 |
+
- Chroma ์ธ๋ฑ์ค
|
| 72 |
+
- Airflow ๋ก๊ทธ์ ๋ฉํ๋ฐ์ดํฐ
|
| 73 |
+
|
| 74 |
+
๋์ `cert_study_app/demo_data/questions_seed.json`๊ณผ `static/question_assets/`๋ฅผ ํฌํจํฉ๋๋ค. ์ฑ ์์ ์ DB๊ฐ ๋น์ด ์๊ฑฐ๋ ๊ธฐ์กด seed๊ฐ ์ค๋๋ ๊ฒฝ์ฐ seed ๊ธฐ์ค์ผ๋ก ๋ฌธ์ ๋ฅผ ์ถ๊ฐ/๊ฐฑ์ ํฉ๋๋ค.
|
| 75 |
+
|
| 76 |
+
ํ์ฌ seed์๋ 321๋ฌธํญ, ๊ณตํต ์ง๋ฌธ, ์๋ฌธ ์ด๋ฏธ์ง, Yes/No ์ง์ ํ ๋ฌธ์ ๊ตฌ์กฐ๊ฐ ํฌํจ๋ฉ๋๋ค.
|
| 77 |
+
|
| 78 |
## ํ๊ฒฝ ๋ณ์
|
| 79 |
|
| 80 |
๊ธฐ๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ PostgreSQL์ ์ฌ์ฉํฉ๋๋ค.
|
docs/07_troubleshooting.md
CHANGED
|
@@ -48,6 +48,12 @@ docker compose logs cert-study-app
|
|
| 48 |
- 8501 ํฌํธ๋ฅผ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ด ์ฌ์ฉ ์ค์ธ์ง ํ์ธํ๋ค.
|
| 49 |
- ํ์ํ๋ฉด `http://127.0.0.1:8501`๋ก๋ ์ ์ํด ๋ณธ๋ค.
|
| 50 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 51 |
## PostgreSQL ์ฐ๊ฒฐ ์ค๋ฅ
|
| 52 |
|
| 53 |
### ์ฆ์
|
|
@@ -100,6 +106,19 @@ CERT_STUDY_DB_FALLBACK=1
|
|
| 100 |
|
| 101 |
์ด์ ๋๋ ๋ฐฐํฌ ํ๊ฒฝ์์๋ PostgreSQL์ ๊ธฐ์ค์ผ๋ก ๋ง์ถ๋ ๊ฒ์ด ์ข์ต๋๋ค.
|
| 102 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 103 |
## Airflow ํ๋ฉด์ ์ ์๋์ง ์์ ๋
|
| 104 |
|
| 105 |
### ์ฆ์
|
|
@@ -159,6 +178,40 @@ PDF ์
๋ก๋ ํ ์ฒ๋ฆฌ ํํฉ์ด ์ค๋ ๋ฐ๋์ง ์์ต๋๋ค.
|
|
| 159 |
- ๋ฌธ์ ๋ฒํธ ํจํด๊ณผ ๋ณด๊ธฐ ํจํด์ ๋ ๋ช
ํํ ์ฒ๋ฆฌํ๋ค.
|
| 160 |
- ๋ชจ๋ ๋ฌธ์ ๋ฅผ LLM์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ๋ณด๋ค, ์คํจ ๊ฐ๋ฅ์ฑ์ด ๋์ ๋ฌธ์ ๋ง ๋ณด์ ํ๋ ๋ฐฉํฅ์ด ์ข๋ค.
|
| 161 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 162 |
## Chroma ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ์ด์ํ ๋
|
| 163 |
|
| 164 |
### ์ฆ์
|
|
|
|
| 48 |
- 8501 ํฌํธ๋ฅผ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ด ์ฌ์ฉ ์ค์ธ์ง ํ์ธํ๋ค.
|
| 49 |
- ํ์ํ๋ฉด `http://127.0.0.1:8501`๋ก๋ ์ ์ํด ๋ณธ๋ค.
|
| 50 |
|
| 51 |
+
๋ก์ปฌ ๊ฐ์ํ๊ฒฝ์ `streamlit` ์คํ ํ์ผ์ด ์์ ๊ฒฝ๋ก๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์๋์ฒ๋ผ Python ๋ชจ๋ ๋ฐฉ์์ผ๋ก ์คํํฉ๋๋ค.
|
| 52 |
+
|
| 53 |
+
```bash
|
| 54 |
+
python -m streamlit run streamlit_app.py
|
| 55 |
+
```
|
| 56 |
+
|
| 57 |
## PostgreSQL ์ฐ๊ฒฐ ์ค๋ฅ
|
| 58 |
|
| 59 |
### ์ฆ์
|
|
|
|
| 106 |
|
| 107 |
์ด์ ๋๋ ๋ฐฐํฌ ํ๊ฒฝ์์๋ PostgreSQL์ ๊ธฐ์ค์ผ๋ก ๋ง์ถ๋ ๊ฒ์ด ์ข์ต๋๋ค.
|
| 108 |
|
| 109 |
+
### `attempt to write a readonly database` ์ค๋ฅ๊ฐ ๋ ๋
|
| 110 |
+
|
| 111 |
+
๊ธฐ์กด SQLite ํ์ผ ๊ถํ ๋๋ฌธ์ seed ๊ฐฑ์ ์ด ์คํจํ ์ ์์ต๋๋ค.
|
| 112 |
+
|
| 113 |
+
๋น ๋ฅด๊ฒ ํ๋ฉด๋ง ํ์ธํ๋ ค๋ฉด ์ ์์ DB๋ฅผ ์ง์ ํฉ๋๋ค.
|
| 114 |
+
|
| 115 |
+
```bash
|
| 116 |
+
DATABASE_URL=sqlite:////tmp/cert-study-local-check.db \
|
| 117 |
+
python -m streamlit run streamlit_app.py
|
| 118 |
+
```
|
| 119 |
+
|
| 120 |
+
๊ธฐ์กด DB๋ฅผ ๊ณ์ ์ฐ๋ ค๋ฉด `data/questions.db` ํ์ผ ๊ถํ๊ณผ ์์ ์๋ฅผ ํ์ธํฉ๋๋ค.
|
| 121 |
+
|
| 122 |
## Airflow ํ๋ฉด์ ์ ์๋์ง ์์ ๋
|
| 123 |
|
| 124 |
### ์ฆ์
|
|
|
|
| 178 |
- ๋ฌธ์ ๋ฒํธ ํจํด๊ณผ ๋ณด๊ธฐ ํจํด์ ๋ ๋ช
ํํ ์ฒ๋ฆฌํ๋ค.
|
| 179 |
- ๋ชจ๋ ๋ฌธ์ ๋ฅผ LLM์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ๋ณด๋ค, ์คํจ ๊ฐ๋ฅ์ฑ์ด ๋์ ๋ฌธ์ ๋ง ๋ณด์ ํ๋ ๋ฐฉํฅ์ด ์ข๋ค.
|
| 180 |
|
| 181 |
+
## ๊ณตํต ์ง๋ฌธ์ด ๋ณด์ด์ง ์์ ๋
|
| 182 |
+
|
| 183 |
+
### ์ฆ์
|
| 184 |
+
|
| 185 |
+
์ผ์ด์ค ์คํฐ๋ ๋ฌธ์ ์ธ๋ฐ `๊ณตํต ์ง๋ฌธ ๋ณด๊ธฐ`๊ฐ ๋ํ๋์ง ์์ต๋๋ค.
|
| 186 |
+
|
| 187 |
+
### ํ์ธํ ๊ฒ
|
| 188 |
+
|
| 189 |
+
- `questions_seed.json`์ `parent_stem`์ด ๋ค์ด ์๋์ง ํ์ธํ๋ค.
|
| 190 |
+
- ์ฑ์ด ์ค๋๋ DB๋ฅผ ๋ณด๊ณ ์์ง ์์์ง ํ์ธํ๋ค.
|
| 191 |
+
- seed refresh๊ฐ DB์ ์ธ ์ ์๋ ์ํ์ธ์ง ํ์ธํ๋ค.
|
| 192 |
+
|
| 193 |
+
### ํด๊ฒฐ ๋ฐฉํฅ
|
| 194 |
+
|
| 195 |
+
- Space ๋๋ ๋ก์ปฌ ์ฑ์ ์ฌ์์ํ๋ค.
|
| 196 |
+
- ๋ก์ปฌ์์๋ ์์ SQLite DB๋ก ๋ค์ ์คํํด seed ์์ฒด๊ฐ ์ ์์ธ์ง ํ์ธํ๋ค.
|
| 197 |
+
- ๊ธฐ์กด DB๊ฐ ์ฝ๊ธฐ ์ ์ฉ์ด๋ฉด ๊ถํ์ ์์ ํ๊ฑฐ๋ ์ DB๋ฅผ ์ฌ์ฉํ๋ค.
|
| 198 |
+
|
| 199 |
+
## Yes/No ๋ฌธ์ ๊ฐ ๊ฐ๊ด์์ฒ๋ผ ๋ณด์ผ ๋
|
| 200 |
+
|
| 201 |
+
### ์ฆ์
|
| 202 |
+
|
| 203 |
+
`๋ค์ ๊ฐ ์ง์ ์ ๋ํด ์/์๋์ค๋ฅผ ์ ํ`ํ๋ ๋ฌธ์ ๊ฐ A/B/C ๋ณด๊ธฐ์ฒ๋ผ ํ์๋ฉ๋๋ค.
|
| 204 |
+
|
| 205 |
+
### ์ค๋ช
|
| 206 |
+
|
| 207 |
+
Yes/No ์ง์ ํ ๋ฌธ์ ๋ ์ผ๋ฐ ๊ฐ๊ด์๊ณผ ๋ค๋ฅด๊ฒ ์ง์ ๋ณ `์ / ์๋์ค` ์
๋ ฅ UI๊ฐ ํ์ํฉ๋๋ค.
|
| 208 |
+
|
| 209 |
+
### ํ์ธํ ๊ฒ
|
| 210 |
+
|
| 211 |
+
- `question_type`์ด `Hotspot (True/False)` ๋๋ ์ ์ฌํ ๊ฐ์ธ์ง ํ์ธํ๋ค.
|
| 212 |
+
- ์ ๋ต์ด `Y,N,Y` ๋๋ `[{key, value}]` ํํ๋ก ์ ๊ทํ๋๋์ง ํ์ธํ๋ค.
|
| 213 |
+
- `1-A / 1-B / 2-A / 2-B` ํ์์ ํญ๋ชฉ๋ณ ์ ํ UI๋ก ํ์๋์ด์ผ ํ๋ค.
|
| 214 |
+
|
| 215 |
## Chroma ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ์ด์ํ ๋
|
| 216 |
|
| 217 |
### ์ฆ์
|
docs/08_publish_automation.md
CHANGED
|
@@ -66,7 +66,14 @@ Hugging Face Space์๋ ๋ก์ปฌ PostgreSQL ๋ฐ์ดํฐ, Chroma ์ธ๋ฑ์ค, ์
๋ก
|
|
| 66 |
python scripts/export_hf_seed.py
|
| 67 |
```
|
| 68 |
|
| 69 |
-
์ด ์คํฌ๋ฆฝํธ๋ `data/Json/questions.json`์
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 70 |
|
| 71 |
์ค์ ๊ธฐ์ถ/๋คํ ์ฑ๊ฒฉ์ ๋ฌธ์ ๋ฅผ ํฌํจํ๋ ๊ฒฝ์ฐ Hugging Face Space๋ private๋ก ์ด์ํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
|
| 72 |
|
|
@@ -158,6 +165,28 @@ git push origin main
|
|
| 158 |
|
| 159 |
๋ก์ปฌ์์ Hugging Face๊น์ง ์ง์ pushํ๋ ๋ฐฉ์์ GitHub Actions ์ค์ ์ ํ
์คํธ์ฉ์ผ๋ก๋ง ์ฌ์ฉํด๋ ์ถฉ๋ถํฉ๋๋ค.
|
| 160 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 161 |
## ์ฃผ์์ฌํญ
|
| 162 |
|
| 163 |
- `HF_TOKEN`์ ์ ๋ Git์ ์ปค๋ฐํ์ง ์์ต๋๋ค.
|
|
|
|
| 66 |
python scripts/export_hf_seed.py
|
| 67 |
```
|
| 68 |
|
| 69 |
+
์ด ์คํฌ๋ฆฝํธ๋ `data/Json/questions.json`์ ๊ธฐ์ค ๋ฌธ์ ๋ฐ์ดํฐ๋ก ์ฌ์ฉํ๊ณ , `data/parsed_json/reparsed_multipage_images_20260601_205501.json`์์ ๊ณตํต ์ง๋ฌธ๊ณผ ๊ณตํต ์ง๋ฌธ ์๋ฌธ ์ด๋ฏธ์ง ์ ๋ณด๋ฅผ ๋ณด๊ฐํฉ๋๋ค.
|
| 70 |
+
|
| 71 |
+
์์ฑ ๊ฒฐ๊ณผ:
|
| 72 |
+
|
| 73 |
+
- `cert_study_app/demo_data/questions_seed.json`
|
| 74 |
+
- `static/question_assets/`
|
| 75 |
+
|
| 76 |
+
`dump.pdf` ์ ์ฒด๋ `data/images/` ์ ์ฒด๋ฅผ ์ฌ๋ฆฌ์ง ์๊ณ , ๋ฌธ์ ํ์ด์ ์๋ฌธ ํ์ธ์ ํ์ํ ์ฐธ์กฐ ์ด๋ฏธ์ง๋ง ๋ณต์ฌํฉ๋๋ค. ํ์ฌ seed์๋ 321๋ฌธํญ, ๊ณตํต ์ง๋ฌธ, ์๋ฌธ ์ด๋ฏธ์ง, Yes/No ์ง์ ํ ๋ฌธ์ ๊ตฌ์กฐ๊ฐ ํฌํจ๋ฉ๋๋ค.
|
| 77 |
|
| 78 |
์ค์ ๊ธฐ์ถ/๋คํ ์ฑ๊ฒฉ์ ๋ฌธ์ ๋ฅผ ํฌํจํ๋ ๊ฒฝ์ฐ Hugging Face Space๋ private๋ก ์ด์ํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
|
| 79 |
|
|
|
|
| 165 |
|
| 166 |
๋ก์ปฌ์์ Hugging Face๊น์ง ์ง์ pushํ๋ ๋ฐฉ์์ GitHub Actions ์ค์ ์ ํ
์คํธ์ฉ์ผ๋ก๋ง ์ฌ์ฉํด๋ ์ถฉ๋ถํฉ๋๋ค.
|
| 167 |
|
| 168 |
+
## ์ผ์๋ณ ๋ณ๊ฒฝ ํ์ธ
|
| 169 |
+
|
| 170 |
+
Git์ ์ปค๋ฐ๋ง๋ค ๋ ์ง์ ๋ณ๊ฒฝ ํ์ผ์ ๋จ๊น๋๋ค. ๋ฐ๋ผ์ ์ผ์๋ณ ๋ณ๊ฒฝ ๋ด์ญ์ ์ธ์ ๋ ํ์ธํ ์ ์์ต๋๋ค.
|
| 171 |
+
|
| 172 |
+
์ค๋ ๋ณ๊ฒฝ ๋ด์ญ:
|
| 173 |
+
|
| 174 |
+
```bash
|
| 175 |
+
git log --since=midnight --stat
|
| 176 |
+
```
|
| 177 |
+
|
| 178 |
+
ํน์ ๋ ์ง ๋ณ๊ฒฝ ๋ด์ญ:
|
| 179 |
+
|
| 180 |
+
```bash
|
| 181 |
+
scripts/git_daily_changes.sh 2026-06-07
|
| 182 |
+
```
|
| 183 |
+
|
| 184 |
+
๋ ์์ธํ ๋ณด๋ ค๋ฉด ํน์ ์ปค๋ฐ์ ํ์ธํฉ๋๋ค.
|
| 185 |
+
|
| 186 |
+
```bash
|
| 187 |
+
git show <commit-hash>
|
| 188 |
+
```
|
| 189 |
+
|
| 190 |
## ์ฃผ์์ฌํญ
|
| 191 |
|
| 192 |
- `HF_TOKEN`์ ์ ๋ Git์ ์ปค๋ฐํ์ง ์์ต๋๋ค.
|
docs/devlog/2026-06-07.md
CHANGED
|
@@ -113,3 +113,19 @@ Chroma๋ ์ ์ฌ ๋ฌธ์ ๊ฒ์์ ์ํ ๋ณด์กฐ ์์ธ์ผ๋ก ์ค๋ช
ํ๋ค.
|
|
| 113 |
- PDF ํ์ฑ ํ์ง ๋ฆฌํฌํธ ํ๋ฉด ๊ฐ์
|
| 114 |
- ๋ถ๋งํฌ ๊ธฐ๋ฅ ์ค๊ณ ๋ฐ ๊ตฌํ
|
| 115 |
- README์ ์คํฌ๋ฆฐ์ท ์ถ๊ฐ
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 113 |
- PDF ํ์ฑ ํ์ง ๋ฆฌํฌํธ ํ๋ฉด ๊ฐ์
|
| 114 |
- ๋ถ๋งํฌ ๊ธฐ๋ฅ ์ค๊ณ ๋ฐ ๊ตฌํ
|
| 115 |
- README์ ์คํฌ๋ฆฐ์ท ์ถ๊ฐ
|
| 116 |
+
|
| 117 |
+
## ์ถ๊ฐ ์งํ ๋ด์ฉ
|
| 118 |
+
|
| 119 |
+
GitHub์ Hugging Face Space ๋ฐฐํฌ ์๋ํ๋ฅผ ์ ๋ฆฌํ๋ค. Hugging Face์๋ ๋ก์ปฌ DB๋ PDF ์๋ณธ์ ์ง์ ์ฌ๋ฆฌ์ง ์๊ณ , ๋ฐฐํฌ์ฉ seed์ ํ์ํ ์ ์ ์ด๋ฏธ์ง๋ง ์ฌ๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑํ๋ค.
|
| 120 |
+
|
| 121 |
+
๋ฐฐํฌ์ฉ seed๋ `scripts/export_hf_seed.py`๋ก ์์ฑํ๋ค. ๊ธฐ์ค ๋ฌธ์ ๋ฐ์ดํฐ๋ `data/Json/questions.json`์ ์ฌ์ฉํ๊ณ , ๊ณตํต ์ง๋ฌธ๊ณผ ๊ณตํต ์ง๋ฌธ ์๋ฌธ ์ด๋ฏธ์ง๋ `data/parsed_json/reparsed_multipage_images_20260601_205501.json`์์ ๋ณด๊ฐํ๋ค.
|
| 122 |
+
|
| 123 |
+
ํ์ฌ ๋ฐฐํฌ์ฉ seed์๋ 321๋ฌธํญ์ด ๋ค์ด ์๋ค. ๊ณตํต ์ง๋ฌธ์ด ์๋ ๋ฌธํญ์ `parent_stem`๊ณผ `parent_image_paths`๋ฅผ ํจ๊ป ๊ฐ์ง๋ค.
|
| 124 |
+
|
| 125 |
+
๋ฌธ์ ํ์ด UI์์๋ Yes/No ์ง์ ํ ๋ฌธ์ ๋ฅผ ์ผ๋ฐ ๊ฐ๊ด์์ด ์๋๋ผ ์ง์ ๋ณ `์ / ์๋์ค` ๋งคํธ๋ฆญ์ค๋ก ํ์ํ๋๋ก ๊ฐ์ ํ๋ค. `1-A / 1-B / 2-A / 2-B`์ฒ๋ผ ํญ๋ชฉ๋ณ ์ ํ์ด ํ์ํ ๋ฌธ์ ๋ ํญ๋ชฉ๋ณ select๋ก ํ์ํ๋ค.
|
| 126 |
+
|
| 127 |
+
์ผ์๋ณ Git ๋ณ๊ฒฝ ํ์ธ์ ์ฝ๊ฒ ํ๊ธฐ ์ํด `scripts/git_daily_changes.sh`๋ฅผ ์ถ๊ฐํ๋ค.
|
| 128 |
+
|
| 129 |
+
```bash
|
| 130 |
+
scripts/git_daily_changes.sh 2026-06-07
|
| 131 |
+
```
|
scripts/git_daily_changes.sh
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env bash
|
| 2 |
+
set -euo pipefail
|
| 3 |
+
|
| 4 |
+
DAY="${1:-$(date +%F)}"
|
| 5 |
+
NEXT_DAY="$(date -j -v+1d -f "%Y-%m-%d" "${DAY}" +%F 2>/dev/null || date -d "${DAY} +1 day" +%F)"
|
| 6 |
+
|
| 7 |
+
echo "Git changes for ${DAY}"
|
| 8 |
+
echo
|
| 9 |
+
|
| 10 |
+
git log \
|
| 11 |
+
--since="${DAY} 00:00" \
|
| 12 |
+
--until="${NEXT_DAY} 00:00" \
|
| 13 |
+
--date=short \
|
| 14 |
+
--pretty=format:'%h %ad %s' \
|
| 15 |
+
--stat
|
streamlit_app.py
CHANGED
|
@@ -22,7 +22,7 @@ from cert_study_app.services.ingestion_job_service import IngestionJobService
|
|
| 22 |
from cert_study_app.services.parse_quality_service import default_quality_report_path
|
| 23 |
from cert_study_app.services.question_type_metadata_service import automation_summary, status_label, type_metadata
|
| 24 |
from cert_study_app.services.question_concept_service import classify_question_batch, concept_label
|
| 25 |
-
from cert_study_app.services.quiz_service import QuizService
|
| 26 |
from cert_study_app.services.study_assistant_service import StudyAssistantService
|
| 27 |
from cert_study_app.services.vector_service import QuestionVectorStore
|
| 28 |
|
|
@@ -680,36 +680,7 @@ def box_choice_labels(question, count: int) -> list[str]:
|
|
| 680 |
|
| 681 |
|
| 682 |
def yes_no_answer_labels(value: str) -> list[str]:
|
| 683 |
-
|
| 684 |
-
raw_value = value
|
| 685 |
-
else:
|
| 686 |
-
raw_value = None
|
| 687 |
-
try:
|
| 688 |
-
raw_value = json.loads(value) if isinstance(value, str) else None
|
| 689 |
-
except Exception:
|
| 690 |
-
raw_value = None
|
| 691 |
-
|
| 692 |
-
if isinstance(raw_value, list):
|
| 693 |
-
values = [
|
| 694 |
-
item.get("value") or item.get("answer") or item.get("selected_answer")
|
| 695 |
-
for item in raw_value
|
| 696 |
-
if isinstance(item, dict)
|
| 697 |
-
]
|
| 698 |
-
labels = yes_no_answer_labels(",".join(str(item) for item in values if item))
|
| 699 |
-
if labels:
|
| 700 |
-
return labels
|
| 701 |
-
elif isinstance(raw_value, dict):
|
| 702 |
-
labels = yes_no_answer_labels(",".join(str(item) for item in raw_value.values()))
|
| 703 |
-
if labels:
|
| 704 |
-
return labels
|
| 705 |
-
|
| 706 |
-
text = str(value or "")
|
| 707 |
-
if re.fullmatch(r"\s*[YNyn](?:\s*,\s*[YNyn])+\s*", text):
|
| 708 |
-
return [token.upper() for token in re.findall(r"[YNyn]", text)]
|
| 709 |
-
tokens = re.findall(r"(?<![๊ฐ-ํฃ])์(?![๊ฐ-ํฃ])|์๋์ค|์๋์|\byes\b|\bno\b", text, re.I)
|
| 710 |
-
if len(tokens) < 2:
|
| 711 |
-
return []
|
| 712 |
-
return ["Y" if token == "์" or token.lower() == "yes" else "N" for token in tokens]
|
| 713 |
|
| 714 |
|
| 715 |
def is_yes_no_hotspot(question) -> bool:
|
|
|
|
| 22 |
from cert_study_app.services.parse_quality_service import default_quality_report_path
|
| 23 |
from cert_study_app.services.question_type_metadata_service import automation_summary, status_label, type_metadata
|
| 24 |
from cert_study_app.services.question_concept_service import classify_question_batch, concept_label
|
| 25 |
+
from cert_study_app.services.quiz_service import QuizService, yes_no_labels
|
| 26 |
from cert_study_app.services.study_assistant_service import StudyAssistantService
|
| 27 |
from cert_study_app.services.vector_service import QuestionVectorStore
|
| 28 |
|
|
|
|
| 680 |
|
| 681 |
|
| 682 |
def yes_no_answer_labels(value: str) -> list[str]:
|
| 683 |
+
return yes_no_labels(value)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 684 |
|
| 685 |
|
| 686 |
def is_yes_no_hotspot(question) -> bool:
|