Spaces:
Sleeping
Sleeping
# Скрипт для запуска экспериментов по оценке качества чанкинга с разными моделями и параметрами | |
# Директории и пути по умолчанию | |
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 |