muryshev commited on
Commit
a49da61
·
1 Parent(s): 246518c
business_transaction_map/components/faiss_vector_database.py CHANGED
@@ -187,23 +187,46 @@ class FaissVectorDatabase:
187
  'TypeDocs': К кому разделу относится карта проводок (1С или SAP)
188
  }
189
  """
190
- if len(emb_query.shape) != 2:
191
- assert print('Не правильный размер вектора!')
 
192
 
193
- print("Index dimension:", self.index.d) # Размерность индекса
194
- print("Query dimension:", emb_query.shape[1]) # Размерность вектора запроса
195
-
196
-
197
- distances, indexes = self.index.search(emb_query, k_neighbors)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
198
  answers = {}
199
  for i, ind in enumerate(indexes[0]):
200
- answers[i] = {}
201
- answers[i][f'distance'] = distances[0][i]
202
- answers[i][f'index_answer'] = ind
203
- answers[i][f'doc_name'] = self.df.iloc[ind][COLUMN_DOC_NAME]
204
- answers[i][f'text_answer'] = self.df.iloc[ind][COLUMN_TABLE_NAME]
205
- answers[i][COLUMN_LABELS_STR] = self.df.iloc[ind][COLUMN_LABELS_STR]
206
- answers[i][COLUMN_NAMES] = self.df.iloc[ind][COLUMN_NAMES]
207
- answers[i][COLUMN_TYPE_DOC_MAP] = self.df.iloc[ind][COLUMN_TYPE_DOC_MAP]
 
 
 
 
 
208
 
209
  return answers
 
187
  'TypeDocs': К кому разделу относится карта проводок (1С или SAP)
188
  }
189
  """
190
+ # Проверка размерности вектора
191
+ if len(emb_query.shape) != 2 or emb_query.shape[0] != 1:
192
+ raise ValueError("Вектор запроса должен иметь размерность [1, d].")
193
 
194
+ # Приведение вектора запроса к нужной размерности, если требуется
195
+ query_dim = emb_query.shape[1]
196
+ index_dim = self.index.d
197
+ if query_dim != index_dim:
198
+ if query_dim < index_dim:
199
+ # Padding до нужной размерности
200
+ padded_query = torch.zeros((1, index_dim), dtype=emb_query.dtype)
201
+ padded_query[:, :query_dim] = emb_query
202
+ emb_query = padded_query
203
+ else:
204
+ raise ValueError(
205
+ f"Размерность вектора запроса ({query_dim}) превышает размерность индекса ({index_dim})."
206
+ )
207
+
208
+ emb_query_np = emb_query.numpy().astype("float32")
209
+
210
+ # Поиск в индексе
211
+ try:
212
+ distances, indexes = self.index.search(emb_query_np, k_neighbors)
213
+ except Exception as e:
214
+ raise RuntimeError(f"Ошибка при выполнении поиска: {e}")
215
+
216
  answers = {}
217
  for i, ind in enumerate(indexes[0]):
218
+ if ind < 0 or ind >= len(self.df):
219
+ answers[i] = {"error": "Индекс результата выходит за пределы таблицы"}
220
+ continue
221
+
222
+ answers[i] = {
223
+ "distance": distances[0][i],
224
+ "index_answer": ind,
225
+ "doc_name": self.df.iloc[ind][COLUMN_DOC_NAME],
226
+ "text_answer": self.df.iloc[ind][COLUMN_TABLE_NAME],
227
+ COLUMN_LABELS_STR: self.df.iloc[ind][COLUMN_LABELS_STR],
228
+ COLUMN_NAMES: self.df.iloc[ind][COLUMN_NAMES],
229
+ COLUMN_TYPE_DOC_MAP: self.df.iloc[ind][COLUMN_TYPE_DOC_MAP],
230
+ }
231
 
232
  return answers