Skip to content

About

ETF-focused RAG system with daily crawling, vectorized document storage (Weaviate), OpenAI/sLLM support, and flexible server deployment with REST & ConnectRPC APIs. Ideal for long-term investment Q&A services.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

ETF RAG Agent πŸš€

κ΅­λ‚΄μ™Έ ETF 정보 기반 RAG(Retrieval-Augmented Generation) μ‹œμŠ€ν…œ

μž₯기투자λ₯Ό μœ„ν•œ μ •ν™•ν•˜κ³  μ΅œμ‹ μ˜ ETF 정보λ₯Ό RAG λ°©μ‹μœΌλ‘œ μ œκ³΅ν•˜λŠ” AI 기반 μ§ˆμ˜μ‘λ‹΅ μ‹œμŠ€ν…œμž…λ‹ˆλ‹€.

Python FastAPI Weaviate License


πŸ“‹ λͺ©μ°¨


🌐 온라인 데λͺ¨

πŸ”— Hugging Face Spaces: https://huggingface.co/spaces/Yugwon/etf-rag-agent


✨ μ£Όμš” κΈ°λŠ₯

🎯 핡심 κΈ°λŠ₯

  • RAG 기반 μ§ˆμ˜μ‘λ‹΅: μ΅œμ‹  ETF 정보λ₯Ό λ°”νƒ•μœΌλ‘œ μ •ν™•ν•œ λ‹΅λ³€ 제곡
  • πŸ–₯️ Gradio μ›Ή UI: μ±„νŒ… μΈν„°νŽ˜μ΄μŠ€λ‘œ μ‰½κ²Œ ETF 정보 질의 (둜컬 & ν΄λΌμš°λ“œ)
  • λ©€ν‹°μ†ŒμŠ€ 데이터 μˆ˜μ§‘:
    • πŸ‡°πŸ‡· κ΅­λ‚΄ ETF (넀이버 금육)
    • πŸ‡ΊπŸ‡Έ ν•΄μ™Έ ETF (yfinance)
    • πŸ“„ κ³΅μ‹œ λ¬Έμ„œ (DART API)
  • μ™„μ „ 무료 운영 κ°€λŠ₯: 둜컬 μž„λ² λ”© λͺ¨λΈλ‘œ OpenAI API 없이 μ‚¬μš© κ°€λŠ₯
  • LLM 선택 μ˜΅μ…˜: Ollama (qwen2.5:3b) λ˜λŠ” OpenAI GPT (선택)
  • μžλ™ μŠ€μΌ€μ€„λ§: 맀일 μžλ™μœΌλ‘œ μ΅œμ‹  ETF 정보 μˆ˜μ§‘
  • 벑터 DB 관리: 쀑볡 제거 및 버전 κ΄€λ¦¬λ‘œ 효율적 μ €μž₯
  • ☁️ ν΄λΌμš°λ“œ 배포: Hugging Face Spaces 무료 배포 지원

πŸ”§ 기술 μŠ€νƒ

  • Backend: FastAPI, gRPC (ConnectRPC)
  • Frontend: Gradio (Python μ›Ή UI)
  • Vector DB: Weaviate
  • LLM: Ollama (qwen2.5:3b) / OpenAI GPT-4
  • Embedding: sentence-transformers (all-MiniLM-L6-v2)
  • Crawling: BeautifulSoup4, yfinance, DART API
  • Scheduler: APScheduler
  • Deployment: Hugging Face Spaces + GitHub Actions

πŸ—οΈ μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚               User Interface               β”‚
β”‚          (REST API / gRPC Client)          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                     β”‚
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚                         β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  FastAPI REST  β”‚       β”‚  gRPC Server   β”‚
β”‚    Server      β”‚       β”‚  (ConnectRPC)  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚                        β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                 β”‚
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚  RAG Handler    β”‚
        β”‚  (Query Engine) β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                 β”‚
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚                             β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Weaviate      β”‚          β”‚   LLM Model      β”‚
β”‚  Vector Store  β”‚          β”‚ (OpenAI/Local)   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β–²β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β”‚
        β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              Data Collectors                β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Naver Crawlerβ”‚ yfinance API β”‚  DART API     β”‚
β”‚  (κ΅­λ‚΄ ETF)   β”‚  (ν•΄μ™Έ ETF)   β”‚  (κ³΅μ‹œλ¬Έμ„œ)      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
        β–²
        β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Scheduler    β”‚
β”‚  (Daily Cron)  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸš€ μ„€μΉ˜ 방법

1. 사전 μš”κ΅¬μ‚¬ν•­

  • Python 3.10 이상
  • Docker (Weaviate μ‹€ν–‰μš©)
  • Git

2. μ €μž₯μ†Œ 클둠

git clone https://github.com/YugwonWon/etf-rag-agent.git
cd etf-rag-agent

3. κ°€μƒν™˜κ²½ 생성 및 ν™œμ„±ν™”

python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

4. μ˜μ‘΄μ„± μ„€μΉ˜

pip install -r requirements.txt

5. Weaviate μ‹€ν–‰ (Docker)

# ν”„λ‘œμ νŠΈ λ””λ ‰ν† λ¦¬μ—μ„œ μ‹€ν–‰
docker run -d --name weaviate \
  -p 8081:8080 \
  -p 50051:50051 \
  -e QUERY_DEFAULTS_LIMIT=25 \
  -e AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED=true \
  -e PERSISTENCE_DATA_PATH='/var/lib/weaviate' \
  -e DEFAULT_VECTORIZER_MODULE='none' \
  -e ENABLE_MODULES='' \
  -e CLUSTER_HOSTNAME='node1' \
  -v $(pwd)/data/weaviate:/var/lib/weaviate \
  semitechnologies/weaviate:1.32.13

πŸ’Ύ 데이터 μ €μž₯ μœ„μΉ˜: ./data/weaviate/ (ν”„λ‘œμ νŠΈ λ‚΄ 둜컬 디렉토리)


βš™οΈ ν™˜κ²½ μ„€μ •

1. ν™˜κ²½ λ³€μˆ˜ 파일 생성

cp .env.example .env

2. .env 파일 μˆ˜μ •

κΈ°λ³Έ μ„€μ •:

# LLM Provider 선택
LLM_PROVIDER=local  # 둜컬 λͺ¨λΈ μ‚¬μš©

# Weaviate μ„€μ •
WEAVIATE_URL=http://localhost:8081

# μŠ€μΌ€μ€„λŸ¬ μ„€μ •
ENABLE_SCHEDULER=true
CRAWL_TIME_HOUR=9
CRAWL_TIME_MINUTE=0

선택 사항:

# OpenAI API Key (유료, LLM_PROVIDER=openai μ‚¬μš© μ‹œμ—λ§Œ)
# OPENAI_API_KEY=your-openai-api-key-here

# DART API Key
# DART_API_KEY=your-dart-api-key-here

3. DART API ν‚€ λ°œκΈ‰ (선택)

DART κ³΅μ‹œ λ¬Έμ„œλ₯Ό μˆ˜μ§‘ν•˜λ €λ©΄:

  1. DART μ˜€ν”ˆ API 접속
  2. νšŒμ›κ°€μž… 및 인증킀 λ°œκΈ‰
  3. .env νŒŒμΌμ— ν‚€ μž…λ ₯

πŸ’» μ‚¬μš© 방법

πŸš€ λΉ λ₯Έ μ‹œμž‘ (톡합 관리 슀크립트)

1. μ„œλ²„ 관리

# 도움말 확인
./server.sh --help

# μ„œλ²„ μ‹œμž‘
./server.sh start

# μ„œλ²„ μƒνƒœ 확인
./server.sh status

# 둜그 μ‹€μ‹œκ°„ 확인
./server.sh logs

# 둜그 λ§ˆμ§€λ§‰ 50쀄 확인
./server.sh logs -n 50

# μ„œλ²„ 쀑지
./server.sh stop

# μ„œλ²„ μž¬μ‹œμž‘
./server.sh restart

# 포트 λ³€κ²½ (κΈ°λ³Έ: 8000)
./server.sh start --port 8080

2. Gradio μ›Ή UI μ‚¬μš© (ꢌμž₯)

# Gradio μ˜μ‘΄μ„± μ„€μΉ˜
pip install gradio

# Gradio UI μ‹€ν–‰
python gradio_app.py

# λΈŒλΌμš°μ €μ—μ„œ 접속
# http://localhost:7860

Gradio UI μ£Όμš” κΈ°λŠ₯:

  • πŸ’¬ μ±„νŒ… μΈν„°νŽ˜μ΄μŠ€λ‘œ ETF 질의
  • πŸ“Š μ‹€μ‹œκ°„ 톡계 확인
  • πŸ“š μ°Έκ³  λ¬Έμ„œ 좜처 ν‘œμ‹œ
  • πŸ” 검색 λ¬Έμ„œ 수 μ‘°μ • (top_k)

3. CLI ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μš©

# 도움말
python cli.py --help

# μ„œλ²„ μƒνƒœ 확인
python cli.py health

# ETF 질의 (기본)
python cli.py query "KODEX 200 ETF에 λŒ€ν•΄ μ„€λͺ…ν•΄μ€˜"

# 상세 정보 포함
python cli.py query "λ―Έκ΅­ S&P 500 ETF μΆ”μ²œν•΄μ€˜" --top-k 5 --verbose

# 톡계 정보 쑰회
python cli.py stats

# 데이터 μˆ˜μ§‘ μ‹€ν–‰
python cli.py collect

πŸ“– 전톡적인 방법

1. gRPC Proto 파일 생성 (선택)

python -m grpc_tools.protoc \
  -I./protos \
  --python_out=./protos/__generated__ \
  --grpc_python_out=./protos/__generated__ \
  ./protos/etf_query.proto

2. μ„œλ²„ 직접 μ‹€ν–‰

FastAPI REST μ„œλ²„:

python -m uvicorn app.main:app --host 0.0.0.0 --port 8000

μ„œλ²„ μ‹€ν–‰ ν›„: http://localhost:8000/docs

gRPC μ„œλ²„ (선택):

python -m app.connect_rpc

3. 초기 데이터 μˆ˜μ§‘

방법 1: CLI μ‚¬μš© (ꢌμž₯)

python cli.py collect

방법 2: API 호좜

curl -X POST "http://localhost:8000/api/collect"

방법 3: Python 슀크립트

from app.crawler.collector import ETFDataCollector
from app.vector_store.weaviate_handler import WeaviateHandler

handler = WeaviateHandler()
collector = ETFDataCollector(vector_handler=handler)
results = collector.collect_all(insert_to_db=True)
print(f'Total collected: {results["total"]}')

4. μ§ˆμ˜μ‘λ‹΅ μ˜ˆμ‹œ

CLI μ‚¬μš© (ꢌμž₯):

python cli.py query "KODEX 200 ETF의 μž₯단점은?" --verbose

REST API:

curl -X POST "http://localhost:8000/api/query" \
  -H "Content-Type: application/json" \
  -d '{
    "question": "KODEX λ―Έκ΅­S&P500 ETF에 λŒ€ν•΄ μ•Œλ €μ€˜",
    "top_k": 3
  }'

Python ν΄λΌμ΄μ–ΈνŠΈ:

from app.retriever.query_handler import RAGQueryHandler

handler = RAGQueryHandler()
response = handler.query(
    question="TIGER κΈˆμ„ λ¬Ό ETF의 총 λ³΄μˆ˜λŠ” μ–Όλ§ˆμΈκ°€μš”?"
)

print(f"λ‹΅λ³€: {response['answer']}")
print(f"μ°Έκ³  λ¬Έμ„œ: {response['num_sources']}개")

πŸ“š API λ¬Έμ„œ

REST API Endpoints

1. μ§ˆμ˜μ‘λ‹΅

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

{
  "question": "string",
  "model_type": "openai",  // or "local"
  "etf_type": "domestic",  // optional: "domestic", "foreign"
  "top_k": 5,
  "temperature": 0.7
}

2. ETF 정보 쑰회

GET /api/etf/{etf_code}

3. 데이터 μˆ˜μ§‘ 트리거

POST /api/collection/trigger
Content-Type: application/json

{
  "domestic": true,
  "foreign": true,
  "dart": true,
  "domestic_max": 100  // optional
}

4. ν—¬μŠ€ 체크

GET /api/health

5. μˆ˜μ§‘ μƒνƒœ 확인

GET /api/collection/status

gRPC API

ν”„λ‘œν†  μ •μ˜: protos/etf_query.proto

Services:

  • AskQuestion: μ§ˆμ˜μ‘λ‹΅
  • GetETFSummary: ETF μš”μ•½ 정보
  • TriggerCollection: 데이터 μˆ˜μ§‘ 트리거
  • HealthCheck: ν—¬μŠ€ 체크

πŸ—„οΈ 데이터 μ†ŒμŠ€

1. κ΅­λ‚΄ ETF (넀이버 금육)

2. ν•΄μ™Έ ETF (yfinance)

  • μ†ŒμŠ€: Yahoo Finance API
  • λŒ€μƒ: μ£Όμš” λ―Έκ΅­ ETF (SPY, QQQ, ARKK λ“±)
  • μˆ˜μ§‘ ν•­λͺ©: 가격, 보수율, μžμ‚°κ·œλͺ¨, λ°°λ‹Ήμˆ˜μ΅λ₯  λ“±

3. κ³΅μ‹œ λ¬Έμ„œ (DART)

  • μ†ŒμŠ€: https://opendart.fss.or.kr/
  • μˆ˜μ§‘ ν•­λͺ©: ETF νˆ¬μžμ„€λͺ…μ„œ, μš΄μš©λ³΄κ³ μ„œ λ“±

πŸ“ ν”„λ‘œμ νŠΈ ꡬ쑰

etf-rag-agent/
β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ __init__.py
β”‚   β”œβ”€β”€ main.py                 # FastAPI REST μ„œλ²„
β”‚   β”œβ”€β”€ connect_rpc.py          # gRPC μ„œλ²„
β”‚   β”œβ”€β”€ config.py               # ν™˜κ²½μ„€μ •
β”‚   β”œβ”€β”€ scheduler.py            # μŠ€μΌ€μ€„λŸ¬
β”‚   β”œβ”€β”€ model/
β”‚   β”‚   β”œβ”€β”€ __init__.py
β”‚   β”‚   β”œβ”€β”€ openai_model.py     # OpenAI λͺ¨λΈ ν•Έλ“€λŸ¬
β”‚   β”‚   β”œβ”€β”€ local_model.py      # 둜컬 LLM ν•Έλ“€λŸ¬
β”‚   β”‚   └── model_factory.py    # λͺ¨λΈ νŒ©ν† λ¦¬
β”‚   β”œβ”€β”€ crawler/
β”‚   β”‚   β”œβ”€β”€ __init__.py
β”‚   β”‚   β”œβ”€β”€ naver_kr.py         # 넀이버 크둀러
β”‚   β”‚   β”œβ”€β”€ yfinance_us.py      # yfinance 크둀러
β”‚   β”‚   β”œβ”€β”€ dart_api.py         # DART API 크둀러
β”‚   β”‚   └── collector.py        # 톡합 μˆ˜μ§‘κΈ°
β”‚   β”œβ”€β”€ vector_store/
β”‚   β”‚   β”œβ”€β”€ __init__.py
β”‚   β”‚   └── weaviate_handler.py # Weaviate ν•Έλ“€λŸ¬
β”‚   └── retriever/
β”‚       β”œβ”€β”€ __init__.py
β”‚       └── query_handler.py    # RAG 쿼리 ν•Έλ“€λŸ¬
β”œβ”€β”€ protos/
β”‚   β”œβ”€β”€ __init__.py
β”‚   β”œβ”€β”€ etf_query.proto         # gRPC proto μ •μ˜
β”‚   └── __generated__/          # μƒμ„±λœ proto μ½”λ“œ
β”œβ”€β”€ data/
β”‚   β”œβ”€β”€ raw/                    # μ›μ‹œ 데이터
β”‚   └── metadata.json           # 메타데이터
β”œβ”€β”€ .env.example                # ν™˜κ²½λ³€μˆ˜ μ˜ˆμ‹œ
β”œβ”€β”€ .gitignore
β”œβ”€β”€ requirements.txt
β”œβ”€β”€ LICENSE
└── README.md

πŸ”§ 개발 & ν…ŒμŠ€νŠΈ

κ°œλ³„ μ»΄ν¬λ„ŒνŠΈ ν…ŒμŠ€νŠΈ

# Config ν…ŒμŠ€νŠΈ
python -m app.config

# 넀이버 크둀러 ν…ŒμŠ€νŠΈ
python -m app.crawler.naver_kr

# yfinance 크둀러 ν…ŒμŠ€νŠΈ
python -m app.crawler.yfinance_us

# Weaviate ν•Έλ“€λŸ¬ ν…ŒμŠ€νŠΈ
python -m app.vector_store.weaviate_handler

# RAG 쿼리 ν•Έλ“€λŸ¬ ν…ŒμŠ€νŠΈ
python -m app.retriever.query_handler

둜그 확인

# μ„œλ²„ 둜그
./server.sh logs

# Gradio 둜그
tail -f gradio.log

# μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 둜그
tail -f logs/etf-rag-agent.log

☁️ ν΄λΌμš°λ“œ 배포

Hugging Face Spaces 무료 배포

Gradio UIλ₯Ό Hugging Face Spaces에 무료둜 배포할 수 μžˆμŠ΅λ‹ˆλ‹€!

배포 단계:

  1. Hugging Face 계정 생성 (κ°€μž…ν•˜κΈ°)
  2. Access Token 생성 (Write κΆŒν•œ)
  3. GitHub Secrets μ„€μ •:
    • HF_TOKEN: Hugging Face Access Token
    • HF_SPACE: Space ID (예: username/etf-rag-agent)
  4. μ½”λ“œ ν‘Έμ‹œ:
    git add spaces/
    git commit -m "Deploy to Hugging Face Spaces"
    git push origin main
  5. μžλ™ 배포: GitHub Actionsκ°€ μžλ™μœΌλ‘œ 배포 μ‹€ν–‰

상세 κ°€μ΄λ“œ: DEPLOYMENT.md μ°Έμ‘°

데λͺ¨ URL μ˜ˆμ‹œ: https://huggingface.co/spaces/[username]/etf-rag-agent

무료 μ˜΅μ…˜:

  • βœ… Hugging Face Spaces (CPU basic)
  • βœ… Railway/Render/Fly.io 무료 ν”Œλžœ
  • βœ… GitHub Actions (μ›” 2,000λΆ„ 무료)

🀝 κΈ°μ—¬ν•˜κΈ°

κΈ°μ—¬λŠ” μ–Έμ œλ‚˜ ν™˜μ˜ν•©λ‹ˆλ‹€!

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

πŸ“ λΌμ΄μ„ μŠ€

이 ν”„λ‘œμ νŠΈλŠ” MIT λΌμ΄μ„ μŠ€ ν•˜μ— λ°°ν¬λ©λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ LICENSE νŒŒμΌμ„ μ°Έμ‘°ν•˜μ„Έμš”.


πŸ‘€ μž‘μ„±μž

Yugwon Won


πŸ™ κ°μ‚¬μ˜ 말

이 ν”„λ‘œμ νŠΈλŠ” λ‹€μŒ μ˜€ν”ˆμ†ŒμŠ€ ν”„λ‘œμ νŠΈλ“€μ„ μ‚¬μš©ν•©λ‹ˆλ‹€:


πŸ“§ 문의

ν”„λ‘œμ νŠΈμ— λŒ€ν•œ μ§ˆλ¬Έμ΄λ‚˜ μ œμ•ˆμ‚¬ν•­μ΄ μžˆμœΌμ‹œλ©΄ 이슈λ₯Ό μƒμ„±ν•΄μ£Όμ„Έμš”.


⭐ 이 ν”„λ‘œμ νŠΈκ°€ μœ μš©ν•˜λ‹€λ©΄ Starλ₯Ό λˆŒλŸ¬μ£Όμ„Έμš”! ETF-focused RAG system with daily crawling, vectorized document storage (Weaviate), OpenAI/sLLM support, and flexible server deployment with REST & ConnectRPC APIs. Ideal for long-term investment Q&A services.

About

ETF-focused RAG system with daily crawling, vectorized document storage (Weaviate), OpenAI/sLLM support, and flexible server deployment with REST & ConnectRPC APIs. Ideal for long-term investment Q&A services.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages