Почему близкие по смыслу тексты близки в пространстве

Углубляемся в «почему это вообще работает»: связь обучения, контекста и геометрии.

Дистрибутивная гипотеза: «слово узнаётся по компании» — слова, встречающиеся в похожих контекстах, имеют похожий смысл.

Идея, на которой держится всё

Откуда модель «знает», что «врач» и «доктор» близки, хотя буквы разные? Она много раз видела их в одинаковом окружении: «записаться к ...», «... выписал рецепт», «приём у ...». Обучение подталкивает векторы слов с похожим окружением сближаться. В итоге синонимы и тематически связанные слова собираются в одни области пространства.

Покажем на «контекстных профилях»

Смоделируем идею грубо: опишем каждое слово тем, как часто оно встречается рядом с «маркерными» словами. Получится контекстный профиль — игрушечный эмбеддинг. Похожие профили = близкие векторы.

import math

# профиль = частоты соседства с маркерами [лечить, рецепт, машина, дорога]
profiles = {
    "врач":     [8, 7, 0, 0],
    "доктор":   [7, 8, 0, 1],
    "водитель": [0, 0, 8, 9],
    "шофёр":    [0, 1, 7, 8],
}

def cosine(a, b):
    dot = sum(x * y for x, y in zip(a, b))
    na = math.sqrt(sum(x * x for x in a))
    nb = math.sqrt(sum(x * x for x in b))
    return dot / (na * nb)

pairs = [("врач", "доктор"), ("врач", "водитель"), ("водитель", "шофёр")]
for a, b in pairs:
    print(f"{a} ~ {b}: cos = {cosine(profiles[a], profiles[b]):.3f}")

Вывод:

врач ~ доктор: cos = 0.987
врач ~ водитель: cos = 0.000
водитель ~ шофёр: cos = 0.996

«Врач» и «доктор» близки, «водитель» и «шофёр» близки, а пары из разных тем — нет. И всё это — лишь из того, с какими словами они соседствуют. Настоящие энкодеры делают это несравнимо тоньше, но принцип ровно такой.

Почему это важно для RAG

Пользователь спросит «как вернуть покупку?», а в документе написано «оформление возврата товара». Общих слов почти нет — поиск по ключевым словам промахнётся. А эмбеддинги поставят вопрос и документ рядом, потому что они про одно и то же. Именно поэтому семантический поиск часто бьёт классический полнотекстовый.

Где интуиция ломается

  • Антонимы бывают близки: «дорого» и «дёшево» живут в похожих контекстах (про цену) — векторы могут оказаться рядом.
  • Редкие термины и опечатки модель кодирует хуже.
  • Очень общий запрос близок ко всему сразу и плохо различает.

Итог

  • Близость в пространстве — следствие похожих контекстов при обучении.
  • Поэтому синонимы и перефразировки находятся, даже без общих слов.
  • Это даёт семантический поиск — основу качественного RAG.
Проверьте себя
1. Что утверждает дистрибутивная гипотеза?
AСлова с похожим написанием имеют похожий смысл
BСлова из похожих контекстов имеют похожий смысл
CЧем длиннее слово, тем оно важнее
DСмысл слова задаётся словарём вручную
2. Почему семантический поиск находит документ «оформление возврата» по запросу «как вернуть покупку»?
AСовпадает много слов
BЭмбеддинги ставят их рядом из-за общего смысла, несмотря на разные слова
CДокумент был дообучен в модель
DСработал точный поиск по подстроке
3. Какой случай может сбить семантический поиск с толку?
AТочные синонимы
BАнтонимы вроде «дорого/дёшево», живущие в похожих контекстах
CДлинные документы
DТексты на одном языке
Поддержать проект