Spaces:
Sleeping
Sleeping
update
Browse files
business_transaction_map/components/faiss_vector_database.py
CHANGED
@@ -187,23 +187,46 @@ class FaissVectorDatabase:
|
|
187 |
'TypeDocs': К кому разделу относится карта проводок (1С или SAP)
|
188 |
}
|
189 |
"""
|
190 |
-
|
191 |
-
|
|
|
192 |
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
198 |
answers = {}
|
199 |
for i, ind in enumerate(indexes[0]):
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
answers[i]
|
205 |
-
|
206 |
-
|
207 |
-
|
|
|
|
|
|
|
|
|
|
|
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
|