rag-youtube-assistant / app /vector_store.py
ganesh3's picture
Create vector_store.py
112d847 verified
from abc import ABC, abstractmethod
import faiss
import numpy as np
import os
import logging
import sys
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', stream=sys.stdout)
logger = logging.getLogger(__name__)
class BaseVectorStore(ABC):
@abstractmethod
def add_documents(self, documents, embeddings):
pass
@abstractmethod
def search(self, query_vector, num_results=5):
pass
class FaissVectorStore(BaseVectorStore):
def __init__(self, dimension):
self.dimension = dimension
self.index = faiss.IndexFlatL2(dimension)
self.documents = []
self.index_path = "data/faiss_index"
os.makedirs("data", exist_ok=True)
self.load_index()
def load_index(self):
if os.path.exists(self.index_path):
try:
self.index = faiss.read_index(self.index_path)
except Exception as e:
logger.error(f"Error loading FAISS index: {e}")
def save_index(self):
try:
faiss.write_index(self.index, self.index_path)
except Exception as e:
logger.error(f"Error saving FAISS index: {e}")
def add_documents(self, documents, embeddings):
self.index.add(np.array(embeddings))
self.documents.extend(documents)
self.save_index()
def search(self, query_vector, num_results=5):
if len(self.documents) == 0:
return []
D, I = self.index.search(np.array([query_vector]), num_results)
return [self.documents[i] for i in I[0]]
def get_vector_store(config):
"""Factory function to get the appropriate vector store"""
return FaissVectorStore # Always return FAISS vector store