From 78a93ee7713156a196602aacce0f3b4a0b7fc301 Mon Sep 17 00:00:00 2001 From: enne2 Date: Tue, 8 Sep 2026 12:12:38 +0200 Subject: [PATCH] =?UTF-8?q?fix(gateway):=20troncamento=20documenti=20reran?= =?UTF-8?q?k=20(RERANK=5FMAX=5FDOC=5FCHARS=3D800)=20=E2=80=94=20evita=2050?= =?UTF-8?q?0=20batch-size=20e=20costi=20oltre=20il=20ctx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gateway/config.py | 1 + gateway/rerank.py | 4 ++++ gateway/tests/test_rerank.py | 14 ++++++++++++++ 3 files changed, 19 insertions(+) diff --git a/gateway/config.py b/gateway/config.py index 00eab85..d7f2d41 100644 --- a/gateway/config.py +++ b/gateway/config.py @@ -39,6 +39,7 @@ SPARSE_VECTOR_NAME = "bm25" RERANK_ENABLED = os.environ.get("RERANK_ENABLED", "false").lower() == "true" RERANK_MODEL = os.environ.get("RERANK_MODEL", "bge-reranker-v2-m3") RERANK_CANDIDATES = int(os.environ.get("RERANK_CANDIDATES", "16")) +RERANK_MAX_DOC_CHARS = int(os.environ.get("RERANK_MAX_DOC_CHARS", "800")) RERANK_TIMEOUT_MS = int(os.environ.get("RERANK_TIMEOUT_MS", "10000")) RERANK_RETRY_COOLDOWN_S = int(os.environ.get("RERANK_RETRY_COOLDOWN_S", "60")) RERANK_CHAIN = os.environ.get("RERANK_CHAIN", "") diff --git a/gateway/rerank.py b/gateway/rerank.py index a306f66..c40e6af 100644 --- a/gateway/rerank.py +++ b/gateway/rerank.py @@ -21,6 +21,7 @@ import metrics from config import ( RERANK_CHAIN, RERANK_ENABLED, + RERANK_MAX_DOC_CHARS, RERANK_MODEL, RERANK_RETRY_COOLDOWN_S, RERANK_TIMEOUT_MS, @@ -121,6 +122,9 @@ async def rerank(query: str, docs: list[str]) -> Optional[tuple[list[float], str chain = _get_chain() if not chain or not docs: return None + # Troncamento dei documenti: limita il costo di inferenza (i cross-encoder + # scala con la lunghezza della coppia query+doc) e evita input oltre il ctx. + docs = [d[:RERANK_MAX_DOC_CHARS] for d in docs] live, all_down = live_nodes() if not live: # tutti in cooldown: ritenta comunque il primo (meglio di un fallimento immediato) diff --git a/gateway/tests/test_rerank.py b/gateway/tests/test_rerank.py index 2048169..49922ef 100644 --- a/gateway/tests/test_rerank.py +++ b/gateway/tests/test_rerank.py @@ -145,6 +145,20 @@ def test_normalize_score(): assert rerank.normalize_score(-10.0) < 0.01 +def test_troncamento_documenti(monkeypatch): + _use_chain(monkeypatch) + seen: dict = {} + + def handler(request): + seen["docs"] = json.loads(request.content)["documents"] + return httpx.Response(200, json={"results": [{"index": 0, "relevance_score": 1.0}]}) + + _mock_client(handler) + asyncio.run(rerank.rerank("q", ["x" * 5000, "corto"])) + assert len(seen["docs"][0]) == 800 # default RERANK_MAX_DOC_CHARS + assert seen["docs"][1] == "corto" + + # --------------------------------------------------------------------------- # integrazione endpoint search # ---------------------------------------------------------------------------