from qdrant_client import QdrantClient from fastembed import SparseTextEmbedding, LateInteractionTextEmbedding from qdrant_client import QdrantClient, models from sentence_transformers import SentenceTransformer from config import DENSE_MODEL, SPARSE_MODEL, LATE_INTERACTION_MODEL, QDRANT_URL, QDRANT_API_KEY,HUGGING_FACE_API_KEY import os class NeuralSearcher: def __init__(self, collection_name): self.collection_name = collection_name self.dense_model = SentenceTransformer(DENSE_MODEL,device="cpu",token=HUGGING_FACE_API_KEY) self.sparse_model = SparseTextEmbedding(SPARSE_MODEL) self.late_interaction_model = LateInteractionTextEmbedding(LATE_INTERACTION_MODEL) self.qdrant_client = QdrantClient(QDRANT_URL,api_key=QDRANT_API_KEY) async def search(self, text: str): dense_query = self.dense_model.encode(text).tolist() sparse_query = next(self.sparse_model.query_embed(text)) # late_query = next(self.late_interaction_model.query_embed(text)) prefetch = [ models.Prefetch( query=dense_query, using=DENSE_MODEL, limit=200 ), models.Prefetch( query=models.SparseVector(**sparse_query.as_object()), using=SPARSE_MODEL, limit=200 ) ] search_result = self.qdrant_client.query_points( collection_name= self.collection_name, prefetch=prefetch, query=models.FusionQuery( fusion=models.Fusion.RRF, ), # using=LATE_INTERACTION_MODEL, with_payload=True, limit = 10 ).points data = [] for hit in search_result: data.append(hit.payload) return data