File size: 2,802 Bytes
47b5f0c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import os

from dotenv import load_dotenv
from qdrant_client import QdrantClient, models

from app.service.api import baseURL

load_dotenv()

api_key = os.getenv("QDRANT_API_KEY")


class QdrantConnectionDb:
    client = None
    _instance = None
    _collection_name = "docuRAG"
    _vector_size = 384
    dense_model = "sentence-transformers/all-MiniLM-L6-v2"
    sparse_model = "prithivida/Splade_PP_en_v1"

    def __new__(cls, *args, **kwargs):
        """
        Create a new instance of QdrantConnectionDb if it does not exist and initialize the collection and models.
        """
        if cls._instance is None:
            cls._instance = super(QdrantConnectionDb, cls).__new__(cls)
            cls.client = QdrantClient(url=baseURL, api_key=api_key)
            cls._initialize_collection(
                cls.client,
                cls._collection_name,
                cls._vector_size,
            )
            cls._set_models(cls.dense_model, cls.sparse_model)

        return cls._instance

    @classmethod
    def _initialize_collection(
        cls, client: QdrantClient, collection_name: str, _vector_size: int
    ):
        """
        Initialize collection if it does not exist

        :param client: QdrantClient
        :param collection_name: str
        :param _vector_size: int

        :return: None
        """
        try:
            collections = client.get_collections().collections
            if collection_name not in [c.name for c in collections]:
                client.create_collection(
                    collection_name=collection_name,
                    vectors_config={
                        "text-dense": models.VectorParams(
                            size=_vector_size,
                            distance=models.Distance.COSINE,
                        )
                    },
                    sparse_vectors_config={
                        "text-sparse": models.SparseVectorParams(
                            index=models.SparseIndexParams(
                                on_disk=False,
                            )
                        )
                    },
                )

        except Exception as e:
            print(f"Error while initializing collection: {e}")

    def get_client(self) -> QdrantClient:
        """
        Get the QdrantClient instance
        """

        return self.client

    @classmethod
    def _set_models(self, model_name: str, sparse_model_name: str):
        """
        Set the model and sparse model for the client
        """
        self.client.set_model(model_name)
        self.client.set_sparse_model(sparse_model_name)

    @classmethod
    def get_collection_name(cls) -> str:
        """
        Get the current collection name
        """
        return cls._collection_name