Spaces:
Sleeping
Sleeping
Upload doc_searcher_v2.py with huggingface_hub
Browse files- doc_searcher_v2.py +22 -6
doc_searcher_v2.py
CHANGED
|
@@ -14,17 +14,30 @@ class DocSearcherV2:
|
|
| 14 |
self.sparse_model = SparseTextEmbedding(SPARSE_MODEL)
|
| 15 |
self.qdrant_client = QdrantClient(QDRANT_URL,api_key=QDRANT_API_KEY,timeout=30)
|
| 16 |
|
| 17 |
-
async def search_semantic(self, text: str):
|
|
|
|
|
|
|
| 18 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
queries = [text]
|
| 20 |
dense_query = self.model.encode(text).tolist()
|
| 21 |
sparse_query = next(self.sparse_model.query_embed(text))
|
| 22 |
|
|
|
|
| 23 |
prefetch = [
|
| 24 |
models.Prefetch(
|
| 25 |
query=dense_query,
|
| 26 |
using="Qwen/Qwen3-Embedding-0.6B",
|
| 27 |
-
limit=
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
),
|
| 29 |
]
|
| 30 |
|
|
@@ -35,7 +48,7 @@ class DocSearcherV2:
|
|
| 35 |
fusion=models.Fusion.RRF,
|
| 36 |
),
|
| 37 |
with_payload=True,
|
| 38 |
-
limit
|
| 39 |
).points
|
| 40 |
|
| 41 |
# Sačuvaj kompletan hit objekat i tekst za reranking
|
|
@@ -52,9 +65,12 @@ class DocSearcherV2:
|
|
| 52 |
if not texts_for_reranking:
|
| 53 |
return []
|
| 54 |
|
| 55 |
-
# Reranking -
|
| 56 |
-
|
| 57 |
-
|
|
|
|
|
|
|
|
|
|
| 58 |
|
| 59 |
# Kombinuj rezultate: mapiraj rerank skorove sa originalnim hit-ovima
|
| 60 |
# reranked_results je lista tuple-ova: [(score, query, document_text), ...]
|
|
|
|
| 14 |
self.sparse_model = SparseTextEmbedding(SPARSE_MODEL)
|
| 15 |
self.qdrant_client = QdrantClient(QDRANT_URL,api_key=QDRANT_API_KEY,timeout=30)
|
| 16 |
|
| 17 |
+
async def search_semantic(self, text: str, qdrant_limit: int = 20, top_k: int = 3):
|
| 18 |
+
"""
|
| 19 |
+
Semantička pretraga sa reranking-om
|
| 20 |
|
| 21 |
+
Args:
|
| 22 |
+
text: Query tekst
|
| 23 |
+
qdrant_limit: Broj chunk-ova iz Qdrant-a (default: 20)
|
| 24 |
+
top_k: Broj najboljih rezultata nakon rerankinga (default: 3)
|
| 25 |
+
"""
|
| 26 |
queries = [text]
|
| 27 |
dense_query = self.model.encode(text).tolist()
|
| 28 |
sparse_query = next(self.sparse_model.query_embed(text))
|
| 29 |
|
| 30 |
+
# Hybrid search: dense + sparse za bolje rezultate
|
| 31 |
prefetch = [
|
| 32 |
models.Prefetch(
|
| 33 |
query=dense_query,
|
| 34 |
using="Qwen/Qwen3-Embedding-0.6B",
|
| 35 |
+
limit=qdrant_limit
|
| 36 |
+
),
|
| 37 |
+
models.Prefetch(
|
| 38 |
+
query=models.SparseVector(**sparse_query.as_object()),
|
| 39 |
+
using=SPARSE_MODEL,
|
| 40 |
+
limit=qdrant_limit
|
| 41 |
),
|
| 42 |
]
|
| 43 |
|
|
|
|
| 48 |
fusion=models.Fusion.RRF,
|
| 49 |
),
|
| 50 |
with_payload=True,
|
| 51 |
+
limit=qdrant_limit,
|
| 52 |
).points
|
| 53 |
|
| 54 |
# Sačuvaj kompletan hit objekat i tekst za reranking
|
|
|
|
| 65 |
if not texts_for_reranking:
|
| 66 |
return []
|
| 67 |
|
| 68 |
+
# Reranking - ISPRAVLJENO: jedan query za sve dokumente
|
| 69 |
+
reranked_results = self.reranker.compute_logits(
|
| 70 |
+
queries * len(texts_for_reranking), # Svaki dokument dobija isti query
|
| 71 |
+
texts_for_reranking,
|
| 72 |
+
top_k=top_k # Vrati samo top_k rezultata
|
| 73 |
+
)
|
| 74 |
|
| 75 |
# Kombinuj rezultate: mapiraj rerank skorove sa originalnim hit-ovima
|
| 76 |
# reranked_results je lista tuple-ova: [(score, query, document_text), ...]
|