Skip to content

JEONGHEESIK/Vector_RAG

Repository files navigation


python os

λ©€ν‹°λͺ¨λ‹¬ RAG μ‹œμŠ€ν…œ (Multi-Modal RAG System)

이미지와 ν…μŠ€νŠΈλ₯Ό λͺ¨λ‘ μ²˜λ¦¬ν•  수 μžˆλŠ” κ³ μ„±λŠ₯ λ©€ν‹°λͺ¨λ‹¬ RAG(Retrieval-Augmented Generation) μ‹œμŠ€ν…œμž…λ‹ˆλ‹€. Ollama와 Qwen2-VL λͺ¨λΈμ„ ν™œμš©ν•˜μ—¬ λŒ€μš©λŸ‰ λ°μ΄ν„°μ—μ„œλ„ λΉ λ₯΄κ³  μ •ν™•ν•œ 검색 및 생성 κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

λͺ©μ°¨

  1. μ£Όμš” νŠΉμ§• 및 μš©λ„
  2. μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜
  3. 기술 μŠ€νƒ
  4. μ„€μΉ˜ 및 μ‹€ν–‰ κ°€μ΄λ“œ
  5. ν™˜κ²½ μ„€μ •
  6. μ‚¬μš© κ°€μ΄λ“œ
  7. 문제 ν•΄κ²°
  8. ν”„λ‘œμ νŠΈ 심화 정보
  9. ν–₯ν›„ κ³„νš
  10. κΈ°μ—¬ μ•ˆλ‚΄
  11. μΆ”κ°€ 정보

1. μ£Όμš” νŠΉμ§• 및 μš©λ„

μ£Όμš” νŠΉμ§•

  • λ©€ν‹°λͺ¨λ‹¬ 검색: ν…μŠ€νŠΈμ™€ 이미지λ₯Ό ν†΅ν•©μ μœΌλ‘œ κ²€μƒ‰ν•˜λŠ” ν•˜μ΄λΈŒλ¦¬λ“œ 검색 μ—”μ§„
  • κ³ μ„±λŠ₯ μž„λ² λ”©: Qwen2-VL λͺ¨λΈ 기반의 μ •κ΅ν•œ μ‹œλ§¨ν‹± μž„λ² λ”©
  • μ§€λŠ₯ν˜• 쿼리 μ΅œμ ν™”: Mistral 7B λͺ¨λΈμ„ ν™œμš©ν•œ μžλ™ 쿼리 λ¦¬λΌμ΄νŒ…
  • GPU 가속: CUDA 기반의 병렬 처리둜 μ΄ˆκ³ μ† 검색 κ°€λŠ₯
  • RESTful API: FastAPI 기반의 ν™•μž₯ κ°€λŠ₯ν•œ API μ•„ν‚€ν…μ²˜
  • μ»¨ν…Œμ΄λ„ˆ 지원: Dockerλ₯Ό ν†΅ν•œ μ†μ‰¬μš΄ 배포 및 ν™•μž₯

μ£Όμš” μš©λ„

  • λ¬Έμ„œ 및 이미지 기반 지식 검색 μ‹œμŠ€ν…œ
  • AI μ–΄μ‹œμŠ€ν„΄νŠΈλ₯Ό μœ„ν•œ 지식 베이슀
  • λŒ€ν™”ν˜• Q&A μ‹œμŠ€ν…œ
  • λ©€ν‹°λͺ¨λ‹¬ μ½˜ν…μΈ  뢄석 ν”Œλž«νΌ

2. μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜

데이터 흐름

  1. 쿼리 μˆ˜μ‹ : μ‚¬μš©μžκ°€ API λ˜λŠ” CLIλ₯Ό 톡해 ν…μŠ€νŠΈ λ˜λŠ” 이미지 쿼리λ₯Ό μž…λ ₯ν•©λ‹ˆλ‹€.
  2. 쿼리 μ΅œμ ν™” (선택 사항): Mistral 7B λͺ¨λΈμ΄ 검색 정확도λ₯Ό 높이기 μœ„ν•΄ 쿼리λ₯Ό μž¬μž‘μ„±ν•©λ‹ˆλ‹€.
  3. λ©€ν‹°λͺ¨λ‹¬ μž„λ² λ”©: Qwen2-VL λͺ¨λΈμ΄ 쿼리λ₯Ό 벑터 μž„λ² λ”©μœΌλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€.
  4. μœ μ‚¬λ„ 검색: FAISS 벑터 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ 쿼리 벑터와 μœ μ‚¬ν•œ ν…μŠ€νŠΈ 및 이미지 벑터λ₯Ό κ²€μƒ‰ν•©λ‹ˆλ‹€.
  5. κ²°κ³Ό ν›„μ²˜λ¦¬: κ²€μƒ‰λœ κ²°κ³Όλ₯Ό μˆœμœ„ν™”ν•˜κ³  μ»¨ν…μŠ€νŠΈλ₯Ό κ΅¬μ„±ν•©λ‹ˆλ‹€.
  6. λ‹΅λ³€ 생성: κ΅¬μ„±λœ μ»¨ν…μŠ€νŠΈλ₯Ό 기반으둜 Ollama의 LLM이 μ΅œμ’… 닡변을 μƒμ„±ν•©λ‹ˆλ‹€.
  7. 응닡 λ°˜ν™˜: μ΅œμ’… 검색 결과와 μƒμ„±λœ 닡변을 μ‚¬μš©μžμ—κ²Œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

3. 기술 μŠ€νƒ

ꡬ뢄 기술 μ„€λͺ…
μ–Έμ–΄ 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 μ„œλ²„ λ“± μ„œλΉ„μŠ€μ˜ μ»¨ν…Œμ΄λ„ˆν™” 및 배포

4. μ„€μΉ˜ 및 μ‹€ν–‰ κ°€μ΄λ“œ

μ‹œμŠ€ν…œ μš”κ΅¬μ‚¬ν•­

  • OS: Linux (Rocky Linux 8.9μ—μ„œ ν…ŒμŠ€νŠΈ μ™„λ£Œ)
  • Python: 3.11.8 이상
  • ν•˜λ“œμ›¨μ–΄:
    • GPU: NVIDIA H100 λ˜λŠ” μœ μ‚¬ 사양. Alibaba-NLP/gme-Qwen2-VL-7B-Instruct λͺ¨λΈ 및 FAISS의 μ›ν™œν•œ ꡬ동을 μœ„ν•΄ μ΅œμ†Œ 100GB μ΄μƒμ˜ VRAM을 κ°•λ ₯히 ꢌμž₯ν•©λ‹ˆλ‹€.
  • μ†Œν”„νŠΈμ›¨μ–΄:
    • Docker (v26.1.3 이상)
    • NVIDIA Container Toolkit (GPU 가속 μ‚¬μš© μ‹œ ν•„μˆ˜)
    • CUDA 12.6

μ„€μΉ˜ 절차

  1. μ €μž₯μ†Œ 볡제 및 ν™˜κ²½ λ³€μˆ˜ μ„€μ •

    # μ €μž₯μ†Œ 클둠
    git clone <repository-url> && cd rag_system
    
    # ν™˜κ²½ λ³€μˆ˜ 파일 생성 (ν•„μš” μ‹œ .env 파일 λ‚΄μš© μˆ˜μ •)
    cp .env.example .env
  2. κ°€μƒν™˜κ²½ 생성 및 ν™œμ„±ν™”

    # Linux/macOS
    python -m venv venv
    source venv/bin/activate
    
    # Windows
    # .\venv\Scripts\activate
  3. ν•„μˆ˜ νŒ¨ν‚€μ§€ μ„€μΉ˜

    pip install --upgrade pip
    pip install -r requirements.txt
  4. 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
  5. 데이터 μž„λ² λ”© 및 인덱싱 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

5. ν™˜κ²½ μ„€μ •

μ‹œμŠ€ν…œμ˜ μ£Όμš” 섀정은 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 = True

6. μ‚¬μš© κ°€μ΄λ“œ

CLI 도ꡬ μ‚¬μš©λ²•

rag_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

API μ„œλ²„ μ‚¬μš©λ²•

  1. FastAPI μ„œλ²„ μ‹€ν–‰

    uvicorn rag_fastapi:app --host 0.0.0.0 --port 8000 --reload

    μ„œλ²„ μ‹€ν–‰ ν›„, λΈŒλΌμš°μ €μ—μ„œ http://localhost:8000/docsλ₯Ό 톡해 API λ¬Έμ„œλ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

  2. API μ—”λ“œν¬μΈνŠΈ

    • POST /api/v1/search: λ¬Έμ„œ 검색 및 λ‹΅λ³€ 생성
    • POST /chat: λŒ€ν™”ν˜• μ±„νŒ… μΈν„°νŽ˜μ΄μŠ€ (README에 λͺ…μ‹œλ˜μ–΄ μžˆμœΌλ‚˜ 상세 λ‚΄μš©μ€ rag_fastapi.py 확인 ν•„μš”)
  3. 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
    }

7. 문제 ν•΄κ²°

  • CUDA λ©”λͺ¨λ¦¬ λΆ€μ‘±: rag_config.py νŒŒμΌμ—μ„œ BATCH_SIZEλ₯Ό 더 μž‘μ€ κ°’(예: 2 λ˜λŠ” 1)으둜 μ‘°μ •ν•˜μ„Έμš”.
  • Ollama μ—°κ²° 였λ₯˜:
    # Docker μ»¨ν…Œμ΄λ„ˆ μƒνƒœ 확인 및 μž¬μ‹œμž‘
    docker ps | grep ollama
    docker restart ollama
    docker logs -f ollama

8. ν”„λ‘œμ νŠΈ 심화 정보

ν”„λ‘œμ νŠΈ ꡬ쑰

μ£Όμš” 파일 ꡬ성

β”œβ”€β”€ 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 인덱슀 μ‚¬μš©, λͺ¨λΈ μ–‘μžν™”, 쿼리 캐싱, 배치 처리 등을 톡해 μ„±λŠ₯을 ν–₯μƒμ‹œμΌ°μŠ΅λ‹ˆλ‹€.
  • ν™•μž₯μ„±: λΆ„μ‚° 벑터 검색(샀딩), λ‘œλ“œ λ°ΈλŸ°μ‹± 등을 톡해 μˆ˜ν‰ ν™•μž₯이 κ°€λŠ₯ν•˜λ©°, μƒˆλ‘œμš΄ λͺ¨λΈμ΄λ‚˜ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‰½κ²Œ μΆ”κ°€ν•  수 μžˆλŠ” ν”ŒλŸ¬κ·ΈμΈ μ•„ν‚€ν…μ²˜λ₯Ό κ³ λ €ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

9. ν–₯ν›„ κ³„νš

  • λ©€ν‹°λͺ¨λ‹¬ μž„λ² λ”© μ„±λŠ₯ μ΅œμ ν™”
  • Kubernetes 기반 μžλ™ ν™•μž₯(Auto-scaling) κΈ°λŠ₯ κ΅¬ν˜„
  • μ‹œμŠ€ν…œ μƒνƒœ λͺ¨λ‹ˆν„°λ§μ„ μœ„ν•œ λŒ€μ‹œλ³΄λ“œ 개발
  • 지식 증λ₯˜(Knowledge Distillation)λ₯Ό ν†΅ν•œ λͺ¨λΈ κ²½λŸ‰ν™” 연ꡬ

10. κΈ°μ—¬ μ•ˆλ‚΄

μ•ˆ λ°›μŠ΅λ‹ˆλ‹€.

11. μΆ”κ°€ 정보

κ°μ‚¬μ˜ 말씀

이 ν”„λ‘œμ νŠΈλŠ” λ‹€μŒμ˜ ν›Œλ₯­ν•œ μ˜€ν”ˆμ†ŒμŠ€ ν”„λ‘œμ νŠΈλ“€ 덕뢄에 κ°€λŠ₯ν–ˆμŠ΅λ‹ˆλ‹€.

μ—°λ½μ²˜

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages