From 3ca548ec84c8e788b9db081d4f4595946055d0a0 Mon Sep 17 00:00:00 2001 From: dolliecoder Date: Tue, 3 Feb 2026 00:58:33 +0530 Subject: [PATCH] Fix: run SentenceTransformer.encode in asyncio.to_thread to prevent event loop blocking --- backend/app/services/embedding_service/service.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/backend/app/services/embedding_service/service.py b/backend/app/services/embedding_service/service.py index 4527c4f9..98a59c68 100644 --- a/backend/app/services/embedding_service/service.py +++ b/backend/app/services/embedding_service/service.py @@ -1,3 +1,4 @@ +import asyncio import logging import config from typing import List, Dict, Any, Optional @@ -66,6 +67,10 @@ def llm(self) -> ChatGoogleGenerativeAI: raise return self._llm + + def _encode_sync(self, *args, **kwargs): + return self.model.encode(*args, **kwargs) + async def get_embedding(self, text: str) -> List[float]: """Generate embedding for a single text input""" try: @@ -74,12 +79,14 @@ async def get_embedding(self, text: str) -> List[float]: text = [text] # Generate embeddings - embeddings = self.model.encode( + embeddings = await asyncio.to_thread( + self._encode_sync, text, convert_to_tensor=True, show_progress_bar=False ) + # Convert to standard Python list and return embedding_list = embeddings[0].cpu().tolist() logger.debug(f"Generated embedding with dimension: {len(embedding_list)}") @@ -92,13 +99,15 @@ async def get_embeddings(self, texts: List[str]) -> List[List[float]]: """Generate embeddings for multiple text inputs in batches""" try: # Generate embeddings - embeddings = self.model.encode( + embeddings = await asyncio.to_thread( + self._encode_sync, texts, convert_to_tensor=True, batch_size=MAX_BATCH_SIZE, show_progress_bar=len(texts) > 10 ) + # Convert to standard Python list embedding_list = embeddings.cpu().tolist() logger.info(f"Generated {len(embedding_list)} embeddings")