diff --git a/app/storage/vector_store.py b/app/storage/vector_store.py index ac74bbc..7ee7d4e 100644 --- a/app/storage/vector_store.py +++ b/app/storage/vector_store.py @@ -284,17 +284,15 @@ class VectorStore: neg_similarities = np.array([]) # Используем топ-k ближайших примеров для более чувствительной оценки - # k выбирается динамически: минимум 10, но не больше 20% от общего количества - k_pos = min(max(10, self.positive_count // 10), 50) - k_pos = min(k_pos, len(pos_similarities)) + # Берем небольшое k (5-10) для большей чувствительности к различиям + k_pos = min(10, max(5, len(pos_similarities))) - # Топ-k положительных примеров + # Топ-k положительных примеров (самые близкие) top_k_pos_sim = float(np.mean(np.sort(pos_similarities)[-k_pos:])) # Для отрицательных: если их меньше k, берем все, иначе топ-k if len(neg_similarities) > 0: - k_neg = min(max(10, self.negative_count // 10), 50) - k_neg = min(k_neg, len(neg_similarities)) + k_neg = min(10, max(5, len(neg_similarities))) top_k_neg_sim = float(np.mean(np.sort(neg_similarities)[-k_neg:])) else: # Если нет отрицательных примеров, используем нейтральное значение @@ -304,8 +302,12 @@ class VectorStore: # Используем более агрессивную нормализацию для малых различий diff = top_k_pos_sim - top_k_neg_sim + # Увеличиваем множитель для большей чувствительности к малым различиям + # Базовый множитель умножаем на 10-20 для работы с топ-k (которые дают значения 0.95-0.99) + base_multiplier = self.score_multiplier * 15.0 + # Адаптивный множитель: чем больше примеров, тем выше чувствительность - adaptive_multiplier = self.score_multiplier * (1.0 + min(1.0, (self.positive_count + self.negative_count) / 1000)) + adaptive_multiplier = base_multiplier * (1.0 + min(0.5, (self.positive_count + self.negative_count) / 2000)) score_neg_pos = 0.5 + (diff * adaptive_multiplier) score_neg_pos = max(0.0, min(1.0, score_neg_pos))