rag-chatbot / app /db /vector_store.py
Abeshith's picture
RAG Chatbot with LangChain, FastAPI, and service layer architecture
64d7fdf
from qdrant_client import QdrantClient
from qdrant_client.models import Distance, VectorParams, PointStruct, Filter, FieldCondition, MatchValue
from app.config import config, settings
from app.utils.logger import logger
from typing import List
import uuid
class VectorStore:
def __init__(self):
self.client = None
self.collection_name = config["database"]["qdrant"]["collection_name"]
def connect(self):
if self.client is None:
qdrant_url = config["database"]["qdrant"]["url"]
api_key = settings.qdrant_api_key or None
self.client = QdrantClient(
url=qdrant_url,
api_key=api_key
)
logger.info("Qdrant connected")
return self.client
def create_collection(self, vector_size: int = None):
if vector_size is None:
vector_size = config["database"]["qdrant"]["vector_size"]
client = self.get_client()
if not client.collection_exists(self.collection_name):
client.create_collection(
collection_name=self.collection_name,
vectors_config=VectorParams(
size=vector_size,
distance=Distance.COSINE
)
)
logger.info(f"Created Qdrant collection: {self.collection_name}")
else:
logger.info(f"Qdrant collection already exists: {self.collection_name}")
def get_client(self):
if self.client is None:
self.connect()
return self.client
async def add_documents(self, collection_name: str, documents: List, embeddings: List[List[float]]):
client = self.get_client()
points = []
for i, (doc, embedding) in enumerate(zip(documents, embeddings)):
point_id = str(uuid.uuid4())
points.append(
PointStruct(
id=point_id,
vector=embedding,
payload={
"text": doc.page_content,
**doc.metadata
}
)
)
client.upsert(
collection_name=collection_name,
points=points
)
logger.info(f"Added {len(points)} documents to Qdrant")
return [p.id for p in points]
async def delete_by_metadata(self, collection_name: str, metadata_key: str, metadata_value: str):
client = self.get_client()
client.delete(
collection_name=collection_name,
points_selector=Filter(
must=[
FieldCondition(
key=metadata_key,
match=MatchValue(value=metadata_value)
)
]
)
)
logger.info(f"Deleted documents with {metadata_key}={metadata_value} from Qdrant")
vector_store = VectorStore()