- νλ‘μ νΈ μκ°
- ν리뷰
- νμ λ° μν
- μ£Όμ νλ©΄
- μμ€ν μν€ν μ²
- μ£Όμ κΈ°λ₯
- κΈ°μ μ€ν
- νλ‘μ νΈ κ΅¬μ‘°
- λΉ λ₯Έ μμ
- μ±λ₯ λ° λΉμ©
- κΈ°λ ν¨κ³Ό
- λΌμ΄μ μ€
All is Wellμ λ°©λν ν¨λ λ°μ΄ν°λ² μ΄μ€μμ μ¬μ©μμ μμ°μ΄ μ§μλ₯Ό μ§λ₯μ μΌλ‘ μ²λ¦¬νμ¬ μ΅μ μ ν¨λμ μΆμΆνλ μ°¨μΈλ κ²μ μμ€ν μ λλ€. "μΊ νμ μ’μνλ 30λ μμΈ κ±°μ£Ό μ¬μ±"κ³Ό κ°μ μμ°μ΄ μ§μλ§μΌλ‘ λ°μ΄ν°λ² μ΄μ€μ μ μ₯λ ν¨λκ³Ό ν¨λμ μ€λ¬Έ μλ΅ λ°μ΄ν°λ₯Ό κ²μνκ³ , AIκ° μμ±ν νλ₯΄μλ λ° ν΅κ³ μκ°νλ₯Ό ν΅ν΄ μ¦κ°μ μΈ μΈμ¬μ΄νΈλ₯Ό μ 곡ν©λλ€.
- ν€μλ κΈ°λ° κ²μμΌλ‘ μΆμμ μ§μ μ²λ¦¬ λΆκ°
- ν¨μ¨μ±κ³Ό μ νμ±μ νΈλ μ΄λμ€ν λ¬Έμ
- κ²μ κ²°κ³Όμ μ νμ νμ© (λ¨μ λͺ©λ‘λ§ μ 곡)
- λΉμ°μμ κ²μ κ²½ν (λ§€λ² μλ‘ κ²μ)
- μ λ°μ΄ν° μΆκ° μ κΈ΄ μ μ²λ¦¬ μκ°
- μ μν νμ΄λΈλ¦¬λ κ²μ: μ§μ λμ΄λ μλ λΆλ₯ (SQL/μλ² λ© λμ μ ν)
- μ§λ₯ν κ·Έλ£Ή λΆμ: LLM κΈ°λ° νλ₯΄μλ μμ± λ° AI μ΄λ―Έμ§ μκ°ν
- λνν μ°μ κ²μ: LangGraph μΈμ κ΄λ¦¬λ‘ λ릴λ€μ΄ μ§μ
- μ€μκ° ν΅κ³ μκ°ν: Chart.js μΈν°λν°λΈ μ°¨νΈ
- BGE κΈ°λ° λ¦¬λνΉ: μ μ²λ¦¬ μμ΄ μ§λ¬Έ-μλ΅ μλ―Έ μ μ¬μ± κ³μ°
- λ©μΈ κ²μ νλ©΄
- κ²μ κ²°κ³Ό νλ©΄
- κ·Έλ£Ή νλ₯΄μλ: LLM μμ± ν μ€νΈ + AI μ΄λ―Έμ§ + ν΄μνκ·Έ
- ν΅κ³ μ°¨νΈ: μ°λ Ήλ/μ±λ³/μ§μ/μ§μ λΆν¬ μκ°ν
- κ°λ³ ν¨λ: μ μ¬λ μ μ + λ§€μΉλ μ§λ¬Έ μλ΅

- ν¨λ μμΈ νμ΄μ§
- κ²μ νμ€ν 리 & λΌμ΄λΈλ¬λ¦¬
- μ¬μ©μ μΈν°νμ΄μ€
- κ²μ, νμ€ν 리, λΌμ΄λΈλ¬λ¦¬ κ΄λ¦¬
- Chart.js ν΅κ³ μκ°ν
- TanStack Query μλ² μν κ΄λ¦¬
- μ¬μ©μ μΈμ¦ (JWT)
- κ²μ κ²°κ³Ό μΊμ κ΄λ¦¬
- νμ€ν 리 & λΌμ΄λΈλ¬λ¦¬ CRUD
- CSV λ€μ΄λ‘λ μ 곡
- νλ‘μ ν¨ν΄μΌλ‘ 보μ κ°ν
- LangGraph 3-Tier κ²μ μν¬νλ‘μ°
- LLM κΈ°λ° μΏΌλ¦¬ λΆμ & κ²°κ³Ό μμ½
- ChromaDB λ²‘ν° κ²μ
- BGE Reranker μ¬μμν
- νλ₯΄μλ & μ΄λ―Έμ§ μμ±
- SQLite: ꡬ쑰ν λ°μ΄ν° (ν¨λ μ 보, μ ν μ§μ μλ΅ λ°μ΄ν°)
- ChromaDB: λ²‘ν° κ²μ (λΉμ ν μ§λ¬Έ + μλ΅)
μ¬μ©μ 쿼리: "μμΈ 20λ μ¬μ± μ€ ChatGPT μ¬μ©νλ μ¬λ"
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Step 1: LLM 쿼리 λΆμ (gpt-4o-mini) β
β { β
β demographics: {region: "μμΈ", age: [20-29], gender: "μ¬μ±"}β
β structured_keywords: [] β
β semantic_queries: ["ChatGPT μ¬μ©"] β
β } β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Step 2: Tier 1 - Demographics SQL (μΈκ΅¬ν΅κ³ νν°) β
β WHERE region='μμΈ' AND gender='μ¬μ±' AND age BETWEEN 20-29β
β β 1,234λͺ
ν보 μΆμΆ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Step 3: Tier 2 - Structured SQL (ꡬ쑰ν ν€μλ) β
β SKIP (ν΄λΉ μμ) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Step 4: Tier 3 - Semantic Vector Search + BGE Reranker β
β [1] Question-First: 44κ° μ§λ¬Έ κ²μ β AI κ΄λ ¨ 5κ° μ§λ¬Έ μ μ β
β [2] Answer Search: 1,234λͺ
ν보 μ€ 5κ° μ§λ¬Έ λ΅λ³λ§ κ²μ β
β [3] BGE Reranker: Cross-encoderλ‘ μ¬μμν β
β β Top 100λͺ
μ μ (match_score: 0.85~0.95) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Step 5: LLM κ²°κ³Ό μμ½ & νλ₯΄μλ μμ± β
β "μμΈ κ±°μ£Ό 20λ μ¬μ± 100λͺ
(ChatGPT μ¬μ©μ)" β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ- Tier 1-2λ§ μ¬μ©: ~100ms β‘
- Full Pipeline (GPU): ~17μ΄
- Full Pipeline (CPU): ~2.5λΆ
κ·Έλ£Ή νλ₯΄μλ (LLM μμ±)
{
"text": "30λ μ΄λ°μ μ‘ν°λΈν μμλμ΄ μ νΈκ°λ‘, μ£Όλ§λ§λ€ λ±μ°μ΄λ μΊ νμ μ¦κΈ°λ©°...",
"hashtags": ["#μμλμ΄", "#30λ", "#μ‘ν°λΈ", "#μΊ ν"],
"image_url": "data:image/png;base64,iVBORw0KG..."
}-
ν μ€νΈ: GPT-4o-miniκ° κ·Έλ£Ή νΉμ± μμ½
-
ν΄μνκ·Έ: ν΅μ¬ ν€μλ μΆμΆ
-
μ΄λ―Έμ§: Nano Banana λͺ¨λΈλ‘ μκ°ν
-
κ°λ³ νλ₯΄μλ (36,113κ° μ¬μ μμ±)
-
κ° ν¨λμ μ±ν₯, κ΄μ¬μ¬, λΌμ΄νμ€νμΌ μμ½
-
κ²μ μ μ μ¬λ μ μμ ν¨κ» μ 곡
-
Chart.js κΈ°λ° μ°¨νΈ
-
μ°λ Ήλλ³ λΆν¬ (λ§λ κ·Έλν)
-
μ±λ³ λΆν¬ (μν μ°¨νΈ)
-
μ§μλ³ λΆν¬ (λ§λ κ·Έλν)
-
μ§μ λ³ λΆν¬ (κ°λ‘ λ§λ)
-
μλλ³ λΆν¬ (μ κ·Έλν)
ν΄λ¦ ν λ²μΌλ‘ μ°¨νΈ μ ν
// μ¬μ©μκ° "μ°λ Ήλ" ν΄λ¦ β BarChart λ λλ§
<BarChart
data={{
labels: ["20λ", "30λ", "40λ"],
values: [50, 300, 100]
}}
title="μ°λ Ήλλ³ λΆν¬"
/>μ°μ μ§λ¬Έ μλ리μ€:
1μ°¨ κ²μ: "μΊ ν μ’μνλ μ¬λ" β 450λͺ
β session_id μ μ§
2μ°¨ κ²μ: "μ΄ μ€μμ μμΈ κ±°μ£Όμ" β 120λͺ
β session_id μ μ§
3μ°¨ κ²μ: "μ΄ μ€μμ 30λλ§" β 80λͺ
LangGraph μν κ΄λ¦¬:
- μ΄μ κ²°κ³Ό μ§ν© λ΄μμλ§ μΆκ° νν°λ§
- μ 체 μ¬κ²μ λΆνμ β ν¨μ¨μ± κ·Ήλν
CSV λ€μ΄λ‘λ
ν¨λID,λμ΄,μ±λ³,μ§μ,ꡬμ,μ§μ
,μμ½,μ μ¬λ
PANEL_001,32,λ¨μ±,μμΈ,κ°λ¨κ΅¬,IT κ°λ°μ,μ£Όλ§λ§λ€ μΊ νμ...,0.95- UTF-8 BOMμΌλ‘ νκΈ κΉ¨μ§ λ°©μ§
- νμμ€ν¬ν νμΌλͺ
:
panel_results_20241128_143022.csv
κ²μ νμ€ν 리
- μ΅κ·Ό κ²μ μλ μ μ₯
- ν΄λ¦μΌλ‘ μ΄μ κ²°κ³Ό μ¦μ 볡μ
λΌμ΄λΈλ¬λ¦¬
- μμ£Ό μ¬μ©νλ κ²μ μ μ₯
- μ¬μ©μ μ§μ μ λͺ© κ΄λ¦¬
React 18.x UI λΌμ΄λΈλ¬λ¦¬
TypeScript νμ
μμ μ±
Vite λΉλ λꡬ (λΉ λ₯Έ HMR)
TanStack Query μλ² μν κ΄λ¦¬ & μΊμ±
Zustand ν΄λΌμ΄μΈνΈ μ μ μν
React Router v6 λΌμ°ν
Axios HTTP ν΄λΌμ΄μΈνΈ
Tailwind CSS μ νΈλ¦¬ν° κΈ°λ° μ€νμΌλ§
Chart.js λ°μ΄ν° μκ°ν
Lucide React μμ΄μ½
FastAPI 0.115+ λΉλκΈ° REST API νλ μμν¬
Python 3.10+ νλ‘κ·Έλλ° μΈμ΄
Uvicorn ASGI μλ²
SQLite 3 λ‘컬 λ°μ΄ν°λ² μ΄μ€
Pydantic 2.x λ°μ΄ν° κ²μ¦ & μ§λ ¬ν
httpx λΉλκΈ° HTTP ν΄λΌμ΄μΈνΈ
python-jose JWT ν ν°
FastAPI 0.115+ λΉλκΈ° API μλ²
Python 3.13 BGE Reranker μμ‘΄μ±
LangGraph StateGraph μν¬νλ‘μ°
LangChain LLM Chains
OpenAI gpt-4o-mini 쿼리 λΆμ & κ²°κ³Ό μμ½
ChromaDB λ²‘ν° λ°μ΄ν°λ² μ΄μ€
OpenAI text-embedding μλ² λ© (1536-dim)
BGE Reranker v2-m3 μ¬μμν (λ‘컬, 무λ£)
sentence-transformers BGE λͺ¨λΈ λ‘λ
SQLite ꡬ쑰ν λ°μ΄ν° (111MB)
- 36,113λͺ
ν¨λ μ 보
- 636,248건 μ€λ¬Έ μλ΅
- κ²μ μΊμ & νμ€ν 리
ChromaDB λ²‘ν° κ²μ (~1.5GB)
- 44κ° μ§λ¬Έ μλ² λ©
- ~202Kκ° λ΅λ³ μλ² λ©
AllIsWell/
βββ Frontend/ # React νλ‘ νΈμλ
β βββ src/
β β βββ api/ # API ν΅μ λ μ΄μ΄
β β β βββ auth.js
β β β βββ search.js
β β β βββ history.js
β β β βββ library.js
β β βββ components/ # μ¬μ¬μ© μ»΄ν¬λνΈ
β β β βββ common/
β β β βββ SearchResult/
β β β βββ panelDetail/
β β β βββ ...
β β βββ pages/ # νμ΄μ§
β β β βββ Login/
β β β βββ Main/
β β β βββ SearchResult/
β β β βββ History/
β β βββ hooks/ # 컀μ€ν
ν
β β βββ utils/ # μ νΈλ¦¬ν°
β βββ package.json
β βββ vite.config.js
β
βββ Backend/ # FastAPI API μλ²
β βββ src/
β β βββ app/
β β βββ db/ # λ°μ΄ν°λ² μ΄μ€
β β βββ routers/ # API λΌμ°ν°
β β β βββ auth.py
β β β βββ search.py
β β β βββ history_api.py
β β β βββ library_api.py
β β βββ schemas/ # Pydantic μ€ν€λ§
β βββ databases/
β β βββ main.db
β βββ main.py
β βββ requirements.txt
β
βββ DataPipeline/ # FastAPI + LangGraph
βββ src/
β βββ pipeline_v4/ # λ©μΈ νμ΄νλΌμΈ
β β βββ pipeline.py
β β βββ graph.py # LangGraph StateGraph
β β βββ nodes.py # 6κ° λ
Έλ
β β βββ chains.py # LLM Chains
β β βββ retrievers.py # 3-Tier κ²μ
β β βββ config.py
β βββ api/
β β βββ question_first_search.py
β βββ database/
β βββ embeddings/
β β βββ embedding_service.py
β β βββ vector_db.py
β β βββ reranker.py # BGE Reranker
β βββ extractors/
βββ databases/
β βββ PersonaSurveyData.db # SQLite (111MB)
β βββ chroma_db_questions/ # μ§λ¬Έ 벑ν°
β βββ chroma_db_answers/ # λ΅λ³ 벑ν°
βββ scripts/ # DB μμ± μ€ν¬λ¦½νΈ
βββ requirements.txt
μ¬μ μꡬμ¬ν
Node.js 18.x μ΄μ Python 3.10 μ΄μ (νμ΄νλΌμΈμ 3.13 κΆμ₯) OpenAI API Key Gemini API Key
1οΈβ£ Frontend μ€μ λ° μ€ν
cd Frontend
# μμ‘΄μ± μ€μΉ
npm install
# νκ²½ λ³μ μ€μ
echo "VITE_API_URL=http://localhost:5001" > .env
# κ°λ° μλ² μ€ν
npm run dev
# β http://localhost:5173
2οΈβ£ Backend (API Server) μ€μ λ° μ€ν
cd Backend
# κ°μνκ²½ μμ± λ° νμ±ν
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# μμ‘΄μ± μ€μΉ
pip install -r requirements.txt
# λ°μ΄ν°λ² μ΄μ€ μ΄κΈ°ν
python create_db_tables.py
# μλ² μ€ν
python main.py
# β http://localhost:5001
# Swagger UI: http://localhost:5001/docs
3οΈβ£ Data Pipeline μ€μ λ° μ€ν
cd DataPipeline
# Python 3.13 κ°μνκ²½ (BGE Reranker νμ)
python3.13 -m venv .venv313
source .venv313/bin/activate
# μμ‘΄μ± μ€μΉ
pip install -r requirements.txt
# OpenAI API ν€ μ€μ
export OPENAI_API_KEY='your-api-key'
# λ°μ΄ν° μ μ²λ¦¬ (μΌνμ±)
cd scripts/
python preprocess_only.py
python create_question_embeddings.py
python create_answer_embeddings.py
cd ..
# νμ΄νλΌμΈ μλ² μ€ν
python run_pipeline.py
# β http://localhost:8000
4οΈβ£ μ 체 μμ€ν μ€ν μμ
# Terminal 1: Data Pipeline
cd DataPipeline
source .venv313/bin/activate
python run_pipeline.py
# Terminal 2: API Server
cd Backend
source venv/bin/activate
python main.py
# Terminal 3: Frontend
cd Frontend
npm run dev
μ μ: http://localhost:5173
λ°μ΄ν° κ·λͺ¨
- ν¨λ: ~3λ§ 7μ²λͺ
- μ§λ¬Έ: ~60κ°
- μλ΅: ~64λ§κ±΄
- νλ₯΄μλ: ~3λ§ 7μ²κ°
- λ°μ΄ν°λ² μ΄μ€: 111MB (SQLite) + ~1.5GB (ChromaDB)
κ²μ μ±λ₯
| κ²μ μ ν | μ¬μ© Tier | μ²λ¦¬ μκ° | μ€λͺ |
|---|---|---|---|
| μΈκ΅¬ν΅κ³ κ²μ | Tier 1 | ~50ms β‘ | SQL WHERE (μ±λ³, λμ΄, μ§μ) |
| ꡬ쑰ν ν€μλ | Tier 1+2 | ~100ms β‘ | SQL + LIKE (μ§μ , νλ ₯, μλ) |
| μλ―Έλ‘ μ κ²μ (GPU) | Full Pipeline | ~17μ΄ | λ²‘ν° κ²μ + BGE Reranker |
| μλ―Έλ‘ μ κ²μ (CPU) | Full Pipeline | ~2.5λΆ | λ²‘ν° κ²μ + BGE Reranker |
μ°Έκ³ : λλΆλΆμ 쿼리λ Tier 1-2λ§ μ¬μ©νμ¬ 1μ΄ μ΄λ΄ μλ΅
λΉμ© (OpenAI API) μ΄κΈ° μ€μ (μΌνμ±)
μ§λ¬Έ μλ² λ© : ~$0.0001 λ΅λ³ μλ² λ© : ~$0.003 μ΄: ~$0.003 (1μ λ―Έλ§)
κ²μ λΉμ© (쿼리λΉ)
LLM 쿼리 λΆμ: ~$0.0005 쿼리 μλ² λ©: ~$0.00002 LLM κ²°κ³Ό μμ½: ~$0.0005 BGE Reranker: $0 (λ‘컬 λͺ¨λΈ) μ΄: ~$0.001/κ²μ
μκ° μ¬μ© μμ
1,000ν κ²μ/μ: ~$1 10,000ν κ²μ/μ: ~$10
- 볡μ‘ν SQL μμ± λΆνμ β λ°μ΄ν° λΆμ μΈλ ₯ μκ° μ κ°
- μ μν μΈμ¬μ΄νΈ λμΆ β μμ₯ λμ μλ ν₯μ
- λ°λ³΅ μμ μλν β IT μμ μλͺ¨ μ΅μν
- νκ² λ§μΌν μ νλ ν₯μ β λ§μΌν ROI κ·Ήλν
- κ°μΈνλ κΈμ΅/μλ£ μλΉμ€ β κ³ κ° λ§μ‘±λ & κ°λ¨κ° μμΉ
- κ³ νμ§ μμ¬κ²°μ μ§μ β μ¬μ μ±κ³΅λ₯ ν₯μ
- μ°κ΅¬ μμ°μ± μ κ³ (λ Όλ¬Έ, νΉν, μμ λμμ λͺ¨μ§)
- λ²μ© νλ«νΌ νμ₯ (λ§μΌν , κΈμ΅, μλ£, 곡곡)
- μ νν μ μ± μ립 μ§μ
- μμ€ν μ λ’°λ & μ¬μ©μ λ§μ‘±λ ν₯μ
- SQL μ§μ μμ΄ μμ°μ΄λ‘ λ°μ΄ν° νμ
- μ‘°μ§ μ λ°μ λ°μ΄ν° κΈ°λ° λ¬Έν νμ°
- μ΄ νλ‘μ νΈλ νμ±λνκ΅ κΈ°μ μ°κ³ SWμΊ‘μ€ν€λμμΈ μμ μμ μ§νλμμ΅λλ€. [GitHub]






