Source code for scripts.bench_utils
"""Shared utilities for benchmark and evaluation scripts."""
from __future__ import annotations
import math
import os
import statistics
from typing import Any, Optional, Sequence
[docs]
def safe_mean(values: Sequence[float]) -> float:
"""Return the arithmetic mean or ``0.0`` for an empty sequence."""
return float(statistics.fmean(values)) if values else 0.0
[docs]
def percentile(values: Sequence[float], p: float) -> float:
"""Return the linear-interpolated percentile for *values*."""
if not values:
return 0.0
sorted_v = sorted(values)
k = (len(sorted_v) - 1) * (p / 100.0)
f = math.floor(k)
c = math.ceil(k)
if f == c:
return sorted_v[int(k)]
return sorted_v[f] * (c - k) + sorted_v[c] * (k - f)
[docs]
def build_ragas_embeddings(
provider: str,
api_key: Optional[str],
) -> Any:
"""Build a RAGAS-compatible embeddings wrapper for the judge provider."""
try:
from ragas.embeddings import LangchainEmbeddingsWrapper
except ImportError:
return None
if provider == "mistral":
try:
from langchain_mistralai import MistralAIEmbeddings
emb = MistralAIEmbeddings(
model="mistral-embed",
api_key=api_key or os.getenv("MISTRAL_API_KEY", ""), # type: ignore[arg-type]
)
return LangchainEmbeddingsWrapper(emb)
except ImportError:
return None
return None