Main function to run the hybrid raw search benchmark
(
dataset: str = "arguana",
top_k: int = 10,
)
| 1094 | return filename |
| 1095 | |
| 1096 | def main( |
| 1097 | dataset: str = "arguana", |
| 1098 | top_k: int = 10, |
| 1099 | ): |
| 1100 | """Main function to run the hybrid raw search benchmark""" |
| 1101 | print("=" * 60) |
| 1102 | print("Raw Hybrid Search Benchmark (dense + server-side sparse)") |
| 1103 | print("=" * 60) |
| 1104 | |
| 1105 | try: |
| 1106 | # Setup |
| 1107 | embedding_model = setup_embedding_model() |
| 1108 | create_session() |
| 1109 | |
| 1110 | # Load dataset |
| 1111 | corpus, queries, qrels = get_beir_dataset(dataset) |
| 1112 | print(f"Loaded {dataset}: {len(corpus)} docs, {len(queries)} queries, {len(qrels)} qrels") |
| 1113 | |
| 1114 | # Calculate average query length (for raw text) |
| 1115 | avg_query_len = sum(len(q.split()) for q in queries.values()) / len(queries) |
| 1116 | print(f"Average query length: {avg_query_len:.1f} tokens") |
| 1117 | |
| 1118 | # Generate dense embeddings |
| 1119 | corpus_ids, corpus_embeddings, query_ids, query_embeddings = generate_dense_embeddings( |
| 1120 | corpus, queries, dataset, embedding_model |
| 1121 | ) |
| 1122 | |
| 1123 | # Build brute-force baselines for evaluation |
| 1124 | print("\nBuilding brute-force baselines...") |
| 1125 | bf_dense = brute_force_dense( |
| 1126 | query_embeddings, corpus_embeddings, corpus_ids, query_ids, top_k, dataset |
| 1127 | ) |
| 1128 | |
| 1129 | # Build sparse vectors for brute-force comparison |
| 1130 | sparse_vectors = build_sparse_vectors_for_bf(corpus, dataset) |
| 1131 | |
| 1132 | # Get corpus stats for sparse queries |
| 1133 | total_docs = len(sparse_vectors) |
| 1134 | term_doc_freq = defaultdict(int) |
| 1135 | total_len = sum(len(v["text"].split()) for v in sparse_vectors) |
| 1136 | avg_len = total_len / total_docs |
| 1137 | for v in sparse_vectors: |
| 1138 | for idx in v["indices"]: |
| 1139 | term_doc_freq[idx] += 1 |
| 1140 | |
| 1141 | sparse_queries = build_sparse_queries_for_bf( |
| 1142 | queries, dataset, (total_docs, term_doc_freq, avg_len) |
| 1143 | ) |
| 1144 | bf_sparse = brute_force_sparse(sparse_queries, sparse_vectors, top_k, dataset) |
| 1145 | |
| 1146 | # Create collection and indexes |
| 1147 | collection_name = f"{COLLECTION_PREFIX}_{dataset}" |
| 1148 | collection = ensure_collection(collection_name) |
| 1149 | |
| 1150 | # Upsert hybrid vectors (dense + raw text) |
| 1151 | start_time = time.time() |
| 1152 | upsert_hybrid_vectors(collection, corpus_ids, corpus_embeddings, corpus) |
| 1153 | indexing_time = time.time() - start_time |
no test coverage detected