""" This module implements a benchmark function to evaluate the performance of the embedding pipeline. It expects a configuration JSON file. It must have questions and expected retrieved text. For each question, it's essential to have variants of that question. Language is fluid and each person might have their own spin on how they may ask it. At the end, it will save the results inside a benchmark_{sysdate}.txt file in the main directory. The benchmark function will return the score as an integer. """ import datetime import json import os from pathlib import Path from .data_processor import process_and_add_to_collector, preprocess_text from .parameters import get_chunk_count, get_max_token_count from .utils import create_metadata_source def benchmark(config_path, collector): # Get the current system date sysdate = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") filename = f"benchmark_{sysdate}.txt" # Open the log file in append mode with open(filename, 'a') as log: with open(config_path, 'r') as f: data = json.load(f) total_points = 0 max_points = 0 for item in data: filepath = item["text"] corpus = "" # Check if the file exists if os.path.isfile(Path(filepath)): # Open the file and read its content with open(Path(filepath), 'r') as file: corpus = file.read() process_and_add_to_collector(corpus, collector, True, create_metadata_source('benchmark')) else: raise f'Cannot find specified file {filepath}.' for question_group in item["questions"]: question_variants = question_group["question_variants"] criteria = question_group["criteria"] for q in question_variants: max_points += len(criteria) processed_text = preprocess_text(q) # Get the most similar chunks results = collector.get_sorted_by_dist(processed_text, n_results=get_chunk_count(), max_token_count=get_max_token_count()) points = 0 for c in criteria: for p in results: if c in p: points += 1 total_points += 1 break info = f"The question '{q}' scored {points}/{len(criteria)} points." print(info, file=log) print('\n---\n', file=log) print(f'##Total points:\n\n{total_points}/{max_points}', file=log) return total_points, max_points