Добавлены endpoints для управления параметрами формулы, удалены ненужные методы, исправлена документация

This commit is contained in:
2026-01-28 00:55:54 +03:00
parent 671ee4657a
commit f3e31e4310
5 changed files with 264 additions and 55 deletions

View File

@@ -37,6 +37,9 @@ class VectorStore:
max_examples: int = 10000,
storage_path: Optional[str] = None,
score_multiplier: float = 5.0,
k_min: int = 5,
k_max: int = 10,
base_multiplier_factor: float = 15.0,
):
"""
Инициализация хранилища.
@@ -45,12 +48,18 @@ class VectorStore:
vector_dim: Размерность векторов
max_examples: Максимальное количество примеров каждого типа
storage_path: Путь для сохранения/загрузки векторов (опционально)
score_multiplier: Множитель для усиления разницы в скорах
score_multiplier: Базовый множитель для усиления разницы в скорах
k_min: Минимальное значение k для топ-k ближайших примеров
k_max: Максимальное значение k для топ-k ближайших примеров
base_multiplier_factor: Множитель для базового score_multiplier
"""
self.vector_dim = vector_dim
self.max_examples = max_examples
self.storage_path = storage_path
self.score_multiplier = score_multiplier
self.k_min = k_min
self.k_max = k_max
self.base_multiplier_factor = base_multiplier_factor
# Инициализируем пустые массивы
# Используем список для динамического добавления, потом конвертируем в numpy
@@ -284,15 +293,15 @@ class VectorStore:
neg_similarities = np.array([])
# Используем топ-k ближайших примеров для более чувствительной оценки
# Берем очень небольшое k (3-5) для максимальной чувствительности к различиям
k_pos = min(5, max(3, len(pos_similarities)))
# Берем k в диапазоне [k_min, k_max] для большей чувствительности к различиям
k_pos = min(self.k_max, max(self.k_min, len(pos_similarities)))
# Топ-k положительных примеров (самые близкие)
top_k_pos_sim = float(np.mean(np.sort(pos_similarities)[-k_pos:]))
# Для отрицательных: если их меньше k, берем все, иначе топ-k
if len(neg_similarities) > 0:
k_neg = min(5, max(3, len(neg_similarities)))
k_neg = min(self.k_max, max(self.k_min, len(neg_similarities)))
top_k_neg_sim = float(np.mean(np.sort(neg_similarities)[-k_neg:]))
else:
# Если нет отрицательных примеров, используем нейтральное значение
@@ -303,20 +312,14 @@ class VectorStore:
diff = top_k_pos_sim - top_k_neg_sim
# Увеличиваем множитель для большей чувствительности к малым различиям
# Базовый множитель умножаем на 25-30 для работы с топ-k (которые дают значения 0.95-0.99)
base_multiplier = self.score_multiplier * 25.0
# Базовый множитель умножаем на base_multiplier_factor для работы с топ-k
base_multiplier = self.score_multiplier * self.base_multiplier_factor
# Адаптивный множитель: чем больше примеров, тем выше чувствительность
# При 500 примерах: 1.25, при 1000+: 1.5
adaptive_multiplier = base_multiplier * (1.0 + min(0.5, (self.positive_count + self.negative_count) / 2000))
# Используем нелинейное преобразование для усиления различий
# Применяем квадратичную функцию к разнице для большей чувствительности
# Если diff положительный - усиливаем, если отрицательный - тоже усиливаем
sign = 1.0 if diff >= 0 else -1.0
amplified_diff = sign * (abs(diff) ** 0.8) * 1.2 # Слегка нелинейное усиление
score_neg_pos = 0.5 + (amplified_diff * adaptive_multiplier)
score_neg_pos = 0.5 + (diff * adaptive_multiplier)
score_neg_pos = max(0.0, min(1.0, score_neg_pos))
# === Вариант 2: pos only (только положительные, топ-k ближайших) ===
@@ -443,5 +446,69 @@ class VectorStore:
"total_count": self.total_count,
"vector_dim": self.vector_dim,
"max_examples": self.max_examples,
"storage_path": self.storage_path,
}
def get_scoring_params(self) -> dict:
"""Возвращает текущие параметры формулы расчета score."""
return {
"score_multiplier": self.score_multiplier,
"k_min": self.k_min,
"k_max": self.k_max,
"base_multiplier_factor": self.base_multiplier_factor,
}
def update_scoring_params(
self,
score_multiplier: Optional[float] = None,
k_min: Optional[int] = None,
k_max: Optional[int] = None,
base_multiplier_factor: Optional[float] = None,
) -> dict:
"""
Обновляет параметры формулы расчета score.
Args:
score_multiplier: Базовый множитель (должен быть > 0)
k_min: Минимальное значение k (должно быть >= 1)
k_max: Максимальное значение k (должно быть >= k_min)
base_multiplier_factor: Множитель для базового score_multiplier (должен быть > 0)
Returns:
dict: Обновленные параметры
Raises:
ValueError: При невалидных значениях
"""
with self._lock:
if score_multiplier is not None:
if score_multiplier <= 0:
raise ValueError("score_multiplier должен быть > 0")
self.score_multiplier = score_multiplier
if k_min is not None:
if k_min < 1:
raise ValueError("k_min должен быть >= 1")
if self.k_max < k_min:
raise ValueError("k_min не может быть больше k_max")
self.k_min = k_min
if k_max is not None:
if k_max < 1:
raise ValueError("k_max должен быть >= 1")
if k_max < self.k_min:
raise ValueError("k_max не может быть меньше k_min")
self.k_max = k_max
if base_multiplier_factor is not None:
if base_multiplier_factor <= 0:
raise ValueError("base_multiplier_factor должен быть > 0")
self.base_multiplier_factor = base_multiplier_factor
logger.info(
f"VectorStore: Параметры формулы обновлены: "
f"score_multiplier={self.score_multiplier}, "
f"k_min={self.k_min}, k_max={self.k_max}, "
f"base_multiplier_factor={self.base_multiplier_factor}"
)
return self.get_scoring_params()