Studio RAG trim: remove cross-encoder reranker

The cross-encoder reranker is off by default (enable_rerank=False everywhere)
and adds a second model download plus a candidate-widening pass on every search.
Removing it keeps the core retrieval (parse, chunk, embed, BM25 + dense, RRF,
search_knowledge_base tool) intact while dropping ~375 lines.

- delete core/rag/reranker.py and its test
- drop enable_rerank / reranker_model from the search tool, tools dispatch,
  and the /rag/search route (candidate_k is now just top_k)
- remove the /rag/reranker/precache endpoint and reranker config knobs
- update tool-handler test to the trimmed rag_scope shape

42 RAG tests pass.
This commit is contained in:
Daniel Han 2026-05-31 14:14:52 +00:00
commit b085b37b69
7 changed files with 9 additions and 384 deletions

View file

@ -1,64 +0,0 @@
"""Reranker tests — skipped if sentence_transformers is unavailable.
These tests load a real CrossEncoder, so they're slow and gated under
the ``server`` marker so a default ``pytest`` run skips them. Force
with ``pytest -m server``.
"""
import sys
from pathlib import Path
import pytest
REPO_ROOT = Path(__file__).resolve().parents[2]
STUDIO_BACKEND = REPO_ROOT / "studio" / "backend"
if str(STUDIO_BACKEND) not in sys.path:
sys.path.insert(0, str(STUDIO_BACKEND))
pytest.importorskip("sentence_transformers")
def test_rerank_empty_returns_empty():
from core.rag.reranker import rerank
assert rerank("anything", []) == []
@pytest.mark.server
def test_rerank_reorders_by_relevance(monkeypatch):
"""Hide the relevant chunk at the back of the input and check it bubbles up."""
monkeypatch.setenv(
"UNSLOTH_RAG_RERANKER_MODEL", "cross-encoder/ms-marco-MiniLM-L-6-v2"
)
from core.rag.reranker import rerank, unload
from core.rag.retrieval import Hit
pairs = [
(Hit("noise1", 0.0), "Cats are small carnivorous mammals."),
(Hit("noise2", 0.0), "The Eiffel Tower is in Paris, France."),
(Hit("noise3", 0.0), "Python is a programming language."),
(
Hit("answer", 0.0),
"The speed of light in vacuum is approximately 299792458 meters per second.",
),
]
try:
ranked = rerank("How fast does light travel?", pairs, top_k = 2)
assert ranked
assert ranked[0].chunk_id == "answer"
finally:
unload()
@pytest.mark.server
def test_unload_clears_singleton(monkeypatch):
monkeypatch.setenv(
"UNSLOTH_RAG_RERANKER_MODEL", "cross-encoder/ms-marco-MiniLM-L-6-v2"
)
from core.rag import reranker
from core.rag.retrieval import Hit
reranker.rerank("q", [(Hit("a", 0.0), "some text")])
assert reranker._model is not None
reranker.unload()
assert reranker._model is None

View file

@ -196,8 +196,6 @@ def test_execute_tool_dispatches_to_search_knowledge_base():
top_k = None,
scope_kb_id = None,
scope_thread_id = None,
enable_rerank = False,
reranker_model = None,
default_top_k = 5,
min_score = 0.0,
**kwargs,
@ -206,7 +204,6 @@ def test_execute_tool_dispatches_to_search_knowledge_base():
called["top_k"] = top_k
called["scope_kb_id"] = scope_kb_id
called["scope_thread_id"] = scope_thread_id
called["enable_rerank"] = enable_rerank
called["default_top_k"] = default_top_k
called["min_score"] = min_score
return "stub-result"
@ -218,7 +215,6 @@ def test_execute_tool_dispatches_to_search_knowledge_base():
tool_context = {
"rag_scope": {
"kb_id": "kb-1",
"enable_rerank": True,
"default_top_k": 3,
"min_score": 0.35,
}
@ -229,7 +225,6 @@ def test_execute_tool_dispatches_to_search_knowledge_base():
assert called["top_k"] == 7
assert called["scope_kb_id"] == "kb-1"
assert called["scope_thread_id"] is None
assert called["enable_rerank"] is True
assert called["default_top_k"] == 3
assert called["min_score"] == 0.35