Skip to content
@fourEdiots

fourEdiots

All is Well - ์ž„๋ฒ ๋”ฉ ๊ฒฐํ•ฉ ์ ์‘ํ˜• ์ž์—ฐ์–ด ํŒจ๋„ ์ถ”์ถœ ์‹œ์Šคํ…œ

LangGraph + RAG + BGE Reranker ๊ธฐ๋ฐ˜ ์ฐจ์„ธ๋Œ€ ์ง€๋Šฅํ˜• ๊ฒ€์ƒ‰ ํ”Œ๋žซํผ

๐Ÿ“‹ ๋ชฉ์ฐจ

๐Ÿ“Œ ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

All is Well์€ ๋ฐฉ๋Œ€ํ•œ ํŒจ๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ์ž์˜ ์ž์—ฐ์–ด ์งˆ์˜๋ฅผ ์ง€๋Šฅ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ์ตœ์ ์˜ ํŒจ๋„์„ ์ถ”์ถœํ•˜๋Š” ์ฐจ์„ธ๋Œ€ ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. "์บ ํ•‘์„ ์ข‹์•„ํ•˜๋Š” 30๋Œ€ ์„œ์šธ ๊ฑฐ์ฃผ ์—ฌ์„ฑ"๊ณผ ๊ฐ™์€ ์ž์—ฐ์–ด ์งˆ์˜๋งŒ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ํŒจ๋„๊ณผ ํŒจ๋„์˜ ์„ค๋ฌธ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ , AI๊ฐ€ ์ƒ์„ฑํ•œ ํŽ˜๋ฅด์†Œ๋‚˜ ๋ฐ ํ†ต๊ณ„ ์‹œ๊ฐํ™”๋ฅผ ํ†ตํ•ด ์ฆ‰๊ฐ์ ์ธ ์ธ์‚ฌ์ดํŠธ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐ŸŽฏ ํ•ต์‹ฌ ๊ฐ€์น˜๊ธฐ์กด ์‹œ์Šคํ…œ์˜ ํ•œ๊ณ„:

  • ํ‚ค์›Œ๋“œ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰์œผ๋กœ ์ถ”์ƒ์  ์งˆ์˜ ์ฒ˜๋ฆฌ ๋ถˆ๊ฐ€
  • ํšจ์œจ์„ฑ๊ณผ ์ •ํ™•์„ฑ์˜ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ๋ฌธ์ œ
  • ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ ์ œํ•œ์  ํ™œ์šฉ (๋‹จ์ˆœ ๋ชฉ๋ก๋งŒ ์ œ๊ณต)
  • ๋น„์—ฐ์†์  ๊ฒ€์ƒ‰ ๊ฒฝํ—˜ (๋งค๋ฒˆ ์ƒˆ๋กœ ๊ฒ€์ƒ‰)
  • ์ƒˆ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ์‹œ ๊ธด ์ „์ฒ˜๋ฆฌ ์‹œ๊ฐ„

All is Well์˜ ํ˜์‹ :

  • ์ ์‘ํ˜• ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ฒ€์ƒ‰: ์งˆ์˜ ๋‚œ์ด๋„ ์ž๋™ ๋ถ„๋ฅ˜ (SQL/์ž„๋ฒ ๋”ฉ ๋™์  ์„ ํƒ)
  • ์ง€๋Šฅํ˜• ๊ทธ๋ฃน ๋ถ„์„: LLM ๊ธฐ๋ฐ˜ ํŽ˜๋ฅด์†Œ๋‚˜ ์ƒ์„ฑ ๋ฐ AI ์ด๋ฏธ์ง€ ์‹œ๊ฐํ™”
  • ๋Œ€ํ™”ํ˜• ์—ฐ์† ๊ฒ€์ƒ‰: LangGraph ์„ธ์…˜ ๊ด€๋ฆฌ๋กœ ๋“œ๋ฆด๋‹ค์šด ์ง€์›
  • ์‹ค์‹œ๊ฐ„ ํ†ต๊ณ„ ์‹œ๊ฐํ™”: Chart.js ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์ฐจํŠธ
  • BGE ๊ธฐ๋ฐ˜ ๋ฆฌ๋žญํ‚น: ์ „์ฒ˜๋ฆฌ ์—†์ด ์งˆ๋ฌธ-์‘๋‹ต ์˜๋ฏธ ์œ ์‚ฌ์„ฑ ๊ณ„์‚ฐ

๐Ÿ” ํ”„๋ฆฌ๋ทฐ

ํ”„๋ฆฌ๋ทฐ

๐Ÿ‘ฅ ํŒ€์› ๋ฐ ์—ญํ• 

Profile Name Role Assigned Task GitHub
์ด์„์šฐ Leader
AIยทData Engineer
Panel Search Pipeline Development
Data Structure Development
GitHub
์–‘๋‹ค์› Full-stack Developer UI Design & Frontend Development
Backend API Development (Login/Search)
GitHub
์ •์ˆ˜ํ˜„ AIยทData Engineer AI Architecture Design
Data Embedding
GitHub
ํ™์„ฑํ™˜ Full-stack Developer UI Design & Frontend Development
Backend API Development (Library/History/Panel Details)
GitHub

๐ŸŽฅ ์ฃผ์š” ํ™”๋ฉด

  1. ๋ฉ”์ธ ๊ฒ€์ƒ‰ ํ™”๋ฉด
  • ๋กœ๊ทธ์ธ ํ›„ ์ž์—ฐ์–ด๋กœ ํŒจ๋„ ๊ฒ€์ƒ‰
    image
  1. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ํ™”๋ฉด
  • ๊ทธ๋ฃน ํŽ˜๋ฅด์†Œ๋‚˜: LLM ์ƒ์„ฑ ํ…์ŠคํŠธ + AI ์ด๋ฏธ์ง€ + ํ•ด์‹œํƒœ๊ทธ
  • ํ†ต๊ณ„ ์ฐจํŠธ: ์—ฐ๋ น๋Œ€/์„ฑ๋ณ„/์ง€์—ญ/์ง์—… ๋ถ„ํฌ ์‹œ๊ฐํ™”
  • ๊ฐœ๋ณ„ ํŒจ๋„: ์œ ์‚ฌ๋„ ์ ์ˆ˜ + ๋งค์นญ๋œ ์งˆ๋ฌธ ์‘๋‹ต
    image
  1. ํŒจ๋„ ์ƒ์„ธ ํŽ˜์ด์ง€
  • ๊ฐœ๋ณ„ ํŒจ๋„์˜ ๊ณ ์œ  ํŽ˜๋ฅด์†Œ๋‚˜, ๊ธฐ๋ณธ ํ”„๋กœํ•„, ํƒœ๊ทธ ์ •๋ณด
    image
  1. ๊ฒ€์ƒ‰ ํžˆ์Šคํ† ๋ฆฌ & ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ๊ฒ€์ƒ‰ ๊ธฐ๋ก ์กฐํšŒ ๋ฐ ์žฌ์‹คํ–‰
  • ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒ€์ƒ‰ ์ €์žฅ ๊ด€๋ฆฌ
    image

๐Ÿ— ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜

๋„ค์–ผ๊ฐ„์ด ์•„ํ‚คํ…์ฒ˜

๊ณ„์ธต๋ณ„ ์—ญํ• 

Frontend (React + Vite)

  • ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค
  • ๊ฒ€์ƒ‰, ํžˆ์Šคํ† ๋ฆฌ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ด€๋ฆฌ
  • Chart.js ํ†ต๊ณ„ ์‹œ๊ฐํ™”
  • TanStack Query ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ

API Server (FastAPI)

  • ์‚ฌ์šฉ์ž ์ธ์ฆ (JWT)
  • ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์บ์‹œ ๊ด€๋ฆฌ
  • ํžˆ์Šคํ† ๋ฆฌ & ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ CRUD
  • CSV ๋‹ค์šด๋กœ๋“œ ์ œ๊ณต
  • ํ”„๋ก์‹œ ํŒจํ„ด์œผ๋กœ ๋ณด์•ˆ ๊ฐ•ํ™”

Data Pipeline (FastAPI + LangGraph)

  • LangGraph 3-Tier ๊ฒ€์ƒ‰ ์›Œํฌํ”Œ๋กœ์šฐ
  • LLM ๊ธฐ๋ฐ˜ ์ฟผ๋ฆฌ ๋ถ„์„ & ๊ฒฐ๊ณผ ์š”์•ฝ
  • ChromaDB ๋ฒกํ„ฐ ๊ฒ€์ƒ‰
  • BGE Reranker ์žฌ์ˆœ์œ„ํ™”
  • ํŽ˜๋ฅด์†Œ๋‚˜ & ์ด๋ฏธ์ง€ ์ƒ์„ฑ

Database (SQLite + ChromaDB)

  • SQLite: ๊ตฌ์กฐํ™” ๋ฐ์ดํ„ฐ (ํŒจ๋„ ์ •๋ณด, ์ •ํ˜• ์งˆ์˜ ์‘๋‹ต ๋ฐ์ดํ„ฐ)
  • ChromaDB: ๋ฒกํ„ฐ ๊ฒ€์ƒ‰ (๋น„์ •ํ˜• ์งˆ๋ฌธ + ์‘๋‹ต)

โœจ ์ฃผ์š” ๊ธฐ๋Šฅ

1. ๐Ÿ” ์ง€๋Šฅํ˜• 3-Tier ๊ฒ€์ƒ‰

์‚ฌ์šฉ์ž ์ฟผ๋ฆฌ: "์„œ์šธ 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๋ถ„

2. ๐ŸŽญ AI ํŽ˜๋ฅด์†Œ๋‚˜ ์ƒ์„ฑ

๊ทธ๋ฃน ํŽ˜๋ฅด์†Œ๋‚˜ (LLM ์ƒ์„ฑ)

{
  "text": "30๋Œ€ ์ดˆ๋ฐ˜์˜ ์•กํ‹ฐ๋ธŒํ•œ ์•„์›ƒ๋„์–ด ์• ํ˜ธ๊ฐ€๋กœ, ์ฃผ๋ง๋งˆ๋‹ค ๋“ฑ์‚ฐ์ด๋‚˜ ์บ ํ•‘์„ ์ฆ๊ธฐ๋ฉฐ...",
  "hashtags": ["#์•„์›ƒ๋„์–ด", "#30๋Œ€", "#์•กํ‹ฐ๋ธŒ", "#์บ ํ•‘"],
  "image_url": "data:image/png;base64,iVBORw0KG..."
}
  • ํ…์ŠคํŠธ: GPT-4o-mini๊ฐ€ ๊ทธ๋ฃน ํŠน์„ฑ ์š”์•ฝ

  • ํ•ด์‹œํƒœ๊ทธ: ํ•ต์‹ฌ ํ‚ค์›Œ๋“œ ์ถ”์ถœ

  • ์ด๋ฏธ์ง€: Nano Banana ๋ชจ๋ธ๋กœ ์‹œ๊ฐํ™”

  • ๊ฐœ๋ณ„ ํŽ˜๋ฅด์†Œ๋‚˜ (36,113๊ฐœ ์‚ฌ์ „ ์ƒ์„ฑ)

  • ๊ฐ ํŒจ๋„์˜ ์„ฑํ–ฅ, ๊ด€์‹ฌ์‚ฌ, ๋ผ์ดํ”„์Šคํƒ€์ผ ์š”์•ฝ

  • ๊ฒ€์ƒ‰ ์‹œ ์œ ์‚ฌ๋„ ์ ์ˆ˜์™€ ํ•จ๊ป˜ ์ œ๊ณต

3. ๐Ÿ“Š ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ํ†ต๊ณ„ ์‹œ๊ฐํ™”

  • Chart.js ๊ธฐ๋ฐ˜ ์ฐจํŠธ

  • ์—ฐ๋ น๋Œ€๋ณ„ ๋ถ„ํฌ (๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„)

  • ์„ฑ๋ณ„ ๋ถ„ํฌ (์›ํ˜• ์ฐจํŠธ)

  • ์ง€์—ญ๋ณ„ ๋ถ„ํฌ (๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„)

  • ์ง์—…๋ณ„ ๋ถ„ํฌ (๊ฐ€๋กœ ๋ง‰๋Œ€)

  • ์†Œ๋“๋ณ„ ๋ถ„ํฌ (์„  ๊ทธ๋ž˜ํ”„)

ํด๋ฆญ ํ•œ ๋ฒˆ์œผ๋กœ ์ฐจํŠธ ์ „ํ™˜

// ์‚ฌ์šฉ์ž๊ฐ€ "์—ฐ๋ น๋Œ€" ํด๋ฆญ โ†’ BarChart ๋ Œ๋”๋ง
<BarChart
  data={{
    labels: ["20๋Œ€", "30๋Œ€", "40๋Œ€"],
    values: [50, 300, 100]
  }}
  title="์—ฐ๋ น๋Œ€๋ณ„ ๋ถ„ํฌ"
/>

4. ๐Ÿ”„ ๋Œ€ํ™”ํ˜• ๋“œ๋ฆด๋‹ค์šด ๊ฒ€์ƒ‰

์—ฐ์† ์งˆ๋ฌธ ์‹œ๋‚˜๋ฆฌ์˜ค:

1์ฐจ ๊ฒ€์ƒ‰: "์บ ํ•‘ ์ข‹์•„ํ•˜๋Š” ์‚ฌ๋žŒ" โ†’ 450๋ช…
   โ†“ session_id ์œ ์ง€
2์ฐจ ๊ฒ€์ƒ‰: "์ด ์ค‘์—์„œ ์„œ์šธ ๊ฑฐ์ฃผ์ž" โ†’ 120๋ช…
   โ†“ session_id ์œ ์ง€
3์ฐจ ๊ฒ€์ƒ‰: "์ด ์ค‘์—์„œ 30๋Œ€๋งŒ" โ†’ 80๋ช…

LangGraph ์ƒํƒœ ๊ด€๋ฆฌ:

  • ์ด์ „ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ ๋‚ด์—์„œ๋งŒ ์ถ”๊ฐ€ ํ•„ํ„ฐ๋ง
  • ์ „์ฒด ์žฌ๊ฒ€์ƒ‰ ๋ถˆํ•„์š” โ†’ ํšจ์œจ์„ฑ ๊ทน๋Œ€ํ™”

5. ๐Ÿ“ฅ ๋ฐ์ดํ„ฐ ํ™œ์šฉ ๊ธฐ๋Šฅ

CSV ๋‹ค์šด๋กœ๋“œ

ํŒจ๋„ID,๋‚˜์ด,์„ฑ๋ณ„,์ง€์—ญ,๊ตฌ์—ญ,์ง์—…,์š”์•ฝ,์œ ์‚ฌ๋„
PANEL_001,32,๋‚จ์„ฑ,์„œ์šธ,๊ฐ•๋‚จ๊ตฌ,IT ๊ฐœ๋ฐœ์ž,์ฃผ๋ง๋งˆ๋‹ค ์บ ํ•‘์„...,0.95
  • UTF-8 BOM์œผ๋กœ ํ•œ๊ธ€ ๊นจ์ง ๋ฐฉ์ง€
  • ํƒ€์ž„์Šคํƒฌํ”„ ํŒŒ์ผ๋ช…: panel_results_20241128_143022.csv

๊ฒ€์ƒ‰ ํžˆ์Šคํ† ๋ฆฌ

  • ์ตœ๊ทผ ๊ฒ€์ƒ‰ ์ž๋™ ์ €์žฅ
  • ํด๋ฆญ์œผ๋กœ ์ด์ „ ๊ฒฐ๊ณผ ์ฆ‰์‹œ ๋ณต์›

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒ€์ƒ‰ ์ €์žฅ
  • ์‚ฌ์šฉ์ž ์ง€์ • ์ œ๋ชฉ ๊ด€๋ฆฌ

๐Ÿ›  ๊ธฐ์ˆ  ์Šคํƒ

Frontend

React 18.x              UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
TypeScript              ํƒ€์ž… ์•ˆ์ „์„ฑ
Vite                    ๋นŒ๋“œ ๋„๊ตฌ (๋น ๋ฅธ HMR)
TanStack Query          ์„œ๋ฒ„ ์ƒํƒœ ๊ด€๋ฆฌ & ์บ์‹ฑ
Zustand                 ํด๋ผ์ด์–ธํŠธ ์ „์—ญ ์ƒํƒœ
React Router v6         ๋ผ์šฐํŒ…
Axios                   HTTP ํด๋ผ์ด์–ธํŠธ
Tailwind CSS            ์œ ํ‹ธ๋ฆฌํ‹ฐ ๊ธฐ๋ฐ˜ ์Šคํƒ€์ผ๋ง
Chart.js                ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”
Lucide React            ์•„์ด์ฝ˜

Backend (API Server)

FastAPI 0.115+          ๋น„๋™๊ธฐ REST API ํ”„๋ ˆ์ž„์›Œํฌ
Python 3.10+            ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด
Uvicorn                 ASGI ์„œ๋ฒ„
SQLite 3                ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
Pydantic 2.x            ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ & ์ง๋ ฌํ™”
httpx                   ๋น„๋™๊ธฐ HTTP ํด๋ผ์ด์–ธํŠธ
python-jose             JWT ํ† ํฐ

Data Pipeline

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 ๋ชจ๋ธ ๋กœ๋”

Database

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

๐Ÿ’ผ ๊ธฐ๋Œ€ ํšจ๊ณผ

๊ฒฝ์ œ์  ์ธก๋ฉด

1. ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ & ๋น„์šฉ ์ ˆ๊ฐ

  • ๋ณต์žกํ•œ SQL ์ž‘์„ฑ ๋ถˆํ•„์š” โ†’ ๋ฐ์ดํ„ฐ ๋ถ„์„ ์ธ๋ ฅ ์‹œ๊ฐ„ ์ ˆ๊ฐ
  • ์‹ ์†ํ•œ ์ธ์‚ฌ์ดํŠธ ๋„์ถœ โ†’ ์‹œ์žฅ ๋Œ€์‘ ์†๋„ ํ–ฅ์ƒ
  • ๋ฐ˜๋ณต ์ž‘์—… ์ž๋™ํ™” โ†’ IT ์ž์› ์†Œ๋ชจ ์ตœ์†Œํ™”

2. ๋น„์ฆˆ๋‹ˆ์Šค ์„ฑ๊ณผ & ๋งค์ถœ ์ฆ๋Œ€

  • ํƒ€๊ฒŸ ๋งˆ์ผ€ํŒ… ์ •ํ™•๋„ ํ–ฅ์ƒ โ†’ ๋งˆ์ผ€ํŒ… ROI ๊ทน๋Œ€ํ™”
  • ๊ฐœ์ธํ™”๋œ ๊ธˆ์œต/์˜๋ฃŒ ์„œ๋น„์Šค โ†’ ๊ณ ๊ฐ ๋งŒ์กฑ๋„ & ๊ฐ๋‹จ๊ฐ€ ์ƒ์Šน
  • ๊ณ ํ’ˆ์งˆ ์˜์‚ฌ๊ฒฐ์ • ์ง€์› โ†’ ์‚ฌ์—… ์„ฑ๊ณต๋ฅ  ํ–ฅ์ƒ

์‚ฌํšŒ์  ์ธก๋ฉด

1. ์—ฐ๊ตฌ & ๊ธฐ์ˆ  ํ˜์‹  ๊ฐ€์†ํ™”

  • ์—ฐ๊ตฌ ์ƒ์‚ฐ์„ฑ ์ œ๊ณ  (๋…ผ๋ฌธ, ํŠนํ—ˆ, ์ž„์ƒ ๋Œ€์ƒ์ž ๋ชจ์ง‘)
  • ๋ฒ”์šฉ ํ”Œ๋žซํผ ํ™•์žฅ (๋งˆ์ผ€ํŒ…, ๊ธˆ์œต, ์˜๋ฃŒ, ๊ณต๊ณต)

2. ๊ณต๊ณต ์„œ๋น„์Šค ํ’ˆ์งˆ ๊ฐœ์„ 

  • ์ •ํ™•ํ•œ ์ •์ฑ… ์ˆ˜๋ฆฝ ์ง€์›
  • ์‹œ์Šคํ…œ ์‹ ๋ขฐ๋„ & ์‚ฌ์šฉ์ž ๋งŒ์กฑ๋„ ํ–ฅ์ƒ

3. ๋ฐ์ดํ„ฐ ๋ฆฌํ„ฐ๋Ÿฌ์‹œ ์žฅ๋ฒฝ ์™„ํ™”

  • SQL ์ง€์‹ ์—†์ด ์ž์—ฐ์–ด๋กœ ๋ฐ์ดํ„ฐ ํƒ์ƒ‰
  • ์กฐ์ง ์ „๋ฐ˜์˜ ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ๋ฌธํ™” ํ™•์‚ฐ

๐Ÿ“„ ๋ผ์ด์„ ์Šค

  • ์ด ํ”„๋กœ์ ํŠธ๋Š” ํ•œ์„ฑ๋Œ€ํ•™๊ต ๊ธฐ์—…์—ฐ๊ณ„ SW์บก์Šคํ†ค๋””์ž์ธ ์ˆ˜์—…์—์„œ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. [GitHub]

Popular repositories Loading

  1. Backend Backend Public

    Python

  2. .github .github Public

Repositories

Showing 2 of 2 repositories

Top languages

Loadingโ€ฆ

Most used topics

Loadingโ€ฆ