Skip to content
SK-Shieldus-3rd-Mini-ProjectPublic

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

ย 

History

65 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿค– AI ํˆฌ์ž ์–ด๋“œ๋ฐ”์ด์ € (jeonbongjun-ai)

Python FastAPI LangChain OpenAI Docker Kubernetes

LangChain + RAG ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ํˆฌ์ž ์ƒ๋‹ด AI ์„œ๋น„์Šค

ํŠน์ง• โ€ข ์•„ํ‚คํ…์ฒ˜ โ€ข ์‹œ์ž‘ํ•˜๊ธฐ โ€ข API ๋ฌธ์„œ โ€ข ๋ฐฐํฌ


๐Ÿ“‹ ๋ชฉ์ฐจ


๐ŸŽฏ ๊ฐœ์š”

AI ํˆฌ์ž ์–ด๋“œ๋ฐ”์ด์ €๋Š” LangChain๊ณผ RAG(Retrieval-Augmented Generation) ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ํˆฌ์ž ์ƒ๋‹ด์„ ์ œ๊ณตํ•˜๋Š” ์ง€๋Šฅํ˜• AI ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๊ธฐ๋Šฅ

  • ๐Ÿ“Š ์‹ค์‹œ๊ฐ„ ์ฃผ๊ฐ€ ๋ถ„์„ - pykrx API๋ฅผ ํ†ตํ•œ ํ•œ๊ตญ ์ฃผ์‹์‹œ์žฅ ๋ฐ์ดํ„ฐ
  • ๐Ÿ“ˆ ๊ฒฝ์ œ์ง€ํ‘œ ํ•ด์„ - MariaDB ๊ธฐ๋ฐ˜ ๊ฑฐ์‹œ๊ฒฝ์ œ ์ง€ํ‘œ ๋ถ„์„
  • ๐Ÿ“‘ ์ฆ๊ถŒ์‚ฌ ๋ฆฌํฌํŠธ ๊ฒ€์ƒ‰ - ChromaDB ๋ฒกํ„ฐ ๊ฒ€์ƒ‰์„ ํ†ตํ•œ ์• ๋„๋ฆฌ์ŠคํŠธ ๋ฆฌํฌํŠธ ๋ถ„์„
  • ๐Ÿ’ก ๊ฐœ์ธํ™”๋œ ํˆฌ์ž ์กฐ์–ธ - GPT-4 ๊ธฐ๋ฐ˜ ๋งž์ถคํ˜• ํˆฌ์ž ์ „๋žต ์ œ๊ณต

โœจ ์ฃผ์š” ํŠน์ง•

๐Ÿ” ์ง€๋Šฅํ˜• ์งˆ๋ฌธ ๋ถ„๋ฅ˜ ์‹œ์Šคํ…œ

์‚ฌ์šฉ์ž ์งˆ๋ฌธ โ†’ AI ๋ถ„๋ฅ˜๊ธฐ โ†’ 4๊ฐ€์ง€ ์นดํ…Œ๊ณ ๋ฆฌ
โ”œโ”€ economic_indicator (๊ฒฝ์ œ์ง€ํ‘œ)
โ”œโ”€ stock_price (์ฃผ๊ฐ€ ๋ถ„์„)
โ”œโ”€ analyst_report (์ฆ๊ถŒ์‚ฌ ๋ฆฌํฌํŠธ)
โ””โ”€ general (์ผ๋ฐ˜ ํˆฌ์ž ์ƒ๋‹ด)

๐ŸŽจ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ฐ์ดํ„ฐ ์†Œ์Šค

์นดํ…Œ๊ณ ๋ฆฌ ๋ฐ์ดํ„ฐ ์†Œ์Šค ์ฒ˜๋ฆฌ ๋ฐฉ์‹
๊ฒฝ์ œ์ง€ํ‘œ MariaDB (Spring Boot) REST API + LLM ํ•ด์„
์ฃผ๊ฐ€ ๋ฐ์ดํ„ฐ pykrx (ํ•œ๊ตญ๊ฑฐ๋ž˜์†Œ) Real-time API + ๊ฐ์„ฑ ๋ถ„์„
๋ฆฌํฌํŠธ ChromaDB (PDF ์ž„๋ฒ ๋”ฉ) RAG ๊ฒ€์ƒ‰ + LLM ๋‹ต๋ณ€
์ผ๋ฐ˜ ์ƒ๋‹ด - GPT-4 Direct

โšก ๊ณ ์„ฑ๋Šฅ ์•„ํ‚คํ…์ฒ˜

  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ: FastAPI + httpx๋ฅผ ํ†ตํ•œ ๊ณ ์† API ์ฒ˜๋ฆฌ
  • ๋ฒกํ„ฐ ๊ฒ€์ƒ‰: ChromaDB๋ฅผ ํ™œ์šฉํ•œ ์˜๋ฏธ ๊ธฐ๋ฐ˜ ๋ฌธ์„œ ๊ฒ€์ƒ‰
  • ์บ์‹ฑ: ๋Œ€์‹œ๋ณด๋“œ ๋ฐ์ดํ„ฐ 60์ดˆ ์บ์‹ฑ์œผ๋กœ ์„ฑ๋Šฅ ์ตœ์ ํ™”
  • ์ปจํ…Œ์ด๋„ˆํ™”: Docker + Kubernetes ๊ธฐ๋ฐ˜ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค

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

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                      Frontend (React)                        โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                           โ”‚ HTTP
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚              Backend (Spring Boot - Port 8080)               โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚ Controllers: /api/chat, /api/stocks, /api/indicatorsโ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ”‚                       โ”‚                                      โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚  โ”‚          MariaDB (๊ฒฝ์ œ์ง€ํ‘œ, ์ข…๋ชฉ ๋งˆ์Šคํ„ฐ)              โ”‚   โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                           โ”‚ HTTP
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚               AI Service (FastAPI - Port 8000)               โ”‚
โ”‚                                                               โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
โ”‚  โ”‚  POST /ai/query (๋ฉ”์ธ ์งˆ๋ฌธ ์ฒ˜๋ฆฌ ์—”๋“œํฌ์ธํŠธ)          โ”‚    โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
โ”‚                       โ”‚                                      โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
โ”‚  โ”‚         Question Classifier (LLM ๊ธฐ๋ฐ˜ ๋ถ„๋ฅ˜)         โ”‚    โ”‚
โ”‚  โ””โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
โ”‚     โ”‚          โ”‚          โ”‚          โ”‚                       โ”‚
โ”‚  โ”Œโ”€โ”€โ–ผโ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ–ผโ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ–ผโ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”                 โ”‚
โ”‚  โ”‚Economicโ”‚Stock  โ”‚Analystโ”‚General โ”‚                        โ”‚
โ”‚  โ”‚Chain  โ”‚Chain  โ”‚Chain  โ”‚Chain  โ”‚                         โ”‚
โ”‚  โ””โ”€โ”€โ”ฌโ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”ฌโ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”ฌโ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜                 โ”‚
โ”‚     โ”‚         โ”‚          โ”‚          โ”‚                       โ”‚
โ”‚  โ”Œโ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ” โ”Œโ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”   โ”‚                        โ”‚
โ”‚  โ”‚MariaDB โ”‚ โ”‚pykrx  โ”‚ โ”‚ChromaDB   โ”‚                       โ”‚
โ”‚  โ”‚via API โ”‚ โ”‚API    โ”‚ โ”‚Vector DBโ”‚  โ”‚                        โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚                        โ”‚
โ”‚                                     โ”‚                        โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚          GPT-4 Turbo (OpenAI API)                      โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ

graph LR
    A[์‚ฌ์šฉ์ž ์งˆ๋ฌธ] --> B[FastAPI /ai/query]
    B --> C{์งˆ๋ฌธ ๋ถ„๋ฅ˜}
    C -->|๊ฒฝ์ œ์ง€ํ‘œ| D[Spring Boot API]
    C -->|์ฃผ๊ฐ€| E[pykrx API]
    C -->|๋ฆฌํฌํŠธ| F[ChromaDB RAG]
    C -->|์ผ๋ฐ˜| G[GPT-4 Direct]
    D --> H[LLM ํ•ด์„]
    E --> I[๊ฐ์„ฑ ๋ถ„์„]
    F --> J[๋ฌธ๋งฅ ๊ธฐ๋ฐ˜ ๋‹ต๋ณ€]
    G --> K[ํˆฌ์ž ์กฐ์–ธ]
    H --> L[์ตœ์ข… ์‘๋‹ต]
    I --> L
    J --> L
    K --> L
Loading

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

Core Framework

  • FastAPI 0.110.0 - ๊ณ ์„ฑ๋Šฅ ๋น„๋™๊ธฐ ์›น ํ”„๋ ˆ์ž„์›Œํฌ
  • Python 3.10+ - ์•ˆ์ •์ ์ธ ์ตœ์‹  ๋ฒ„์ „

AI/ML Stack

  • LangChain 0.3.27 - LLM ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ
  • OpenAI GPT-4 Turbo - ์ž์—ฐ์–ด ์ดํ•ด ๋ฐ ์ƒ์„ฑ
  • ChromaDB 0.4.24 - ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
  • tiktoken 0.12.0 - ํ† ํฐ ์นด์šดํŒ…

Data Sources

  • pykrx 1.0.51 - ํ•œ๊ตญ๊ฑฐ๋ž˜์†Œ API
  • httpx 0.28.1 - ๋น„๋™๊ธฐ HTTP ํด๋ผ์ด์–ธํŠธ
  • pandas 2.2.1 - ๋ฐ์ดํ„ฐ ๋ถ„์„

Document Processing

  • pypdf 4.1.0 - PDF ๋ฌธ์„œ ํŒŒ์‹ฑ
  • langchain-text-splitters - ์Šค๋งˆํŠธ ํ…์ŠคํŠธ ์ฒญํ‚น

DevOps

  • Docker - ์ปจํ…Œ์ด๋„ˆํ™”
  • Kubernetes (GKE) - ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜
  • GitHub Actions - CI/CD

๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

jeonbongjun-ai/
โ”œโ”€โ”€ ๐Ÿ“‚ chains/                      # LangChain ์ฒด์ธ ๋กœ์ง
โ”‚   โ”œโ”€โ”€ __init__.py
โ”‚   โ”œโ”€โ”€ classifier.py               # ์งˆ๋ฌธ ๋ถ„๋ฅ˜๊ธฐ (4-way classification)
โ”‚   โ”œโ”€โ”€ rag_chain.py                # RAG ์ฒด์ธ (์ฆ๊ถŒ์‚ฌ ๋ฆฌํฌํŠธ)
โ”‚   โ”œโ”€โ”€ indicator_chain.py          # ๊ฒฝ์ œ์ง€ํ‘œ ๋ถ„์„ ์ฒด์ธ
โ”‚   โ”œโ”€โ”€ stock_chain.py              # ์ฃผ๊ฐ€ ๋ถ„์„ + ๊ฐ์„ฑ ๋ถ„์„
โ”‚   โ””โ”€โ”€ general_chain.py            # ์ผ๋ฐ˜ ํˆฌ์ž ์ƒ๋‹ด
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ routers/                     # FastAPI ๋ผ์šฐํ„ฐ
โ”‚   โ””โ”€โ”€ market_data.py              # ์‹œ์žฅ ๋ฐ์ดํ„ฐ API
โ”‚       โ”œโ”€โ”€ GET /api/dashboard      # ํ†ตํ•ฉ ๋Œ€์‹œ๋ณด๋“œ
โ”‚       โ”œโ”€โ”€ GET /api/stock/{ticker} # ๊ฐœ๋ณ„ ์ข…๋ชฉ ์กฐํšŒ
โ”‚       โ””โ”€โ”€ POST /api/stock-details # ๋‹ค์ค‘ ์ข…๋ชฉ ์กฐํšŒ
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ utils/                       # ์œ ํ‹ธ๋ฆฌํ‹ฐ ๋ชจ๋“ˆ
โ”‚   โ”œโ”€โ”€ config.py                   # ํ™˜๊ฒฝ ์„ค์ • (Pydantic)
โ”‚   โ”œโ”€โ”€ logger.py                   # ๋กœ๊น… ์„ค์ •
โ”‚   โ”œโ”€โ”€ embedder.py                 # OpenAI ์ž„๋ฒ ๋”ฉ
โ”‚   โ”œโ”€โ”€ db_client.py                # ChromaDB ํด๋ผ์ด์–ธํŠธ
โ”‚   โ”œโ”€โ”€ spring_client.py            # Spring Boot API ํด๋ผ์ด์–ธํŠธ
โ”‚   โ”œโ”€โ”€ data_loader.py              # ๋ฌธ์„œ ๋กœ๋” (PDF/CSV/JSON)
โ”‚   โ””โ”€โ”€ text_splitter.py            # ํ…์ŠคํŠธ ์ฒญํ‚น
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ notebooks/                   # Jupyter ์‹คํ—˜ ๋…ธํŠธ๋ถ
โ”‚   โ”œโ”€โ”€ 01_classifier_test.ipynb    # ๋ถ„๋ฅ˜๊ธฐ ํ…Œ์ŠคํŠธ
โ”‚   โ”œโ”€โ”€ 02_rag_test.ipynb           # RAG ํŒŒ์ดํ”„๋ผ์ธ ํ…Œ์ŠคํŠธ
โ”‚   โ””โ”€โ”€ test_full_pipeline.ipynb    # ์ „์ฒด ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ k8s/                         # Kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ
โ”‚   โ”œโ”€โ”€ ai-service-deployment.yaml  # Deployment ์„ค์ •
โ”‚   โ”œโ”€โ”€ ai-service-service.yaml     # Service (ClusterIP)
โ”‚   โ””โ”€โ”€ ai-config.yaml              # BackendConfig (Health Check)
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ .github/workflows/           # GitHub Actions CI/CD
โ”‚   โ””โ”€โ”€ build-push-ai.yaml          # Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๋ฐ ํ‘ธ์‹œ
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ data/                        # ๋ฐ์ดํ„ฐ ๋””๋ ‰ํ† ๋ฆฌ (gitignore)
โ”‚   โ”œโ”€โ”€ reports/                    # ์ฆ๊ถŒ์‚ฌ ๋ฆฌํฌํŠธ PDF
โ”‚   โ”œโ”€โ”€ news/                       # ๋‰ด์Šค ๋ฐ์ดํ„ฐ
โ”‚   โ””โ”€โ”€ indicators/                 # ๊ฒฝ์ œ์ง€ํ‘œ CSV
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ embeddings/                  # ChromaDB ์ €์žฅ์†Œ (gitignore)
โ”‚   โ””โ”€โ”€ chromadb/                   # ๋ฒกํ„ฐ ์ž„๋ฒ ๋”ฉ DB
โ”‚
โ”œโ”€โ”€ ๐Ÿ“‚ logs/                        # ๋กœ๊ทธ ํŒŒ์ผ (gitignore)
โ”‚
โ”œโ”€โ”€ ๐Ÿ“„ main.py                      # FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—”ํŠธ๋ฆฌํฌ์ธํŠธ
โ”œโ”€โ”€ ๐Ÿ“„ Dockerfile                   # Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ ์„ค์ •
โ”œโ”€โ”€ ๐Ÿ“„ requirements.txt             # Python ์˜์กด์„ฑ
โ”œโ”€โ”€ ๐Ÿ“„ .env.example                 # ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํ…œํ”Œ๋ฆฟ
โ”œโ”€โ”€ ๐Ÿ“„ .gitignore                   # Git ์ œ์™ธ ํŒŒ์ผ
โ””โ”€โ”€ ๐Ÿ“„ README.md                    # ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ (๋ณธ ํŒŒ์ผ)

๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘

1๏ธโƒฃ ์‚ฌ์ „ ์š”๊ตฌ์‚ฌํ•ญ

  • Python 3.10 ์ด์ƒ
  • Docker (์„ ํƒ์‚ฌํ•ญ)
  • OpenAI API ํ‚ค
  • Spring Boot ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ (ํฌํŠธ 8080)

2๏ธโƒฃ ์„ค์น˜

# ์ €์žฅ์†Œ ํด๋ก 
git clone https://github.com/yourusername/jeonbongjun-ai.git
cd jeonbongjun-ai

# ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ ๋ฐ ํ™œ์„ฑํ™”
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# ์˜์กด์„ฑ ์„ค์น˜
pip install -r requirements.txt

3๏ธโƒฃ ํ™˜๊ฒฝ ์„ค์ •

# .env ํŒŒ์ผ ์ƒ์„ฑ
cp .env.example .env

# .env ํŒŒ์ผ ํŽธ์ง‘ (ํ•„์ˆ˜!)
# OPENAI_API_KEY=sk-proj-your-actual-api-key

.env ์˜ˆ์‹œ

# OpenAI API
OPENAI_API_KEY=sk-proj-your-actual-api-key-here

# FastAPI Settings
HOST=0.0.0.0
PORT=8000
DEBUG=True

# ChromaDB
CHROMA_DB_PATH=./embeddings/chromadb

# Logging
LOG_LEVEL=INFO
LOG_FILE=./logs/app.log

4๏ธโƒฃ ์„œ๋ฒ„ ์‹คํ–‰

# FastAPI ์„œ๋ฒ„ ์‹œ์ž‘
python main.py

# ๋˜๋Š” uvicorn ์ง์ ‘ ์‹คํ–‰
uvicorn main:app --host 0.0.0.0 --port 8000 --reload

์„œ๋ฒ„ ์‹คํ–‰ ํ›„ ์ ‘์†:


๐Ÿ“ก API ๋ฌธ์„œ

Core Endpoints

1. ํ—ฌ์Šค ์ฒดํฌ

GET /health

์‘๋‹ต ์˜ˆ์‹œ

{
  "status": "ok",
  "service": "InvestAI Core",
  "version": "1.0.0",
  "timestamp": "2026-01-18T10:30:00.000Z"
}

2. AI ์งˆ๋ฌธ ์ฒ˜๋ฆฌ (๋ฉ”์ธ ์—”๋“œํฌ์ธํŠธ)

POST /ai/query
Content-Type: application/json

์š”์ฒญ ๋ฐ”๋””

{
  "session_id": "user123-session456",
  "question": "์‚ผ์„ฑ์ „์ž์˜ AI ๋ฐ˜๋„์ฒด ์ „๋ง์€ ์–ด๋•Œ?"
}

์‘๋‹ต ์˜ˆ์‹œ

{
  "session_id": "user123-session456",
  "question": "์‚ผ์„ฑ์ „์ž์˜ AI ๋ฐ˜๋„์ฒด ์ „๋ง์€ ์–ด๋•Œ?",
  "answer": "NHํˆฌ์ž์ฆ๊ถŒ ๋ฆฌํฌํŠธ์— ๋”ฐ๋ฅด๋ฉด, ์‚ผ์„ฑ์ „์ž๋Š” HBM3E ์–‘์‚ฐ ์‹œ์ž‘์œผ๋กœ...",
  "category": "analyst_report",
  "sources": [
    {
      "title": "NHํˆฌ์ž์ฆ๊ถŒ_์‚ผ์„ฑ์ „์ž_20251015.pdf",
      "securities_firm": "NHํˆฌ์ž์ฆ๊ถŒ",
      "date": "20251015",
      "content": "AI ๋ฐ˜๋„์ฒด ์‹œ์žฅ์—์„œ ์‚ผ์„ฑ์ „์ž๋Š”..."
    }
  ],
  "timestamp": "2026-01-18T10:35:00.000Z"
}

3. ๋Œ€์‹œ๋ณด๋“œ ๋ฐ์ดํ„ฐ ์กฐํšŒ

GET /api/dashboard

์‘๋‹ต ๊ตฌ์กฐ

{
  "indices": {
    "kospi": {
      "value": 2850.34,
      "changeValue": 12.5,
      "changeRate": 0.44,
      "chartData": [{"value": 2840}, {"value": 2850}, ...]
    },
    "kosdaq": { ... }
  },
  "topGainers": [
    {"code": "005930", "name": "์‚ผ์„ฑ์ „์ž", "price": 75000, "change_rate": 3.5}
  ],
  "topLosers": [...],
  "topVolume": [...],
  "topMarketCap": [...]
}

4. ๊ฐœ๋ณ„ ์ข…๋ชฉ ์กฐํšŒ

GET /api/stock/{ticker}

์˜ˆ์‹œ

curl http://localhost:8000/api/stock/005930

์‘๋‹ต

{
  "name": "์‚ผ์„ฑ์ „์ž",
  "ticker": "005930",
  "price": 75000,
  "changePct": 2.3,
  "ohlc": {
    "open": 74000,
    "high": 76000,
    "low": 73500
  }
}

๐Ÿ”„ ์งˆ๋ฌธ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ

์ „์ฒด ํ๋ฆ„๋„

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  1. ์‚ฌ์šฉ์ž ์งˆ๋ฌธ ์ž…๋ ฅ                                          โ”‚
โ”‚     "์‚ผ์„ฑ์ „์ž AI ๋ฐ˜๋„์ฒด ์ „๋ง์€?"                              โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                       โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  2. Question Classifier (GPT-4 ๊ธฐ๋ฐ˜)                         โ”‚
โ”‚     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚
โ”‚     โ”‚ Prompt: "๋‹ค์Œ ์งˆ๋ฌธ์„ 4๊ฐ€์ง€ ์นดํ…Œ๊ณ ๋ฆฌ๋กœ ๋ถ„๋ฅ˜..."       โ”‚   โ”‚
โ”‚     โ”‚ Output: {"category": "analyst_report",           โ”‚   โ”‚
โ”‚     โ”‚          "stock_code": "005930"}                 โ”‚   โ”‚
โ”‚     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                       โ”‚
         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
         โ”‚                           โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”         โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ 3a. RAG Chain   โ”‚         โ”‚ 3b. Other Chainsโ”‚
โ”‚ (analyst_report)โ”‚         โ”‚ (stock/economic)โ”‚
โ”‚                 โ”‚         โ”‚                 โ”‚
โ”‚ ChromaDB Search โ”‚         โ”‚ API Calls       โ”‚
โ”‚     โ†“           โ”‚         โ”‚     โ†“           โ”‚
โ”‚ Top 3 Documents โ”‚         โ”‚ Data Fetch      โ”‚
โ”‚     โ†“           โ”‚         โ”‚     โ†“           โ”‚
โ”‚ GPT-4 Generationโ”‚         โ”‚ GPT-4 Analysis  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         โ”‚                           โ”‚
         โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                       โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚  4. ์ตœ์ข… ์‘๋‹ต ์ƒ์„ฑ                                            โ”‚
โ”‚     - ๋‹ต๋ณ€ (answer)                                          โ”‚
โ”‚     - ์ถœ์ฒ˜ (sources)                                         โ”‚
โ”‚     - ์นดํ…Œ๊ณ ๋ฆฌ (category)                                     โ”‚
โ”‚     - ํƒ€์ž„์Šคํƒฌํ”„                                              โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์ฒ˜๋ฆฌ ์ƒ์„ธ

๐Ÿ“Š Economic Indicator Chain

# 1. Spring Boot API์—์„œ ์ตœ์‹  ๊ฒฝ์ œ์ง€ํ‘œ ์กฐํšŒ
indicators = await spring_client.get_economic_indicators()
# {"๊ธฐ์ค€๊ธˆ๋ฆฌ": "3.5%", "M2": "3500์กฐ์›", ...}

# 2. GPT-4๋กœ ์ง€ํ‘œ ํ•ด์„ ๋ฐ ์˜ํ–ฅ ๋ถ„์„
answer = llm.invoke(prompt_template.format(
    question=question,
    indicators=indicators_str
))

๐Ÿ“ˆ Stock Price Chain

# 1. pykrx๋กœ ์‹ค์‹œ๊ฐ„ ์ฃผ๊ฐ€ ์กฐํšŒ
stock_data = get_stock_data_from_pykrx(stock_code)

# 2. ๊ฐ์„ฑ ๋ถ„์„ (๋“ฑ๋ฝ๋ฅ  ๊ธฐ๋ฐ˜)
sentiment = analyze_sentiment(stock_data)  # "๊ธ์ •", "์ค‘๋ฆฝ", "๋ถ€์ •"

# 3. GPT-4๋กœ ์ฃผ๊ฐ€ ๋ถ„์„ ๋ฐ ์‹œ์žฅ ํ•ด์„
answer = llm.invoke(prompt_template.format(
    stock_data=stock_str,
    sentiment=sentiment
))

๐Ÿ“‘ Analyst Report Chain (RAG)

# 1. ChromaDB ๋ฒกํ„ฐ ๊ฒ€์ƒ‰ (์œ ์‚ฌ๋„ ๊ธฐ๋ฐ˜)
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})
docs = retriever.get_relevant_documents(question)

# 2. ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ๋ฅผ ์ปจํ…์ŠคํŠธ๋กœ GPT-4 ํ˜ธ์ถœ
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=retriever,
    return_source_documents=True
)
result = qa_chain({"query": question})

๐Ÿ’ก General Advice Chain

# GPT-4์— ์ง์ ‘ ์งˆ๋ฌธ (์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์—†์Œ)
answer = llm.invoke(prompt_template.format(question=question))

๐Ÿณ ๋ฐฐํฌ

Docker ๋ฐฐํฌ

1. ์ด๋ฏธ์ง€ ๋นŒ๋“œ

docker build -t ai-service:latest .

2. ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰

docker run -d \
  --name ai-service \
  -p 8000:8000 \
  -e OPENAI_API_KEY=your-api-key \
  ai-service:latest

Kubernetes ๋ฐฐํฌ (GKE)

1. Secret ์ƒ์„ฑ

kubectl create secret generic jeonbongjun-secrets \
  --from-literal=OPENAI_API_KEY=your-api-key \
  -n jeonbongjun

2. ๋ฐฐํฌ

# Deployment
kubectl apply -f k8s/ai-service-deployment.yaml

# Service
kubectl apply -f k8s/ai-service-service.yaml

# BackendConfig (Health Check)
kubectl apply -f k8s/ai-config.yaml

3. ์ƒํƒœ ํ™•์ธ

# Pod ์ƒํƒœ
kubectl get pods -n jeonbongjun -l app=ai-service

# ๋กœ๊ทธ ํ™•์ธ
kubectl logs -f deployment/ai-service-deployment -n jeonbongjun

# Health Check
kubectl exec -it <pod-name> -n jeonbongjun -- curl localhost:8000/health

CI/CD (GitHub Actions)

ํ”„๋กœ์ ํŠธ๋Š” ์ž๋™ ๋นŒ๋“œ/๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค:

# .github/workflows/build-push-ai.yaml
on:
  push:
    branches: [main]

jobs:
  - Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ
  - Docker Hub์— ํ‘ธ์‹œ
  - ๋ฉ€ํ‹ฐ ์•„ํ‚คํ…์ฒ˜ ์ง€์› (amd64, arm64)

Docker Hub: o11117/ai-service:latest


๐Ÿ‘จโ€๐Ÿ’ป ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ

์ฆ๊ถŒ์‚ฌ ๋ฆฌํฌํŠธ ์ž„๋ฒ ๋”ฉ

PDF ๋ฆฌํฌํŠธ๋ฅผ ChromaDB์— ์ž„๋ฒ ๋”ฉํ•˜๋ ค๋ฉด:

# 1. PDF ํŒŒ์ผ์„ data/reports/์— ์ถ”๊ฐ€
# ํŒŒ์ผ๋ช… ํ˜•์‹: {์ฆ๊ถŒ์‚ฌ๋ช…}_{์ข…๋ชฉ๋ช…}_{๋‚ ์งœ}.pdf
# ์˜ˆ: NHํˆฌ์ž์ฆ๊ถŒ_์‚ผ์„ฑ์ „์ž_20251015.pdf

# 2. ์ž„๋ฒ ๋”ฉ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰
python scripts/embed_reports.py

์Šคํฌ๋ฆฝํŠธ๋Š” ์ž๋™์œผ๋กœ:

  1. PDF ํŒŒ์ผ ๋กœ๋“œ
  2. ํŽ˜์ด์ง€๋ณ„๋กœ ํ…์ŠคํŠธ ์ถ”์ถœ
  3. ์ฒญํ‚น (500์ž, 50์ž ์˜ค๋ฒ„๋žฉ)
  4. OpenAI ์ž„๋ฒ ๋”ฉ ์ƒ์„ฑ
  5. ChromaDB์— ์ €์žฅ

Jupyter Notebook ํ…Œ์ŠคํŠธ

# Jupyter ์‹คํ–‰
jupyter notebook

# ๋…ธํŠธ๋ถ ์‹คํ–‰ ์ˆœ์„œ:
# 1. notebooks/01_classifier_test.ipynb  (์งˆ๋ฌธ ๋ถ„๋ฅ˜ ํ…Œ์ŠคํŠธ)
# 2. notebooks/02_rag_test.ipynb         (RAG ํŒŒ์ดํ”„๋ผ์ธ)
# 3. notebooks/test_full_pipeline.ipynb  (์ „์ฒด ํ†ตํ•ฉ)

๋กœ๊ทธ ํ™•์ธ

# ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ ๋ชจ๋‹ˆํ„ฐ๋ง
tail -f logs/app.log

# ๋กœ๊ทธ ๋ ˆ๋ฒจ ๋ณ€๊ฒฝ (.env)
LOG_LEVEL=DEBUG  # DEBUG, INFO, WARNING, ERROR

๐Ÿ”ง ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ

1. OpenAI API ์˜ค๋ฅ˜

Error: Incorrect API key provided

ํ•ด๊ฒฐ์ฑ…: .env ํŒŒ์ผ์˜ OPENAI_API_KEY๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

2. ChromaDB ๊ฒฝ๋กœ ์˜ค๋ฅ˜

Error: Cannot access chromadb path

ํ•ด๊ฒฐ์ฑ…:

mkdir -p embeddings/chromadb
chmod 755 embeddings/chromadb

3. pykrx ๋ฐ์ดํ„ฐ ์กฐํšŒ ์‹คํŒจ

Error: ์ฃผ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

ํ•ด๊ฒฐ์ฑ…:

  • ์ฃผ๋ง/๊ณตํœด์ผ์—๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ข…๋ชฉ ์ฝ”๋“œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•˜์„ธ์š” (6์ž๋ฆฌ ์ˆซ์ž).

4. Kubernetes Pod Crash

CrashLoopBackOff

์ฒดํฌ๋ฆฌ์ŠคํŠธ:

# 1. Secret ํ™•์ธ
kubectl get secret jeonbongjun-secrets -n jeonbongjun

# 2. ๋กœ๊ทธ ํ™•์ธ
kubectl logs <pod-name> -n jeonbongjun

# 3. Health Check ํ™•์ธ
kubectl describe pod <pod-name> -n jeonbongjun

5. Spring Boot ์—ฐ๊ฒฐ ์‹คํŒจ

Error: ๊ฒฝ์ œ์ง€ํ‘œ ์กฐํšŒ HTTP ์˜ค๋ฅ˜

ํ•ด๊ฒฐ์ฑ…:

  • utils/spring_client.py์—์„œ base_url ํ™•์ธ
  • Kubernetes: http://backend-svc:8080
  • ๋กœ์ปฌ: http://localhost:8080

๐Ÿ“ ํ–ฅํ›„ ๊ฐœ๋ฐœ ๊ณ„ํš

  • ๋ฉ€ํ‹ฐํ„ด ๋Œ€ํ™” ์ง€์› - ์„ธ์…˜ ๊ธฐ๋ฐ˜ ๋Œ€ํ™” ์ปจํ…์ŠคํŠธ ์œ ์ง€
  • ์‹ค์‹œ๊ฐ„ ๋‰ด์Šค ํฌ๋กค๋ง - ์ฆ๊ถŒ ๋‰ด์Šค ์ž๋™ ์ˆ˜์ง‘ ๋ฐ ์ž„๋ฒ ๋”ฉ
  • ๋ฐฑํ…Œ์ŠคํŒ… ์‹œ๋ฎฌ๋ ˆ์ด์…˜ - AI ์ถ”์ฒœ ๊ธฐ๋ฐ˜ ๊ฐ€์ƒ ํˆฌ์ž ์„ฑ๊ณผ ๋ถ„์„
  • ๊ฐ์„ฑ ๋ถ„์„ ๊ณ ๋„ํ™” - BERT ๊ธฐ๋ฐ˜ ๋‰ด์Šค/SNS ๊ฐ์„ฑ ๋ถ„์„
  • ํฌํŠธํด๋ฆฌ์˜ค ์ตœ์ ํ™” - ํ˜„๋Œ€ ํฌํŠธํด๋ฆฌ์˜ค ์ด๋ก (MPT) ์ ์šฉ
  • WebSocket ์ง€์› - ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ์‘๋‹ต
  • ๋‹ค๊ตญ์–ด ์ง€์› - ์˜์–ด/์ค‘๊ตญ์–ด ์งˆ๋ฌธ ์ฒ˜๋ฆฌ

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

์ด ํ”„๋กœ์ ํŠธ๋Š” MIT ๋ผ์ด์„ ์Šค ํ•˜์— ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ LICENSE ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages