Spaces:
Sleeping
NBS ํ๋ฅด์๋ ์ค๋ฌธ์กฐ์ฌ ์์คํ ๊ตฌ์ถ ๊ฐ์ด๋
์ด ๋ฌธ์๋ ์ ๊ตญ์งํ์กฐ์ฌ(NBS) ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ์ฌ 16๋ง ๊ฑด์ ์๋ต์๋ฅผ ์๋ฐํ๋ก ๊ตฌํํ๊ณ , ์๋ก์ด ์ง๋ฌธ์ ๋ํด ์๋ฎฌ๋ ์ด์ ํ ์ ์๋ ์์คํ ์ ๊ตฌ์ถํ๊ธฐ๊น์ง์ ์ ๊ณผ์ ์ ์์ธํ ๊ธฐ๋กํ๊ณ ์์ต๋๋ค.
1. ํ๋ก์ ํธ ๊ฐ์
๋ณธ ํ๋ก์ ํธ์ ๋ชฉํ๋ 2020๋ ๋ถํฐ ์ถ์ ๋ 160ํ ์ด์์ ์ ๊ตญ์งํ์กฐ์ฌ ๋ฐ์ดํฐ๋ฅผ ํตํฉํ์ฌ, ํน์ ์ธ๊ตฌํต๊ณํ์ ํน์ฑ(์ฑ๋ณ, ์ฐ๋ น, ์ง์ญ, ์ง์ )๊ณผ ๊ณผ๊ฑฐ ๊ฐ์น๊ด์ ๊ฐ์ง 'ํ๋ฅด์๋ ์๋ฐํ' 1,000๋ช ์ ์ํ๋งํ๊ณ ์ด๋ค์ด ์๋ก์ด ์ฌํ์ ์ด์์ ๋ํด ์ด๋ป๊ฒ ๋ต๋ณํ ์ง ์์ธกํ๋ ์๋ฎฌ๋ ์ด์ ํ๊ฒฝ์ ๊ตฌ์ถํ๋ ๊ฒ์ ๋๋ค.
2. ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ณผ์ (Data Pipeline)
๋จ๊ณ 1: ์๋ณธ ๋ฐ์ดํฐ ๋ณํ (์ ๊ตญ์งํ์กฐ์ฌ_์๋ณธ โ ์ ๊ตญ์งํ์กฐ์ฌ_json)
- ๋์: 163๊ฐ์ ์กฐ์ฌ ํด๋ ๋ด Stata(
.dta) ๋ฐ SPSS(.sav) ํ์ผ. - ์ฒ๋ฆฌ ๋ด์ฉ:
- ๊ฐ ํด๋์
README.txt๋ฐ PDF ๋ณด๊ณ ์๋ฅผ ๋ถ์ํ์ฌ ์ค๋ฌธ์ง ๋ฌธํญ ๋งค์นญ. - Stata/SPSS์ ์์นํ ์ฝ๋ ๋ฐ์ดํฐ์ ๋ณ์ ๋ผ๋ฒจ(Value Labels)์ ์ ํ ํ ์คํธ ๊ธฐ๋ฐ์ JSON ํฌ๋งท์ผ๋ก ๋ณํ.
- ๊ฐ ํด๋์
- ๊ฒฐ๊ณผ:
์ ๊ตญ์งํ์กฐ์ฌ_jsonํด๋ ๋ด 163๊ฐ์ ํ์คํ๋ JSON ํ์ผ ์์ฑ.
๋จ๊ณ 2: ๋ฐ์ดํฐ ํตํฉ ๋ฐ ์ ๊ทํ (์ ๊ตญ์งํ์กฐ์ฌ_json โ consolidated_nbs_data.parquet)
- ๋์: 163๊ฐ์ JSON ํ์ผ (์ด 166,721๊ฑด์ ๊ฐ๋ณ ์๋ต์ ๋ฐ์ดํฐ).
- Parquet ํ์ผ์ ๊ตฌ์กฐ (Wide Table & Sparse Matrix):
- ์์ ๊ณผ์ ๋น๊ต: ์์ ์ด ํ๋์ ์ํธ์ ํ๊ณผ ์ด์ ๋ง์ถ๋ ๊ฒ๊ณผ ์ ์ฌํ์ง๋ง, Parquet๋ ํจ์ฌ ๊ฑฐ๋ํ '์ด๊ด๋์ญ ํ ์ด๋ธ(Wide Table)' ๊ตฌ์กฐ์ ๋๋ค.
- ํตํฉ ์๋ฆฌ: 163ํ์ ์ค๋ฌธ์กฐ์ฌ๋ ๋งค๋ฒ ์ง๋ฌธ์ด ๋ค๋ฆ
๋๋ค. ์ด ์์คํ
์
Pandas.concat๊ธฐ์ ์ ์ฌ์ฉํ์ฌ, ๋์ผํ ์ง๋ฌธ์ ๊ฐ์ ์ด(Column)์ ํฉ์น๊ณ , ์๋ก์ด ์ง๋ฌธ์ ์๋ก์ด ์ด๋ก ์ถ๊ฐํ๋ฉฐ ์์ผ๋ก ๊ธธ๊ฒ ๋ถ์ฌ๋๊ฐ๋ ๋ฐฉ์์ ์ทจํฉ๋๋ค. - ํฌ์ ํ๋ ฌ(Sparse Matrix): ํน์ ํ์ฐจ์ ์๋ ์ง๋ฌธ ์นธ์ ๋น์ด์๋(NaN) ์ํ๋ก ์ ์ฅ๋ฉ๋๋ค. Parquet ํฌ๋งท์ ์ด๋ฐ ๋น ๊ณต๊ฐ์ ๋งค์ฐ ํจ์จ์ ์ผ๋ก ์์ถํ์ฌ ์ ์ฅํ๋ฏ๋ก, ์์ฒ ๊ฐ์ ์ด์ด ์์ด๋ ํ์ผ ์ฉ๋์ด ๋งค์ฐ ์๊ฒ ์ ์ง๋ฉ๋๋ค.
- ์๋ต์ ์๋ณ ์ฒด๊ณ (Unique Identification):
- survey_round: ์ ์ฒด 160์ฌ ํ์ฐจ ์ค ํด๋น ๋ฐ์ดํฐ๊ฐ ์์ง๋ ํน์ ์กฐ์ฌ ํ์ฐจ (์: 100ํ NBS).
- respondent_id: ํด๋น ํ์ฐจ ๋ด์์ ์๋ต์์๊ฒ ๋ถ์ฌ๋ ๊ณ ์ ๋ฒํธ.
- ์๋ณ ๋ฐฉ์:
survey_round์respondent_id์ ์กฐํฉ(๋ณตํฉ ํค)์ ํตํด 16๋ง์ฌ ๋ช ์ ์ ์ฒด ์๋ต์ ์ค ํน์ ๊ฐ์ธ์ ์ ์ผํ๊ฒ ์ฐพ์๋ด๊ณ ๊ด๋ฆฌํฉ๋๋ค.
- ์ฃผ์ ์ธ๊ตฌํต๊ณ ํต๊ณ:
- ์ด ๋ฐ์ดํฐ ๊ฑด์: 166,721๋ช (์๋ต์ ๋จ์)
- ์ฑ๋ณ ๋ถํฌ: ๋จ์ (50.1%), ์ฌ์ (49.9%)
- ์ฐ๋ น ํต๊ณ: ํ๊ท 50.0์ธ (ํ์คํธ์ฐจ 17.4), ์ต์ 18์ธ ~ ์ต๋ 99์ธ
- ์ง์ญ ๋ถํฌ (Top 5): ๊ฒฝ๊ธฐ(25.5%), ์์ธ(18.5%), ๋ถ์ฐ(6.9%), ๊ฒฝ๋จ(6.5%), ์ธ์ฒ(5.7%)
- ์ฃผ์ ์ง์ ๊ตฐ: ์ฌ๋ฌด/๊ธฐ์ ์ง(25.2%), ์ฃผ๋ถ(18.2%), ์์์ (15.7%), ๋ฌด์ง/ํด์ง/๊ธฐํ(14.7%)
- ์ ์ฒด ์ง๋ฌธ ํญ๋ชฉ ํ์ธ: NBS ๊ณ ์ ์ค๋ฌธ ๋ฌธํญ ๋ฆฌ์คํธ(1,219๊ฑด)
- ์ฒ๋ฆฌ ๋ด์ฉ:
- ํตํฉ: 163๊ฐ์ ์๋ก ๋ค๋ฅธ ์ค๋ฌธ ํ์ผ์ ํ๋์ ๊ฑฐ๋ ๋ฐ์ดํฐ์ ์ผ๋ก ๋ณํฉ.
- ๊ฐ ํ์คํ: "๋จ/์ฌ", "๋จ์ฑ/์ฌ์ฑ" ๋ฑ ๋ค์ํ ํ๊ธฐ๋ฅผ "๋จ์/์ฌ์"๋ก ํต์ผ.
๋จ๊ณ 3: ์ง๋ฌธ ์๋ฏธ๋ก ์ ์ธ๋ฑ์ฑ (index_questions.py โ nbs_questions_index.parquet)
๊ณ ์ ๋ฌธํญ ์ถ์ถ ๋ฐ ์ ๋ํผ์ผ์ด์ (Unification) ๊ธฐ์ : 163ํ์ ์ค๋ฌธ์กฐ์ฌ์์ ํํธํ๋ ์ง๋ฌธ๋ค์ 1,219๊ฐ์ ๊ณ ์ ์ง์์ผ๋ก ํตํฉํ๊ธฐ ์ํด ๋ค์ ๊ธฐ์ ์ด ์ ์ฉ๋์์ต๋๋ค.
- Preprocessing (์ง๋ฅํ ๋งคํ): ์๋ณธ ๋ฐ์ดํฐ์ ๋ณ์๋ช
(
q1)์ PDF๋ฅผ ํตํด ์ ์ฒด ๋ฌธ์ฅ์ผ๋ก ๋ณต์ํ์ฌ ํตํฉ์ ๊ธฐ์ด๋ฅผ ๋ง๋ จํ์ต๋๋ค. - Noise Reduction (๋ฉํ๋ฐ์ดํฐ ์ ์ธ): ์์ด๋, ๊ฐ์ค์น ๋ฑ ๋น์ง๋ฌธ ๋ฐ์ดํฐ๋ฅผ ์ ์ธํ์ฌ ์์ ์ง๋ฌธ 1,219๊ฑด์ ํ๋ณดํ์ต๋๋ค.
- Stable Vector Search (๊ณ ์ฑ๋ฅ ์ ํ ๊ฒ์):
- ๋ณ๊ฒฝ ์ฌํญ: ๊ธฐ์กด์ ์ธ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค(ChromaDB) ๋์ , Pandas + NumPy ๊ธฐ๋ฐ์ ์ ํ ๋ฒกํฐ ๊ฒ์ ๋ฐฉ์์ ์ฑํํ์ต๋๋ค.
- ์ด์ : Windows ํ๊ฒฝ์์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํธํ์ฑ(HNSW ์ค๋ฅ)์ ์๋ฒฝํ ํด๊ฒฐํ๊ณ , 1,219๊ฑด ์ ๋์ ๋ฐ์ดํฐ ๊ท๋ชจ์์๋ ๋ณ๋ DB ์์ง ์์ด๋ ์์ ๋ฐ๋ฆฌ์ด(ms) ๋จ์์ ์ด๊ณ ์ ๊ฒ์์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
- Virtual Unification (์๋ฏธ๋ก ์ ๋ณด์ ): ๋ฏธ์ธํ๊ฒ ๋ค๋ฅธ ์ง๋ฌธ๋ค์ SBERT ์๋ฒ ๋ฉ๊ณผ ์ฝ์ฌ์ธ ์ ์ฌ๋(Cosine Similarity) ๊ณ์ฐ์ ํตํด ๊ฒ์ ์์ ์ ์ง๋ฅ์ ์ผ๋ก ํตํฉ ์ฐธ์กฐ๋ฉ๋๋ค.
- Preprocessing (์ง๋ฅํ ๋งคํ): ์๋ณธ ๋ฐ์ดํฐ์ ๋ณ์๋ช
(
์๋ฒ ๋ฉ ๋ชจ๋ธ:
snunlp/KR-SBERT-V40K-klueNLI-augSTS์ธ๋ฑ์ค ๋ฐ์ดํฐ ๊ตฌ์กฐ (
nbs_questions_index.parquet):- question: ์ง๋ฌธ ์๋ฌธ (์: "๋ํต๋ น ๊ตญ์ ์ด์ ํ๊ฐ")
- vector: SBERT๊ฐ ์์ฑํ 768์ฐจ์์ ์์น ๋ฒกํฐ ๋ฆฌ์คํธ.
๊ฒ์ ์๊ณ ๋ฆฌ์ฆ (Cosine Similarity):
- NumPy๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ์ง๋ฌธ๊ณผ ์ธ๋ฑ์ค๋ 1,219๊ฐ ์ง๋ฌธ ์ฌ์ด์ ๊ฐ๋๋ฅผ ๊ณ์ฐ, ๊ฐ์ฅ ์๋ฏธ๊ฐ ๊ฐ๊น์ด ์ง๋ฌธ๋ค์ ์ถ์ถํฉ๋๋ค.
3. ์๋ฎฌ๋ ์ด์ ์์คํ ์๋ ์๋ฆฌ (Technical Deep-Dive)
1) ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์ ํ๋ก์ธ์ค (Data Flow Diagram)
์์คํ ์ '๋๊ตฌ์ธ์ง(์ธ๊ตฌํต๊ณ)'์ '์ด๋ค ์ฑํฅ์ธ์ง(๊ณผ๊ฑฐ ๋ต๋ณ)'๋ฅผ ๊ฒฐํฉํ์ฌ ๋ต๋ณ์ ์์ฑํฉ๋๋ค.
graph TD
A["์ฌ์ฉ์ ์
๋ ฅ (์ง๋ฌธ + ์กฐ๊ฑด)"] --> B{"1๋จ๊ณ: ์ธ๊ตฌํต๊ณ ํํฐ๋ง\n(Parquet/Hard Filter)"}
B -- "์ผ์น์ ๋ฐ๊ฒฌ" --> C["์๋ต์ ํ๋ณด๊ตฐ (Candidates)"]
B -- "์ผ์น์ ์์" --> B_Fail["๊ฒฝ๊ณ ํ ์ข
๋ฃ (์กฐ๊ฑด ์ํ ๊ถ์ฅ)"]
A --> D{"2๋จ๊ณ: ์๋ฏธ ๊ฒ์\n(Vector DB/Soft Filter)"}
D --> E["์ ์ฌ ์ง๋ฌธ Top-5 ์ถ์ถ"]
C --> F{"3๋จ๊ณ: ์ปจํ
์คํธ ์ถ์ถ\n(Grounding)"}
E --> F
F --> G["A. ํ๋ฅด์๋ ํต์ฌ ์ง๋ฌธ ์ค์บ\n(์ ์น/์ด๋
/๊ฒฝ์ ๋ฑ)"]
F --> H["B. ์ ์ฌ ์ง๋ฌธ ๋ต๋ณ ๋งค์นญ"]
G --> I["์ต์ข
์ปจํ
์คํธ (์ง์ ๋ฒ ์ด์ค)"]
H --> I
I --> J["4๋จ๊ณ: LLM ๋ต๋ณ ์์ฑ\n(Gemini 2.5 Flash)"]
J --> K["์๋ฎฌ๋ ์ด์
์๋ฃ (JSON ์ ์ฅ)"]
2) ์์ธ ์ํฉ ๋ฐ ์๋ ์๋ฆฌ (FAQ)
- Q: ์ธ๊ตฌํต๊ณ ์กฐ๊ฑด(์ฑ๋ณ/์ง์ญ ๋ฑ)์ ๋ง๋ ์๋ต์๊ฐ ์์ผ๋ฉด ์ด๋ป๊ฒ ๋๋์?
- ํ์ฌ ์์คํ ์ **'์กฐ๊ฑด ์ํ'**๋ฅผ ์ํด ๋น ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ์๋ฅผ ๋ค์ด 45์ธ ์๋ต์๊ฐ ์๋ค๋ฉด 40๋ ์ ์ฒด๋ก ๋ฒ์๋ฅผ ๋ํ๊ฑฐ๋ ํน์ ์กฐ๊ฑด์ ์๋ตํ์ฌ ๋ค์ ์๋ฎฌ๋ ์ด์ ํด์ผ ํฉ๋๋ค.
- Q: ์กฐ๊ฑด์ ๋ง๋๋ฐ, ์ ์ฌํ ๊ณผ๊ฑฐ ์ง๋ฌธ์ ๋ตํ ๊ธฐ๋ก์ด ์๋ ์๋ต์๋ผ๋ฉด์?
- ์์คํ ์ **'์ด์ค ์์ ์ฅ์น(Safety Net)'**๊ฐ ์๋ํฉ๋๋ค. ์ง๋ฌธ๊ณผ ์ง์ ์ ์ธ ์ฐ๊ด์ด ์๋๋ผ๋ ํด๋น ์๋ต์๊ฐ ๊ณผ๊ฑฐ์ ๋ตํ๋ ์ ์น์ ์ฑํฅ, ์ด๋ , ์ง์ง ์ ๋น, ๊ฒฝ์ ์ ๊ณ์ธต ์์ ๋ฑ ํ๋ฅด์๋๋ฅผ ๊ฒฐ์ ์ง๋ ํต์ฌ ๋ต๋ณ์ ์ฐ์ ์ ์ผ๋ก ์ถ์ถํฉ๋๋ค.
- ๋ง์ฝ ์ด๋ง์ ๋ ์๋ค๋ฉด, LLM์ ์ ๋ ฅ๋ ์ธ๊ตฌํต๊ณ ์ ๋ณด(์: "์์ธ ๊ฑฐ์ฃผ 30๋ ๋จ์ฑ")๋ง์ ๋ฐํ์ผ๋ก ์ฌํ์ ํต๋ ์ ๊ธฐ๋ฐํ ๋ต๋ณ์ ์์ฑํ๊ฒ ๋ฉ๋๋ค.
- Q:
referenced_context๊ฐ ์ง๋ฌธ ์ฃผ์ ์ ์ง์ ์ ์ธ ๊ด๋ จ์ด ์์ด ๋ณด์ด๋ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?- ์ด์ค ๊ฒ์ ๋ก์ง: ์์คํ ์ **A. ํต์ฌ ํ๋ฅด์๋ ๋ฌธํญ(๊ฐ์น๊ด)**๊ณผ **B. ์ฃผ์ ์ ์ฌ ๋ฌธํญ(๊ธฐ์ต)**์ ๋์์ ์ถ์ถํฉ๋๋ค.
- ํฌ์์ฑ ๋์: ๋ง์ฝ ํด๋น ์๋ต์๊ฐ ์ฐธ์ฌํ ํ์ฐจ์ ์ง๋ฌธ ์ฃผ์ ์ ์๋ฏธ์ ์ผ๋ก ์ ์ฌํ ์ง๋ฌธ์ด ์์์ ๊ฒฝ์ฐ(ํฌ์ ๋ฐ์ดํฐ), ์์คํ ์ ์๋ฐํ์ ๋ต๋ณ ๋ ผ๋ฆฌ๋ฅผ ๋ณด๊ฐํ๊ธฐ ์ํด ๊ทธ ์ฌ๋์ ๊ทผ๋ณธ์ ์ธ ๊ฐ์น๊ด(์ ์น/์ด๋ /๊ณ์ธต ๋ฑ)์ ์ปจํ ์คํธ๋ก ์ฐ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ LLM์ด "์ด๋ฌํ ์ฑํฅ์ ์ฌ๋์ด๋ผ๋ฉด ์๋ก์ด ์ด์์ ๋ํด ์ด๋ ๊ฒ ๋ตํ ๊ฒ์ด๋ค"๋ผ๊ณ ํ๋นํ๊ฒ ์ถ๋ก ํ๋๋ก ๋๋ ์ฅ์น์ ๋๋ค.
- Q: ์ธ๊ตฌํต๊ณ ์กฐ๊ฑด๊ณผ ์ง๋ฌธ ์ ์ฌ๋ ์ฌ์ด์ ๊ด๊ณ ์ค์ ์ ์ด๋ป๊ฒ ํ๋์?
- **์ธ๊ตฌํต๊ณ(Hard Filter)**๋ ์๋ฐํ์ '์ ๋ถ'์ ๊ฒฐ์ ํ๊ณ , **์ง๋ฌธ ์ ์ฌ๋(Soft Filter)**๋ ๊ทธ ์๋ฐํ์ '๊ธฐ์ต'์ ์ํํฉ๋๋ค.
- ์ ๋ถ์ด ๊ฒฐ์ ๋ ์๋ต์์ ํ(Row)์์ ์๋ฏธ์ ์ผ๋ก ๊ฐ์ฅ ๊ฐ๊น์ด ๊ธฐ์ต(๋ต๋ณ)์ ์ฐพ์ LLM์๊ฒ ์ ๋ฌํจ์ผ๋ก์จ, "์ด ์ฌํ์ ์์์ ๊ฐ์ง ์ฌ๋์ ์ด๋ฐ ์ง๋ฌธ์ ์ด๋ ๊ฒ ๋ตํ ๊ฒ์ด๋ค"๋ผ๋ ๋ ผ๋ฆฌ์ ํ๋น์ฑ์ ํ๋ณดํฉ๋๋ค.
- Q: ์กฐ๊ฑด์ ๋ง๋ ํ๋ณด์๊ฐ 1,000๋ช
์ด๋ผ๋ฉด ์ต์ข
10๋ช
์ ์ด๋ค ๊ธฐ์ค์ผ๋ก ์ ์ ๋๋์?
- ๋ฌด์์ ์ํ๋ง(Random Sampling) ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค. 1์ฐจ ํํฐ๋ง(์ธ๊ตฌํต๊ณ)์ ํต๊ณผํ ํ๋ณด๊ตฐ์ด ์ค์ ํ ์ํ ์(
--sample)๋ณด๋ค ๋ง์ ๊ฒฝ์ฐ, ์์คํ ์ ์ง๋จ ๋ด ํธํฅ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ทธ๋ค ์ค ๋ฌด์์๋ก ์ต์ข ๋์์๋ฅผ ์ถ์ถํฉ๋๋ค.
- ๋ฌด์์ ์ํ๋ง(Random Sampling) ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค. 1์ฐจ ํํฐ๋ง(์ธ๊ตฌํต๊ณ)์ ํต๊ณผํ ํ๋ณด๊ตฐ์ด ์ค์ ํ ์ํ ์(
- Q: ์ ์ง๋ฌธ๊ณผ ๊ฐ์ฅ ์ ์ฌํ ๋ต๋ณ์ ํ ์ฌ๋์ ์์๋๋ก ๋ฝ์ง ์๊ณ ๋ฌด์์๋ก ๋ฝ๋์?
- ์ ํ ํธํฅ(Selection Bias) ๋ฐฉ์ง: ์ง๋ฌธ๊ณผ ์ ์ฌํ ์๊ฐ์ ๊ฐ์ง ์ฌ๋๋ง ๊ณจ๋ผ๋ธ๋ค๋ฉด, ํด๋น ์ธ๋๋ ์ง์ญ ๋ด์ ๋ค์ํ ๊ฐ์น๊ด์ด ์๋ฉธํ๊ณ ๋จ์ผํ ๋ชฉ๋จ๋ง ๋จ๊ฒ ๋ฉ๋๋ค.
- ํต๊ณ์ ๋ค์์ฑ ๋ณด์กด: ๊ฐ์ '์์ธ 30๋ ์ฌ์ฑ'์ด๋ผ๋ ์ง๋ณด/๋ณด์, ๋ถ์ ํจ/๊ฐ๋ํจ ๋ฑ ๋ค์ํ ํ๋ฅด์๋๊ฐ ์กด์ฌํฉ๋๋ค. ๋ฌด์์ ์ํ๋ง์ ํตํด ์ด๋ฌํ ์ง๋จ ๋ด ๋ค์ํ ์คํํธ๋ผ์ ๋ชฉ์๋ฆฌ๋ฅผ ๊ณจ๊ณ ๋ฃจ ์๋ฎฌ๋ ์ด์ ์ ๋ฐ์ํ์ฌ ์ค์ ์ฌ๋ก ์งํ์ ๊ฐ๊น์ด ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ ์ํจ์ ๋๋ค.
4. ์๋ ์ฌ๋ก (Example Case Study)
[์ฌ์ฉ์ ์ ๋ ฅ]
- ์ง๋ฌธ: "๊ธฐ๋ณธ์๋์ ๋์ ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น?"
- ์กฐ๊ฑด: ์ฑ๋ณ=๋จ์, ์ง์ญ=์์ธ, ์ฐ๋ น=40, ์ง์ =์์์
[์์คํ ๋ด๋ถ ์๋]
- ๋ฐ์ดํฐ ํํฐ๋ง:
consolidated_nbs_data.parquet์์ ์์ธ ๊ฑฐ์ฃผ 40์ธ ๋จ์ฑ ์์์ ์๋ค์ ์ถ์ถ. - ์ ์ฌ ์ง๋ฌธ ๊ฒ์: ChromaDB์์ "๋ณต์ง ์ ์ฑ ํ๋", "์ฌ์ ๋ ํด๊ฒฐ ๋ฐฉ์" ๋ฑ์ ์ง๋ฌธ์ ์ ์ฌ ๋ฌธํญ์ผ๋ก ์ ์ .
- ์ปจํ
์คํธ ๊ตฌ์ถ: ์ถ์ถ๋ ์๋ต์ ์ค ํ ๋ช
์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋:
- ์ ์น ์ฑํฅ: ๋ณด์
- ๋ณต์ง ์ ์ฑ ์ ๋ํ ๋ต๋ณ: "๋ฐ๋ (์ธ๊ธ ๋ถ๋ด ์ฆ๋ ์ฐ๋ ค)"
- ๋ถ๋์ฐ ๊ฐ๊ฒฉ์ ๋ํ ๋ต๋ณ: "๊ธ๋ฑ ๋ฐ๋"
- LLM ์์ฑ (Gemini):
- ์ ์ ๋ณด๋ค์ ์ข ํฉํ์ฌ "๋ณด์์ ๊ฐ์น๊ด์ ๊ฐ์ง 40๋ ์์์ ์๋ก์, ์ธ๊ธ ๋ถ๋ด์ด ๋์ด๋ ์ ์๋ ๊ธฐ๋ณธ์๋์ ์ ๋ํด์๋ ์ ์คํ๊ฑฐ๋ ๋ฐ๋ํ๋ ์ ์ฅ"์ ๋ต๋ณ์ ์์ฑ.
- ๊ฒฐ๊ณผ JSON์
referenced_context์ ์์ ์ฐธ์กฐ๋ ๊ณผ๊ฑฐ ๋ต๋ณ๋ค์ ๋ ธ์ถ.
5. ํ์ฌ ์ฌ์ฉ ๋ฐฉ๋ฒ (Usage Guide)
์ค๋ฌธ ์์คํ
์ ํ๋ฅด์๋_์ค๋ฌธ์กฐ์ฌ_์ ๊ตญ์งํ์กฐ์ฌ ํด๋ ๋ด์์ ์คํ๋ฉ๋๋ค.
์ต์
A: ์ค์ ์๋ต์ ์ํ๋ง ๋ชจ๋ (avatar_actual.py)
์ค์ ๊ณผ๊ฑฐ ์๋ต์๋ค์ ๋ต๋ณ ์ด๋ ฅ์ ๋ฐํ์ผ๋ก ๊ฐ์ฅ ์์ํ ์๋ต์ ์์ฑํฉ๋๋ค.
# ์์ 1: ๋จ์ ์ง๋ฌธ ํ์ (๊ฒฝ๊ธฐ๋ ๊ฑฐ์ฃผ 31~40์ธ ๋จ์ฑ 5๋ช
)
..\.venv\Scripts\python.exe avatar_actual.py --question "์ ๋
์ฐ์ฅ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํด?" --region "๊ฒฝ๊ธฐ" --gender "๋จ์" --age "31~40" --job "์ฌ๋ฌด/๊ธฐ์ ์ง" --sample 5
# ์์ 2: ์ธ๋ถ ์ค๋ช
๋ฐ 5์ ์ฒ๋ ํฌํจ (์ต์ ์๊ธ ๊ด๋ จ ์ฌํ ์๋ฎฌ๋ ์ด์
)
..\.venv\Scripts\python.exe avatar_actual.py --question "์ต๊ทผ ๊ณ ๋ฌผ๊ฐ์ ์ ์ฑ์ฅ ๊ธฐ์กฐ ์์์ ์๋ฏผ ๊ฒฝ์ ์ ์์ ์ ์ํด ํ์ฌ์ ์ต์ ์๊ธ์ ๋ํญ ์ธ์ํด์ผ ํ๋ค๋ ์ฃผ์ฅ์ด ์์ต๋๋ค. ์ด์ ๋ํด ์ผ๋ง๋ ๋์ํ์ญ๋๊น? (1์ : ์ ํ ๋์ ์ํจ ~ 5์ : ๋งค์ฐ ๋์)" --region "์์ธ" --gender "์ฌ์" --age "25~35" --sample 5
์ต์
B: ๊ฐ์ ํต๊ณ ๊ธฐ๋ฐ ๋ชจ๋ (avatar_synthetic.py)
ํน์ ๊ทธ๋ฃน์ ํต๊ณ์ ๋ต๋ณ ๋ถํฌ๋ฅผ ๋ถ์ํ์ฌ ๊ฐ์์ ํ๋ฅด์๋ ๋ต๋ณ์ ์์ฑํฉ๋๋ค.
# ์์: ์์ธ ๊ฑฐ์ฃผ 20๋ ์ฌ์ฑ ํ์ ๊ทธ๋ฃน์ ํต๊ณ ๊ธฐ๋ฐ 10๋ช
์์ฑ
..\.venv\Scripts\python.exe avatar_synthetic.py --question "๊ณต์ ๊ฒฝ์ ์๋น์ค ์ด์ฉ ์ํฅ์?" --region "์์ธ" --gender "์ฌ์" --age "20" --job "ํ์" --sample 10
ํ๋ผ๋ฏธํฐ ์์ธ ์ค๋ช
--question: ์๋ฎฌ๋ ์ด์ ํ ์๋ก์ด ์ง๋ฌธ (ํ์)- ์ง๋ฌธ ์ค๊ณ ๊ถ์ฅ์ฌํญ:
- ์ด์ ์ค์ฌ ์ง๋ฌธ: ํน์ ์ธ๋ฌผ์ ๋ํ ๊ฐ์ธ์ ํ๊ฐ๋ณด๋ค๋ ์ฌํ์ ์ด์๋ ์ ์ฑ ์ ์ฌ์์ ๋ํ ์ง๋ฌธ์ด ๋ ํ๋นํ ๋ต๋ณ์ ์ ๋ํฉ๋๋ค.
- ๋ฐฐ๊ฒฝ ์ค๋ช
ํฌํจ: ๋จ์ํ ์ง๋ฌธ๋ณด๋ค๋ ์ด์์ ๋ํ ๋งฅ๋ฝ(๋ฐฐ๊ฒฝ ์ค๋ช
)์ ํจ๊ป ์ ๊ณตํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
- ์์ (๊ถ์ฅ): "์ต๊ทผ ๊ณ ๋ฌผ๊ฐ ์ํฉ์์ ์๋ฏผ ๊ฒฝ์ ์์ ์ ์ํด ์ต์ ์๊ธ์ ์ธ์ํด์ผ ํ๋ค๋ ์ฃผ์ฅ์ด ์์ต๋๋ค. ์ด์ ๋ํด..."
- ์๋ต ์ฒ๋ ๋ช ์: ์ ๋์ ์ธ ๋ถ์์ด๋ ๊ตฌ์กฐํ๋ ๋ต๋ณ์ด ํ์ํ๋ค๋ฉด "์ผ๋ง๋ ๋์ํ์ญ๋๊น? (1: ์ ํ ๋์ ์ํจ ~ 5: ๋งค์ฐ ๋์)"์ ๊ฐ์ด ๊ตฌ์ฒด์ ์ธ ์ฒ๋๋ฅผ ์ ์ํ๋ ๊ฒ์ ๊ฐ๋ ฅํ ๊ถ์ฅํฉ๋๋ค.
- ์ง๋ฌธ ์ค๊ณ ๊ถ์ฅ์ฌํญ:
--region: ์ง์ญ (์ ๋ ฅ ๊ฐ๋ฅ: ์์ธ, ๊ฒฝ๊ธฐ, ์ธ์ฒ, ๊ฐ์, ๋ถ์ฐ, ๋๊ตฌ, ๊ด์ฃผ, ๋์ , ์ธ์ฐ, ์ธ์ข , ์ถฉ๋ถ, ์ถฉ๋จ, ์ ๋ถ, ์ ๋จ, ๊ฒฝ๋ถ, ๊ฒฝ๋จ, ์ ์ฃผ)--gender: ์ฑ๋ณ (์ ๋ ฅ ๊ฐ๋ฅ: ๋จ์/๋จ, ์ฌ์/์ฌ)--age: ๋์ด ๋๋ ๋์ด ๋ฒ์ (33, 20~29 ๋ฑ ์ ๋ ฅ ๊ฐ๋ฅ)--job: ์ง์ (์ ๋ ฅ ๊ฐ๋ฅ: ํ์, ์ฌ๋ฌด/๊ธฐ์ ์ง, ์์์ , ์ฃผ๋ถ, ๊ฒฝ์/๊ด๋ฆฌ/์ ๋ฌธ์ง, ์์ฐ/๊ธฐ๋ฅ/๋ ธ๋ฌด์ง, ๋/๋ฆผ/์์ฐ์ , ๋ฌด์ง/ํด์ง/๊ธฐํ)--sample: ์์ฑํ ์๋ฐํ/์๋ต ์- ๊ถ์ฅ ์ฌํญ (Stable & Conservative): 10 ~ 50๊ฐ
- ์ด์ : ์์คํ ์ ์๋ต์๋ณ๋ก ๊ฐ๋ณ์ ์ธ LLM ํธ์ถ์ ์ํํฉ๋๋ค. Gemini 2.5 Flash Lite์ ์๋์ API ์์ ์ฑ(๋คํธ์ํฌ ํ์์์ ๋ฐ ์๋ ์ ํ)์ ๊ณ ๋ คํ ๋, ํ ๋ฒ์ ์คํ์์ 50๊ฐ ๋ด์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๊ฐ์ฅ ์์ ์ ์ด๊ณ ๋น ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํฉ๋๋ค. ๋๋ ์๋๋ฆฌ์ค(100๊ฐ ์ด์)๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ฌ๋ฌ ๋ฒ ๋๋์ด ์คํํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
6. ์๋ฎฌ๋ ์ด์ ๋ชจ๋ ์์ธ ๋น๊ต (Actual vs Synthetic)
์์คํ ์ ๋ชฉ์ ์ ๋ฐ๋ผ '๊ฐ๋ณ์ฑ'๊ณผ 'ํต๊ณ์ฑ' ์ค ํ๋๋ฅผ ์ ํํ ์ ์๋๋ก ๋ ๊ฐ์ง ์คํ ๋ชจ๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
1) ๋น๊ต ์์ฝ ํ ์ด๋ธ
| ๋น๊ต ํญ๋ชฉ | ์ต์
A: ์ค์ ์๋ต์ ๋ชจ๋ (actual) |
์ต์
B: ๊ฐ์ ํต๊ณ ๋ชจ๋ (synthetic) |
|---|---|---|
| ํต์ฌ ์ฒ ํ | "์ค์ ์กด์ฌํ๋ ์ฌ๋์ ๊ธฐ์ต์ ์ํ" | "ํน์ ๊ทธ๋ฃน์ ํต๊ณ์ ๊ฒฝํฅ์ฑ์ ์์ธํ" |
| ์ปจํ ์คํธ ๊ตฌ์ฑ | ํน์ ๊ฐ์ธ์ ๊ฐ๋ณ ๋ต๋ณ ์ด๋ ฅ (1:1 ๋งค์นญ) | ๊ทธ๋ฃน ์ ์ฒด์ ๋ต๋ณ ๋ถํฌ ํต๊ณ (N:1 ์์ฝ) |
| ์๋ฎฌ๋ ์ด์ ๋์ | ๋ฐ์ดํฐ์์ ์ค์ ์ธ๋ฌผ (์: ID 6038๋ฒ ์๋ต์) | ํต๊ณ๋ฅผ ๋ฐํ์ผ๋ก ์์ฑ๋ ๊ฐ์์ ํ๋ฅด์๋ |
| ๋ต๋ณ์ ํน์ง | ํํธํ๋์ด ์์ผ๋ ๊ทน๋๋ก ๊ตฌ์ฒด์ ์ด๊ณ ํ์ค์ ์ | ๊ทธ๋ฃน์ ํ๊ท ์ ์ธ ๊ฐ์น๊ด๊ณผ ํธ๋ ๋๋ฅผ ์ ๋ฐ์ํจ |
| ์ถ์ฒ ์ฉ๋ | ์ฌ์ธต ์ธํฐ๋ทฐ(FGI) ์์ค์ ์์ํ ๋ฐ์ ํ์ ์ | ์ง๋จ์ ์ฌ๋ก ์ ํ๋ฆ์ด๋ ํต๊ณ์ ๊ฒฝํฅ ํ์ ์ |
2) ์ฌ๋ก๋ฅผ ํตํ ์ฐจ์ด ์ค๋ช (์์ธ ๊ฑฐ์ฃผ, 20๋ ์ฌ์ฑ, ํ์ ๊ทธ๋ฃน)
์ง๋ฌธ: "๋ํ ๋ฑ๋ก๊ธ ๋ฐ๊ฐ ์ธํ ์ ์ฑ ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น?"
[์ต์
A: ์ค์ ์๋ต์ ๋ชจ๋ (avatar_actual.py)]
- ๋์: ์์ธ 20๋ ์ฌ์ฑ ํ์ ๋ฐ์ดํฐ ์ค 5๋ช ์ ๋ฌด์์๋ก ๋ฝ์ต๋๋ค.
- ์ปจํ
์คํธ:
- ์๋ฐํ 1ํธ: "๊ณผ๊ฑฐ์ ์ฅํ๊ธ ํํ ๋ถ์กฑ์ ๋ถ๋ง์ด๋ผ๊ณ ๋ตํ์, ๋ถ๋ชจ๋ ๊ฒฝ์ ๋ ฅ ๋ฎ์"
- ์๋ฐํ 2ํธ: "๊ณผ๊ฑฐ์ ๊ต์ก ์ง ์ ํ ์ฐ๋ ค๋ก ์ ๋ถ ๊ฐ์ ๋ฐ๋ํ๋ค๊ณ ๋ตํ์"
- ๊ฒฐ๊ณผ: ์๋ฐํ๋ง๋ค ๋ณธ์ธ์ ๊ฐ์ธ์ ์ฌ์ ์ด ๋ฌ๋ฟ ๋ด๊ธด ์ ๊ฐ๊ฐ์ ๋ต๋ณ์ ๋ด๋์ต๋๋ค. (ํ์ค์ฑ ๋์)
[์ต์
B: ๊ฐ์ ํต๊ณ ๋ชจ๋ (avatar_synthetic.py)]
- ๋์: ์์ธ 20๋ ์ฌ์ฑ ํ์ ์์ฒ ๋ช ์ ๋ฐ์ดํฐ๋ฅผ ํต๊ณ๋ก ๋ ๋๋ค.
- ์ปจํ
์คํธ:
- "ํด๋น ๊ทธ๋ฃน์ 75%๋ ๋ฑ๋ก๊ธ ๋ถ๋ด์ด ๋งค์ฐ ๋๋ค๊ณ ๋ตํ์ผ๋ฉฐ, 15%๋ ๋ํ์ ์ฌ์ ํฌ๋ช ์ฑ์ ๊ฐ์กฐํ์ต๋๋ค."
- ๊ฒฐ๊ณผ: "์ฐ๋ฆฌ ์ธ๋์ ๋๋ค์๊ฐ ๋ฑ๋ก๊ธ ๋ถ๋ด์ผ๋ก ๊ณ ํต๋ฐ๊ณ ์์ผ๋ฉฐ..."์ ๊ฐ์ด ๊ทธ๋ฃน์ ๋ํ์ฑ์ ๋ค ๋ต๋ณ์ ์์ฑํฉ๋๋ค. (๊ฒฝํฅ์ฑ ํ์ ์ฉ์ด)
3) ๊ฐ์ ํต๊ณ ๋ชจ๋์ ์์ธ ๋ก์ง (Deep-Dive into Synthetic Logic)
๊ฐ์ ํต๊ณ ๋ชจ๋๋ ์ค์ ๊ฐ์ธ์ด ์๋ **'์ง๋จ์ ์งํ'**๋ฅผ ์ถ์ถํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๊ณ ๋ํ๋ ์ปจํ ์คํธ ์ถ์ถ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.
โ ํต๊ณ์ ๋ถํฌ(Distribution) ๋ฐฉ์์ ์ฑํ
๋จ์ํ "๊ฐ์ฅ ๋ง์ ๋ต๋ณ" ํ๋๋ง ์ ๋ฌํ๋ ๊ฒ์ด ์๋๋ผ, "A ๋ต๋ณ(60%), B ๋ต๋ณ(30%), ๊ธฐํ(10%)"์ ๊ฐ์ด ์ค์ ์๋ต ๋น์จ์ ์์น๋ก ๊ณ์ฐํ์ฌ LLM์๊ฒ ๋ณด๊ณ ํฉ๋๋ค.
- ๋ค์์ฑ ๋ณด์กด: ์ง๋จ ๋ด์ ์ง๋ฐฐ์ ์ธ ์๊ฒฌ๋ฟ๋ง ์๋๋ผ ์์ ์๊ฒฌ์ ๋น์ค๊น์ง ํ์ต์์ผ, ๋ต๋ณ์ ํ์ ๋๋ ์ ์คํจ์ ์ ๋๋ฅผ ์ค์ ์ฌ๋ก ์งํ์ ๋ง๊ฒ ์กฐ์ ํฉ๋๋ค.
- ๋์์ค ๊ตฌํ: ์ฐฌ๋ฐ์ด ํฝํฝํ ์ด์(51:49)์ ์๋์ ์ธ ์ด์(90:10)์ ๋ํด LLM์ด ์๋ก ๋ค๋ฅธ ๋์์ค์ ํ๋ฅด์๋๋ฅผ ์ฐ๊ธฐํ๋๋ก ์ ๋ํฉ๋๋ค.
โก ์ง๋ฅ์ ๋ฌธํญ ์ ๋ณ (Top-5 Dense Columns)
1,200์ฌ ๊ฐ์ ๋ฌธํญ ์ค ํด๋น ์ง๋จ์ ๊ฐ์ฅ ์ ์ค๋ช ํ ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์๋์ผ๋ก ์ ๋ณํฉ๋๋ค.
- ๋ฐ์ดํฐ ๋ฐ๋ ๊ฒ์ฌ: ๊ณ ์ ํ๋ฅด์๋ ๋ฌธํญ(์ ์น/์ด๋ /๊ณ์ธต ๋ฑ) ์ค ๊ฒฐ์ธก์น(NaN)๊ฐ ๊ฐ์ฅ ์ ์, ์ฆ ๊ฐ์ฅ ๋ง์ ์ฌ๋์ด ์ฑ์คํ๊ฒ ์๋ตํ ์์ 5๊ฐ ๋ฌธํญ์ ์๋ ์ถ์ถํฉ๋๋ค.
- ์ง๋ฌธ ์ ์ฌ์ฑ ๊ฒฐํฉ: ์ฌ์ฉ์์ ์ง๋ฌธ๊ณผ ์๋ฏธ์ ์ผ๋ก ์ ์ฌํ ๊ณผ๊ฑฐ ๋ฌธํญ๋ค์ ํต๊ณ ๋ถํฌ๋ฅผ ๊ฒฐํฉํ์ฌ, ์ง๋จ์ '๊ธฐ์ด ์ฒด๋ ฅ(๊ฐ์น๊ด)'๊ณผ '์ง์ ์ ๊ฒฝํ(์ ์ฌ ์ง๋ฌธ)'์ ๋ชจ๋ ๋ฐ์ํฉ๋๋ค.
โข ๊ฒฐ์ธก์น ๊ทน๋ณต (Sparse Data Recovery)
ํน์ ๊ฐ์ธ์ ์๋ต์ด ๋น์ด ์์ด๋ ๋ชจ์ง๋จ ์ค ํ ๋ช ์ด๋ผ๋ ๋ตํ๋ค๋ฉด ๊ทธ ๊ฒฝํฅ์ฑ์ด ํต๊ณ์ ๋ฐ์๋๋ฏ๋ก, ์ค์ ์๋ต์ ๋ชจ๋๋ณด๋ค ๋ฐ์ดํฐ ๊ณต๋ฐฑ์ ํจ์ฌ ๊ฐํ๋ฉฐ ์์ ์ ์ธ ์๋ฎฌ๋ ์ด์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
7. ๊ฒฐ๊ณผ ํ์ธ ๋ฐ ๊ฒ์ฆ
- ๊ฒฐ๊ณผ๋
survey_results_actual.json๋๋survey_results_synthetic.json์ ์ ์ฅ๋ฉ๋๋ค. - ๊ฐ ๊ฒฐ๊ณผ์๋ ์๋ฐํ์ ๋ต๋ณ๋ฟ๋ง ์๋๋ผ, ๋ต๋ณ์ ๊ทผ๊ฑฐ๊ฐ ๋ **๊ณผ๊ฑฐ ์๋ต ๋ด์ฉ(
referenced_context)**์ด ํฌํจ๋์ด ์์ด ๋ ผ๋ฆฌ์ ์ผ๊ด์ฑ์ ํ์ธํ ์ ์์ต๋๋ค.
8. ํต์ฌ ๋ฐ์ดํฐ ํ์ผ ์์ธ ๋น๊ต
์์คํ ์ ๋ ๊ฐ์ ํต์ฌ Parquet ํ์ผ๋ก ์๋ํ๋ฉฐ, ๊ฐ๊ฐ์ ์ญํ ์ด ๋ช ํํ ๊ตฌ๋ถ๋ฉ๋๋ค.
1) nbs_questions_index.parquet (6.2 MB)
๋ชฉ์ : ์ง๋ฌธ ๊ฒ์ ์ธ๋ฑ์ค (Question Semantic Search Index)
๊ตฌ์กฐ:
| ์ปฌ๋ผ๋ช | ํ์ | ์ค๋ช | ์์ |
|---|---|---|---|
question |
string | ์ง๋ฌธ ์๋ฌธ | "๋ํต๋ น ๊ตญ์ ์ด์ ํ๊ฐ" |
vector |
list[float] | KR-SBERT ์๋ฒ ๋ฉ (768์ฐจ์) | [0.123, -0.456, 0.789, ...] |
๋ฐ์ดํฐ ๊ท๋ชจ: 1,219๊ฐ ๊ณ ์ ์ง๋ฌธ
์ญํ :
- ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ์๋ก์ด ์ง๋ฌธ๊ณผ ์๋ฏธ์ ์ผ๋ก ์ ์ฌํ ๊ณผ๊ฑฐ ์ง๋ฌธ์ ์ฐพ๊ธฐ ์ํ ๋ฒกํฐ ๊ฒ์
- Cosine Similarity ๊ธฐ๋ฐ Top-K ๊ฒ์
- ์: "์ ๋ ์ฐ์ฅ ์ด๋ป๊ฒ ์๊ฐํ์ธ์?" โ ์ ์ฌ ์ง๋ฌธ: "์ ๋ ํด์ง ์ฐ๋ น ์กฐ์ ", "๊ณ ๋ น์ ๊ณ ์ฉ ์ ์ฑ " ๋ฑ
์์ฑ ๋ฐฉ๋ฒ:
# index_questions.py ์คํ์ผ๋ก ์ฌ์์ฑ ๊ฐ๋ฅ (1๋ถ ์์)
python index_questions.py
2) consolidated_nbs_data.parquet (6.7 MB)
๋ชฉ์ : ์๋ต์ ๋ฐ์ดํฐ๋ฒ ์ด์ค (Respondent Database)
๊ตฌ์กฐ (Wide Table + Sparse Matrix):
| ์ปฌ๋ผ ์ ํ | ์ปฌ๋ผ๋ช ์์ | ํ์ | ์ค๋ช |
|---|---|---|---|
| ๋ฉํ๋ฐ์ดํฐ | survey_round |
int | ์กฐ์ฌ ํ์ฐจ (1~163) |
respondent_id |
int | ์๋ต์ ๊ณ ์ ๋ฒํธ | |
| ์ธ๊ตฌํต๊ณ | gender |
string | ์ฑ๋ณ (๋จ์/์ฌ์) |
age |
int | ์ฐ๋ น (18~99์ธ) | |
region |
string | ๊ฑฐ์ฃผ ์ง์ญ (์์ธ, ๊ฒฝ๊ธฐ ๋ฑ) | |
job |
string | ์ง์ (์ฌ๋ฌด/๊ธฐ์ ์ง, ์ฃผ๋ถ ๋ฑ) | |
| ์๋ต ๋ฐ์ดํฐ | ๋ํต๋ น_๊ตญ์ ์ด์_ํ๊ฐ |
string | ๊ฐ๋ณ ์ง๋ฌธ์ ๋ํ ๋ต๋ณ |
์ ๋
์ฐ์ฅ_์ฐฌ๋ฐ |
string | ๊ฐ๋ณ ์ง๋ฌธ์ ๋ํ ๋ต๋ณ | |
| ... (1,219๊ฐ ์ง๋ฌธ ์ปฌ๋ผ) | ... | ... |
๋ฐ์ดํฐ ๊ท๋ชจ: 166,721๋ช ร 1,219๊ฐ ์ง๋ฌธ (ํฌ์ ํ๋ ฌ)
์ญํ :
- ์๋ต์ ํํฐ๋ง: ์ธ๊ตฌํต๊ณ ์กฐ๊ฑด(์ฑ๋ณ/์ฐ๋ น/์ง์ญ/์ง์ )์ผ๋ก ํน์ ์๋ต์ ์ถ์ถ
- ๊ณผ๊ฑฐ ๋ต๋ณ ์ฐธ์กฐ: ์ ํ๋ ์๋ต์์ ์ ์ฌ ์ง๋ฌธ์ ๋ํ ์ค์ ๋ต๋ณ ์ด๋ ฅ์ LLM ์ปจํ ์คํธ๋ก ์ ๊ณต
- ํต๊ณ ์ง๊ณ: Synthetic ๋ชจ๋์์ ๊ทธ๋ฃน ์ ์ฒด์ ๋ต๋ณ ๋ถํฌ ํต๊ณ ๊ณ์ฐ
ํน์ง:
- Sparse Matrix: ๊ฐ ์๋ต์๋ ์ ์ฒด 1,219๊ฐ ์ง๋ฌธ ์ค ํ๊ท 20~30๊ฐ๋ง ๋ต๋ณ (๋๋จธ์ง๋ NaN)
- ์์ถ ํจ์จ: Parquet์ ํจ์จ์ ์ธ ์์ถ์ผ๋ก 13๋ง ๊ฐ ์ด์์ ์ ์ค ๋๋ถ๋ถ์ด ๋น์ด์์ด๋ 6.7MB๋ก ์ ์ง
3) ๋ ํ์ผ์ ์๋ ํ๋ฆ (Data Flow)
graph LR
A[์ฌ์ฉ์ ์ง๋ฌธ] --> B[nbs_questions_index.parquet]
B --> C[์ ์ฌ ์ง๋ฌธ Top-5 ์ถ์ถ]
D[์ธ๊ตฌํต๊ณ ์กฐ๊ฑด] --> E[consolidated_nbs_data.parquet]
E --> F[์กฐ๊ฑด ๋ง๋ ์๋ต์ ํํฐ๋ง]
C --> G[์๋ต์์ ์ ์ฌ ์ง๋ฌธ ๋ต๋ณ ์ถ์ถ]
F --> G
G --> H[LLM ํ๋กฌํํธ ๊ตฌ์ฑ]
H --> I[์๋ฎฌ๋ ์ด์
๋ต๋ณ ์์ฑ]
๋จ๊ณ๋ณ ์์:
์ฌ์ฉ์ ์ ๋ ฅ: "๊ธฐ๋ณธ์๋์ ๋์ ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ญ๋๊น?" (์กฐ๊ฑด: ์์ธ, 40๋, ๋จ์ฑ, ์์์ )
์ง๋ฌธ ๊ฒ์ (
nbs_questions_index.parquet์ฌ์ฉ):- ์ ์ฌ ์ง๋ฌธ ๋ฐ๊ฒฌ: "๋ณต์ง ์ ์ฑ ํ๋", "์ฌ์ ์ง์ถ ์ฆ๊ฐ", "์๋ ์ฌ๋ถ๋ฐฐ" ๋ฑ
์๋ต์ ํํฐ๋ง (
consolidated_nbs_data.parquet์ฌ์ฉ):- ์์ธ ๊ฑฐ์ฃผ + 40๋ + ๋จ์ฑ + ์์์ ์ โ 234๋ช ์ถ์ถ
- ๋ฌด์์ ์ํ๋ง โ 5๋ช ์ ์
์ปจํ ์คํธ ๊ตฌ์ฑ:
- ๊ฐ ์๋ต์๋ณ๋ก ์ ์ ์ฌ ์ง๋ฌธ์ ๋ํ ๊ณผ๊ฑฐ ๋ต๋ณ ์กฐํ
- ์๋ต์ A: "๋ณต์ง ์ ์ฑ ํ๋ โ ๋ฐ๋ (์ธ๊ธ ๋ถ๋ด)", "์ฌ์ ์ง์ถ ์ฆ๊ฐ โ ์ ์คํด์ผ"
- ์๋ต์ B: "๋ณต์ง ์ ์ฑ ํ๋ โ ์ฐฌ์ฑ (์๋ฏผ ๋ณดํธ)", "์๋ ์ฌ๋ถ๋ฐฐ โ ํ์"
LLM ์์ฑ: ์ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ๊ฐ ์๋ต์๊ฐ "๊ธฐ๋ณธ์๋์ "์ ๋ํด ๋ต๋ณํ ๋ด์ฉ ์์ธก
9. ๋ฌธ์ ํด๊ฒฐ (Troubleshooting)
์ธ๋ฑ์ค ํ์ผ ์ ์ค
๋ง์ฝ nbs_questions_index.parquet ํ์ผ์ด ์ญ์ ๋๊ฑฐ๋ ์์๋์๋ค๋ฉด, index_questions.py๋ฅผ ๋ค์ ์คํํ์ฌ 1๋ถ ๋ด์ธ๋ก ๋ณต๊ตฌํ ์ ์์ต๋๋ค.
cd ํ๋ฅด์๋_์ค๋ฌธ์กฐ์ฌ_์ ๊ตญ์งํ์กฐ์ฌ
..\.venv\Scripts\python.exe index_questions.py
(๊ธฐ์กด์ nbs_db_stable ํด๋ ๋ฐ ChromaDB ์ธ๋ฑ์ค ๋ก๋ ์ค๋ฅ๋ ์์คํ ์ด Parquet ๊ธฐ๋ฐ ์ ํ ๊ฒ์์ผ๋ก ์ ํ๋จ์ ๋ฐ๋ผ ๋ ์ด์ ๋ฐ์ํ์ง ์์ต๋๋ค.)