2020 GenerateFollowupRequest ,
2121)
2222from ai_server .rag .embedder import EmbeddingProvider
23- from ai_server .rag .reranker import NoopReranker , Reranker , rerank_hits
2423
2524log = structlog .get_logger (__name__ )
2625
@@ -43,13 +42,12 @@ def __init__(
4342 core_client : CoreClient | None = None ,
4443 embedder : EmbeddingProvider | None = None ,
4544 rag_top_k : int = 5 ,
46- reranker : Reranker | None = None ,
47- candidate_k : int = 20 ,
4845 streaming_generator : StreamingFollowupGenerator | None = None ,
4946 session_notifier : SessionRealtimeNotifier | None = None ,
5047 tts = None ,
5148 storage = None ,
5249 tts_voice : str = "" ,
50+ rag_timeout_sec : float = 1.5 ,
5351 ) -> None :
5452 self ._generator = generator
5553 self ._publisher = publisher
@@ -58,13 +56,12 @@ def __init__(
5856 self ._core = core_client
5957 self ._embedder = embedder
6058 self ._rag_top_k = rag_top_k
61- self ._reranker = reranker or NoopReranker ()
62- self ._candidate_k = max (candidate_k , rag_top_k )
6359 self ._streaming = streaming_generator
6460 self ._notifier = session_notifier
6561 self ._tts = tts
6662 self ._storage = storage
6763 self ._tts_voice = tts_voice
64+ self ._rag_timeout_sec = rag_timeout_sec
6865
6966 async def handle (self , message : AbstractIncomingMessage ) -> None :
7067 async with message .process (requeue = False ):
@@ -233,7 +230,19 @@ async def _synth_segment(
233230 async def _build_rag_context (self , req : GenerateFollowupRequest ) -> str :
234231 if not self ._core or not self ._embedder or not req .context_document_ids :
235232 return "(none)"
233+ try :
234+ return await asyncio .wait_for (
235+ self ._do_build_rag_context (req ), timeout = self ._rag_timeout_sec
236+ )
237+ except asyncio .TimeoutError :
238+ log .warning (
239+ "followup.rag.timeout" ,
240+ session_id = req .session_id ,
241+ timeout_sec = self ._rag_timeout_sec ,
242+ )
243+ return "(none)"
236244
245+ async def _do_build_rag_context (self , req : GenerateFollowupRequest ) -> str :
237246 query = f"{ req .previous_question } \n \n { req .answer_text } "
238247 try :
239248 query_vec = (
@@ -243,17 +252,14 @@ async def _build_rag_context(self, req: GenerateFollowupRequest) -> str:
243252 query_embedding = query_vec ,
244253 query_text = query ,
245254 document_ids = req .context_document_ids ,
246- top_k = self ._candidate_k ,
255+ top_k = self ._rag_top_k ,
247256 )
248257 except Exception as exc :
249258 log .warn ("followup.rag.failed" , error = str (exc ), session_id = req .session_id )
250259 return "(none)"
251260
252261 if not hits :
253262 return "(none)"
254- hits = await rerank_hits (
255- self ._reranker , query = query , hits = hits , top_k = self ._rag_top_k
256- )
257263 return "\n ---\n " .join (
258264 f"[doc#{ h .document_id } chunk#{ h .chunk_index } ] { h .chunk_text } " for h in hits
259265 )
0 commit comments