File size: 1,156 Bytes
a090dae
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# File: src/search.py
import faiss
import numpy as np
import pickle
import os
from config.settings import Settings
from src.logger import logger

class Search:
    def __init__(self):
        self.index = faiss.IndexFlatL2(384)
        self.texts = []
        if os.path.exists(Settings.FAISS_INDEX_PATH):
            self.index = faiss.read_index(Settings.FAISS_INDEX_PATH)
            if os.path.exists(Settings.TEXTS_PATH):
                with open(Settings.TEXTS_PATH, "rb") as f:
                    self.texts = pickle.load(f)
            logger.info("Đã tải FAISS index và texts")

    def add(self, text, vector):
        self.index.add(np.array([vector], dtype=np.float32))
        self.texts.append(text)
        faiss.write_index(self.index, Settings.FAISS_INDEX_PATH)
        with open(Settings.TEXTS_PATH, "wb") as f:
            pickle.dump(self.texts, f)
        logger.info(f"Đã thêm vào FAISS: {text[:50]}...")

    def search(self, vector, k=1):
        distances, indices = self.index.search(np.array([vector], dtype=np.float32), k)
        return [(self.texts[i], distances[0][j]) for j, i in enumerate(indices[0]) if i != -1]