Skip to content

latent.rag.tune

RAG hyperparameter grid search using retrieval-level metrics.

Evaluates different configurations (alpha, k1, b, k, thresholds) by computing recall@k against labeled relevant chunk IDs — no LLM calls needed.

Usage::

from latent.rag.tune import rag_grid_search

results = rag_grid_search(
    chroma_path="data/stable/chroma_db",
    questions=[{"query": "...", "relevant_chunk_ids": ["c1", "c2"]}],
    embedding_provider="sentence_transformer",
    embedding_model="intfloat/multilingual-e5-large",
)

Classes

TuneResult

TuneResult(config: dict[str, Any], recall_at_k: float, mrr: float, precision_at_k: float, avg_top_score: float, num_queries: int)

Result of a single RAG config evaluation.

TuneSpace

TuneSpace(alphas: list[float] = (lambda: [0.3, 0.5, 0.7, 0.8])(), k_values: list[int] = (lambda: [10, 15, 20])(), rrf_k_values: list[int] = (lambda: [30, 40, 60])(), bm25_k1: list[float] = (lambda: [1.2, 1.5, 2.0])(), bm25_b: list[float] = (lambda: [0.5, 0.75, 1.0])(), backends: list[str] = (lambda: ['hybrid', 'chroma'])(), tokenizers: list[str] = (lambda: ['default', 'hebrew'])())

Search space for RAG hyperparameter tuning.

Functions

rag_grid_search(chroma_path: str | Path, questions: list[dict[str, Any]], embedding_provider: str = 'voyage', embedding_model: str | None = None, collection_name: str = 'knowledge_base', space: TuneSpace | None = None, max_configs: int = 100) -> list[TuneResult]

Run grid search over RAG configs using retrieval-level metrics.

Args: chroma_path: Path to ChromaDB persistence directory. questions: List of dicts with "query" and "relevant_chunk_ids" keys. embedding_provider: Embedding provider name. embedding_model: Embedding model name. collection_name: ChromaDB collection name. space: Search space (defaults to standard grid). max_configs: Maximum configs to evaluate.

Returns: List of TuneResult sorted by recall@k (descending).