Kamal Nayan Kumar commited on
Commit
548ff8f
·
1 Parent(s): 698e020

feat: revert backend to use sentence-transformers (all-MiniLM-L6-v2) for better embeddings

Browse files
Files changed (2) hide show
  1. backend/api.py +8 -9
  2. backend/requirements.txt +1 -1
backend/api.py CHANGED
@@ -5,14 +5,15 @@ from typing import Any, Dict, List
5
 
6
  import numpy as np
7
  import spacy
 
8
  from fastapi import FastAPI, Query
9
  from fastapi.middleware.cors import CORSMiddleware
10
  from rank_bm25 import BM25Okapi
11
 
12
  try:
13
- from fastembed import TextEmbedding
14
  except Exception:
15
- TextEmbedding = None
16
 
17
 
18
  BASE_DIR = Path(__file__).resolve().parents[1]
@@ -95,11 +96,10 @@ def _role_overlap_score(
95
 
96
 
97
  def _maybe_load_embedder() -> Any:
98
- if TextEmbedding is None:
99
  return None
100
  try:
101
- # threads=1 prevents FastEmbed from spawning RAM-hungry multiprocessing workers
102
- return TextEmbedding("sentence-transformers/all-MiniLM-L6-v2", threads=1)
103
  except Exception as e:
104
  print(f"Failed to load embedder: {e}")
105
  return None
@@ -109,8 +109,7 @@ def _dense_scores(query: str) -> np.ndarray:
109
  if EMBEDDER is None or DOC_EMBEDDINGS.size == 0:
110
  return np.zeros(len(CORPUS), dtype=float)
111
 
112
- # FastEmbed returns a generator of arrays, we need the first (and only) one
113
- query_embedding = list(EMBEDDER.embed([query]))[0]
114
  return np.array(np.dot(DOC_EMBEDDINGS, query_embedding), dtype=float)
115
 
116
 
@@ -145,7 +144,7 @@ def _build_result(
145
 
146
  try:
147
  spacy_doc = NLP(text)
148
- html = spacy.displacy.render(
149
  spacy_doc,
150
  style="dep",
151
  page=False,
@@ -192,7 +191,7 @@ if EMBEDDINGS_PATH.exists():
192
  DOC_EMBEDDINGS = DOC_EMBEDDINGS[:MAX_DOCS]
193
  elif EMBEDDER is not None and TEXTS:
194
  print("Computing embeddings on the fly... (This may cause OOM on small instances)")
195
- DOC_EMBEDDINGS = np.array(list(EMBEDDER.embed(TEXTS)))
196
  else:
197
  DOC_EMBEDDINGS = np.array([])
198
 
 
5
 
6
  import numpy as np
7
  import spacy
8
+ from spacy import displacy
9
  from fastapi import FastAPI, Query
10
  from fastapi.middleware.cors import CORSMiddleware
11
  from rank_bm25 import BM25Okapi
12
 
13
  try:
14
+ from sentence_transformers import SentenceTransformer
15
  except Exception:
16
+ SentenceTransformer = None
17
 
18
 
19
  BASE_DIR = Path(__file__).resolve().parents[1]
 
96
 
97
 
98
  def _maybe_load_embedder() -> Any:
99
+ if SentenceTransformer is None:
100
  return None
101
  try:
102
+ return SentenceTransformer("all-MiniLM-L6-v2")
 
103
  except Exception as e:
104
  print(f"Failed to load embedder: {e}")
105
  return None
 
109
  if EMBEDDER is None or DOC_EMBEDDINGS.size == 0:
110
  return np.zeros(len(CORPUS), dtype=float)
111
 
112
+ query_embedding = EMBEDDER.encode(query)
 
113
  return np.array(np.dot(DOC_EMBEDDINGS, query_embedding), dtype=float)
114
 
115
 
 
144
 
145
  try:
146
  spacy_doc = NLP(text)
147
+ html = displacy.render(
148
  spacy_doc,
149
  style="dep",
150
  page=False,
 
191
  DOC_EMBEDDINGS = DOC_EMBEDDINGS[:MAX_DOCS]
192
  elif EMBEDDER is not None and TEXTS:
193
  print("Computing embeddings on the fly... (This may cause OOM on small instances)")
194
+ DOC_EMBEDDINGS = np.array(EMBEDDER.encode(TEXTS))
195
  else:
196
  DOC_EMBEDDINGS = np.array([])
197
 
backend/requirements.txt CHANGED
@@ -1,6 +1,6 @@
1
  fastapi
2
  uvicorn
3
  rank-bm25
4
- fastembed
5
  spacy
6
  numpy
 
1
  fastapi
2
  uvicorn
3
  rank-bm25
4
+ sentence-transformers
5
  spacy
6
  numpy