File size: 6,775 Bytes
86c402d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#!/bin/bash
# Скрипт для запуска экспериментов по оценке качества чанкинга с разными моделями и параметрами

# Директории и пути по умолчанию
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