persona_survey / NBS_System_Guide.md
jonghhhh's picture
Add detailed Parquet files comparison section
afd99b0
# 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๊ฑด)](file:///c:/vscode/crawling_chatbot/ํŽ˜๋ฅด์†Œ๋‚˜_์„ค๋ฌธ์กฐ์‚ฌ_์ „๊ตญ์ง€ํ‘œ์กฐ์‚ฌ/NBS_Question_List.md)
- **์ฒ˜๋ฆฌ ๋‚ด์šฉ**:
- **ํ†ตํ•ฉ**: 163๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์„ค๋ฌธ ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ ๋ฐ์ดํ„ฐ์…‹์œผ๋กœ ๋ณ‘ํ•ฉ.
- **๊ฐ’ ํ‘œ์ค€ํ™”**: "๋‚จ/์—ฌ", "๋‚จ์„ฑ/์—ฌ์„ฑ" ๋“ฑ ๋‹ค์–‘ํ•œ ํ‘œ๊ธฐ๋ฅผ "๋‚จ์ž/์—ฌ์ž"๋กœ ํ†ต์ผ.
### ๋‹จ๊ณ„ 3: ์งˆ๋ฌธ ์˜๋ฏธ๋ก ์  ์ธ๋ฑ์‹ฑ (`index_questions.py` โ†’ `nbs_questions_index.parquet`)
- **๊ณ ์œ  ๋ฌธํ•ญ ์ถ”์ถœ ๋ฐ ์œ ๋‹ˆํ”ผ์ผ€์ด์…˜(Unification) ๊ธฐ์ˆ **:
163ํšŒ์˜ ์„ค๋ฌธ์กฐ์‚ฌ์—์„œ ํŒŒํŽธํ™”๋œ ์งˆ๋ฌธ๋“ค์„ **1,219๊ฐœ**์˜ ๊ณ ์œ  ์ง€์‹์œผ๋กœ ํ†ตํ•ฉํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๊ธฐ์ˆ ์ด ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
1. **Preprocessing (์ง€๋Šฅํ˜• ๋งคํ•‘)**: ์›๋ณธ ๋ฐ์ดํ„ฐ์˜ ๋ณ€์ˆ˜๋ช…(`q1`)์„ PDF๋ฅผ ํ†ตํ•ด **์ „์ฒด ๋ฌธ์žฅ**์œผ๋กœ ๋ณต์›ํ•˜์—ฌ ํ†ตํ•ฉ์˜ ๊ธฐ์ดˆ๋ฅผ ๋งˆ๋ จํ–ˆ์Šต๋‹ˆ๋‹ค.
2. **Noise Reduction (๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ œ์™ธ)**: ์•„์ด๋””, ๊ฐ€์ค‘์น˜ ๋“ฑ ๋น„์งˆ๋ฌธ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ์™ธํ•˜์—ฌ ์ˆœ์ˆ˜ ์งˆ๋ฌธ **1,219๊ฑด**์„ ํ™•๋ณดํ–ˆ์Šต๋‹ˆ๋‹ค.
3. **Stable Vector Search (๊ณ ์„ฑ๋Šฅ ์„ ํ˜• ๊ฒ€์ƒ‰)**:
- **๋ณ€๊ฒฝ ์‚ฌํ•ญ**: ๊ธฐ์กด์˜ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(ChromaDB) ๋Œ€์‹ , **Pandas + NumPy ๊ธฐ๋ฐ˜์˜ ์„ ํ˜• ๋ฒกํ„ฐ ๊ฒ€์ƒ‰** ๋ฐฉ์‹์„ ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.
- **์ด์œ **: Windows ํ™˜๊ฒฝ์—์„œ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธํ™˜์„ฑ(HNSW ์˜ค๋ฅ˜)์„ ์™„๋ฒฝํžˆ ํ•ด๊ฒฐํ•˜๊ณ , 1,219๊ฑด ์ •๋„์˜ ๋ฐ์ดํ„ฐ ๊ทœ๋ชจ์—์„œ๋Š” ๋ณ„๋„ DB ์—”์ง„ ์—†์ด๋„ ์†Œ์ˆ˜ ๋ฐ€๋ฆฌ์ดˆ(ms) ๋‹จ์œ„์˜ ์ดˆ๊ณ ์† ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
4. **Virtual Unification (์˜๋ฏธ๋ก ์  ๋ณด์ •)**: ๋ฏธ์„ธํ•˜๊ฒŒ ๋‹ค๋ฅธ ์งˆ๋ฌธ๋“ค์€ SBERT ์ž„๋ฒ ๋”ฉ๊ณผ ์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„(Cosine Similarity) ๊ณ„์‚ฐ์„ ํ†ตํ•ด ๊ฒ€์ƒ‰ ์‹œ์ ์— ์ง€๋Šฅ์ ์œผ๋กœ ํ†ตํ•ฉ ์ฐธ์กฐ๋ฉ๋‹ˆ๋‹ค.
- **์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ**: `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)
์‹œ์Šคํ…œ์€ '๋ˆ„๊ตฌ์ธ์ง€(์ธ๊ตฌํ†ต๊ณ„)'์™€ '์–ด๋–ค ์„ฑํ–ฅ์ธ์ง€(๊ณผ๊ฑฐ ๋‹ต๋ณ€)'๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
```mermaid
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`)๋ณด๋‹ค ๋งŽ์„ ๊ฒฝ์šฐ, ์‹œ์Šคํ…œ์€ ์ง‘๋‹จ ๋‚ด ํŽธํ–ฅ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ๋“ค ์ค‘ ๋ฌด์ž‘์œ„๋กœ ์ตœ์ข… ๋Œ€์ƒ์ž๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
- **Q: ์™œ ์งˆ๋ฌธ๊ณผ ๊ฐ€์žฅ ์œ ์‚ฌํ•œ ๋‹ต๋ณ€์„ ํ•œ ์‚ฌ๋žŒ์„ ์ˆœ์„œ๋Œ€๋กœ ๋ฝ‘์ง€ ์•Š๊ณ  ๋ฌด์ž‘์œ„๋กœ ๋ฝ‘๋‚˜์š”?**
- **์„ ํƒ ํŽธํ–ฅ(Selection Bias) ๋ฐฉ์ง€**: ์งˆ๋ฌธ๊ณผ ์œ ์‚ฌํ•œ ์ƒ๊ฐ์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ๋งŒ ๊ณจ๋ผ๋‚ธ๋‹ค๋ฉด, ํ•ด๋‹น ์„ธ๋Œ€๋‚˜ ์ง€์—ญ ๋‚ด์˜ ๋‹ค์–‘ํ•œ ๊ฐ€์น˜๊ด€์ด ์†Œ๋ฉธํ•˜๊ณ  ๋‹จ์ผํ•œ ๋ชฉ๋‹จ๋งŒ ๋‚จ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
- **ํ†ต๊ณ„์  ๋‹ค์–‘์„ฑ ๋ณด์กด**: ๊ฐ™์€ '์„œ์šธ 30๋Œ€ ์—ฌ์„ฑ'์ด๋ผ๋„ ์ง„๋ณด/๋ณด์ˆ˜, ๋ถ€์œ ํ•จ/๊ฐ€๋‚œํ•จ ๋“ฑ ๋‹ค์–‘ํ•œ ํŽ˜๋ฅด์†Œ๋‚˜๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋ฌด์ž‘์œ„ ์ƒ˜ํ”Œ๋ง์„ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ์ง‘๋‹จ ๋‚ด **๋‹ค์–‘ํ•œ ์ŠคํŽ™ํŠธ๋Ÿผ์˜ ๋ชฉ์†Œ๋ฆฌ**๋ฅผ ๊ณจ๊ณ ๋ฃจ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์— ๋ฐ˜์˜ํ•˜์—ฌ ์‹ค์ œ ์—ฌ๋ก  ์ง€ํ˜•์— ๊ฐ€๊นŒ์šด ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.
---
## 4. ์ž‘๋™ ์‚ฌ๋ก€ (Example Case Study)
**[์‚ฌ์šฉ์ž ์ž…๋ ฅ]**
- ์งˆ๋ฌธ: "๊ธฐ๋ณธ์†Œ๋“์ œ ๋„์ž…์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?"
- ์กฐ๊ฑด: ์„ฑ๋ณ„=๋‚จ์ž, ์ง€์—ญ=์„œ์šธ, ์—ฐ๋ น=40, ์ง์—…=์ž์˜์—…
**[์‹œ์Šคํ…œ ๋‚ด๋ถ€ ์ž‘๋™]**
1. **๋ฐ์ดํ„ฐ ํ•„ํ„ฐ๋ง**: `consolidated_nbs_data.parquet`์—์„œ ์„œ์šธ ๊ฑฐ์ฃผ 40์„ธ ๋‚จ์„ฑ ์ž์˜์—…์ž๋“ค์„ ์ถ”์ถœ.
2. **์œ ์‚ฌ ์งˆ๋ฌธ ๊ฒ€์ƒ‰**: ChromaDB์—์„œ "๋ณต์ง€ ์ •์ฑ… ํ™•๋Œ€", "์žฌ์ •๋‚œ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ" ๋“ฑ์˜ ์งˆ๋ฌธ์„ ์œ ์‚ฌ ๋ฌธํ•ญ์œผ๋กœ ์„ ์ •.
3. **์ปจํ…์ŠคํŠธ ๊ตฌ์ถ•**: ์ถ”์ถœ๋œ ์‘๋‹ต์ž ์ค‘ ํ•œ ๋ช…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‹ˆ:
* ์ •์น˜ ์„ฑํ–ฅ: ๋ณด์ˆ˜
* ๋ณต์ง€ ์ •์ฑ…์— ๋Œ€ํ•œ ๋‹ต๋ณ€: "๋ฐ˜๋Œ€ (์„ธ๊ธˆ ๋ถ€๋‹ด ์ฆ๋Œ€ ์šฐ๋ ค)"
* ๋ถ€๋™์‚ฐ ๊ฐ€๊ฒฉ์— ๋Œ€ํ•œ ๋‹ต๋ณ€: "๊ธ‰๋“ฑ ๋ฐ˜๋Œ€"
4. **LLM ์ƒ์„ฑ (Gemini)**:
* ์œ„ ์ •๋ณด๋“ค์„ ์ข…ํ•ฉํ•˜์—ฌ "๋ณด์ˆ˜์  ๊ฐ€์น˜๊ด€์„ ๊ฐ€์ง„ 40๋Œ€ ์ž์˜์—…์ž๋กœ์„œ, ์„ธ๊ธˆ ๋ถ€๋‹ด์ด ๋Š˜์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ์†Œ๋“์ œ์— ๋Œ€ํ•ด์„œ๋Š” ์‹ ์ค‘ํ•˜๊ฑฐ๋‚˜ ๋ฐ˜๋Œ€ํ•˜๋Š” ์ž…์žฅ"์˜ ๋‹ต๋ณ€์„ ์ƒ์„ฑ.
* ๊ฒฐ๊ณผ JSON์˜ `referenced_context`์— ์œ„์˜ ์ฐธ์กฐ๋œ ๊ณผ๊ฑฐ ๋‹ต๋ณ€๋“ค์„ ๋…ธ์ถœ.
---
## 5. ํ˜„์žฌ ์‚ฌ์šฉ ๋ฐฉ๋ฒ• (Usage Guide)
์„ค๋ฌธ ์‹œ์Šคํ…œ์€ `ํŽ˜๋ฅด์†Œ๋‚˜_์„ค๋ฌธ์กฐ์‚ฌ_์ „๊ตญ์ง€ํ‘œ์กฐ์‚ฌ` ํด๋” ๋‚ด์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
### ์˜ต์…˜ A: ์‹ค์ œ ์‘๋‹ต์ž ์ƒ˜ํ”Œ๋ง ๋ชจ๋“œ (`avatar_actual.py`)
์‹ค์ œ ๊ณผ๊ฑฐ ์‘๋‹ต์ž๋“ค์˜ ๋‹ต๋ณ€ ์ด๋ ฅ์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ฐ€์žฅ ์ƒ์ƒํ•œ ์‘๋‹ต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
```powershell
# ์˜ˆ์‹œ 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`)
ํŠน์ • ๊ทธ๋ฃน์˜ ํ†ต๊ณ„์  ๋‹ต๋ณ€ ๋ถ„ํฌ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๊ฐ€์ƒ์˜ ํŽ˜๋ฅด์†Œ๋‚˜ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
```powershell
# ์˜ˆ์‹œ: ์„œ์šธ ๊ฑฐ์ฃผ 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`)]
1. **๋™์ž‘**: ์„œ์šธ 20๋Œ€ ์—ฌ์„ฑ ํ•™์ƒ ๋ฐ์ดํ„ฐ ์ค‘ 5๋ช…์„ ๋ฌด์ž‘์œ„๋กœ ๋ฝ‘์Šต๋‹ˆ๋‹ค.
2. **์ปจํ…์ŠคํŠธ**:
- ์•„๋ฐ”ํƒ€ 1ํ˜ธ: "๊ณผ๊ฑฐ์— ์žฅํ•™๊ธˆ ํ˜œํƒ ๋ถ€์กฑ์— ๋ถˆ๋งŒ์ด๋ผ๊ณ  ๋‹ตํ–ˆ์Œ, ๋ถ€๋ชจ๋‹˜ ๊ฒฝ์ œ๋ ฅ ๋‚ฎ์Œ"
- ์•„๋ฐ”ํƒ€ 2ํ˜ธ: "๊ณผ๊ฑฐ์— ๊ต์œก ์งˆ ์ €ํ•˜ ์šฐ๋ ค๋กœ ์ •๋ถ€ ๊ฐœ์ž… ๋ฐ˜๋Œ€ํ•œ๋‹ค๊ณ  ๋‹ตํ–ˆ์Œ"
3. **๊ฒฐ๊ณผ**: ์•„๋ฐ”ํƒ€๋งˆ๋‹ค ๋ณธ์ธ์˜ **๊ฐœ์ธ์  ์‚ฌ์ •**์ด ๋“ฌ๋ฟ ๋‹ด๊ธด ์ œ๊ฐ๊ฐ์˜ ๋‹ต๋ณ€์„ ๋‚ด๋†“์Šต๋‹ˆ๋‹ค. (ํ˜„์‹ค์„ฑ ๋†’์Œ)
#### [์˜ต์…˜ B: ๊ฐ€์ƒ ํ†ต๊ณ„ ๋ชจ๋“œ (`avatar_synthetic.py`)]
1. **๋™์ž‘**: ์„œ์šธ 20๋Œ€ ์—ฌ์„ฑ ํ•™์ƒ ์ˆ˜์ฒœ ๋ช…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ต๊ณ„๋กœ ๋ƒ…๋‹ˆ๋‹ค.
2. **์ปจํ…์ŠคํŠธ**:
- "ํ•ด๋‹น ๊ทธ๋ฃน์˜ 75%๋Š” ๋“ฑ๋ก๊ธˆ ๋ถ€๋‹ด์ด ๋งค์šฐ ๋†’๋‹ค๊ณ  ๋‹ตํ–ˆ์œผ๋ฉฐ, 15%๋Š” ๋Œ€ํ•™์˜ ์žฌ์ • ํˆฌ๋ช…์„ฑ์„ ๊ฐ•์กฐํ–ˆ์Šต๋‹ˆ๋‹ค."
3. **๊ฒฐ๊ณผ**: "์šฐ๋ฆฌ ์„ธ๋Œ€์˜ ๋Œ€๋‹ค์ˆ˜๊ฐ€ ๋“ฑ๋ก๊ธˆ ๋ถ€๋‹ด์œผ๋กœ ๊ณ ํ†ต๋ฐ›๊ณ  ์žˆ์œผ๋ฉฐ..."์™€ ๊ฐ™์ด **๊ทธ๋ฃน์˜ ๋Œ€ํ‘œ์„ฑ**์„ ๋ค ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. (๊ฒฝํ–ฅ์„ฑ ํŒŒ์•… ์šฉ์ด)
---
### 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 ๊ฒ€์ƒ‰
- ์˜ˆ: "์ •๋…„ ์—ฐ์žฅ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์„ธ์š”?" โ†’ ์œ ์‚ฌ ์งˆ๋ฌธ: "์ •๋…„ํ‡ด์ง ์—ฐ๋ น ์กฐ์ •", "๊ณ ๋ น์ž ๊ณ ์šฉ ์ •์ฑ…" ๋“ฑ
**์ƒ์„ฑ ๋ฐฉ๋ฒ•**:
```python
# 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๊ฐœ ์งˆ๋ฌธ (ํฌ์†Œ ํ–‰๋ ฌ)
**์—ญํ• **:
1. **์‘๋‹ต์ž ํ•„ํ„ฐ๋ง**: ์ธ๊ตฌํ†ต๊ณ„ ์กฐ๊ฑด(์„ฑ๋ณ„/์—ฐ๋ น/์ง€์—ญ/์ง์—…)์œผ๋กœ ํŠน์ • ์‘๋‹ต์ž ์ถ”์ถœ
2. **๊ณผ๊ฑฐ ๋‹ต๋ณ€ ์ฐธ์กฐ**: ์„ ํƒ๋œ ์‘๋‹ต์ž์˜ ์œ ์‚ฌ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ์‹ค์ œ ๋‹ต๋ณ€ ์ด๋ ฅ์„ LLM ์ปจํ…์ŠคํŠธ๋กœ ์ œ๊ณต
3. **ํ†ต๊ณ„ ์ง‘๊ณ„**: Synthetic ๋ชจ๋“œ์—์„œ ๊ทธ๋ฃน ์ „์ฒด์˜ ๋‹ต๋ณ€ ๋ถ„ํฌ ํ†ต๊ณ„ ๊ณ„์‚ฐ
**ํŠน์ง•**:
- **Sparse Matrix**: ๊ฐ ์‘๋‹ต์ž๋Š” ์ „์ฒด 1,219๊ฐœ ์งˆ๋ฌธ ์ค‘ ํ‰๊ท  20~30๊ฐœ๋งŒ ๋‹ต๋ณ€ (๋‚˜๋จธ์ง€๋Š” NaN)
- **์••์ถ• ํšจ์œจ**: Parquet์˜ ํšจ์œจ์ ์ธ ์••์ถ•์œผ๋กœ 13๋งŒ ๊ฐœ ์ด์ƒ์˜ ์…€ ์ค‘ ๋Œ€๋ถ€๋ถ„์ด ๋น„์–ด์žˆ์–ด๋„ 6.7MB๋กœ ์œ ์ง€
---
### 3) ๋‘ ํŒŒ์ผ์˜ ์ž‘๋™ ํ๋ฆ„ (Data Flow)
```mermaid
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[์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋‹ต๋ณ€ ์ƒ์„ฑ]
```
**๋‹จ๊ณ„๋ณ„ ์˜ˆ์‹œ**:
1. **์‚ฌ์šฉ์ž ์ž…๋ ฅ**: "๊ธฐ๋ณธ์†Œ๋“์ œ ๋„์ž…์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?" (์กฐ๊ฑด: ์„œ์šธ, 40๋Œ€, ๋‚จ์„ฑ, ์ž์˜์—…)
2. **์งˆ๋ฌธ ๊ฒ€์ƒ‰** (`nbs_questions_index.parquet` ์‚ฌ์šฉ):
- ์œ ์‚ฌ ์งˆ๋ฌธ ๋ฐœ๊ฒฌ: "๋ณต์ง€ ์ •์ฑ… ํ™•๋Œ€", "์žฌ์ • ์ง€์ถœ ์ฆ๊ฐ€", "์†Œ๋“ ์žฌ๋ถ„๋ฐฐ" ๋“ฑ
3. **์‘๋‹ต์ž ํ•„ํ„ฐ๋ง** (`consolidated_nbs_data.parquet` ์‚ฌ์šฉ):
- ์„œ์šธ ๊ฑฐ์ฃผ + 40๋Œ€ + ๋‚จ์„ฑ + ์ž์˜์—…์ž โ†’ 234๋ช… ์ถ”์ถœ
- ๋ฌด์ž‘์œ„ ์ƒ˜ํ”Œ๋ง โ†’ 5๋ช… ์„ ์ •
4. **์ปจํ…์ŠคํŠธ ๊ตฌ์„ฑ**:
- ๊ฐ ์‘๋‹ต์ž๋ณ„๋กœ ์œ„ ์œ ์‚ฌ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๊ณผ๊ฑฐ ๋‹ต๋ณ€ ์กฐํšŒ
- ์‘๋‹ต์ž A: "๋ณต์ง€ ์ •์ฑ… ํ™•๋Œ€ โ†’ ๋ฐ˜๋Œ€ (์„ธ๊ธˆ ๋ถ€๋‹ด)", "์žฌ์ • ์ง€์ถœ ์ฆ๊ฐ€ โ†’ ์‹ ์ค‘ํ•ด์•ผ"
- ์‘๋‹ต์ž B: "๋ณต์ง€ ์ •์ฑ… ํ™•๋Œ€ โ†’ ์ฐฌ์„ฑ (์„œ๋ฏผ ๋ณดํ˜ธ)", "์†Œ๋“ ์žฌ๋ถ„๋ฐฐ โ†’ ํ•„์š”"
5. **LLM ์ƒ์„ฑ**: ์œ„ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ฐ ์‘๋‹ต์ž๊ฐ€ "๊ธฐ๋ณธ์†Œ๋“์ œ"์— ๋Œ€ํ•ด ๋‹ต๋ณ€ํ•  ๋‚ด์šฉ ์˜ˆ์ธก
---
## 9. ๋ฌธ์ œ ํ•ด๊ฒฐ (Troubleshooting)
### ์ธ๋ฑ์Šค ํŒŒ์ผ ์œ ์‹ค
๋งŒ์•ฝ `nbs_questions_index.parquet` ํŒŒ์ผ์ด ์‚ญ์ œ๋˜๊ฑฐ๋‚˜ ์†์ƒ๋˜์—ˆ๋‹ค๋ฉด, `index_questions.py`๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜์—ฌ 1๋ถ„ ๋‚ด์™ธ๋กœ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
```powershell
cd ํŽ˜๋ฅด์†Œ๋‚˜_์„ค๋ฌธ์กฐ์‚ฌ_์ „๊ตญ์ง€ํ‘œ์กฐ์‚ฌ
..\.venv\Scripts\python.exe index_questions.py
```
*(๊ธฐ์กด์˜ nbs_db_stable ํด๋” ๋ฐ ChromaDB ์ธ๋ฑ์Šค ๋กœ๋“œ ์˜ค๋ฅ˜๋Š” ์‹œ์Šคํ…œ์ด Parquet ๊ธฐ๋ฐ˜ ์„ ํ˜• ๊ฒ€์ƒ‰์œผ๋กœ ์ „ํ™˜๋จ์— ๋”ฐ๋ผ ๋” ์ด์ƒ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)*