Как это работает
Модели вроде sentence-transformers считают эмбеддинги быстро и локально, без обращения к внешнему API. Мультиязычные модели подходят для русского языка.
Порог («ответ считаем правильным, если близость выше 0.8») подбирают по своим данным: для разных моделей эмбеддингов шкала разная. Метрика симметрична и плохо отличает противоречие от согласия.
cos(a, b) = (a · b) / (‖a‖ × ‖b‖)
Пример
1from sentence_transformers import SentenceTransformer, util
2
3model = SentenceTransformer("paraphrase-multilingual-MiniLM-L12-v2")
4
5def semantic_similarity(a, b):
6 emb = model.encode([a, b], convert_to_tensor=True)
7 return util.cos_sim(emb[0], emb[1]).item()Как применять в тестировании ИИ
Хороша как дешёвый фильтр на больших объёмах: отсеять явный брак и дубли. Не используйте её как единственный критерий правильности и дополняйте проверками чисел, дат и отрицаний.
Типичные ошибки
- Брать порог из чужих статей: шкала зависит от модели эмбеддингов.
- Считать высокую близость доказательством верного факта.
- Не проверять метрику на парах «верный перифраз» и «подмена факта».
Частые вопросы
Как выбрать порог семантической близости?
Разметьте людьми набор пар «верно» и «неверно», посчитайте близость и подберите порог, который разделяет их лучше всего. Универсального значения нет: оно зависит от модели эмбеддингов.
Почему семантическая близость не находит подмену числа?
Эмбеддинги отражают тему и общий смысл, а «14 дней» и «30 дней» в одном контексте очень похожи по теме. Поэтому числа, даты и отрицания проверяют отдельно.