Spaces:
Running
Running
| """ | |
| Retrieval Profiling Script | |
| Measures end-to-end latency of the retrieval and reranking pipeline. | |
| Reports against the correct per-phase latency budgets from settings.yaml. | |
| """ | |
| import logging | |
| import time | |
| import yaml | |
| from src.retrieval.hybrid_search import HybridRetriever | |
| from src.retrieval.reranker import CrossEncoderReranker | |
| logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s") | |
| logger = logging.getLogger(__name__) | |
| def main() -> None: | |
| with open("config/settings.yaml") as f: | |
| config = yaml.safe_load(f) | |
| retrieval_budget: float = config["latency"]["retrieval_budget_ms"] | |
| rerank_budget: float = config["latency"]["rerank_budget_ms"] | |
| total_budget: float = config["latency"]["total_p95_ms"] | |
| retriever = HybridRetriever() | |
| reranker = CrossEncoderReranker() | |
| test_queries = [ | |
| "What period does the fiscal year 2023 cover?", | |
| "How many page views for open data?", | |
| "What is ChipLingo framework?", | |
| "Who authored the Python tutorial?", | |
| "What are the DeepEval metrics?", | |
| ] | |
| header = f"{'Query':<48} | {'Retrieval':>12} | {'Rerank':>10} | {'Total':>10}" | |
| print(header) | |
| print("-" * len(header)) | |
| retrieval_latencies: list[float] = [] | |
| rerank_latencies: list[float] = [] | |
| for query in test_queries: | |
| start_retrieval = time.perf_counter() | |
| candidates = retriever.search(query) | |
| retrieval_ms = (time.perf_counter() - start_retrieval) * 1000 | |
| start_rerank = time.perf_counter() | |
| _ = reranker.rerank(query, candidates) | |
| rerank_ms = (time.perf_counter() - start_rerank) * 1000 | |
| total_ms = retrieval_ms + rerank_ms | |
| retrieval_latencies.append(retrieval_ms) | |
| rerank_latencies.append(rerank_ms) | |
| retrieval_flag = "!" if retrieval_ms > retrieval_budget else " " | |
| rerank_flag = "!" if rerank_ms > rerank_budget else " " | |
| print( | |
| f"{query[:46]:<48} | " | |
| f"{retrieval_ms:>10.1f}ms{retrieval_flag} | " | |
| f"{rerank_ms:>8.1f}ms{rerank_flag} | " | |
| f"{total_ms:>8.1f}ms" | |
| ) | |
| avg_retrieval = sum(retrieval_latencies) / len(retrieval_latencies) | |
| avg_rerank = sum(rerank_latencies) / len(rerank_latencies) | |
| avg_total = avg_retrieval + avg_rerank | |
| print("-" * len(header)) | |
| print(f"{'Averages':<48} | {avg_retrieval:>10.1f}ms | {avg_rerank:>8.1f}ms | {avg_total:>8.1f}ms") | |
| print() | |
| print("Budget report:") | |
| _check("Retrieval", avg_retrieval, retrieval_budget) | |
| _check("Reranking", avg_rerank, rerank_budget) | |
| _check("Total (retrieval+rerank only)", avg_total, total_budget) | |
| print() | |
| print( | |
| f"Note: total budget ({total_budget}ms) must also absorb LLM generation " | |
| f"({config['latency']['generation_budget_ms']}ms). " | |
| f"Remaining after retrieval+rerank: {total_budget - avg_total:.1f}ms" | |
| ) | |
| def _check(label: str, actual: float, budget: float) -> None: | |
| status = "PASS" if actual <= budget else "FAIL" | |
| print(f" {status} {label}: {actual:.1f}ms (budget: {budget}ms)") | |
| if __name__ == "__main__": | |
| main() | |