Skip to content

fisa06-team-binary/stock-rag-platform

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

22 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

📈 Stock RAG Platform

Elasticsearch 기반 Hybrid Search + Vector Search + RAG 구조를 활용한
주식 종목 AI 분석 플랫폼입니다.

BM25 기반 키워드 검색과 Dense Vector 기반 Semantic Search를 결합하여
자연어 질문에 대한 기업 분석 결과를 제공합니다.


🚀 주요 기능

🔎 1. 종목 탐색기

  • 회사명 / 업종 / 주요제품 기반 검색
  • BM25 (Lexical Search)
  • Dense Vector 기반 Semantic Search
  • Hybrid 검색 지원
  • 검색 결과 개수 표시

🤖 2. AI 챗봇

  • Streamlit st.chat_input 기반 대화형 UI
  • 사용자 질문 → Elasticsearch 검색
  • 검색된 Context 기반 RAG 응답 생성
  • 검색 방식 표시 (lexical / semantic)

🏗 시스템 아키텍처


User Query
↓
Streamlit UI
↓
Elasticsearch
├─ BM25 (Lexical Search)
└─ Dense Vector (Semantic Search)
↓
Context 추출
↓
LLM (RAG)
↓
AI 응답 반환


🧠 검색 전략

1️⃣ Lexical Search (BM25)

  • 정확한 키워드 기반 검색
  • 회사명 검색에 적합

2️⃣ Semantic Search (Dense Vector)

  • 의미 기반 유사도 검색
  • 산업군 / 테마 검색에 적합

3️⃣ Hybrid Search

  • Lexical + Vector 점수 결합

📦 기술 스택

  • Python
  • Streamlit
  • Elasticsearch 8.x
  • Dense Vector
  • OpenAI API
  • Pandas / Numpy
  • SentenceTransformers (Embedding)

📂 프로젝트 구조


|-- .env
|-- .gitignore
|-- 100_elk_vectorize.py
|-- app.py
|-- elk_utils.py
|-- pages/
|     |-- 1-주식_종목_탐색기.py
|     |-- 2-AI_챗봇.py
|     |-- 3-하이브리드_탐색기.py
|     |-- 4-주식_데이터_정보.py
|     |-- 200_관리자_ELK_대시보드.py
|-- requirements.txt


🚨 트러블슈팅 (Troubleshooting)

1. 이슈 (Issue): - 시맨틱 검색(Semantic Search) 모드에서 "소부장" 같은 한국 주식 시장의 특정 테마 약어를 입력 시 연관된 주식 데이터가 전혀 검색되지 않는 현상(Recall 저하) 발생.

2. 원인 분석 (Root Cause Analysis):

  • 임베딩 모델의 도메인 지식 한계: 사용 중인 범용 벡터 임베딩 모델이 해당 신조어/약어가 내포한 실질적인 비즈니스 의미("소재", "부품", "장비")와의 벡터 공간상 거리(Cosine Similarity)를 좁히지 못함.
  • 데이터 희소성(Sparsity): 타겟 문서(주식 정보) 내에 "소부장"이라는 단어 자체가 직접적으로 존재하지 않아, 렉시컬(키워드) 검색으로도 Fallback 되지 않는 구조적 문제 확인.

3. 해결 방안 (Resolution):

  • Query Expansion 로직 도입: 사용자 입력(Input)을 DB에 바로 던지지 않고, 중간에 LLM(gpt-4o-mini)을 거쳐 검색에 유리한 단답형 키워드 목록으로 번역/확장하는 미들웨어 로직 추가.

  • 결과: 도메인 용어 검색 시 내부적으로 정확한 산업군 풀네임으로 치환되어 검색 엔진에 전달됨으로써, 검색 성공률 및 정확도가 대폭 상승함.


⚙️ 실행 방법

1️⃣ Elasticsearch 실행 (Docker 권장)

docker run -p 9200:9200 -e "discovery.type=single-node" elasticsearch:8.11.0

(선택) Kibana 실행

docker run -p 5601:5601 --link elasticsearch kibana:8.11.0

2️⃣ 가상환경 생성

python -m venv myenv
myenv\Scripts\activate   # Windows

3️⃣ 패키지 설치

pip install -r requirements.txt

4️⃣ .env 파일 생성

OPENAI_API_KEY=your_openai_key

5️⃣ 데이터 벡터화 및 인덱싱

python 100_elk_vectorize.py

6️⃣ Streamlit 실행

streamlit run app.py

📊 데이터 전처리

기업 정보 데이터를 아래와 같이 통합하여 벡터화:

df['context'] = (
    "회사명: " + df['회사명'].fillna('') + " | "
    "업종: " + df['업종'].fillna('') + " | "
    "주요제품: " + df['주요제품'].fillna('')
)

🎯 학습 포인트

  • RAG 구조 직접 설계 및 구현
  • Elasticsearch Dense Vector 활용
  • Hybrid Search 전략 설계
  • Streamlit 멀티페이지 구조 구성
  • 대량 데이터 벡터화 및 인덱싱 경험

🔄 향후 개선 계획

  • 검색 결과 리랭킹 추가
  • 산업군 통계 시각화
  • 기업 비교 분석 기능
  • 투자 리포트 자동 생성
  • Elastic Cloud 배포

🖼 데모 화면

screencapture-localhost-8503-2026-02-23-14_06_03 screencapture-localhost-8503-AI-2026-02-23-14_07_35 screencapture-localhost-8503-2026-02-23-14_08_11 screencapture-localhost-8503-2026-02-23-14_08_32 screencapture-localhost-8503-ELK-2026-02-23-14_08_52

About

Elasticsearch 기반 Hybrid Search + Vector Search + RAG 구조를 활용한 주식 종목 AI 분석 플랫폼입니다.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages