μ΄λ―Έμ§μ ν μ€νΈλ₯Ό λͺ¨λ μ²λ¦¬ν μ μλ κ³ μ±λ₯ λ©ν°λͺ¨λ¬ RAG(Retrieval-Augmented Generation) μμ€ν μ λλ€. Ollamaμ Qwen2-VL λͺ¨λΈμ νμ©νμ¬ λμ©λ λ°μ΄ν°μμλ λΉ λ₯΄κ³ μ νν κ²μ λ° μμ± κΈ°λ₯μ μ 곡ν©λλ€.
- μ£Όμ νΉμ§ λ° μ©λ
- μμ€ν μν€ν μ²
- κΈ°μ μ€ν
- μ€μΉ λ° μ€ν κ°μ΄λ
- νκ²½ μ€μ
- μ¬μ© κ°μ΄λ
- λ¬Έμ ν΄κ²°
- νλ‘μ νΈ μ¬ν μ 보
- ν₯ν κ³ν
- κΈ°μ¬ μλ΄
- μΆκ° μ 보
- λ©ν°λͺ¨λ¬ κ²μ: ν μ€νΈμ μ΄λ―Έμ§λ₯Ό ν΅ν©μ μΌλ‘ κ²μνλ νμ΄λΈλ¦¬λ κ²μ μμ§
- κ³ μ±λ₯ μλ² λ©: Qwen2-VL λͺ¨λΈ κΈ°λ°μ μ κ΅ν μλ§¨ν± μλ² λ©
- μ§λ₯ν 쿼리 μ΅μ ν: Mistral 7B λͺ¨λΈμ νμ©ν μλ 쿼리 리λΌμ΄ν
- GPU κ°μ: CUDA κΈ°λ°μ λ³λ ¬ μ²λ¦¬λ‘ μ΄κ³ μ κ²μ κ°λ₯
- RESTful API: FastAPI κΈ°λ°μ νμ₯ κ°λ₯ν API μν€ν μ²
- 컨ν μ΄λ μ§μ: Dockerλ₯Ό ν΅ν μμ¬μ΄ λ°°ν¬ λ° νμ₯
- λ¬Έμ λ° μ΄λ―Έμ§ κΈ°λ° μ§μ κ²μ μμ€ν
- AI μ΄μμ€ν΄νΈλ₯Ό μν μ§μ λ² μ΄μ€
- λνν Q&A μμ€ν
- λ©ν°λͺ¨λ¬ μ½ν μΈ λΆμ νλ«νΌ
- 쿼리 μμ : μ¬μ©μκ° API λλ CLIλ₯Ό ν΅ν΄ ν μ€νΈ λλ μ΄λ―Έμ§ 쿼리λ₯Ό μ λ ₯ν©λλ€.
- 쿼리 μ΅μ ν (μ ν μ¬ν):
Mistral 7Bλͺ¨λΈμ΄ κ²μ μ νλλ₯Ό λμ΄κΈ° μν΄ μΏΌλ¦¬λ₯Ό μ¬μμ±ν©λλ€. - λ©ν°λͺ¨λ¬ μλ² λ©:
Qwen2-VLλͺ¨λΈμ΄ 쿼리λ₯Ό λ²‘ν° μλ² λ©μΌλ‘ λ³νν©λλ€. - μ μ¬λ κ²μ:
FAISSλ²‘ν° λ°μ΄ν°λ² μ΄μ€μμ 쿼리 벑ν°μ μ μ¬ν ν μ€νΈ λ° μ΄λ―Έμ§ 벑ν°λ₯Ό κ²μν©λλ€. - κ²°κ³Ό νμ²λ¦¬: κ²μλ κ²°κ³Όλ₯Ό μμννκ³ μ»¨ν μ€νΈλ₯Ό ꡬμ±ν©λλ€.
- λ΅λ³ μμ±: ꡬμ±λ 컨ν
μ€νΈλ₯Ό κΈ°λ°μΌλ‘
Ollamaμ LLMμ΄ μ΅μ’ λ΅λ³μ μμ±ν©λλ€. - μλ΅ λ°ν: μ΅μ’ κ²μ κ²°κ³Όμ μμ±λ λ΅λ³μ μ¬μ©μμκ² λ°νν©λλ€.
| κ΅¬λΆ | κΈ°μ | μ€λͺ |
|---|---|---|
| μΈμ΄ | Python 3.11+ | νλ‘μ νΈμ μ£Ό κ°λ° μΈμ΄μ λλ€. |
| ML/DL | Transformers | Alibaba-NLP/gme-Qwen2-VL-7B-Instruct λͺ¨λΈ λ‘λ© λ° μ¬μ© |
| FAISS | Facebook AIμ κ³ μ±λ₯ λ²‘ν° μ μ¬λ κ²μ λΌμ΄λΈλ¬λ¦¬ | |
| PyTorch | λ₯λ¬λ λͺ¨λΈμ λ°±μλ νλ μμν¬ | |
| LLM μΈνλΌ | Ollama | λ‘컬 νκ²½μμ LLMμ μ€ννκΈ° μν νλ«νΌ |
llama4:17b-scout-16e |
λ©μΈ λ΅λ³ μμ±μ μν λͺ¨λΈ | |
mistral:7b-instruct |
쿼리 μ΅μ νλ₯Ό μν λͺ¨λΈ | |
| μΉ νλ μμν¬ | FastAPI | κ³ μ±λ₯ λΉλκΈ° API μλ² κ΅¬μΆ |
| Uvicorn | ASGI μλ² | |
| μ νΈλ¦¬ν° | Pydantic | λ°μ΄ν° μ ν¨μ± κ²μ¬ λ° μ€μ κ΄λ¦¬ |
| NumPy, Pillow | μμΉ μ°μ° λ° μ΄λ―Έμ§ μ²λ¦¬ | |
| Docker | Ollama μλ² λ± μλΉμ€μ 컨ν μ΄λν λ° λ°°ν¬ |
- OS: Linux (Rocky Linux 8.9μμ ν μ€νΈ μλ£)
- Python: 3.11.8 μ΄μ
- νλμ¨μ΄:
- GPU: NVIDIA H100 λλ μ μ¬ μ¬μ.
Alibaba-NLP/gme-Qwen2-VL-7B-Instructλͺ¨λΈ λ° FAISSμ μνν ꡬλμ μν΄ μ΅μ 100GB μ΄μμ VRAMμ κ°λ ₯ν κΆμ₯ν©λλ€.
- GPU: NVIDIA H100 λλ μ μ¬ μ¬μ.
- μννΈμ¨μ΄:
- Docker (v26.1.3 μ΄μ)
- NVIDIA Container Toolkit (GPU κ°μ μ¬μ© μ νμ)
- CUDA 12.6
-
μ μ₯μ 볡μ λ° νκ²½ λ³μ μ€μ
# μ μ₯μ ν΄λ‘ git clone <repository-url> && cd rag_system # νκ²½ λ³μ νμΌ μμ± (νμ μ .env νμΌ λ΄μ© μμ ) cp .env.example .env
-
κ°μνκ²½ μμ± λ° νμ±ν
# Linux/macOS python -m venv venv source venv/bin/activate # Windows # .\venv\Scripts\activate
-
νμ ν¨ν€μ§ μ€μΉ
pip install --upgrade pip pip install -r requirements.txt
-
Ollama μ€μΉ λ° λͺ¨λΈ λ€μ΄λ‘λ
# Ollama μ€μΉ (Linux) curl -fsSL [https://ollama.com/install.sh](https://ollama.com/install.sh) | sh # Dockerλ₯Ό μ¬μ©ν Ollama μλ² μ€ν (GPU μ¬μ©) docker run -d --gpus=all \ -p 11434:11434 \ --name ollama \ -v ollama:/root/.ollama \ ollama/ollama # νμ LLM λͺ¨λΈ λ€μ΄λ‘λ (μκ°μ΄ μμλ μ μμ) docker exec ollama ollama pull mistral:7b-instruct-v0.3-fp16 docker exec ollama ollama pull llama4:17b-scout-16e-instruct-q4_K_M
-
λ°μ΄ν° μλ² λ© λ° μΈλ±μ±
embedding_system.pyλ₯Ό μ¬μ©νμ¬ κ²μ λμ λ°μ΄ν°μ λ²‘ν° μΈλ±μ€λ₯Ό μμ±ν©λλ€.# ν μ€νΈ λ°μ΄ν° μΈλ±μ± μμ python embedding_system.py --json /path/to/text_data.json --type text # μ΄λ―Έμ§ λ°μ΄ν° μΈλ±μ± μμ python embedding_system.py --json /path/to/image_data.json --type image
μμ€ν
μ μ£Όμ μ€μ μ rag_config.py νμΌμ RAGConfig ν΄λμ€μμ κ΄λ¦¬ν©λλ€.
# ===== λ°μ΄ν° μ€μ =====
DATA_PATH = "/path/to/your/data.json"
IMAGE_BASE_PATH = "/path/to/images"
EMBEDDING_CACHE_DIR = "./embeddings"
# ===== λͺ¨λΈ μ€μ =====
MULTIMODAL_MODEL = "Alibaba-NLP/gme-Qwen2-VL-7B-Instruct"
OLLAMA_MODEL = "llama4:17b-scout-16e-instruct-q4_K_M"
QUERY_REWRITER_MODEL = "mistral:7b-instruct-v0.3-fp16"
# ===== κ²μ μ€μ =====
TOP_K = 5
SIMILARITY_THRESHOLD = 0.6
USE_QUERY_REWRITING = True
# ===== μ±λ₯ μ€μ =====
BATCH_SIZE = 4
USE_GPU = Truerag_clihandler.pyλ₯Ό ν΅ν΄ 컀맨λ λΌμΈμμ μμ€ν
μ μ¬μ©ν μ μμ΅λλ€.
- κΈ°λ³Έ κ²μ
python rag_clihandler.py -q "κ²μμ΄" - μμ 10κ° κ²°κ³Ό νμ
python rag_clihandler.py -q "κ²μμ΄" -k 10 - μ΄λ―Έμ§λ§ κ²μ
python rag_clihandler.py -q "κ²μμ΄" --media-type image - AI λ΅λ³ μμ± λΉνμ±ν
python rag_clihandler.py -q "κ²μμ΄" --no-ai - λνν λͺ¨λ μ€ν
python rag_clihandler.py -i
-
FastAPI μλ² μ€ν
uvicorn rag_fastapi:app --host 0.0.0.0 --port 8000 --reload
μλ² μ€ν ν, λΈλΌμ°μ μμ
http://localhost:8000/docsλ₯Ό ν΅ν΄ API λ¬Έμλ₯Ό νμΈν μ μμ΅λλ€. -
API μλν¬μΈνΈ
POST /api/v1/search: λ¬Έμ κ²μ λ° λ΅λ³ μμ±POST /chat: λνν μ±ν μΈν°νμ΄μ€ (READMEμ λͺ μλμ΄ μμΌλ μμΈ λ΄μ©μrag_fastapi.pyνμΈ νμ)
-
API μμ² μμ (
/api/v1/search)Request:
{ "query": "κ²μν μ§λ¬Έ λλ ν€μλ", "top_k": 5, "threshold": 0.6, "use_images": true, "rewrite_query": true }Response:
{ "success": true, "query": "μλ³Έ 쿼리 λ¬Έμμ΄", "results": [ { "id": "λ¬Έμ ID", "content": "λ¬Έμ λ΄μ©", "similarity": 0.95, "metadata": { "source": "μΆμ²" }, "type": "text" } ], "response": "μμ±λ λ΅λ³ (AIκ° μμ±ν κ²½μ°)", "images": [ { "id": "μ΄λ―Έμ§ ID", "url": "μ΄λ―Έμ§ URL" } ], "error": null }
- CUDA λ©λͺ¨λ¦¬ λΆμ‘±:
rag_config.pyνμΌμμBATCH_SIZEλ₯Ό λ μμ κ°(μ: 2 λλ 1)μΌλ‘ μ‘°μ νμΈμ. - Ollama μ°κ²° μ€λ₯:
# Docker 컨ν μ΄λ μν νμΈ λ° μ¬μμ docker ps | grep ollama docker restart ollama docker logs -f ollama
βββ README.md # νλ‘μ νΈ λ¬Έμ
βββ embedding_system.py # λ²‘ν° μλ² λ© μμ± λ° κ΄λ¦¬ μμ€ν
βββ image_incoder.py # μ΄λ―Έμ§ μΈμ½λ© μ²λ¦¬ λͺ¨λ
βββ ollamagen.py # Ollama APIλ₯Ό ν΅ν ν
μ€νΈ μμ± λͺ¨λ
βββ rag_clihandler.py # 컀맨λ λΌμΈ μΈν°νμ΄μ€ μ²λ¦¬κΈ°
βββ rag_config.py # μμ€ν
μ€μ κ΄λ¦¬
βββ rag_fastapi.py # FastAPI κΈ°λ° REST API μλ²
βββ rag_formatter.py # κ²μ κ²°κ³Ό ν¬λ§·ν
λͺ¨λ
βββ rag_initializer.py # μμ€ν
μ΄κΈ°ν λ° μ€μ λͺ¨λ
βββ rag_integration.py # μΈλΆ μμ€ν
ν΅ν© λͺ¨λ
βββ rag_rewriter.py # 쿼리 μ¬μμ± λͺ¨λ
βββ rag_search.py # ν΅μ¬ κ²μ μμ§ λͺ¨λ
βββ rag_utils.py # μ νΈλ¦¬ν° ν¨μ λͺ¨λ
βββ requirements.txt # μμ‘΄μ± ν¨ν€μ§ λͺ©λ‘
βββ telepathy_rag.py # λ©μΈ RAG μμ€ν
ν΅ν© λͺ¨λ
- RAGSearchEngine (
rag_search.py): FAISSλ₯Ό νμ©νμ¬ λ©ν°λͺ¨λ¬ μλ² λ©μ μ μ¬λ κ²μμ μννλ ν΅μ¬ μμ§μ λλ€. - VectorDBService (
embedding_system.py): ν μ€νΈμ μ΄λ―Έμ§ λ°μ΄ν°λ₯Ό μλ² λ©νκ³ , λ³λμ FAISS μΈλ±μ€λ‘ κ΄λ¦¬νλ©°, μ μ₯/λ‘λ κΈ°λ₯μ μ 곡ν©λλ€. - OllamaGenerator (
ollamagen.py): Ollama APIλ₯Ό νΈμΆνμ¬ κ²μλ 컨ν μ€νΈ κΈ°λ°μ λ΅λ³μ μμ±ν©λλ€. - QueryRewriter (
rag_rewriter.py): Mistral λͺ¨λΈμ μ¬μ©νμ¬ μ¬μ©μ 쿼리λ₯Ό λ λͺ ννκ³ νλΆνκ² μ¬μμ±νμ¬ κ²μ μ±λ₯μ ν₯μμν΅λλ€. - SearchIntegration (
rag_integration.py): 쿼리 μ¬μμ±, κ²μ, λ΅λ³ μμ± λ± RAGμ μ 체 μν¬νλ‘μ°λ₯Ό ν΅ν©νκ³ μ‘°μ¨ν©λλ€.
- μ±λ₯ μ΅μ ν: HNSW μΈλ±μ€ μ¬μ©, λͺ¨λΈ μμν, 쿼리 μΊμ±, λ°°μΉ μ²λ¦¬ λ±μ ν΅ν΄ μ±λ₯μ ν₯μμμΌ°μ΅λλ€.
- νμ₯μ±: λΆμ° λ²‘ν° κ²μ(μ€λ©), λ‘λ λ°Έλ°μ± λ±μ ν΅ν΄ μν νμ₯μ΄ κ°λ₯νλ©°, μλ‘μ΄ λͺ¨λΈμ΄λ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ½κ² μΆκ°ν μ μλ νλ¬κ·ΈμΈ μν€ν μ²λ₯Ό κ³ λ €νκ³ μμ΅λλ€.
- λ©ν°λͺ¨λ¬ μλ² λ© μ±λ₯ μ΅μ ν
- Kubernetes κΈ°λ° μλ νμ₯(Auto-scaling) κΈ°λ₯ ꡬν
- μμ€ν μν λͺ¨λν°λ§μ μν λμ보λ κ°λ°
- μ§μ μ¦λ₯(Knowledge Distillation)λ₯Ό ν΅ν λͺ¨λΈ κ²½λν μ°κ΅¬
μ λ°μ΅λλ€.
μ΄ νλ‘μ νΈλ λ€μμ νλ₯ν μ€νμμ€ νλ‘μ νΈλ€ λλΆμ κ°λ₯νμ΅λλ€.
- Email:
koto144@gmail.com - Issues: GitHub Issues