Repository navigation
Expand file tree
/
Copy pathfaiss_module.py
More file actions
87 lines (71 loc) · 3.22 KB
/
Copy pathfaiss_module.py
File metadata and controls
87 lines (71 loc) · 3.22 KB
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
import faiss
import numpy as np
class FaissIndex:
def __init__(self, d, index_type='FlatL2'):
"""
Инициализация индекса.
:param d: Размерность векторов.
:param index_type: Тип индекса ('FlatL2' или 'IVFFlat').
"""
self.d = d
self.index_type = index_type
if index_type == 'FlatL2':
self.index = faiss.IndexFlatL2(d)
elif index_type == 'IVFFlat':
quantizer = faiss.IndexFlatL2(d)
self.index = faiss.IndexIVFFlat(quantizer, d, 100)
self.index.train(np.random.random((1000, d)).astype('float32')) # Тренировка индекса
else:
raise ValueError("Неподдерживаемый тип индекса")
def add_vectors(self, vectors):
"""
Добавление новых векторов в индекс.
:param vectors: Вектора для добавления.
"""
self.index.add(vectors)
def remove_vectors(self, ids):
"""
Удаление векторов по их идентификаторам.
:param ids: Идентификаторы векторов для удаления.
"""
if self.index_type == 'FlatL2':
raise NotImplementedError("Этот индекс не поддерживает удаление векторов")
elif hasattr(self.index, 'remove_ids'):
self.index.remove_ids(faiss.IDSelectorBatch(ids))
else:
raise NotImplementedError("Этот индекс не поддерживает удаление векторов")
def update_vectors(self, ids, new_vectors):
"""
Обновление существующих векторов.
:param ids: Идентификаторы векторов для обновления.
:param new_vectors: Новые значения векторов.
"""
self.remove_vectors(ids)
self.add_vectors(new_vectors)
def search_vectors(self, query_vectors, k):
"""
Поиск ближайших соседей для заданных запросных векторов.
:param query_vectors: Вектора для поиска.
:param k: Количество ближайших соседей.
:return: Индексы и расстояния до ближайших соседей.
"""
D, I = self.index.search(query_vectors, k)
return D, I
def save_index(self, file_path):
"""
Сохранение индекса в файл.
:param file_path: Путь к файлу для сохранения.
"""
faiss.write_index(self.index, file_path)
def load_index(self, file_path):
"""
Загрузка индекса из файла.
:param file_path: Путь к файлу.
"""
self.index = faiss.read_index(file_path)
def get_total_vectors(self):
"""
Получение общего количества векторов в индексе.
:return: Количество векторов.
"""
return self.index.ntotal