Dus Tran commited on
Commit
af847aa
·
1 Parent(s): 18292ea

fix: make heavy ML libraries import conditionally on Render to prevent OOM/timeouts

Browse files
Files changed (2) hide show
  1. app/core/config.py +9 -1
  2. app/service/retriever.py +7 -2
app/core/config.py CHANGED
@@ -1,10 +1,16 @@
1
  import os
2
  from dotenv import load_dotenv
3
  from langchain_groq import ChatGroq
4
- from langchain_huggingface import HuggingFaceEmbeddings
5
 
6
  load_dotenv()
7
 
 
 
 
 
 
 
 
8
  BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
9
  DATA_PATH = os.path.join(BASE_DIR, "data")
10
  QDRANT_PATH = os.path.join(BASE_DIR, "VectorDB")
@@ -20,6 +26,8 @@ LLM_MODEL_NAME = "llama-3.3-70b-versatile"
20
  RERANK_MODEL_NAME = "cross-encoder/ms-marco-MiniLM-L-6-v2"
21
 
22
  def get_embeddings():
 
 
23
  return HuggingFaceEmbeddings(model_name=EMBED_MODEL_NAME)
24
 
25
 
 
1
  import os
2
  from dotenv import load_dotenv
3
  from langchain_groq import ChatGroq
 
4
 
5
  load_dotenv()
6
 
7
+ IS_RENDER = os.getenv("RENDER") == "true"
8
+
9
+ if not IS_RENDER:
10
+ from langchain_huggingface import HuggingFaceEmbeddings
11
+ else:
12
+ from langchain_google_genai import GoogleGenAIEmbeddings
13
+
14
  BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
15
  DATA_PATH = os.path.join(BASE_DIR, "data")
16
  QDRANT_PATH = os.path.join(BASE_DIR, "VectorDB")
 
26
  RERANK_MODEL_NAME = "cross-encoder/ms-marco-MiniLM-L-6-v2"
27
 
28
  def get_embeddings():
29
+ if IS_RENDER:
30
+ return GoogleGenAIEmbeddings(model="models/text-embedding-004")
31
  return HuggingFaceEmbeddings(model_name=EMBED_MODEL_NAME)
32
 
33
 
app/service/retriever.py CHANGED
@@ -1,7 +1,6 @@
1
  from qdrant_client import QdrantClient
2
  from qdrant_client.http import models
3
- from sentence_transformers import CrossEncoder
4
- from app.core.config import QDRANT_PATH, RERANK_MODEL_NAME, get_embeddings, COLLECTION_NAME
5
 
6
  _rerank_model = None
7
  _qdrant_client = None
@@ -9,9 +8,11 @@ _qdrant_client = None
9
  def get_rerank_model():
10
  global _rerank_model
11
  if _rerank_model is None:
 
12
  _rerank_model = CrossEncoder(RERANK_MODEL_NAME, device='cpu')
13
  return _rerank_model
14
 
 
15
  def get_qdrant_client():
16
  global _qdrant_client
17
  if _qdrant_client is None:
@@ -59,6 +60,10 @@ def apply_post_retrieval_rerank(user_query: str, retrieved_texts: str, top_n: in
59
  if not doc_list:
60
  return "Không tìm thấy ngữ cảnh phù hợp."
61
 
 
 
 
 
62
  rerank_model = get_rerank_model()
63
  pairs = [[user_query, doc] for doc in doc_list]
64
  scores = rerank_model.predict(pairs)
 
1
  from qdrant_client import QdrantClient
2
  from qdrant_client.http import models
3
+ from app.core.config import QDRANT_PATH, RERANK_MODEL_NAME, get_embeddings, COLLECTION_NAME, IS_RENDER
 
4
 
5
  _rerank_model = None
6
  _qdrant_client = None
 
8
  def get_rerank_model():
9
  global _rerank_model
10
  if _rerank_model is None:
11
+ from sentence_transformers import CrossEncoder
12
  _rerank_model = CrossEncoder(RERANK_MODEL_NAME, device='cpu')
13
  return _rerank_model
14
 
15
+
16
  def get_qdrant_client():
17
  global _qdrant_client
18
  if _qdrant_client is None:
 
60
  if not doc_list:
61
  return "Không tìm thấy ngữ cảnh phù hợp."
62
 
63
+ if IS_RENDER:
64
+ # Bỏ qua CrossEncoder khi chạy trên Render để tránh tràn bộ nhớ (Free tier 512MB RAM)
65
+ return "\n\n---\n\n".join(doc_list[:top_n])
66
+
67
  rerank_model = get_rerank_model()
68
  pairs = [[user_query, doc] for doc in doc_list]
69
  scores = rerank_model.predict(pairs)