0504ankitsharma commited on
Commit
8e80322
·
verified ·
1 Parent(s): 9a32e55

Update app/database.py

Browse files
Files changed (1) hide show
  1. app/database.py +46 -42
app/database.py CHANGED
@@ -8,84 +8,88 @@ logger = logging.getLogger(__name__)
8
 
9
  class VectorDatabase:
10
  def __init__(self):
11
- self.pc = Pinecone(api_key=settings.PINECONE_API_KEY)
12
- self.index_name = settings.PINECONE_INDEX_NAME
13
- self.index = None
14
- self._initialize_index()
15
-
 
 
 
 
16
  def _initialize_index(self):
17
  """Initialize or connect to Pinecone index"""
18
  try:
19
- # Check if index exists
20
  existing_indexes = self.pc.list_indexes()
21
  index_names = [idx.name for idx in existing_indexes]
22
 
 
23
  if self.index_name not in index_names:
24
- logger.info(f"Creating new index: {self.index_name}")
25
  self.pc.create_index(
26
  name=self.index_name,
27
- dimension=settings.PINECONE_DIMENSION,
28
  metric="cosine",
29
- spec=ServerlessSpec(
30
- cloud="aws",
31
- region=settings.PINECONE_ENVIRONMENT.split('-')[0] + "-" +
32
- settings.PINECONE_ENVIRONMENT.split('-')[1] + "-" +
33
- settings.PINECONE_ENVIRONMENT.split('-')[2]
34
- )
35
  )
36
- # Wait for index to be ready
37
- time.sleep(5)
38
-
39
  self.index = self.pc.Index(self.index_name)
40
- logger.info(f"Connected to index: {self.index_name}")
41
-
42
  except Exception as e:
43
- logger.error(f"Error initializing Pinecone index: {str(e)}")
44
  raise
45
-
46
  def upsert_vectors(self, vectors: List[tuple]):
47
  """
48
- Upsert vectors to Pinecone
49
- vectors: List of tuples (id, embedding, metadata)
50
  """
51
  try:
 
 
 
 
52
  self.index.upsert(vectors=vectors)
53
- logger.info(f"Upserted {len(vectors)} vectors")
54
  except Exception as e:
55
- logger.error(f"Error upserting vectors: {str(e)}")
56
  raise
57
-
58
- def query_vectors(self, query_vector: List[float], top_k: int = 5,
59
- filter_dict: Dict = None) -> List[Dict[str, Any]]:
60
- """Query similar vectors from Pinecone"""
61
  try:
62
- results = self.index.query(
63
  vector=query_vector,
64
  top_k=top_k,
65
  include_metadata=True,
66
- filter=filter_dict
67
  )
68
- return results.matches
69
  except Exception as e:
70
- logger.error(f"Error querying vectors: {str(e)}")
71
  raise
72
-
73
  def delete_all(self):
74
- """Delete all vectors from index"""
75
  try:
76
  self.index.delete(delete_all=True)
77
- logger.info("Deleted all vectors from index")
78
  except Exception as e:
79
  logger.error(f"Error deleting vectors: {str(e)}")
80
  raise
81
-
82
  def get_stats(self):
83
- """Get index statistics"""
84
  try:
85
- return self.index.describe_index_stats()
 
86
  except Exception as e:
87
- logger.error(f"Error getting stats: {str(e)}")
88
  raise
89
 
90
- # Global instance
91
- vector_db = VectorDatabase()
 
 
8
 
9
  class VectorDatabase:
10
  def __init__(self):
11
+ try:
12
+ self.pc = Pinecone(api_key=settings.PINECONE_API_KEY)
13
+ self.index_name = settings.PINECONE_INDEX_NAME
14
+ self.index = None
15
+ self._initialize_index()
16
+ except Exception as e:
17
+ logger.error(f"Error initializing Pinecone client: {str(e)}")
18
+ raise
19
+
20
  def _initialize_index(self):
21
  """Initialize or connect to Pinecone index"""
22
  try:
23
+ # Get list of indexes
24
  existing_indexes = self.pc.list_indexes()
25
  index_names = [idx.name for idx in existing_indexes]
26
 
27
+ # Create index if not found
28
  if self.index_name not in index_names:
29
+ logger.info(f"Creating new Pinecone index: {self.index_name}")
30
  self.pc.create_index(
31
  name=self.index_name,
32
+ dimension=settings.PINECONE_DIMENSION, # e.g., 768 or 1536
33
  metric="cosine",
34
+ spec=ServerlessSpec(cloud="aws", region=settings.PINECONE_REGION)
 
 
 
 
 
35
  )
36
+ time.sleep(10) # Give time for index to initialize
37
+
 
38
  self.index = self.pc.Index(self.index_name)
39
+ logger.info(f"Connected to Pinecone index: {self.index_name}")
40
+
41
  except Exception as e:
42
+ logger.error(f"Error creating or connecting to Pinecone index: {str(e)}")
43
  raise
44
+
45
  def upsert_vectors(self, vectors: List[tuple]):
46
  """
47
+ Upsert vectors into Pinecone.
48
+ Format: [(id, embedding, metadata)]
49
  """
50
  try:
51
+ if not vectors:
52
+ logger.warning("No vectors provided for upsert.")
53
+ return
54
+
55
  self.index.upsert(vectors=vectors)
56
+ logger.info(f" Successfully upserted {len(vectors)} vectors to Pinecone.")
57
  except Exception as e:
58
+ logger.error(f"Error upserting vectors to Pinecone: {str(e)}")
59
  raise
60
+
61
+ def query_vectors(self, query_vector: List[float], top_k: int = 5, filter_dict: Dict = None):
62
+ """Query the Pinecone index for similar vectors."""
 
63
  try:
64
+ response = self.index.query(
65
  vector=query_vector,
66
  top_k=top_k,
67
  include_metadata=True,
68
+ filter=filter_dict or {}
69
  )
70
+ return response.matches
71
  except Exception as e:
72
+ logger.error(f"Error querying Pinecone: {str(e)}")
73
  raise
74
+
75
  def delete_all(self):
76
+ """Delete all vectors in the index."""
77
  try:
78
  self.index.delete(delete_all=True)
79
+ logger.info("🗑️ All vectors deleted from Pinecone index.")
80
  except Exception as e:
81
  logger.error(f"Error deleting vectors: {str(e)}")
82
  raise
83
+
84
  def get_stats(self):
85
+ """Fetch index statistics."""
86
  try:
87
+ stats = self.index.describe_index_stats()
88
+ return stats
89
  except Exception as e:
90
+ logger.error(f"Error getting index stats: {str(e)}")
91
  raise
92
 
93
+
94
+ # Create global instance
95
+ vector_db = VectorDatabase()