Spaces:
Runtime error
Runtime error
| # Скрипт для запуска экспериментов по оценке качества чанкинга с разными моделями и параметрами | |
| # Директории и пути по умолчанию | |
| DATA_FOLDER="data/docs" | |
| DATASET_PATH="data/dataset.xlsx" | |
| OUTPUT_DIR="data" | |
| LOG_DIR="logs" | |
| SIMILARITY_THRESHOLD=0.7 | |
| DEVICE="cuda:1" | |
| # Создаем директории, если они не существуют | |
| mkdir -p "$OUTPUT_DIR" | |
| mkdir -p "$LOG_DIR" | |
| # Список моделей для тестирования | |
| MODELS=( | |
| "intfloat/e5-base" | |
| "intfloat/e5-large" | |
| "BAAI/bge-m3" | |
| "deepvk/USER-bge-m3" | |
| "ai-forever/FRIDA" | |
| ) | |
| # Параметры чанкинга (отсортированы в запрошенном порядке) | |
| # Формат: [слов_в_чанке]:[нахлест]:[описание] | |
| CHUNKING_PARAMS=( | |
| "50:25:Маленький чанкинг с нахлёстом 50%" | |
| "50:0:Маленький чанкинг без нахлёста" | |
| "20:10:Очень мелкий чанкинг с нахлёстом 50%" | |
| "100:0:Средний чанкинг без нахлёста" | |
| "100:25:Средний чанкинг с нахлёстом 25%" | |
| "150:50:Крупный чанкинг с нахлёстом 33%" | |
| "200:75:Очень крупный чанкинг с нахлёстом 37.5%" | |
| ) | |
| # Функция для запуска одного эксперимента | |
| run_experiment() { | |
| local model="$1" | |
| local words="$2" | |
| local overlap="$3" | |
| local description="$4" | |
| # Заменяем слеши в имени модели на подчеркивания для имен файлов | |
| local model_safe_name=$(echo "$model" | tr '/' '_') | |
| # Формируем имя файла результатов | |
| local results_filename="results_fixed_size_w${words}_o${overlap}_${model_safe_name}.csv" | |
| local results_path="${OUTPUT_DIR}/${results_filename}" | |
| # Формируем имя файла лога | |
| local timestamp=$(date +"%Y%m%d_%H%M%S") | |
| local log_filename="log_${model_safe_name}_w${words}_o${overlap}_${timestamp}.txt" | |
| local log_path="${LOG_DIR}/${log_filename}" | |
| echo "==============================================================================" | |
| echo "Запуск эксперимента:" | |
| echo " Модель: $model" | |
| echo " Чанкинг: $description (words=$words, overlap=$overlap)" | |
| echo " Устройство: $DEVICE" | |
| echo " Результаты будут сохранены в: $results_path" | |
| echo " Лог: $log_path" | |
| echo "==============================================================================" | |
| # Базовая команда запуска | |
| local cmd="python scripts/evaluate_chunking.py \ | |
| --data-folder \"$DATA_FOLDER\" \ | |
| --model-name \"$model\" \ | |
| --dataset-path \"$DATASET_PATH\" \ | |
| --output-dir \"$OUTPUT_DIR\" \ | |
| --words-per-chunk $words \ | |
| --overlap-words $overlap \ | |
| --similarity-threshold $SIMILARITY_THRESHOLD \ | |
| --device $DEVICE \ | |
| --force-recompute" | |
| # Специальная обработка для модели ai-forever/FRIDA | |
| if [[ "$model" == "ai-forever/FRIDA" ]]; then | |
| cmd="$cmd --use-sentence-transformers" | |
| fi | |
| # Записываем информацию о запуске в лог | |
| echo "Эксперимент запущен в: $(date)" > "$log_path" | |
| echo "Команда: $cmd" >> "$log_path" | |
| echo "" >> "$log_path" | |
| # Записываем время начала | |
| start_time=$(date +%s) | |
| # Запускаем команду и записываем вывод в лог | |
| eval "$cmd" 2>&1 | tee -a "$log_path" | |
| exit_code=${PIPESTATUS[0]} | |
| # Записываем время окончания | |
| end_time=$(date +%s) | |
| duration=$((end_time - start_time)) | |
| duration_min=$(echo "scale=2; $duration/60" | bc) | |
| # Добавляем информацию о завершении в лог | |
| echo "" >> "$log_path" | |
| echo "Эксперимент завершен в: $(date)" >> "$log_path" | |
| echo "Длительность: $duration секунд ($duration_min минут)" >> "$log_path" | |
| echo "Код возврата: $exit_code" >> "$log_path" | |
| if [ $exit_code -eq 0 ]; then | |
| echo "Эксперимент успешно завершен за $duration_min минут" | |
| else | |
| echo "Эксперимент завершился с ошибкой (код $exit_code)" | |
| fi | |
| } | |
| # Основная функция | |
| main() { | |
| local total_experiments=$((${#MODELS[@]} * ${#CHUNKING_PARAMS[@]})) | |
| local completed_experiments=0 | |
| echo "Запуск $total_experiments экспериментов..." | |
| # Засекаем время начала всех экспериментов | |
| local start_time_all=$(date +%s) | |
| # Сначала перебираем все параметры чанкинга | |
| for chunking_param in "${CHUNKING_PARAMS[@]}"; do | |
| # Разбиваем строку параметров на составляющие | |
| IFS=':' read -r words overlap description <<< "$chunking_param" | |
| echo -e "\n=== Стратегия чанкинга: $description (words=$words, overlap=$overlap) ===\n" | |
| # Затем перебираем все модели для текущей стратегии чанкинга | |
| for model in "${MODELS[@]}"; do | |
| # Запускаем эксперимент | |
| run_experiment "$model" "$words" "$overlap" "$description" | |
| # Увеличиваем счетчик завершенных экспериментов | |
| completed_experiments=$((completed_experiments + 1)) | |
| remaining_experiments=$((total_experiments - completed_experiments)) | |
| if [ $remaining_experiments -gt 0 ]; then | |
| echo "Завершено $completed_experiments/$total_experiments экспериментов. Осталось: $remaining_experiments" | |
| fi | |
| done | |
| done | |
| # Рассчитываем общее время выполнения | |
| local end_time_all=$(date +%s) | |
| local total_duration=$((end_time_all - start_time_all)) | |
| local total_duration_min=$(echo "scale=2; $total_duration/60" | bc) | |
| echo "" | |
| echo "Все эксперименты завершены за $total_duration_min минут" | |
| echo "Результаты сохранены в $OUTPUT_DIR" | |
| echo "Логи сохранены в $LOG_DIR" | |
| } | |
| # Запускаем основную функцию | |
| main |